
Swain Helm
- 7 installs
- 2 repo stars
- Updated July 24, 2026
- cristoslc/swain
Start, stop, and monitor the swain-helm bridge watchdog that routes Zulip messages to opencode serve for remote session control from any device.
About
Manages the swain-helm bridge system, starting a watchdog daemon that reconciles desired state so project bridges and opencode serve stay running, and monitoring their health. A developer uses it to control agent sessions remotely via Zulip from any device.
- Watchdog daemon reconciles bridge and opencode serve state
- Routes Zulip messages for untethered remote session control
Swain Helm by the numbers
- 7 all-time installs (skills.sh)
- Ranked #1,587 of 2,715 Automation & Workflows skills by installs in the Skillselion catalog
- Data as of Jul 29, 2026 (Skillselion catalog sync)
npx skills add https://github.com/cristoslc/swain --skill swain-helmAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 7 |
|---|---|
| repo stars | ★ 2 |
| Last updated | July 24, 2026 |
| Repository | cristoslc/swain ↗ |
What it does
Start, stop, and monitor the swain-helm bridge watchdog that routes Zulip messages to opencode serve for remote session control from any device.
Files
<!-- swain-model-hint: haiku, effort: low -->
swain-helm
Manages the swain-helm bridge system: starts the watchdog daemon, registers projects, monitors health, and tears down cleanly. The watchdog is a persistent process that reconciles desired state — ensuring project bridges and opencode serve are running.
Locate the CLI
REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || pwd)"
HELM="$REPO_ROOT/bin/swain-helm"If not found at that path, glob for **/bin/swain-helm.
Runtime files
| File | Purpose |
|---|---|
~/.config/swain-helm/run/watchdog.pid | Watchdog process PID. |
~/.config/swain-helm/run/bridges/<name>.pid | Per-project bridge PID. |
~/.config/swain-helm/run/opencode-instances.json | Discovered/tracked opencode serve instances. |
~/.config/swain-helm/helm.config.json | Global config (chat credentials, opencode auth). |
~/.config/swain-helm/projects/<name>.json | Per-project desired state. |
Commands
host up ("start bridge" / "helm up" / default)
Start the watchdog daemon. Resolves 1Password credentials at startup (requires biometric unlock):
swain-helm host upForeground mode for debugging:
swain-helm host up --foregroundThe watchdog discovers project configs, starts bridges, and finds or starts opencode serve. If 1Password is locked, the command fails with a clear error.
host down ("stop bridge" / "helm down" / "shut down bridge")
swain-helm host downStops the watchdog and all project bridges. Use --project <name> to stop only one bridge:
swain-helm host down --project swainhost status ("helm status" / "is the bridge running" / "bridge health")
swain-helm host statusReports: watchdog PID, each bridge PID and health, opencode serve port/health/auth status.
host provision ("provision bridge" / "setup bridge")
One-time setup: registers Zulip bot, creates stream, writes helm.config.json:
swain-helm host provisionproject add ("add project" / "register project")
Register a project for the watchdog to manage:
swain-helm project add ./ # current directory (rejects if no .git/)
swain-helm project add ~/code/swain # absolute pathWrites ~/.config/swain-helm/projects/<name>.json. The watchdog picks it up on the next reconciliation cycle (every 30s).
project remove ("remove project")
swain-helm project remove --project swainRemoves the project config. The watchdog stops the bridge on the next cycle.
project list ("list projects")
swain-helm project listShows all registered projects with their running status.
logs ("helm logs" / "show bridge logs" / "what is the bridge doing")
Tail the watchdog log:
tail -50 /tmp/swain-helm.logFor continuous streaming, tell the operator to run tail -f /tmp/swain-helm.log in their terminal.
restart ("restart bridge" / "helm restart")
Stop then start:
swain-helm host down && swain-helm host upAfter starting
Show the operator: 1. Bridge status (from host status output). 2. How to attach: opencode attach http://127.0.0.1:<PORT>. 3. Zulip stream to use for sending prompts. 4. Log path for monitoring: /tmp/swain-helm.log.
Error handling
- If
bin/swain-helmis not found, tell the operator the untethered package may not be installed and point to RUNBOOK-004. - If 1Password is locked at startup, report clearly: "Unlock 1Password and retry."
- If opencode serve fails the health check, show the last 20 lines of
/tmp/opencode-serve.log. - Never fail silently — always report what was attempted and what failed.