OpenWork

OpenCode エンジン上に構築されたオープンソース GUI デスクトップクライアント — Claude Cowork のオープンな代替

1 — 概要

OpenWork は、Claude Cowork / Codex に相当するオープンソースのデスクトップアプリ。OpenCode をエンジンとして使い、UI・オンボーディング・安全性・権限管理・進捗表示を担うエクスペリエンス層として機能する。ローカルファースト・クラウド対応・ロックインなし。

Localファースト
MITライセンス
Tauriデスクトップシェル
SSEリアルタイム

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: ヒューリスティック自動検出より明示的設定を優先。逃げ道と失敗理由を常に提示。
Non-Goals: OpenCode CLI/TUI を置き換えない。OpenCode API にマップしない「マジック機能」を作らない。
2 — アーキテクチャ
パス役割
/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 操作はホストモードのフォールバックであり、主要な機能サーフェスではない。

Reload-required フロー: opencode.json / .opencode/skills/** / MCP 定義などの変更後は markReloadRequired(reason, trigger) を呼び出し、共通のリロードポップアップに委ねる。機能ごとに個別バナーを作らない。
3 — ランタイムモード
Mode A — Desktop

ローカルホスト

OpenWork が OpenWork サーバーをローカルで起動。OpenCode は 127.0.0.1:4096 で稼働。リモート共有は明示的 opt-in で 0.0.0.0 にリバインド。

  • デフォルトランタイム: openwork-orchestrator
  • フォールバック: direct(Tauri が OpenCode を直接起動)
  • ポート範囲: 48000–51000(ワークスペースごとに固定)
Mode B — Web / Cloud

クラウドワーカー

ホスト型 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
4 — 拡張機能
プリミティブユースケース特徴・注意点
MCPOAuth が必要なサードパーティ連携認証 + ケーパビリティの境界が明確。サーバーの露出範囲に制限あり
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" は明示的かつ取り消し可能。

5 — セットアップ
  • 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 上に opencode CLI がインストール済み
# クローン後、依存関係をインストール
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:uiWeb UI のみ起動
pnpm typecheck型チェック
pnpm buildプロダクションビルド
pnpm build:uiWeb UI ビルド
pnpm test:e2eE2E テスト
Linux / Wayland (Hyprland): WebKitGTK エラーで起動に失敗する場合は WEBKIT_DISABLE_DMABUF_RENDERER=1 openwork または WEBKIT_DISABLE_COMPOSITING_MODE=1 openwork を試す。
6 — コントリビューション
  • AGENTS.md / VISION.md / PRINCIPLES.md / PRODUCT.md / ARCHITECTURE.md を読む
  • Node.js・pnpm・Rust ツールチェーン・opencode が揃っていることを確認
  • pnpm installpnpm typecheckpnpm test:e2e でベースラインを確認
  • Issue リンクとスコープが明確
  • 動作変更にはテストを追加・更新
  • PR 本文に実行コマンドと結果を記載
  • UI 変更にはスクリーンショット・動画を添付
  • CI 失敗はコード起因かインフラ/外部起因かを分類
  • 新しい PRD は apps/app/pr/<name>.md に追加