Skip to content

spwn

Fork a Claude Code session and spwn branches the conversation and the code together — explore several approaches at once, each on its own git branch with its own live environment, and merge the one that worked.

Claude Code is a single conversation in a single terminal. Real work isn’t linear: you want to try an idea one way, back out, try it another, run a few agents at once, and keep whichever result is best. Doing that by hand means juggling git worktrees, terminal tabs, and copy-pasted context — and losing running work every time a window closes.

spwn is a native macOS app built around two ideas. When you fork a session it branches the conversation and the code together, so exploration is cheap and every branch runs in isolation. And a per-session hook system lets each branch stand up its own environment — a dev server, a seeded database, containers — and tear it down when the session is gone.

⑂ Session branching

A single conversation is a straight line; real work isn’t. Fork any session and spwn branches the conversation and the code in one gesture — the child inherits the full history and gets its own git branch in its own worktree, forked from the parent’s. The original keeps running, untouched. Explore many branches cheaply, then merge back only what worked — with a click or plain git merge. Or use the Timeline to rewind a session to an earlier turn: conversation, files, or both.

⚓ The hook system

Each session lives on its own branch in its own worktree, so it’s the natural unit for per-session setup and teardown. spwn does this the unix way: one shell script per lifecycle event (session-created, session-ready, session-turn, session-deleted), with the session’s details injected as SPWN_* env vars. Start a dev server, seed a DB, copy secrets, clean up on delete. spwn even runs on its own hooks — worktree management, per-turn commits, and checkpoints ship as default scripts you can read, extend, or delete.

Parallel sessions, no collisions

Every session gets its own git branch and worktree. Launch several at once on different approaches — one refactor, one experiment, one bug hunt — and none of them touches the others or your project folder. Switching tabs is a pure focus change.

Build from the first second

Each new workspace is copy-on-write seeded with your heavy folders (node_modules, target, dist, …), so an agent can build, test, and run immediately — no cold reinstall in every branch.

Merge only what worked

Each session commits its work as it goes. When one produces something you want, merge its branch back with a click — or with plain git. Nothing lands automatically; you decide what and when.

Merge tray

Collect notes, files, and the best turns from any session into a per-project tray, then Inject them as the first message of a fresh session — so you start primed instead of cold.

Scheduled tasks

Have Claude run a read-only task on a schedule — a daily status report, a nightly review — reusing the project’s Merge tray. Results wait as ready-to-read sessions.

Survives restarts

Quit spwn, reopen it, and every session is right where you left it, running programs and all — a clean, scrollable conversation on one side and full Claude Code on the other.

You can wire up git worktrees, tmux, and a prompt library yourself. spwn is what you’d build if you did — and then maintained:

Doing it by hand With spwn
git branch forks files; your chat context stays behind Fork branches the conversation and the code together
git worktree add + branch per experiment, cleaned up manually A branch + worktree per session, created and removed for you
Cold npm install / rebuild in every worktree Heavy build dirs COW-cloned in — build instantly
Per-branch setup scripts you run by memory Project hooks fire on session lifecycle events
Re-paste project background into each new chat A Merge tray you Inject in one click
Lost running work when a terminal closes Sessions survive quitting the app
Merge experiments back and hope you cleaned up One-click Merge, with a dialog naming anything you’d lose