---
title: "OpenCode Viewerとは？opencodeの履歴の保存先・ブラウザ閲覧・再開手順【V2対応】"
url: "https://www.issoh.co.jp/tech/details/9200/"
published: 2025-10-07
updated: 2026-10-19
categories: ["AIエージェント・MCP"]
publisher: "株式会社一創"
---

# OpenCode Viewerとは？opencodeの履歴の保存先・ブラウザ閲覧・再開手順【V2対応】

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-viewer` v0.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](https://github.com/nogataka/opencode-viewer)にそう明記されています。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のページ](https://www.npmjs.com/package/@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ドキュメント](https://opencode.ai/v2/docs/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からの移行ガイド](https://opencode.ai/v2/docs/migrate-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/opencode-viewer@0.0.3

# ポートを固定する
HOSTNAME=127.0.0.1 PORT=3400 npx @nogataka/opencode-viewer@0.0.3

# ブラウザの自動起動を止め、旧形式の保存先を明示する
HOSTNAME=127.0.0.1 CC_VIEWER_NO_AUTO_OPEN=1 \
  OPENCODE_STORAGE_ROOT=~/.local/share/opencode/storage \
  npx @nogataka/opencode-viewer@0.0.3
```

**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の公式ドキュメント](https://opencode.ai/docs/ja/web/)は「デフォルトでは、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の公式ドキュメント](https://opencode.ai/v2/docs/)は、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のどちらにもありません。

### セッション共有（/share）はV2で削除

V1ではTUI内で `/share` を実行すると `opncd.ai/s/<share-id>` 形式の公開URLが発行されます。既定の共有モードはmanualで、実行しない限り共有はされません。リンクを知っている人なら誰でも会話を読めるので、業務では共有を無効にする運用も検討してください。V2のキーバインド定義では、この操作が「Deprecated: session sharing was removed」となっています。V2で会話を人に渡すなら `opencode session export` のJSONを使います。opencode本体の設定や料金は[OpenCodeの基本と設定](/tech/details/10369/)で扱っています。

## 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版](/tech/details/9651/)とも共通しますが、こちらは手元にサーバーを立てる方式です。
- 複数の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` を設定します。

## 関連記事

- [OpenCodeとは？2.0の変更点・インストール・設定・無料モデルを解説【2026年10月】](/tech/details/10369/)
- [Claude Code Web版の使い方：ブラウザでの始め方・料金・CLI版との違い【2026年10月】](/tech/details/9651/)
- [Codex CLIのプロキシ設定・承認モード・オプション一覧｜導入とアンインストール【2026年9月】](/tech/details/8157/)
- [Gemini CLIは終了した？個人向け停止後も使える条件とAntigravity CLI移行手順](/tech/details/7470/)

---

出典: [OpenCode Viewerとは？opencodeの履歴の保存先・ブラウザ閲覧・再開手順【V2対応】](<https://www.issoh.co.jp/tech/details/9200/>)（株式会社一創）
