OpenCode Viewerは、opencodeの対話セッションをブラウザで一覧・再開・中断できるサードパーティ製のWebクライアントです。ただ、公開から1年が経つあいだに、opencode本体は保存方式をSQLiteへ移しました。2026年9月12日(日本時間)にはOpenCode 2.0(以下V2)の2.0.0がnpmで公開され、履歴の見方とコマンドがV1から変わっています。この記事では、OpenCode Viewerの実装を確認したうえで、V1(1.19.3)とV2(2.0.32)のそれぞれで履歴を見る・再開する手順と、V1からV2へ移るときに履歴が欠ける場面を、手元で実行した結果をもとに説明します。
まとめ:opencodeの履歴を見る手段の選び方
- opencodeの履歴は、V1・V2とも
~/.local/share/opencode/opencode.db(SQLite)に入ります。V1はopencode db path、V2はopencode debug paths dbでパスを確認できます。 - OpenCode Viewer(
@nogataka/opencode-viewerv0.0.3)が読むのは旧形式のstorage/session・message・partのJSONだけです。現行のopencodeではこのディレクトリが作られないため、画面には何も出ません。 - ブラウザで見たいなら公式機能を使います。V1は
opencode web、V2はopencode pairです。V2にはopencode webがありません。 - V1からV2への履歴移行は、V2を初めて起動したときに1回だけ行われます。そのあとV1で作ったセッションはV2に出てきません。V1の
opencode exportで書き出したJSONも、V2のsession importでは取り込めませんでした。 - OpenCode Viewerは2025年10月3日を最後に更新がありません(star 9・fork 0、2026年10月19日時点)。PORT未指定時の待ち受けは5757で、READMEにある3400ではありません。
OpenCode Viewerの開発元とclaude-code-viewerとの関係
OpenCode Viewerは、d-kimuson氏のclaude-code-viewerをopencode向けに作り替えた派生プロジェクトです。リポジトリのREADMEにそう明記されています。Claude Code用だったころの名残が実装に残っており、ブラウザ自動起動を止める環境変数は CC_VIEWER_NO_AUTO_OPEN という接頭辞のままです。依存パッケージには @anthropic-ai/claude-code が残り、options.md の中身はCodex CLIのヘルプ文のままになっています。
規模も確認しておきます。GitHubのnogataka/opencode-viewerはstar 9・fork 0で、コミットは2025年10月1日〜3日の3日間に収まっています。npmの最新版は0.0.3(2025年10月2日公開)で、その後の版はありません。継続的にメンテナンスされる前提で選べるツールではありません。
スコープ付きパッケージ名と同名ツールの違い
インストール時に取り違えやすいのがパッケージ名です。npmには opencode-viewer というスコープなしの別パッケージがあり、こちらはopencode-interceptorが記録したLLM通信を閲覧する別のツールです。この記事のOpenCode Viewerは、必ずスコープ付きの @nogataka/opencode-viewer で指定してください。
opencodeのセッション履歴の保存先と保存形式
履歴が見つからないときは、まず使っているopencodeがV1かV2かを確かめます。保存先のファイル名は同じでも、中身のテーブルと操作コマンドが違うためです。
V1とV2の見分け方:–versionの表記と入れ方
opencode --version の出力で区別できます。V1は 1.19.3 のように数字だけを返し、V2は opencode v2.0.32 のように製品名付きで返します。どちらが入るかはインストール方法で決まります。
| 入れ方 | 系統 | 2026年10月19日時点の版 |
|---|---|---|
| npm install -g opencode-ai | V1 | 1.19.3 |
| npm install -g @opencode/cli | V2 | 2.0.32 |
| brew install opencode(Homebrew本家) | V2 | 2.0.32 |
| brew install anomalyco/tap/opencode-v2 | V2 | 2.0系 |
npmのV2パッケージは opencode と opencode2 の2つのコマンドを入れます。Homebrew本家の opencode がV2になっているため、最近macOSに入れた人はV2を使っている可能性が高いと考えてください。npmのV1・V2の版と公開日はnpmの@opencode/cliのページで確認できます。
V1(1.19.3)はopencode.dbのsession・message・partテーブル
V1では、セッション本体はSQLiteデータベースに保存されます。パスと中身はCLIから確認できます。
$ opencode db path
/Users/you/.local/share/opencode/opencode.db
$ opencode db "select id, title from session"
ses_eb07603bcffeRMr28O9Zd7oZtA|履歴移行テスト
セッションは session テーブル、メッセージは message テーブル、メッセージの構成要素は part テーブルに入ります。WALモードなので、同じ場所に opencode.db-wal と opencode.db-shm が並びます。XDG_DATA_HOME を設定していればその配下に、OPENCODE_DB でパスを上書きしていればそちらに置かれます。
V2(2.0.32)は同じopencode.dbにsession_v2テーブルを追加
V2には opencode db サブコマンドがありません。パスは opencode debug paths で出します。V2のCLIドキュメントは、パスだけを出力する opencode debug paths db を sqlite3 に渡す使い方を紹介しています。このコマンドはサーバーを起動せず、DBも開きません。
$ opencode debug paths db
/Users/you/.local/share/opencode/opencode.db
$ sqlite3 "$(opencode debug paths db)" ".tables"
ファイル名はV1と同じ opencode.db ですが、V2を新規に入れたDBには session・message・part テーブルがありません。代わりに session_v2・session_message・session_inbox などが作られます。V1向けに書いたSQLや外部ツールは、V2のDBにはそのまま使えません。
旧形式のstorageディレクトリとOPENCODE_STORAGE_ROOT
OpenCode Viewerが前提にしているのは、SQLite移行より前の保存形式です。~/.local/share/opencode/storage/ の下に session・message・part の3ディレクトリがあり、それぞれにJSONファイルが置かれる構造を読みます。基点は XDG_DATA_HOME(未設定なら ~/.local/share)で、OPENCODE_STORAGE_ROOT を設定すればそちらが優先されます。
古いopencodeから使い続けていて storage ディレクトリが手元に残っていれば、OpenCode Viewerは今もその過去ログを読めます。旧形式のディレクトリを OPENCODE_STORAGE_ROOT で指定してv0.0.3を起動すると、GET /api/projects はHTTP 200でプロジェクト一覧を返しました。注意したいのは逆のケースです。SQLiteへ移行した後も古いJSONが残っていると、ビューアはそちらを読みます。画面に出ている履歴が今の履歴とは限りません。
V1からV2への履歴移行の実測結果と追加移行の制約
V2のV1からの移行ガイドは、設定ファイルやプラグインの移し方を詳しく書いています。一方、セッション履歴がどう引き継がれるかには触れていません。そこで隔離した環境にV1(1.19.3)とV2(2.0.32)を入れ、同じデータディレクトリを使って挙動を確かめました。
| 操作 | 結果 |
|---|---|
| V1でセッション作成→V2で session list | 表示される(移行済み) |
| V2初回起動後のDB | kvに migration.v1-v2 = completed |
| V2起動後にV1で新規セッション作成 | V1には出る・V2には出ない |
| V1 export のJSONを V2 session import | SchemaError で失敗 |
まず、移行はV2を初めて起動したときの1回だけです。V2はV1の session・message・part を読んで自分の session_v2 系テーブルへ写し、完了したことをDBの kv テーブルに migration.v1-v2 として記録します。V1のテーブルは消されずに残るため、V1からは移行前と同じように過去のセッションを開けます。
次に、移行後にV1で作ったセッションはV2へ追加で写されません。V2を一度起動したあとにV1でセッションを作ると、V1の opencode session list には2件、V2の opencode session list には1件と、表示がずれました。V1とV2を行き来しながら使うと、V2側の履歴に穴があきます。
さらに、V1で書き出したJSONはV2へそのまま取り込めませんでした。V1の opencode export <セッションID> の出力をV2の opencode session import に渡すと、次のエラーで止まりました。
$ opencode session import v1-session.json
SchemaError: Missing key
at ["info"]["location"]
V2のexportはセッション情報を info.location.directory に持ちますが、V1のexportは info.directory に持ちます。キーの置き場所が違うので、V1の出力を未加工のまま渡すと上のエラーになります。実務上の結論は単純です。V2へ切り替えると決めたら、V1で作業を終えてからV2を初めて起動し、以後はV1でセッションを作らない。移行後にV1で作ったセッションは、V1をそのまま残してV1から開いてください。
OpenCode Viewerの起動とポート・表示設定
以下はbashとzshでの起動例です。どれもローカルにWebサーバーを立て、自動起動を止めていなければ既定のブラウザが開きます。
# グローバルインストールせず、自端末だけで待ち受ける(PORT未指定なら5757)
HOSTNAME=127.0.0.1 npx @nogataka/[email protected]
# ポートを固定する
HOSTNAME=127.0.0.1 PORT=3400 npx @nogataka/[email protected]
# ブラウザの自動起動を止め、旧形式の保存先を明示する
HOSTNAME=127.0.0.1 CC_VIEWER_NO_AUTO_OPEN=1 \
OPENCODE_STORAGE_ROOT=~/.local/share/opencode/storage \
npx @nogataka/[email protected]
READMEに書かれた既定ポート3400は、npmで配布されているCLIには当てはまりません。公開版の dist/index.js は、PORT が未設定なら5757を代入します。3400はリポジトリの開発用スクリプト(pnpm dev)が使う値です。自動起動は CC_VIEWER_NO_AUTO_OPEN=1 のほか、NO_AUTO_OPEN=1・NO_AUTO_BROWSER=1 でも止まります。Node.jsは20.12.0以上が必要です。
待ち受けアドレスにも注意してください。同梱のNext.jsサーバーは HOSTNAME が未設定なら 0.0.0.0 を使うので、既定では全インターフェースで待ち受けます。ビューアには認証がありません。共有ネットワークで起動するなら HOSTNAME=127.0.0.1 を必ず付けてください。
一覧の絞り込み・集約と送信キーの設定値
設定はブラウザのUIから変えられ、現在値は GET /api/config で確認できます。既定値は次の3つです。
| 設定キー | 既定値 | 効果 |
|---|---|---|
| hideNoUserMessageSession | true | ユーザー入力が無いセッションを隠す |
| unifySameTitleSession | true | 最初の入力が同じセッションをまとめる |
| enterKeyBehavior | shift-enter-send | Shift+Enterで送信 |
まとめる判定に使われるのは、セッションJSONのタイトルではなく最初の入力内容です。同じ入力で始まったセッションは、最終更新が新しい1件だけが残ります。前の2つが既定で有効なため、一覧は実際の件数より少なく見えます。作ったはずのセッションが見当たらないときは、まずこの2つをオフにしてください。
OpenCode Viewerのセッション再開・中断の仕組み
OpenCode Viewerは表示専用ではなく、ブラウザから新規セッションの開始と再開もできます。サーバー側が opencode run --format json を子プロセスとして起動し、再開時は --session <セッションID> を加えてメッセージを渡します。出力されたJSONイベントを読み、SSE(Server-Sent Events)でブラウザへ送る作りです。
実行中タスクの状態は running・waiting・completed・failed の4つです。UIのAbortボタンは POST /api/tasks/abort を呼び、サーバーが子プロセスへSIGTERMを送って止めます。中断してもセッションは残るので、同じセッションへ次のメッセージを送れば続きから再開できます。ただし再開が成り立つのは、PATH上のopencodeがそのセッションを持っている場合だけです。旧JSONのログを表示できても、現行のopencodeにそのセッションが無ければ再開はできません。
画面に出るIDと内部IDの違い
ビューアのURLに出るIDは、opencodeのセッションIDではありません。ビューアはセッションJSONのファイルパスをbase64urlでエンコードした文字列をセッションIDとして扱い、プロジェクトIDにはワークスペースパスのSHA-1ハッシュを使います。CLIへ渡すべきIDは、セッションJSONの id フィールド(ses_ で始まる値。画面ではsessionIdバッジからコピーできる)のほうです。取り違えると --session が通りません。
Git差分表示とファイル補完API
ビューアにはGit連携があり、ブランチとコミットの一覧取得と、2つのリファレンス間の差分表示ができます。差分APIは POST /api/projects/:projectId/git/diff で、fromRef と toRef の両方が必須です。toRef に作業ツリーを表す working を指定すれば、HEAD との比較で未コミットの変更を見られます。このときに限り、git status --untracked-files=all --short で拾った未追跡ファイルも、全行を追加行とする差分として結果に混ざります。エージェントが新しく作ったファイルを見落とさない作りです。
入力欄のパス補完は GET /api/projects/:projectId/file-completion が担い、basePath で指定したディレクトリを1階層だけ読みます。ドットで始まる名前は候補から外れます。プロジェクト外のパスをはじく検査はパス文字列の前方一致だけで判定しているため、同じ接頭辞を持つ隣のディレクトリまでは弾けません。
公式機能で履歴を見る・再開する:V1とV2のコマンド対応
OpenCode Viewerが公開された2025年10月と違い、今のopencodeは同じことを公式機能でこなせます。ただし、使うコマンドはV1とV2で違います。
ブラウザで開く:V1のopencode webとV2のopencode pair
V1では opencode web でサーバーを立て、ブラウザを開きます。V1の公式ドキュメントは「デフォルトでは、OpenCode は使用可能なポートを選択します。」と説明しています。同じサーバーをブラウザなしで立てる opencode serve の場合、1.19.3でポートを指定せずに起動すると127.0.0.1:4096で待ち受けました。パスワードは OPENCODE_SERVER_PASSWORD で設定し、未設定だと「server is unsecured」と警告したうえで無認証で動きます。ユーザー名の既定は opencode です。
# V1
opencode web # ブラウザが開く
opencode web --port 4096 # ポートを固定する
OPENCODE_SERVER_PASSWORD='長く固有のパスワード' opencode web --hostname 0.0.0.0
# V2
opencode pair # 1回限りの接続リンクを表示する
opencode serve # Web UIとAPIのサーバーだけを立てる
V2には opencode web がありません。V2の公式ドキュメントは、Webインターフェースへの入口を opencode pair と案内しています。実行すると、裏で共有のバックグラウンドサービスが立ち上がり、http://127.0.0.1:<ポート>/auth/connect/... という接続リンクが表示されます。リンクは1回だけ有効で、5分で失効します。別の端末から開くには opencode service set hostname 0.0.0.0 が必要です。--remote を付けるとOpenTunnel経由でインターネットに公開されるため、社内コードを扱う環境では使わないでください。
V2の opencode serve も既定は127.0.0.1:4096で、ルートでWeb UIを返します。V1と違うのは、OPENCODE_SERVER_PASSWORD が未設定でも無認証にならない点です。起動のたびにランダムなパスワードを作り、server password ... として表示します。Basic認証のユーザー名は opencode で、それ以外の名前では401が返りました。
一覧・再開・エクスポートのCLI対応表
| やりたいこと | V1(1.19.3) | V2(2.0.32) |
|---|---|---|
| セッション一覧 | opencode session list | opencode session list |
| 直前を再開 | opencode -c | opencode -c |
| ID指定で再開 | opencode -s <ID> | opencode -s <ID> |
| 分岐して再開 | –fork | なし |
| JSONで書き出し | opencode export <ID> | opencode session export <ID> |
| 取り込み | opencode import <file> | opencode session import <file> |
| 削除 | opencode session delete <ID> | opencode session delete <ID> |
| DBのパス | opencode db path | opencode debug paths db |
| 共有URL | TUIで /share | 削除済み |
session list はどちらも -n(--max-count)で件数を絞り、--format json で機械可読に出せます。V2のヘルプは「List top-level sessions in the current project, newest first」と説明しており、一覧に出るのは今いるプロジェクトのセッションだけです。別のリポジトリで作ったセッションが見当たらないときは、そのディレクトリへ移ってから実行してください。exportの --sanitize(機微な内容とファイルデータを伏せる)は両方にあります。
V2の --session には落とし穴があります。ヘルプの説明は「Session ID to continue, or to create if it does not exist」で、存在しないIDを渡すとエラーにならず、そのIDで新しいセッションが作られます。IDを打ち間違えても空のセッションが開くだけなので、続きが出てこないときはまずIDを確かめてください。なお、opencode resume というサブコマンドはV1・V2のどちらにもありません。
V1ではTUI内で /share を実行すると opncd.ai/s/<share-id> 形式の公開URLが発行されます。既定の共有モードはmanualで、実行しない限り共有はされません。リンクを知っている人なら誰でも会話を読めるので、業務では共有を無効にする運用も検討してください。V2のキーバインド定義では、この操作が「Deprecated: session sharing was removed」となっています。V2で会話を人に渡すなら opencode session export のJSONを使います。opencode本体の設定や料金はOpenCodeの基本と設定で扱っています。
OpenCode Viewerを選ぶべきでない場面と代替
これから環境を組むなら、OpenCode Viewerは選ばないほうがよいと判断します。読み取る形式が現行の保存方式と合っておらず、その差を埋める更新が1年入っていないためです。V2ではDBのテーブル構成も変わっており、旧JSON形式を読む現行ビューアではV2の履歴を表示できません。次に当てはまるなら別の手段を使ってください。
- opencodeを最近入れた。V1・V2とも
storageディレクトリが作られないので、表示できるものがありません。 - ブラウザUIが欲しいだけ。V1なら
opencode web、V2ならopencode pairが本体の履歴を表示します。ただし、V1のWeb UIはパスワードを設定しないと無認証で動作します。ブラウザでAIコーディングを完結させる考え方はClaude Code Web版とも共通しますが、こちらは手元にサーバーを立てる方式です。 - 複数のAIコーディングツールの履歴をまとめて見たい。cc-sessions-viewer(Rust・MIT)はClaude Code・Codex・opencodeなど複数エージェントのセッションを1画面で扱えます。ただしV2の
session_v2系テーブルに対応しているかは、導入前に確かめてください。
旧形式の storage ディレクトリを保存してあり、その過去ログだけを読み返したいという限定用途なら、今も役に立ちます。その場合は OPENCODE_STORAGE_ROOT でアーカイブのパスを指定し、HOSTNAME=127.0.0.1 を付けて、普段の環境とは切り離して起動してください。
よくある質問
opencodeの会話履歴はどこに保存されますか?
V1・V2とも ~/.local/share/opencode/opencode.db というSQLiteファイルです。V1は opencode db path、V2は opencode debug paths db で、その環境での正確なパスが出ます。XDG_DATA_HOME や OPENCODE_DB を設定している場合はそちらが優先されます。
opencodeで中断したセッションを再開するにはどうすればよいですか?
直前のセッションなら opencode -c(--continue)、特定のセッションなら opencode -s <セッションID>(--session)です。IDは opencode session list で確認できます。V1では --fork を付けると分岐して再開できますが、V2にはこのフラグがありません。opencode resume というコマンドはありません。
opencodeのセッションをエクスポートして別の環境へ移せますか?
同じ系統どうしなら移せます。V1は opencode export <ID> > session.json と opencode import、V2は opencode session export と opencode session import です。V1で書き出したJSONはV2の session import で「Missing key [“info”][“location”]」になり、取り込めませんでした。
OpenCode Viewerにセッションが1件も表示されないのはなぜですか?
読みに行く storage/session ディレクトリが無いためです。現行のopencodeはSQLiteに保存するので、新規環境ではJSONのディレクトリが作られません。旧形式のデータが別の場所に残っているなら OPENCODE_STORAGE_ROOT で指定します。データはあるのに件数が合わないときは、hideNoUserMessageSession と unifySameTitleSession が既定でオンになっている影響を疑ってください。
opencodeをブラウザで操作するにはどうすればよいですか?
V1は opencode web、V2は opencode pair で表示される1回限りのリンクを開きます。どちらも既定では127.0.0.1でだけ待ち受けます。LANの別端末から使うなら、V1は --hostname 0.0.0.0 と OPENCODE_SERVER_PASSWORD、V2は opencode service set hostname 0.0.0.0 を設定します。