Multi session/project opencode manager
  • Go 54.1%
  • TypeScript 41.3%
  • CSS 3.7%
  • Shell 0.5%
  • Makefile 0.3%
Find a file
Dries De Peuter 94fb098933
All checks were successful
CI / Frontend (pull_request) Successful in 6m27s
CI / Backend (pull_request) Successful in 6m53s
CI / Coverage Results (pull_request) Successful in 33s
CI / Playwright E2E (pull_request) Successful in 8m52s
CI / Build (pull_request) Successful in 3m37s
CI / Semantic Tag (pull_request) Successful in 5s
CI / Frontend (push) Successful in 6m44s
CI / Backend (push) Successful in 6m47s
CI / Coverage Results (push) Successful in 38s
CI / Playwright E2E (push) Successful in 9m12s
CI / Build (push) Successful in 3m42s
CI / Semantic Tag (push) Successful in 6s
Pages / Build and publish site (push) Successful in 21s
ci: pick the hugo tarball matching the runner arch
2026-07-31 13:29:55 +02:00
.beads bd init: initialize beads issue tracking 2026-07-26 03:13:53 +02:00
.github/workflows ci: pick the hugo tarball matching the runner arch 2026-07-31 13:29:55 +02:00
.opencode chore: rename ocman sessions skill 2026-07-26 03:13:53 +02:00
build/darwin chore: add Wails macOS Info.plist template 2026-05-16 09:56:17 +02:00
docs docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
examples/workflows docs: add Hacker News Dagu workflow example 2026-07-26 12:57:40 +02:00
frontend fix: show OpenCode always-allow patterns on permission confirm 2026-07-31 01:34:05 +02:00
internal fix: make follow-up queueing explicit 2026-07-31 01:33:52 +02:00
observability/grafana feat(otel): per-session filter on LLM dashboard metrics 2026-07-04 12:15:42 +02:00
scripts Merge remote-tracking branch 'origin/main' into pr468 2026-07-27 11:26:26 +02:00
site docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
spec docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
.air.remote.toml feat(dev): add remote dev target 2026-07-03 16:16:25 +02:00
.air.toml chore: Kill orphaned dev-server processes on make start 2026-04-24 20:19:48 +02:00
.envrc.example chore: Ignore direnv files and add .envrc.example 2026-04-21 20:46:57 +02:00
.gitignore docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
.golangci.yml chore: add golangci-lint 2026-07-08 21:31:48 +02:00
.pre-commit-config.yaml ci: ratchet test coverage via gh-pages baseline 2026-06-11 08:56:33 +02:00
AGENTS.md fix: make follow-up queueing explicit 2026-07-31 01:33:52 +02:00
Caddyfile feat: replace dictation overlay with Speech API + Caddy/Tailscale HTTPS 2026-05-16 11:12:05 +02:00
cliff.toml ci: generate release changelog from conventional commits 2026-05-05 23:49:51 +02:00
docker-compose.otel.yml feat: Add OpenTelemetry traces and metrics behind --otel flag 2026-04-30 07:54:31 +02:00
go.mod Merge branch 'main' into feat/dagu-command-workflows 2026-07-27 23:50:16 +02:00
go.sum Merge branch 'main' into feat/dagu-command-workflows 2026-07-27 23:50:16 +02:00
LICENSE fix: More 2026-04-16 00:33:45 +02:00
main.go feat: execute agent and approval nodes through a workflow-step shim 2026-07-26 12:57:40 +02:00
main_test.go feat: authenticate managed opencode traffic (#377) 2026-07-20 01:54:22 +02:00
Makefile docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
mise.toml docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
path_env.go fix: preserve Ctrl+C after login shell path lookup 2026-07-28 23:17:51 +02:00
path_env_test.go fix: preserve Ctrl+C after login shell path lookup 2026-07-28 23:17:51 +02:00
README.md docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
wails.json chore: switch frontend tooling from npm to pnpm 2026-05-16 23:59:12 +02:00

ocman

CI Release License: MIT

A web dashboard for browsing and driving your coding-agent sessions. Supports OpenCode and Claude Code.

ocman dashboard

Features

  • Session browser — List, search, archive, and replay every session. Sessions are grouped by project with status indicators and a + button to start new ones.
  • Live composer — Send messages, respond to permission prompts, abort, and compact a running session straight from the browser. Streaming output renders live.
  • Bash mode — Prefix a message with ! to run a shell command in the session's working directory and capture the output.
  • Command palette — Unified ⌘K palette for jumping between sessions, settings, and actions, with in-app notifications.
  • Slash commands/new [title] to create a session, /clear to archive the current one and start fresh, plus keyboard-driven session rename.
  • Tmux integration — Launch or auto-launch an OpenCode instance inside tmux directly from the UI.
  • Scheduled prompts — Run one stored project prompt later in a fresh OpenCode session, with durable status and session linkage.
  • Multi-remote — Attach other ocman instances over the network and manage every machine's sessions from one dashboard, with a host badge per session and machine-aware new-session creation. See Multi-remote.
  • Diff & changes view — Syntax-highlighted diffs inline in the thread, plus a Changes sidebar combining session edits with the working-tree git diff.
  • Stats dashboard — Per-project metrics, wall-clock totals, token/pricing graphs, and system stats.
  • Model picker — Per-platform favorites and a refreshable catalog so new models appear without restarting.
  • Auth — Optional password gate with rate-limited logins and persistent signed cookies. Off by default for localhost.
  • PWA — Installable as a Progressive Web App.

Quick start

# Run directly against the OpenCode database
./ocman
# Open http://localhost:8228

Download the latest binary from the releases page, or build from source with make build (requires Go 1.24+ and Node.js 22+).

macOS desktop app

The releases page also ships ocman-darwin-arm64.dmg — a drag-to-Applications installer for the native desktop build. The DMG is not signed or notarized, so macOS Gatekeeper will refuse to open the app on first launch with a "cannot be opened because the developer cannot be verified" warning.

To bypass:

  1. Open the DMG and drag ocman.app to /Applications.
  2. In Finder, right-click (or Control-click) ocman.appOpen.
  3. Confirm Open in the dialog. macOS remembers the choice and subsequent launches work normally.

Alternative — strip the quarantine attribute from a terminal:

xattr -dr com.apple.quarantine /Applications/ocman.app

The easiest way to get interactive sessions (composer, permission replies, abort) is to launch them from ocman itself — via the command palette (/wt for worktrees) or the per-project Worktrees view. Ocman manages one OpenCode instance per project and connects automatically.

If you prefer running OpenCode yourself, start it with an explicit port so ocman can discover it:

opencode --port 0   # let OpenCode pick a free port

Without --port, externally launched sessions are still readable but the composer stays disabled.

Configuration

./ocman                              # default: listens on 127.0.0.1:8228
./ocman -addr localhost:9090         # custom listen address
./ocman -db /path/to/opencode.db     # custom OpenCode database path
./ocman -platforms opencode,claude-code  # enable multiple platforms

See Configuration for the full flag and environment variable reference, including authentication setup.

Optional agent integration

Ocman works as a dashboard without any agent integration. It also embeds an optional, localhost-only MCP server so an AI agent can split work into child OpenCode sessions or isolated git worktrees and coordinate between them (new_session, await_session_result, get_session_status, list_child_sessions, cancel_session, and parent/child message tools).

Point your OpenCode config at http://localhost:8229/mcp (or http://localhost:8228/mcp via the make dev proxy). See the MCP integration guide for setup, the full tool list, and the optional session-splitting skill.

Managing sessions across machines

Run ocman on several machines and manage them all from one hub. On each machine you want to manage remotely, start ocman with a gRPC listen address:

ocman -remote-listen 0.0.0.0:8230 \
  -remote-tls-cert cert.pem -remote-tls-key key.pem

Then on the hub, open Settings → Remotes → Attach a remote, paste the remote's address and its access token (revealed from the remote's own Settings → Remotes page), and its sessions join the unified list with a host badge. Opening, driving, and creating sessions all route to the owning machine automatically.

This is off by default — a plain ./ocman with no remotes is unchanged. See the step-by-step multi-remote guide for TLS, security notes, and troubleshooting.

Documentation

docs/ mirrors the site structure — five chapters, same layout in the repo and on the rendered site (make docs).

License

This project is licensed under the MIT License. See LICENSE for details.