Run coding agents in parallel.
Never into each other.

Every agent gets its own git worktree, terminal and branch. Nothing shared, nothing overwritten. Read the diffs, leave notes on the lines that worry you, and merge the ones that got it right.

Forever free macOS 26 and later Claude Code · Codex

Writing code stopped being the slow part.

The bottleneck moved. It is no longer how fast an agent can write a change, it is how fast you can read what several of them wrote. Bloom is built around the reading: every workspace on the left, the work in the middle, the diff one keystroke away.

The Bloom window. Five workspaces down the left in different states, one of them with an agent still running, the open one showing a short exchange about the branch, and its changed files and diff on the right.
Five workspaces on one repository, each on its own branch. The only screenshot on this page.

Every agent gets its own copy of the repository.

Bloom makes a git worktree for each workspace. Same repository, same history, a separate directory on a separate branch. An agent refactoring the parser cannot save over another agent's half finished migration, because the two of them are not looking at the same files.

Your own checkout is never touched. Close a workspace and it goes away, and the branch you had open this morning is exactly where you left it.

This does not repeal git. If two branches really do change the same lines, that is a merge conflict, and it turns up at merge time where you can read it properly. What isolation buys you is that merge time is the only moment it can happen.

  • One worktree, one branch, one agent
  • No second clone, no history to re-download
  • A normal directory on your disk, openable in anything
git worktree list Mechanism
The repository pharos has one history. Bloom adds a git worktree per workspace, each a separate directory on its own branch, while your own checkout of main stays untouched. pharos .git · one history, one object store feat/constituent-cache ~/bloom/constituent-cache Claude Code feat/solar-noon ~/bloom/solar-noon Codex fix/chart-datum ~/bloom/chart-datum Codex main ~/code/pharos yours, untouched
One repository. One history. Three directories that cannot see each other's files.

A terminal that already knows your setup.

Bloom reads your Ghostty configuration: theme, font, ANSI palette. The terminal inside Bloom looks like the terminal outside it, because it is reading the same file you already tuned.

Split it into panes the way you would in iTerm or Ghostty. Hand a session to tmux and it keeps running after you quit Bloom, and it is still there when you come back.

  • Your Ghostty theme, font and ANSI colours
  • Split panes, horizontally and vertically
  • tmux sessions outlive the app
~/.config/ghostty/config Read, not copied
theme = catppuccin-mocha
font-family = "JetBrains Mono"
font-size = 13
font-thicken = true
cursor-style = block
window-padding-x = 10
Terminal palette in Bloom ANSI 0–7
0
1
2
3
4
5
6
7
Set the theme once, in the file you already keep. Bloom resolves the same sixteen ANSI colours, the first eight of them here.

Read the diff before you trust it.

A real review surface, not a wall of green and red. Side by side or unified, whichever you think in. A directory tree of everything that changed, so you can see the shape of the work before you read a line of it.

Comment on a line and the comment becomes context for the agent. The next turn starts from what you actually said, in the place you said it.

  • Side by side and unified
  • Changed files as a directory tree
  • Inline comments feed straight back to the agent
  • Editable source that refuses to save over a file the agent has moved on from
src/tide/nodefactors.ts +24 −1
  1. 26 type FactorTable = ReadonlyMap<string, number>
  2. 27
  3. 28 const nodeFactorCache = new LruCache<number, FactorTable>(8)
  4. 29
  5. - export function nodeFactors(year: number): Map<string, number> {
  6. 30 + export function nodeFactors(year: number): FactorTable {
  7. 31 + const cached = nodeFactorCache.get(year)
  8. 32 +
  9. 33 + if (cached) {
  10. 34 + return cached
  11. 35 + }

Freek commented on line 31

This is once per year, but heightAt calls it once per sample. Resolve the station's harmonics in series/extrema instead and the cache stops mattering on the hot path.

Sent to Claude Code with the next message

A comment is not a note to yourself. It is the first thing the agent reads on the next turn.

Open the pull request from here.

When the work is right, ask the agent to open the pull request. The prompt is editable first, so the description reads the way you would have written it rather than the way a model assumes you write.

Bloom reads the check runs as they come back. Merging takes one more confirmation, on purpose.

  • The agent writes it, you edit the prompt
  • Check runs in the window, not in a tab
  • Merge behind a confirmation
Prompt to the agent Editable

Open the pull request against main. Title it for the caching change, not the test churn, and say that nodeFactors now returns a ReadonlyMap while every caller stayed the same.

Checks 3 of 4 reported

feat/constituent-cache main

  • test / vitest passed 1m 12s
  • lint / biome passed 18s
  • types / tsc failed 39s
  • build / node 24 running 22s
Nothing merges on its own. The failing check is the point: you see it here, before you go looking for a browser tab.

Arrange the window the way you think.

A pane holds a chat, a terminal or a browser. Put them wherever the task wants them. Chat next to a terminal while something builds. Browser next to the diff while you check the thing you just changed.

It is one window with a layout, not four apps you keep alt-tabbing between.

One workspace, three panes Layout
A single Bloom window with the workspace list down the left, a chat pane filling the middle, and a terminal above a browser on the right. Chat Terminal Browser
Chat and a terminal
Stacked on the left
Three across
The same window, three arrangements. A pane holds whatever the task wants there.

It behaves like a Mac app, because it is one.

The small things you get for free on this platform, and never get from a web app wearing a window frame.

Dock badge

How many agents have finished and are still waiting on you, readable from any other app.

Services menu

Send a selection from anywhere on the system straight into a workspace.

Notifications

A turn finishes, fails or gets stuck, and you hear about it. Type your reply into the banner and carry on with what you were doing.

Quick Look

Space bar previews for changed files, exactly the way Finder does it.

Drag out

Pull a file out of Bloom and drop it in Finder, or anywhere else that takes files.

Bring the agent you already use.

Bloom runs the agent CLI you already have installed, signed in with the account you already have. It does not sit between you and your model. Today that means Claude Code and Codex. Two more are on the way, and we would rather list them as unfinished than let you find out after you have downloaded it.

Claude Code

Anthropic

Codex

OpenAI

Cursor Agent

Cursor

Not yet

OpenCode

Open source

Not yet

We built it because we needed it.

Bloom is made at Spatie, a web development company in Antwerp, Belgium. Two of us write it: Freek Van der Herten, who co-founded the place, and his colleague Alex Vanderbist.

I run several coding agents at the same time, so most of my day goes into reading what they wrote instead of writing it myself. I wanted a tool built around that part.

I want every agent in its own worktree so they can't save over each other. I want a terminal in the same window, and I want to read the diff before anything gets merged. Alex and I use it all day while we build it, which is how we find most of what's wrong with it.

It's free. We've spent a long time giving software away, most of it to people who never send anything back, and it has worked out fine. We'd rather you used this than not.

spatie.be

The Spatie team sitting around a table in the Antwerp office, laptops open, watching a presentation on the wall screen.
The team in Antwerp, mid-discussion.

A few things worth knowing up front.

What is a git worktree, and why should I care?

A worktree is a second working directory for the same repository, checked out to a different branch. Git has shipped them since 2015. They cost you a directory, not a clone: same history, same objects, nothing re-downloaded.

Bloom makes one per workspace. That is the whole reason two agents can work at the same time without corrupting each other's changes. They are not sharing files.

What happens when two agents change the same thing?

While they are working, nothing. They are in different directories on different branches, so neither can see or overwrite the other's edits.

If the two changes really do disagree, that shows up as a merge conflict, at merge time, where git has always put it and where you can read it properly. Bloom's job is to make sure that is the only place it can happen.

Claude Code already makes worktrees. Why use this?

Because you probably do not use only one agent. Bloom runs Claude Code and Codex in the same window, against the same repository, and gives both of them the same review surface: one diff viewer, one comment system, one way to open a pull request.

If you have settled on a single agent and you are happy reviewing its work in its own app, you may not need Bloom at all. That is a fine outcome and we would rather say so here than find out after you have downloaded it.

Does running several agents cost more?

Yes, and nobody in this category likes saying it. Three agents working at once burn roughly three times the tokens of one agent working alone. Bloom does not change that, and it does not resell you anything: you are billed by whoever you already have a subscription or an API key with.

Which is the real argument against starting twenty of them. Start the number you can genuinely read the output of.

Which agents does it run?

Claude Code and Codex, whichever of them you already have set up, with your existing account.

Cursor Agent and OpenCode are in the app but marked as not available yet. We have not verified how they store their credentials, and we are not going to guess at it and hand you a workspace that cannot sign in.

Is it really free?

Yes. Bloom is free to download and free to use. Spatie makes its money elsewhere, and this is a tool we needed for ourselves.

Is it open source?

No. Free, but not open. If you want the open source part of what we do, there is a great deal of it.

What about node_modules, .env files and dev servers?

A worktree is a fresh directory, so anything git ignores does not come along with it. Dependencies, local environment files and build caches have to exist in each workspace, the same as on any new checkout. Worth knowing before you start five of them.

Do my sessions die when I quit?

Terminal sessions handed to tmux keep running after you quit Bloom, and they are still there when you open it again.

Do I have to review everything in Bloom?

No. Every workspace is a normal git worktree on your disk, on a normal branch. Open it in your editor, run your own tooling against it, push it, do whatever you would have done anyway. Bloom is not a format you get locked into.

Bloom

Start more than one thing. Finish all of them.

Forever free · macOS 26 and later