Splay clones your repositories from GitHub, shows each workspace’s pull request status in the sidebar, and opens pull requests for you.
Fan out your agents.
Splay is a workspace manager for running coding agents in parallel. One repository fans out into many git worktrees, each with its own persistent terminal sessions, driven from a native GTK app or the command line.
- fix-loginclaude
- session-tabsclaudebash
- flaky-testcodex
- docs-refreshopencode
- bump-depsbashcargo test
one workspace per feature, each its own git worktree
all your repos in one sidebar
sessions are just terminals: claude, codex, bash…
close the app, come back later. still running.
If it runs in a shell, it runs in Splay.
- claude
- codex
- opencode
- gemini
- aider
- bash
- cargo watch
- npm run dev
- your own thing
Integrations
Plugs into what you already use.
Run a workspace in a VM of its own instead of on your machine, with the same terminals and the same CLI.
Why Splay
Parallel agents, without the chaos.
Coding agents work best when you run many of them at once: one per feature, one per bug fix. In practice that turns into chaos fast. Each agent needs its own copy of the source so they don’t trample each other’s changes, and each one lives in its own terminal.
Before long you’re drowning in terminal tabs, losing track of which agent is working on what, and juggling git branches and directories by hand.
Splay gives you one place for all of it: your repositories, their workspaces, and the agent sessions running inside them. You can add another agent without adding more bookkeeping.
How it works
Repositories, workspaces, sessions.
Three ideas, each one fanning out into the next. That’s the whole model.
splay repository ├── ui-remember-session-tab workspace │ ├── claude session │ └── bash session └── ui-missing-pr-link workspace └── codex session dwim repository └── fix-flaky-test workspace └── claude session
- Repository
- The git repository that holds your project. Register as many as you like; Splay keeps a local clone of each.
- Workspace
- An isolated copy of the source, backed by a git worktree. Work happens here without touching any other workspace.
- Session
- A persistent terminal inside a workspace: a coding agent, a shell, or any long-running command.
A workspace per feature
- 1Create a workspace for the feature or bug fix.
- 2Let an agent work in a session.
- 3Open a pull request when it’s ready.
- 4Iterate on review in the same workspace.
- 5Merge, then remove the workspace.
Features
Minimal, opinionated, fast.
Works with any coding agent
Claude Code, Codex, OpenCode, or any other CLI. Sessions are just terminals, so there are no plugins to wait for.
A git worktree per workspace
Parallel agents never share a checkout or step on each other’s branches. Splay creates and cleans up the worktrees for you.
Fast workspace cloning
Branch off an existing workspace into a new worktree and branch with one command.
Many repositories, one place
Register any number of GitHub repositories and manage all their workspaces and sessions from one sidebar.
Terminals that survive
Sessions are backed by libghostty-vt and outlive disconnects. Detach and reattach from the app or the CLI without killing anything.
Native app and CLI
A GTK 4 desktop app for day-to-day work, and splayctl for everything you’d rather script.
Sandboxing
Bring your own sandbox.
Each workspace runs wherever you choose: on your machine, or in a VM of its own. Either way its sessions survive disconnects and reattach from the app or the CLI.
local
Your machine
A git worktree next to Splay’s clone of the repository. The default, and ready in a second.
exedev
An exe.dev VM
A VM per workspace. Splay creates it, clones the repository and runs sessions over SSH. Removing the workspace deletes the VM.
yours
Whatever you run
A sandbox only creates a workspace, destroys it, and says how to run a command in it. Want yours? Open an issue.
A setup script per repository
Turn a provider on for a repository and give it a setup script. It runs in each new remote workspace before the first shell starts, so the toolchain is there when the agent is.
$ splayctl repo enable splay exedev Enabled exedev for splay $ splayctl ws create splay fix-login --sandbox exedev Created workspace fix-login for splay
Command line
Everything the app does, from a shell.
splayctl manages repositories, workspaces and sessions. Attach to a
running agent from any terminal and press Ctrl ] to detach.
The agent keeps going.
$ splayctl repo add github.com/splay-sh/splay Added repo splay $ splayctl ws create splay fix-login Created workspace fix-login for splay Created session s6a0c7e2f1a3 $ splayctl ws clone splay:fix-login fix-login-alt Cloned workspace splay:fix-login to fix-login-alt for splay Created session s6a0c7e3b2c8 $ splayctl session create splay:fix-login -- claude Created session s6a0c7e4d07f $ splayctl session attach s6a0c7e4d07f # Ctrl-] detaches. The agent keeps running.
Fan out on your machine.
One command to install. Then run splay.
Installs splay and splayctl in ~/.local/bin, plus a launcher entry.
Prefer to build from source?