Multi session/project opencode manager
  • Go 57.5%
  • TypeScript 39%
  • CSS 2.8%
  • Shell 0.4%
  • Makefile 0.2%
Find a file
Dries De Peuter 13c6c4e6fb
Some checks failed
CI / Frontend (push) Failing after 3m9s
CI / Playwright E2E (push) Failing after 3m27s
CI / Backend (push) Successful in 14m32s
CI / Semantic Tag (push) Has been skipped
CI / Coverage Results (push) Failing after 27s
test(settings): wait for auto-archive settings to load before asserting
2026-09-29 08:17:44 +02:00
.beads bd init: initialize beads issue tracking 2026-07-26 03:13:53 +02:00
.forgejo/workflows ci: avoid duplicate production build 2026-09-13 13:55:05 +02:00
.github docs: add contribution guide and GitHub issue template (#635) 2026-09-12 22:01:05 +02:00
.opencode feat(artifacts): add MCP artifacts tool and ocman-artifacts skill 2026-09-28 17:27:36 +02:00
build/darwin chore: add Wails macOS Info.plist template 2026-05-16 09:56:17 +02:00
cmd/ocman-relay feat: harden relay inbox lifecycle 2026-09-13 10:25:32 +02:00
deploy chore: tidy the project root 2026-08-20 09:26:02 +02:00
docs feat(previews): resolve link previews with machine-wide personal tokens 2026-09-28 23:17:45 +02:00
examples docs(plugins): add Slack app blueprint 2026-09-22 13:53:56 +02:00
frontend test(settings): wait for auto-archive settings to load before asserting 2026-09-29 08:17:44 +02:00
internal refactor(previewauth): move grant lifecycle into grants.go 2026-09-28 23:29:59 +02:00
observability/grafana chore: drop stale Claude Code references 2026-08-01 00:43:20 +02:00
scripts fix(installer): probe HTTP on start, clean *.new, honour XDG in uninstall 2026-09-13 22:02:39 +02:00
sdk/plugin feat(plugins): configure Slack conversation models 2026-09-22 13:53:56 +02:00
site docs: document routines and legacy workflow data 2026-09-05 18:04:45 +02:00
spec feat(project-settings): continue a stalled session on the next model 2026-09-28 16:57:33 +02:00
.air.remote.toml feat: share conversations across machines via an encrypted relay 2026-08-15 10:43:34 +02:00
.air.toml feat: share conversations across machines via an encrypted relay 2026-08-15 10:43:34 +02:00
.dockerignore feat: share conversations across machines via an encrypted relay 2026-08-15 10:43:34 +02:00
.envrc.example chore: tidy the project root 2026-08-20 09:26:02 +02:00
.gitignore feat: share conversations across machines via an encrypted relay 2026-08-15 10:43:34 +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(artifacts): match the app theme through shared components 2026-09-29 08:17:36 +02:00
cliff.toml ci: generate release changelog from conventional commits 2026-05-05 23:49:51 +02:00
CONTEXT.md docs: document the native Factory 2026-09-05 00:12:51 +02:00
CONTRIBUTING.md docs: add contribution guide and GitHub issue template (#635) 2026-09-12 22:01:05 +02:00
go.mod feat: add encrypted relay webhook inboxes (#633) 2026-09-12 22:01:14 +02:00
go.sum feat: add encrypted relay webhook inboxes (#633) 2026-09-12 22:01:14 +02:00
install.sh fix(installer): probe HTTP on start, clean *.new, honour XDG in uninstall 2026-09-13 22:02:39 +02:00
LICENSE fix: More 2026-04-16 00:33:45 +02:00
main.go feat(artifacts): add MCP artifacts tool and ocman-artifacts skill 2026-09-28 17:27:36 +02:00
main_test.go feat(artifacts): add MCP artifacts tool and ocman-artifacts skill 2026-09-28 17:27:36 +02:00
Makefile test(plugins): verify Slack plugin acceptance 2026-09-22 13:53:56 +02:00
mise.toml docs: add a Hugo marketing/docs site and restructure docs/ 2026-07-31 01:09:37 +02:00
README.md feat: add routine and session MCP tools 2026-09-07 02:00:09 +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.

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, answer permission prompts, abort, and compact a running session 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. One ⌘K palette for jumping between sessions, settings, and actions, with in-app notifications.
  • Slash commands. /new [title] creates a session, /clear archives the current one and starts fresh. Renaming a session is keyboard-driven too.
  • Tmux integration. Launch or auto-launch an OpenCode instance inside tmux from the UI.
  • Routines. Save a project prompt, run it now, or schedule it in a fresh OpenCode session. History records errors and links to created sessions. See Routines.
  • Multi-remote. Attach other ocman instances over the network and manage every machine's sessions from one dashboard. Every session carries a host badge, and new-session creation knows which machine has the project. See Multi-remote.
  • Diff and changes view. Syntax-highlighted diffs inline in the thread, plus a Changes sidebar that combines session edits with the working-tree git diff.
  • Stats dashboard. Per-project metrics, wall-clock totals, token and pricing graphs, system stats.
  • Model picker. Per-platform favorites and a refreshable catalog, so new models appear without a restart.
  • 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

curl -fsSL https://forgejo.nousefreak.be/dries/ocman/raw/branch/main/install.sh | bash -s -- install
# Open http://localhost:8228

The script checks your toolchain (git, go, node, pnpm), builds from source into ~/.local/share/ocman/src, installs the binary to ~/.local/bin/ocman, and starts it in the background. It also installs itself as ocman-ctl:

ocman-ctl status | start | stop | restart | logs
ocman-ctl update              # pull, rebuild, restart
ocman-ctl uninstall           # add --purge to also delete state.db
ocman-ctl doctor              # dependency check only

Override with OCMAN_ADDR, OCMAN_PREFIX, OCMAN_BRANCH, OCMAN_SRC.

Alternatively, 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 Gatekeeper refuses to open the app on first launch with a "cannot be opened because the developer cannot be verified" warning.

To get past it:

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

Or 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, using 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

You don't need any of this to use ocman as a dashboard. It also embeds an optional, localhost-only MCP server exposing Factory, routine, read-only session, and file-embedding 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 and the full tool list.

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

MIT. See LICENSE.