OpenCode Viewerは、opencodeの対話セッションをブラウザ上で一覧・再開・中断できるサードパーティ製のWebクライアントです。ただし公開から約1年が経ち、opencode本体のほうがセッションの保存方式を変え、さらに公式のWeb UIまで用意しました。この記事では、OpenCode Viewerで何ができるのかを実装ベースで整理したうえで、2026年9月時点で履歴を確実に見るならどの手段を選ぶべきかを示します。
まとめ:保存形式に応じた履歴閲覧手段の選択
- opencode v1.18.31のセッションは
~/.local/share/opencode/opencode.db(SQLite)に入ります。パスはopencode db pathで確認できます。 - OpenCode Viewer(
@nogataka/opencode-viewerv0.0.3)が読むのは、旧形式のstorage/session・storage/message・storage/partというJSONディレクトリです。新規環境ではこのディレクトリ自体が作られません。 - ブラウザで見たいだけなら、まず公式の
opencode webを試すのが最短です。一覧と再開はCLIのopencode session listとopencode --sessionでも足ります。 PORTを指定せずに起動したときの待ち受けポートは5757です。READMEにある3400は開発用スクリプトの値で、公開版のCLIには当てはまりません。- OpenCode Viewerのnpm公開版はv0.0.3(2025年10月2日公開)、GitHubの最終コミットは2025年10月3日で、以後の更新はありません(star 9・fork 0、2026年9月18日時点)。
旧形式で残ったログを読み返したいのか、いま動いているセッションを見たいのかで、選ぶ手段が変わります。以下、ビューアの実装と公式機能を順に確認します。
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は2026年9月18日時点でstar 9・fork 0、最終コミットは2025年10月3日です。npmの最新版は0.0.3で、公開日は2025年10月2日。コミットは2025年10月1日から3日までの3日間に収まっており、継続的にメンテナンスされる前提では選べません。
スコープ付きパッケージ名と同名ツールの違い
インストール時に取り違えが起きやすいのがパッケージ名です。npmには opencode-viewer というスコープなしの別パッケージが存在し、こちらはopencode-interceptorが記録したLLM通信を閲覧するまったく別のツールです。この記事で扱うOpenCode Viewerは、必ずスコープ付きの @nogataka/opencode-viewer で指定してください。
opencodeのセッション履歴の保存先と保存形式
履歴が見つからないときは、ビューアが読む旧JSON形式と、使っているopencodeの保存形式が一致しているかを最初に確認してください。ここが分かれ目なので、現行版と旧形式を分けて見ていきます。
現行v1.18.31はSQLiteの単一ファイル
opencode v1.18.31では、セッション本体はJSONファイルではなくSQLiteデータベースに保存されます。パスを知るコマンドが用意されています。
$ opencode db path
/Users/you/.local/share/opencode/opencode.db
$ opencode db "select name from sqlite_master where type='table' order by name"
name
account
credential
message
part
project
session
session_share
workspace
出力はTSVで、name という見出しのあとに1行1テーブルで並びます(上の例は主なものの抜粋です)。実体は Global.Path.data(XDGのデータディレクトリ配下の opencode)に置かれる opencode.db で、WALモードのため opencode.db-wal と opencode.db-shm が並びます。セッションは session テーブル、メッセージは message テーブル、メッセージの構成要素は part テーブルという対応です。共有状態も session_share テーブルとしてDB側にあります。
重要なのは、v1.18.31を新規に導入して起動しても storage ディレクトリが一切作られない点です。データディレクトリに現れるのは opencode.db 系の3ファイルと log・repos だけでした。
旧形式のJSONディレクトリとOPENCODE_STORAGE_ROOT
OpenCode Viewerが前提にしているのは、これより前の保存形式です。具体的には ~/.local/share/opencode/storage/ の下に session・message・part の3ディレクトリが並び、それぞれJSONファイルが置かれている構造を読みます。パス決定の実装は XDG_DATA_HOME があればそれを、無ければ ~/.local/share を基点にし、OPENCODE_STORAGE_ROOT が設定されていればそちらで上書きする、という順序です。
したがって、古いバージョンから使い続けていて storage ディレクトリが手元に残っている環境なら、OpenCode Viewerは今でもその過去ログを読めます。実際、旧形式のディレクトリを OPENCODE_STORAGE_ROOT で指定してv0.0.3を起動すると、GET /api/projects はHTTP 200でプロジェクト一覧と各プロジェクトのセッション件数を返します(セッション一覧はプロジェクト個別のAPIが返します)。逆に、旧形式のJSONがどこにも残っていなければ、表示できるものはありません。注意したいのは反対のケースです。SQLiteへ移行済みの環境でも古いJSONが残っていれば、ビューアはそちらを読むため、画面に出ているのが現在の履歴とは限りません。
OpenCode Viewerの起動とポート・表示設定
以下はbashとzshでの起動例です。npxでの実行、グローバル導入後の実行、環境変数を添えた実行の3通りを示します。いずれもローカルにWebサーバーを立てます。自動起動を抑止していない例では、サーバーが応答できる状態になると既定ブラウザが開きます。
# インストールせずに実行(ポート未指定なら5757で待ち受ける)
npx @nogataka/opencode-viewer@latest
# ポートを固定する
PORT=3400 npx @nogataka/opencode-viewer@latest
# グローバル導入
npm install -g @nogataka/opencode-viewer
opencode-viewer
# 待ち受けを自端末に限定し、ブラウザ自動起動を抑止し、旧形式の保存先を明示する
HOSTNAME=127.0.0.1 CC_VIEWER_NO_AUTO_OPEN=1 \
OPENCODE_STORAGE_ROOT=~/.local/share/opencode/storage \
npx @nogataka/opencode-viewer@latest
ここで注意が要るのがポート番号です。READMEが書いている既定ポート3400は、npmで配布されているCLIには当てはまりません。公開版に含まれる dist/index.js は PORT が未設定のとき5757を代入するため、何も指定せずに起動すると http://localhost:5757 で待ち受けます。3400はリポジトリの開発用スクリプトが使う値です。番号を固定したいときは PORT を明示してください。自動起動の抑止は 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で送信(Enterは改行) |
まとめる判断に使われるのはセッションJSONのタイトルではなく、最初の入力内容です。テキスト入力なら本文、コマンドなら名前と引数が比較対象になります。同じ入力で始まったセッションは最終更新が新しいものだけが残ります。前の2つが既定で有効なため、セッションは実際の件数より少なく見えます。「作ったはずのセッションが一覧に無い」と感じたら、まずこの2つをオフにして確認してください。日本語入力ではIMEの確定Enterが送信に化けやすいため、enterKeyBehavior の既定が shift-enter-send である点も実用上は効いてきます。
セッション再開・中断の実装とCLI操作
OpenCode Viewerは表示専用ではなく、ブラウザから新規セッション開始と再開の指示を出せます。内部では、サーバー側がopencodeのCLIプロセスを起動する形をとっています。引数は 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形式のセッションを扱える場合に限られます。旧ログが表示できることと、そこから再開できることは別です。
なお、ビューアを使わずCLIだけで再開する場合は opencode --continue(短縮形 -c)で直前のセッションを、opencode --session <セッションID>(短縮形 -s)で特定のセッションを継続できます。opencode resume というサブコマンドは存在しないため、記事や記憶を頼りに打つと失敗します。
画面に出るIDと内部IDの違い
URLに現れるIDは、opencodeが発行したセッションIDそのものではありません。ビューアはセッションJSONのファイルパスをbase64urlでエンコードした文字列をセッションIDとして扱い、プロジェクトIDにはワークスペースパスのSHA-1ハッシュを使っています。CLIへ渡すべきIDは、セッションJSONの id フィールド(画面上ではsessionIdバッジからコピーできる値)のほうです。この2つを取り違えると --session が通りません。
Git差分表示とファイル補完API
ビューアにはGit連携があり、ブランチ一覧とコミット一覧の取得、および2つのリファレンス間の差分表示ができます。差分APIは POST /api/projects/:projectId/git/diff で、fromRef と toRef の両方が必須です。ただし toRef には作業ツリーを表す working を指定でき、fromRef を HEAD、toRef を working にすれば未コミットの変更を比較できます。ブランチやコミットを指すときは 種別:参照名 というコロン区切りの書式で渡します。
特徴的なのは未追跡ファイルの扱いです。toRef を working にしたときに限り、未追跡ファイルも差分に加わります。git diff は追跡外のファイルを出力しないため、サーバー側で git status --untracked-files=all --short を実行して未追跡ファイルを列挙し、その全行を追加行とみなす差分を組み立てて結果に混ぜています。AIエージェントが新規作成したファイルを見落とさない、という点では実用的な作りです。
もう一つ、対話入力欄のパス補完は GET /api/projects/:projectId/file-completion が担い、basePath クエリ(既定値は /)で候補を絞ります。実装は指定したディレクトリを1階層だけ readdir するもので、再帰的な探索はしません。ドットで始まるファイルとディレクトリは候補から除外されます。プロジェクト外を指すパスをはじく検査もありますが、パス文字列の前方一致で判定しているだけなので、同じ接頭辞を持つ隣のディレクトリまでは確実には弾けません。
OpenCode Viewerが公開された2025年10月時点と違い、現在のopencodeは同種の機能を公式に持っています。third-partyツールを入れる前に、こちらで足りないかを確認するのが先です。
公式ブラウザUI「opencode web」の起動と認証設定
ブラウザで操作したいという目的は、公式コマンドで直接満たせます。
opencode web # ポート未指定なら4096を優先し、使用中なら空きポートへ
opencode web --port 4096 # ポートを固定する
OPENCODE_SERVER_PASSWORD='長く固有のパスワード' opencode web --hostname 0.0.0.0 # LAN内の別端末から使う
起動するとHTTPサーバーが立ち、ブラウザにOpenCodeの画面が表示されます。ポートを指定しない場合は、公式ドキュメントの説明(ランダムな空きポート)とは違い、v1.18.31のサーバー実装はまず4096を試し、確保できないときだけ空きポートへ回ります。ホスト名を 0.0.0.0 にするとローカルとネットワークの両方のアドレスが表示され、--mdns を付ければ opencode.local として同一ネットワークに広告されます。ただし OPENCODE_SERVER_PASSWORD を設定しないとサーバーは無認証で、起動時に警告が出ます。LANへ開くなら必ず設定してください。認証時の既定ユーザー名は opencode です。
ブラウザを自動で開かずサーバーだけ起動したいときは opencode serve を使います。こちらもルートで同じWeb UIを返し、OpenAPI定義は /doc から取得できます。ブラウザでAIコーディングを完結させる方向はClaude Code Web版にも共通します。ただし opencode web は手元にサーバーを立てる方式で、クラウド側で実行するものではありません。
セッション一覧・エクスポートのCLI操作とTUIでの共有
履歴まわりの操作はCLIに揃っています。opencode session list でセッション一覧、opencode session delete <セッションID> で削除、opencode export <セッションID> でJSONを標準出力へ書き出し、opencode import <ファイル> で取り込みです。エクスポートには --sanitize があり、機微な内容とファイルデータを伏せて出力できます。トークン消費とコストの集計は opencode stats です。
セッションの共有だけはCLIのサブコマンドではなく、TUI内のスラッシュコマンド /share で行います。共有モードの既定はmanualで、明示的に実行しない限り自動共有はされません。発行されるURLは opncd.ai/s/<share-id> という形式で、リンクを知っている人は誰でも会話を閲覧できます。社内コードの相談内容がそのまま公開URLになるため、業務利用では共有モードを無効化する運用も検討してください。opencode本体の設定ファイルや料金体系はOpenCodeの基本と設定の側で扱っています。
OpenCode Viewerを選ぶべきでない場面と代替
結論から言えば、これから新しく環境を組むならOpenCode Viewerは選ばないほうがよいと考えます。読み取り対象が現行の保存方式と食い違っており、その差を埋める更新が1年近く入っていないためです。次の条件に当てはまる場合は、素直に別の手段を採ってください。
- opencodeを最近入れた、または既にSQLiteへ移行済み。
storageディレクトリが存在しないなら表示できるものがありません。 - ブラウザUIが欲しいだけ。
opencode webのほうが本体と同期し、認証・LAN公開・mDNSまで揃っています。 - 複数のAIコーディングツールの履歴をまとめて見たい。cc-sessions-viewer(star 378・Rust・MIT)はClaude Code・Codex・Kimi Code・Antigravity CLI・opencodeなど複数エージェントのセッションを1画面で扱えます。klovi(MIT)も同系統の選択肢です。
逆に、旧形式の storage ディレクトリを丸ごと保全していて過去ログだけを読み返したい、という限定用途ではまだ役に立ちます。その場合も OPENCODE_STORAGE_ROOT でアーカイブのパスを明示し、現役の環境とは切り離して起動するのが安全です。
よくある質問
opencodeの会話履歴はどこに保存されますか?
v1.18.31では ~/.local/share/opencode/opencode.db というSQLiteファイルです。opencode db path を実行すると、その環境での正確なパスが出力されます。XDG_DATA_HOME を設定している場合は、通常その配下になります。OPENCODE_DB でDBのパスを上書きしているときは、そちらが優先されます。
中断したセッションを再開するにはどうすればよいですか?
直前のセッションなら opencode --continue(または -c)、特定のセッションを指定するなら opencode --session <セッションID>(または -s)です。継続せず分岐させたいときは --fork を併用します。opencode resume というコマンドはありません。
セッションを他の人に共有・エクスポートできますか?
共有はTUIで /share を実行すると opncd.ai/s/<share-id> 形式の公開URLが発行されます。既定は手動共有なので、この操作をしない限り共有URLは発行されません(対話そのものは利用中のAIプロバイダーへ送られます)。ファイルとして渡したい場合は opencode export <セッションID> > session.json のように標準出力を保存し、受け手が opencode import で取り込みます。
OpenCode Viewerにセッションが1件も表示されないのはなぜですか?
読みに行く storage/session ディレクトリが存在しない可能性が高いです。現行のopencodeはセッションをSQLiteに保存するため、新規環境ではJSONディレクトリが作られません。旧形式のデータが別の場所に残っているなら OPENCODE_STORAGE_ROOT で指定してください。データはあるのに件数が合わない場合は、hideNoUserMessageSession と unifySameTitleSession が既定でオンになっている影響を疑います。
opencode webとOpenCode Viewerはどちらを使うべきですか?
通常は opencode web です。本体に同梱されているため保存方式の変更に追随し、パスワード認証やネットワーク公開の設定も用意されています。OpenCode Viewerを選ぶ理由が残るのは、旧形式で保存された過去ログを読み返したい場合に限られます。