OpenWork
OpenCode エンジン上に構築されたオープンソース GUI デスクトップクライアント — Claude Cowork のオープンな代替
OpenWork は、Claude Cowork / Codex に相当するオープンソースのデスクトップアプリ。OpenCode をエンジンとして使い、UI・オンボーディング・安全性・権限管理・進捗表示を担うエクスペリエンス層として機能する。ローカルファースト・クラウド対応・ロックインなし。
OpenCode = エンジン / OpenWork = エクスペリエンス。OpenCode が持つすべての API・SDK・プリミティブをそのまま活用し、カスタム実装を最小限に抑える設計思想。
- Local-first, cloud-ready: ワンクリックでローカル起動、必要に応じてリモート接続。
- Composable: デスクトップアプリ・WhatsApp/Slack/Telegram コネクタ・サーバー CLI を自由に組み合わせ。
- Ejectable: OpenCode が動くことはすべて OpenWork でも動く。UI がなくても OK。
- Sharing is caring: localhost ソロからはじめ、必要なときだけリモート共有に opt-in。
- Predictable > Clever: ヒューリスティック自動検出より明示的設定を優先。逃げ道と失敗理由を常に提示。
| パス | 役割 |
|---|---|
/apps/app/ | OpenWork UI — デスクトップ・モバイル・Web クライアントの体験層 |
/apps/desktop/ | Tauri シェル。ネイティブプロセスのライフサイクルと engine_* / orchestrator_* コマンドを管理 |
/apps/server/ | OpenWork サーバー — UI が消費する API・コントロール層。FS 操作と OpenCode へのプロキシが中心 |
/apps/orchestrator/ | CLI デーモン。host モードで OpenWork server + OpenCode + opencode-router を管理 |
/apps/opencode-router/ | Slack/Telegram メッセージブリッジ。(channel, identityId, peerId) → directory でルーティング |
/apps/share/ | OpenWork バンドルのシェアリンク公開サービス |
/ee/apps/den-* | クラウド制御プレーン (den-api)・プロキシ (den-worker-proxy)・ランタイム (den-worker-runtime) |
すべてのファイルシステム変更は OpenWork サーバーを経由する。これにより、ローカル・リモート問わず権限チェック・承認・監査ログが一元化される。Tauri のネイティブ FS 操作はホストモードのフォールバックであり、主要な機能サーフェスではない。
opencode.json / .opencode/skills/** / MCP 定義などの変更後は markReloadRequired(reason, trigger) を呼び出し、共通のリロードポップアップに委ねる。機能ごとに個別バナーを作らない。
ローカルホスト
OpenWork が OpenWork サーバーをローカルで起動。OpenCode は 127.0.0.1:4096 で稼働。リモート共有は明示的 opt-in で 0.0.0.0 にリバインド。
- デフォルトランタイム:
openwork-orchestrator - フォールバック:
direct(Tauri が OpenCode を直接起動) - ポート範囲:
48000–51000(ワークスペースごとに固定)
クラウドワーカー
ホスト型 Web コントロールサーフェスにサインイン後、クラウドワーカーを起動。/w/ws_* URL + アクセストークンで OpenWork アプリから接続。
- den-api がワーカーのプロビジョニングを管理
- den-worker-proxy が Daytona APIキーをサーバーサイドに保持
- モバイルクライアントからも同じ接続フローを利用
/apps/app UI
|
v
/apps/desktop (Tauri シェル)
|
+--> /apps/orchestrator (daemon / start/serve host)
| |
| v
| OpenCode (loopback)
|
+--> /apps/server (OpenWork API + proxy)
| |
| +--> OpenCode
| +--> /apps/opencode-router (optional)
|
+--> /apps/opencode-router (optional local child)
Slack / Telegram からのメッセージを OpenCode セッションに転送する。ルーティングキーは (channel, identityId, peerId) → directory。ディレクトリはルートの外に出られず、予測可能なスコープを維持。
Telegram / Slack
|
v
adapter (channel, identityId, peerId)
|
v
router state (bindings / sessions)
|
v
directory resolution
|
v
OpenCode session.prompt
|
v
reply to same chat
| プリミティブ | ユースケース | 特徴・注意点 |
|---|---|---|
| MCP | OAuth が必要なサードパーティ連携 | 認証 + ケーパビリティの境界が明確。サーバーの露出範囲に制限あり |
| Skills | 繰り返し可能なプレーンテキストパターン | 反復性と可読性が高い。Plugins/CLI と組み合わせると強力 |
| Plugins | コードレベルのツールが必要なとき | CLI より安全、MCP より柔軟。権限スコープ付き |
| Agents | 別モデルで実行するサブタスク | メインモデルと異なるコンテキスト・MCP を持てる |
| Commands | /コマンドでツールをトリガー | .opencode/commands/ に Markdown で定義 |
| Bash / CLI | 上級者・内部パワーワークフロー | 最高リスク。コンテキスト・権限クリープに注意 |
インストール済みの .opencode/skills フォルダを一覧表示し、ローカルスキルフォルダを .opencode/skills/<skill-name> にインポートできる UI。将来的にはレジストリ検索・キュレーションリスト同期・サインアップ不要の公開に対応予定。
プラグインは opencode.json で管理される。OpenWork は設定ファイルに書き込んだ後、POST /workspace/:id/engine/reload でエンジンにリロードを伝える。
{
"$schema": "https://opencode.ai/config.json",
"plugin": ["opencode-wakatime"]
}
2 層構造: OpenWork UI がネイティブピッカーで許可ルートを明示管理し、OpenCode サーバーがセッションレベルの権限要求を処理。"Allow once" は永続スコープを拡張しない。"Always allow" は明示的かつ取り消し可能。
- Node.js +
pnpm@10.27.0 - Bun 1.3.9 以上(
bun --versionで確認) - Rust ツールチェーン(Tauri 用):
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh - Tauri CLI:
cargo install tauri-cli - PATH 上に
opencodeCLI がインストール済み
# クローン後、依存関係をインストール
pnpm install --frozen-lockfile
# デスクトップアプリ起動(dev-mode 隔離 ON)
pnpm dev
# Web UI のみ起動(Tauri なし)
pnpm dev:ui
サンティチェック(1 分):
git checkout dev && git pull --ff-only origin dev
pnpm install --frozen-lockfile
which bun && bun --version
pnpm --filter @openwork/desktop exec tauri --version
デスクトップ UI なしで OpenCode + OpenWork サーバーを実行する場合:
npm install -g openwork-orchestrator
openwork start --workspace /path/to/workspace --approval auto
| コマンド | 用途 |
|---|---|
pnpm dev | デスクトップアプリ開発サーバー起動 |
pnpm dev:ui | Web UI のみ起動 |
pnpm typecheck | 型チェック |
pnpm build | プロダクションビルド |
pnpm build:ui | Web UI ビルド |
pnpm test:e2e | E2E テスト |
WEBKIT_DISABLE_DMABUF_RENDERER=1 openwork または WEBKIT_DISABLE_COMPOSITING_MODE=1 openwork を試す。
AGENTS.md/VISION.md/PRINCIPLES.md/PRODUCT.md/ARCHITECTURE.mdを読む- Node.js・pnpm・Rust ツールチェーン・
opencodeが揃っていることを確認 pnpm install→pnpm typecheck→pnpm test:e2eでベースラインを確認
- Issue リンクとスコープが明確
- 動作変更にはテストを追加・更新
- PR 本文に実行コマンドと結果を記載
- UI 変更にはスクリーンショット・動画を添付
- CI 失敗はコード起因かインフラ/外部起因かを分類
- 新しい PRD は
apps/app/pr/<name>.mdに追加