Michael Gifford-Santos
All work Sigil

← All work

Sigil

Watch the machines work.

A self-hosted hub for your terminal sessions — and for the AI coding agents running inside them. Sigil attaches to every machine you own and serves each session as a fast, persistent web terminal, so a long-running agent is observable and interruptible from a browser or a phone. It knows which sessions are working, which are blocked waiting on you, and what they are costing.

Design · Engineering — open source, MIT

mijkal.github.io/sigil →

The constraint

The work should not stop because I closed a laptop. Long-running agent sessions are not scripts you fire and collect — they run for hours, need watching, and occasionally need interrupting mid-thought. Tie that to the machine you happen to be sitting at and you have tied it to being in one chair. I wanted the session to live on a server and the window onto it to be wherever I am: a workstation, a second laptop, a phone in a queue somewhere.

What I built

A Go daemon that treats tmux as a process manager for AI agent sessions. It connects to target hosts over SSH, attaches to sessions, and streams them to a browser client over HTTPS — so any session on any host is observable and interruptible from any device. A target needs tmux and nothing else: no agent to install, no daemon to keep alive on the far end.

Two clients, one hub

The browser is not the only way in. A terminal client ships alongside it — a multi-view TUI over the same daemon, with the fleet summary, sessions, hosts and a live resource sidebar. Attaching from it hands the terminal straight to ssh -t … tmux attach rather than rendering a second terminal of my own: you get real tmux, with none of my code between your keystrokes and the session. It is a navigator, not an emulator — which is also why it costs almost nothing to keep correct.

Decisions worth defending

  • tmux, rather than a protocol of my own. It already solves detachable sessions, survives disconnects, and is on every host I care about. Writing a new transport would have meant reimplementing it worse and installing it everywhere.
  • Interruptible, not just observable. A read-only view of a stuck agent is a nicer way to watch it waste an hour. Being able to type into the real session from a phone is the difference between monitoring and operating.
  • Exact-match session targets, everywhere. tmux resolves names by prefix, so the resurrector could adopt a different session whose name merely started the same way — and silently consume a live one. A bug that destroys work while reporting success is the kind you fix at the type level, not with a retry.
  • Restore, do not restart. Recovering from a host crash by launching a fresh agent loses the context that made it useful. Sessions come back with their state, or coming back is not worth much.

Operating it

Built because operating a fleet surfaced failure modes no local harness handles: tmux servers die, hosts run out of memory, SSH drops in the middle of a run. Those stopped being events worth noticing once sessions restored themselves — which is the real measure of this kind of tool. It is the substrate the rest of my agent work runs on, in daily use rather than demonstration.

Where it stands

Open source under MIT, with the daemon, the web client and the docs at mijkal.github.io/sigil.