usher

module
v0.8.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 24, 2026 License: MIT

README

usher

Unified Session Hub for Extended Reach.

Drive Claude Code, Codex, and pi sessions from any browser — including your phone.

usher dashboard

usher brings the Claude Code, Codex, and pi sessions on your machine into one hub, accessible from a browser or supported messaging app. There is nothing to import or migrate: sessions started in a terminal or IDE appear automatically and remain available through their native agents. Native transcripts remain the source of truth; usher keeps only its own lightweight metadata.

Why usher

  • No session migration. usher discovers native sessions in place, including work started from a terminal or IDE. It does not copy conversations into its own session store, and every session remains usable through its original agent without usher.
  • Keep the native agents. usher drives the official Claude Code and Codex CLIs, plus pi, instead of reimplementing their agent loops.
  • Work from any device. Start a task at your desk, follow it from your phone, send a follow-up, or handle a permission request. The web UI installs as a PWA on desktop and mobile.
  • See every project together. Discover, search, pin, archive, fork, and resume sessions across projects and backends from one dashboard.
  • Stay local-first. Sessions and agent processes remain on your machine. Remote access is through infrastructure you control, such as Tailscale or Cloudflare Tunnel.
  • Simple by design, composable by default. usher stays focused on session routing and works with the tools you already use — native agent CLIs, tunnels, editors, and messaging apps. Its implementation follows the same KISS principle: a static, stdlib-first Go binary with a plain-JavaScript frontend, no npm, and no build step.

Quick start

You need at least one supported agent installed, signed in, and run once: Claude Code, Codex, or pi. The optional session terminal also needs tmux. On Windows, run usher inside WSL.

Install and start a user-level service:

curl -fsSL https://raw.githubusercontent.com/nexustar/usher/main/install.sh | bash

Or install and run it directly:

go install github.com/nexustar/usher/cmd/usher@latest
usher serve

Open http://127.0.0.1:7777. Each backend is enabled automatically when its session directory exists, and existing sessions appear without an import step. Run usher serve -h for the complete option list.

To run usher in the background, use the example launchd property list on macOS or systemd user unit on Linux; each file includes setup and log-viewing instructions.

To use usher away from the host machine, follow Remote access. Do not expose it without first understanding the authentication guidance there.

Main features

  • Sessions: discover existing sessions, create new ones, resume, fork, rename, pin, archive, search, and switch backend or model.
  • Live work: stream assistant output and tool activity, interrupt turns, answer questions, and approve or deny native backend permission requests.
  • Context: render markdown, images, uploads, subagents, context usage, and compaction events from the transcript.
  • Remote control: responsive PWA, Web Push notifications, and optional Telegram or Lark/Feishu integration.
  • Per-session tools: one tmux shell per conversation and an optional deep link into an editor such as code-server.
  • Router: a main chat can list, search, create, and route work to sessions. It uses deterministic commands by default and can optionally accept natural language through an OpenAI-compatible model.

Architecture

flowchart LR
  clients["browser · PWA · IM"]
  subgraph host["your machine"]
    usher["usher<br/>web UI · router · permissions"]
    drivers["backend protocols<br/>Claude · Codex · pi"]
    logs[("native session transcripts")]
    shells["per-session tmux shells"]
  end
  clients <-->|"HTTP · SSE"| usher
  usher <-->|"send · stream · interrupt · approve"| drivers
  drivers -->|"write turns"| logs
  usher -.->|"discover + tail"| logs
  usher <-->|"whole-text input + fixed controls"| shells
  • Sessions are discovered from native transcript files. usher stores lightweight metadata such as pins, archive state, and display titles, but does not copy conversations into its own session store or take ownership of them.
  • Backend protocols run turns and report lifecycle, streaming, model, and permission events. usher normalizes those events for the UI.
  • The main-chat agent manages sessions and routes messages. It does not answer substantive questions itself; the full-context coding-agent session does.
  • usher does not browse the machine. File uploads, transcript image references, editor links, and the deliberately limited tmux shell are explicit paths, not a general filesystem API.

Documentation

Solutions are task-oriented guides for combining usher with the rest of your setup:

Reference material explains stable behavior that is not useful to repeat in command-line help:

Project boundaries

usher renders and drives coding-agent conversations; it is not a filesystem browser, IDE, or replacement agent runtime. Sessions stay compatible with their native CLIs and remain usable without usher.

Directories

Path Synopsis
cmd
usher command
usher is the entrypoint binary.
usher is the entrypoint binary.
internal
agent/usheragent
Package usheragent is the main-chat agent that routes user messages to Claude Code sessions and resolves permission requests.
Package usheragent is the main-chat agent that routes user messages to Claude Code sessions and resolves permission requests.
appserver
Package appserver implements the newline-delimited JSON-RPC transport used by `codex app-server`.
Package appserver implements the newline-delimited JSON-RPC transport used by `codex app-server`.
auth
Package auth implements usher's password-based web UI auth: argon2id password hashing, an HMAC-signed stateless cookie tied to the current password hash (so changing password kicks every device), and a per-IP exponential-backoff rate limiter for /login.
Package auth implements usher's password-based web UI auth: argon2id password hashing, an HMAC-signed stateless cookie tied to the current password hash (so changing password kicks every device), and a per-IP exponential-backoff rate limiter for /login.
backend
Package backend defines the backend-neutral contracts between the router and concrete coding-agent adapters.
Package backend defines the backend-neutral contracts between the router and concrete coding-agent adapters.
broker
Package broker is a small in-process pub/sub for session events.
Package broker is a small in-process pub/sub for session events.
claudestream
Package claudestream manages long-running Claude Code stream-json children.
Package claudestream manages long-running Claude Code stream-json children.
codexrollout
Package codexrollout parses OpenAI Codex CLI "rollout" session logs into the the backend-neutral core display model consumed by router, web, and agents.
Package codexrollout parses OpenAI Codex CLI "rollout" session logs into the the backend-neutral core display model consumed by router, web, and agents.
core
Package core holds shared types referenced by multiple internal packages.
Package core holds shared types referenced by multiple internal packages.
discovery
Package discovery scans Claude Code's projects directory and watches it for changes, exposing the set of known sessions.
Package discovery scans Claude Code's projects directory and watches it for changes, exposing the set of known sessions.
hook
Package hook brokers backend interactions through usher's web UI.
Package hook brokers backend interactions through usher's web UI.
imutil
Package imutil holds helpers shared by usher's IM frontends (the in-process Telegram hub and out-of-process IM plugins): flattening session jsonl events into plain text, and IM-agnostic text utilities.
Package imutil holds helpers shared by usher's IM frontends (the in-process Telegram hub and out-of-process IM plugins): flattening session jsonl events into plain text, and IM-agnostic text utilities.
jsonl
Package jsonl parses Claude Code's session log files.
Package jsonl parses Claude Code's session log files.
mainchat
Package mainchat persists main-chat conversations as append-only jsonl files under <data-dir>/mainchats/<id>.jsonl.
Package mainchat persists main-chat conversations as append-only jsonl files under <data-dir>/mainchats/<id>.jsonl.
modelcatalog
Package modelcatalog implements model metadata sources for built-in agent backends.
Package modelcatalog implements model metadata sources for built-in agent backends.
pathutil
Package pathutil holds path-safety helpers shared across usher.
Package pathutil holds path-safety helpers shared across usher.
pi
Package pi adapts pi coding-agent sessions and its RPC protocol to usher.
Package pi adapts pi coding-agent sessions and its RPC protocol to usher.
pluginapi
Package pluginapi exposes the IM-frontend subset of the Router to out-of-process plugins over a Unix socket, and provides the matching client.
Package pluginapi exposes the IM-frontend subset of the Router to out-of-process plugins over a Unix socket, and provides the matching client.
push
Package push delivers browser Web Push notifications for usher: a turn finishing or a permission prompt arriving while the web UI is closed or backgrounded.
Package push delivers browser Web Push notifications for usher: a turn finishing or a permission prompt arriving while the web UI is closed or backgrounded.
router
Package router glues discovery, sender, broker, and hook together.
Package router glues discovery, sender, broker, and hook together.
sender
Package sender drives headless Claude and Codex sessions and reports each turn's output by tailing the backend's session log.
Package sender drives headless Claude and Codex sessions and reports each turn's output by tailing the backend's session log.
sessionmeta
Package sessionmeta persists per-session user decisions (archive, pin) in sessions.json under <data-dir>/.
Package sessionmeta persists per-session user decisions (archive, pin) in sessions.json under <data-dir>/.
telegram
Package telegram is a dependency-free Telegram Bot API client plus the hub that mirrors usher's sessions into a forum supergroup, one topic per session.
Package telegram is a dependency-free Telegram Bot API client plus the hub that mirrors usher's sessions into a forum supergroup, one topic per session.
terminal
Package terminal manages session-scoped tmux shells.
Package terminal manages session-scoped tmux shells.
transcript
Package transcript adapts built-in persisted formats to the backend-neutral transcript contract.
Package transcript adapts built-in persisted formats to the backend-neutral transcript contract.
web
Package web serves the usher HTTP API and embedded static UI.
Package web serves the usher HTTP API and embedded static UI.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL