fast, durable terminal agents that SWIM between clients π built in Zig
current release: v0.1.5
curl -fsSL https://marlin.wtf/install.sh | sh
prefer Homebrew? brew install jespern/tap/marlin
marlin is a daemon-native terminal AI agent harness and session multiplexer. Its own agent runs native models; installed Claude Code and Codex agents can run beside it as guests using their existing vendor logins. The daemon owns the structured sessions while the TUI, web UI, and headless CLI remain thin clients.
Close a terminal and the turn keeps running. Reattach later, reach it through SSH, mosh, or your tailnet, or compose it with ordinary shell commands. The transcript, plans, status, approvals, diagnostics, and full tool results are still thereβand inspectable without opening SQLite.
GARAGE PICK If Marlin were a car, it would be a first-generation Honda NSX: supercar fast, Honda reliable, usable every day, and direct enough that the driver always knows what the machine is doing. No touchscreen maze, no ornamental controls. Just a small, deliberate machine that starts every time and wants to be driven hard.
/sessions, per-session view state, and rolled-up child activity.!c copies the last complete tool result.marlin --remote host carries the structured protocol over SSH. marlin web is an opt-in loopback UI exposed to your phone through Tailscale Serve./reboot --build while developing Marlin inside Marlin.claude binary or stable codex app-server protocol as first-class multiplexed sessions using existing subscription logins. Guest permission prompts share marlin's approval bar.marlin run works headlessly; ls, search, and inspect --json expose daemon-owned state for shell scripts without screen scraping or SQLite queries.task and task_batch create up to eight durable, attachable, read-only children. Named councils fan questions across models for parent synthesis./attach uploads signed image data through the client boundary, stores it by content hash, and maps it to native provider vision blocks.parallel_safe really run concurrently, with at most eight workers. Durable results stay in provider-call order./voice setup adds optional push-to-talk or toggle dictation with whisper.cpp or parakeet-mlx. Audio stays at the client edge, and transcripts land in the composer for review before submission.$ curl -fsSL https://marlin.wtf/install.sh | sh $ export OPENROUTER_API_KEY=... $ marlin run "why is my build broken" # ...the daemon keeps the structured session... $ marlin # attach the TUI $ marlin --remote devbox # same TUI, carried over SSH $ marlin ls # short stable handles, including children $ marlin inspect 63df --json # metadata, state, plan, blocks, diagnostics $ marlin search "permission denied" # search durable transcripts $ marlin attach 63df # any unique prefix (minimum four) # installed vendor agents can join the same multiplexer: $ marlin run --model codex/default "review this patch" # inside the TUI: /council new core # pick models, then choose Done /review core audit this design before I ship it
The installer downloads the matching tagged release for macOS or Linux
on aarch64 or x86_64, verifies its SHA-256 checksum, and installs it in
~/.local/bin without sudo. Homebrew also works:
brew install jespern/tap/marlin.
Tracking main instead? Clone the
repository and run
zig build with Zig 0.16.0.
| track | where it is | status |
|---|---|---|
| M0βM3 | agent loop, daemon, TUI, context engine, self-hosting reboot | β BUILT |
| M3.5 | permissions + secret boundary (reads refused, secrets redacted, macOS+Linux sandbox) | β ENFORCED |
| M4 | structured session multiplexer | β VERIFIED |
| M5 | managed MCP, executable tools, hooks, skills | β PRODUCTIZED |
| M6a | durable child sessions + bounded task fan-out | β VERIFIED |
| M6b | named multi-model councils + durable reviewer sessions | β SHIPPED |
| M6c | SSH-carried remote clients + tailnet web UI | β SHIPPED |
| now | cancellation, reconnect, extension diagnostics, dogfood, and performance | π¨ HARDENING |
| later | workspace snapshots, isolation, leases, land/discard | π EVIDENCE FIRST |
The source-of-truth details live in the milestones and the active M6 execution plan.
marlin web is an opt-in, tokenless loopback client exposed through Tailscale Serve; your tailnet is the trust boundary, and it is not a public deploy surface/land, and /discard remain one deliberately later trackSOURCE on GH made w/ ZIG RELEASES ARCHITECTURE
one handcrafted HTML file. the fish rejected React.