Prompt more, merge more,
ship more.
Run Claude Code and Codex side by side on your Mac. Give each task its own workspace, review the changes, and open a pull request from the same window.
Forever free Open source
Keep every workspace in one window.
Choose a workspace on the left, talk to its agent in the middle, and review the diff on the right. Open browser and terminal panes beside the chat when you need them.
Bloom can drive itself.
Ask your agent to start the server and open a browser beside the chat. It can run the commands, arrange the panes, and inspect the page with you.
Ask the agent
- Start the dev server in a terminal pane and open the site in a browser beside this chat.
-
Terminal
The server runs in your workspace. You can see its output as requests come in.
-
Browser
Your site opens beside the chat, ready for you to click through.
-
Chat
Spot a problem? Ask the agent to inspect the page and fix it in the same conversation.
Bloom connects its agents to these tools through MCP automatically. There is nothing extra to install. Pane controls stay within the agent's workspace.
Work on four things at once in the same codebase.
Bloom creates a git worktree and branch for every workspace. Each worktree is a separate directory, so an agent in one workspace cannot save over files in another. Your own checkout stays where you left it.
Read the diff before you trust it.
Bloom shows every changed file in a tree beside the diff. Comment on a line and Bloom includes your comment when it starts the agent's next turn.
You can also switch the file to Edit and make the change yourself. If the agent has changed that file since you opened it, Bloom refuses to save over the newer version.
Ship it without leaving the window.
Ask the agent to open a pull request and Bloom shows its check runs in the workspace. When it is ready, press Merge. Bloom sends the agent a merge prompt that you can edit. The agent already has the branch open, so it can resolve a conflict or investigate a failed check in the same chat.
This requires gh to be installed and signed in. The rest of Bloom
works without it.
- Pull request descriptions come from a prompt you control
- Bloom shows check runs inside the workspace
Split your workspace any way you like.
Put a chat, terminal, or browser in each pane, then drag them into place as you work.
Terminal panes open in the workspace's worktree, so a dev server runs the code on that branch. If you have tmux installed, Bloom can keep terminals running after you quit. Turn it on in Settings.
Agents can start agents.
An agent can start subagents in its workspace and talk to them while they work. They share the same worktree and branch. Each subagent gets a name and a row in the sidebar, where you can read what it is doing or reply yourself. A workspace can have up to ten agents running at once.
Ask the agent
- Start a second agent to write the tests while you finish the migration.
- Ask the one writing the tests how far it has got.
- That approach is wrong, tell it to start again from the interface.
Save a prompt once, use it in every workspace.
Save an instruction as a quick prompt and it appears in the composer of every workspace. Search for it when you need it. Bloom includes a few defaults.
Your agent can create quick prompts too. Ask it to save an instruction and it will be there the next time you need it.
Bring the agent you already use.
Bloom runs the Claude Code or Codex CLI already installed on your Mac and uses its existing login. Cursor and OpenCode are not supported yet.
Claude Code
Anthropic
Codex
OpenAI
Cursor
Anysphere
Not yet
OpenCode
Open source
Not yet
We made it for the way we work.
We make Bloom at Spatie in Antwerp. Freek builds it, and the rest of the team tells him what works (and what does not).
When I started using AI seriously for dev work in November 2025, I ran my agents in Ghostty, in a wall of tabs. Then I tried Conductor, and the worktree idea clicked: every agent in its own directory, on its own branch, unable to save over the others. That solved the problem I had.
What I still wanted was a Mac app. You can always tell when something isn’t really native, and I didn’t want to feel that in the window I sit in all day. Building your own tools used to be hard to justify. It isn’t any more, so I built one, and I use it all day while I build it, which is how I find most of what’s wrong with it.
There are plenty of other ways to do this, and they’re good. A tool you sit in all day has to fit your personality and the way you like to work, so it is worth looking at the alternatives before you settle on one. I wanted one that worked the way I do, and I like building things, so I took this on.
It’s free, and it’s staying free. There’s no paid tier coming and nothing to upsell you. It’s like the rest of our open source work, which we’ve given away for years without asking anything back, and that has worked out fine. Bloom is open source too, so you can read exactly what it does with your code.
Tell us what Bloom should do next.
Bloom's Help menu has Submit a prompt. Use it to tell us what you want Bloom to do. Freek reads every submission and decides what to build. If something is broken, use Send Feedback next to it.
Open source, and postcardware.
Bloom is open source on GitHub. Read the code, open an issue, or send us a pull request. Spatie has released open source software since 2015. Our Laravel and PHP packages have been downloaded more than two billion times.
Bloom is free and will stay free. If you use it, send us a postcard from where you live. We put every postcard on our wall.
SpatieKruikstraat 22, Box 12
2018 Antwerp
Belgium
- git clone https://github.com/spatie/bloom
- cd bloom
- make test # the core suite, no app target needed
- make run # release build, assembled and launched
- make lint # the house rules no linter knows about
Other ways to do this.
The apps below solve the same problem in different ways. Bloom works the way we like to work at Spatie, but you may find another one works better for you.
Questions
Is it a web app in a window? #
No. Bloom's interface is built with AppKit and SwiftUI. Its browser pane uses a web view to display websites.
Does running several agents cost more? #
Running more agents can use more of your provider's allowance. Usage and costs depend on the tasks, models and plan you use. Bloom adds no charge; your existing subscription or API billing still applies.
Which agents does it run? #
Claude Code and Codex, using the CLI and login you already have on your Mac. Cursor and OpenCode are not supported yet.
Can I drive Bloom from my own Claude Code? #
Yes. Connect your client using the command in Bloom's Settings. You can list projects, create workspaces, start tasks and check their progress over MCP. Agents running inside Bloom can also control the panes in their workspace.
Is it really free? #
Yes. Bloom is free to download and use, with no paid tier planned. Spatie funds it through our other work. You still need your own coding agent subscription or API access.
Is it open source? #
Yes. You can read the code, report bugs and contribute at github.com/spatie/bloom.
What about node_modules, .env files and dev servers? #
Each worktree starts as a fresh checkout. Bloom copies your
.env files and runs the project's setup script if one is
configured. Use that script to install dependencies and set up services.
Build caches start cold in each new worktree.
How do I set up a Laravel project? #
Each workspace starts in a fresh directory. For a Laravel project, you typically need to install dependencies, configure a local URL and prepare a database before you can run the app.
A setup script is a text file containing the terminal commands you would normally run to get your project ready. Bloom runs them for you in each new workspace, before the agent starts. You only need to configure this once per project.
1. Create the script in your project. Open your original project
folder in your editor, the one containing artisan and
composer.json. Create a folder named .bloom there if it
doesn't exist, then create a file inside it named setup.sh.
The full path within your project is .bloom/setup.sh.
Put your setup commands in that file. The example below is based on There There's
setup and assumes you already use Laravel Valet, PostgreSQL and Bun on your Mac.
Replace my-app and my_app with your project's name, and
adjust the commands if you use different tools. If you're unsure what belongs
here, ask your coding agent to adapt this example to your project.
#!/usr/bin/env bash
# Stop on errors or unset variables.
set -eu
# Bloom provides the original checkout path and this workspace's ID.
# Start with the original project's environment settings.
cp "$BLOOM_ROOT_PATH/.env" .env
# Give this workspace its own HTTPS .test domain with Laravel Valet.
SITE="my-app-$(printf '%s' "$BLOOM_WORKSPACE_ID" | tr -cd '[:alnum:]' | cut -c1-10)"
valet link "$SITE"
valet secure "$SITE"
sed -i '' "s|^APP_URL=.*|APP_URL=https://$SITE.test|" .env
# Use a separate PostgreSQL database so the main checkout is untouched.
# Only create it if it doesn't exist, so setup can run again.
DATABASE="my_app_$(printf '%s' "$BLOOM_WORKSPACE_ID" | tr -cd '[:alnum:]' | cut -c1-12)"
if ! psql -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname = '$DATABASE'" | grep -q 1; then
createdb "$DATABASE"
fi
sed -i '' "s|^DB_DATABASE=.*|DB_DATABASE=$DATABASE|" .env
# Install PHP and JavaScript dependencies, then build the frontend assets.
composer install
bun install
bun run build
# Create the tables and seed the workspace database with initial data.
php artisan migrate --seed --force
2. Tell Bloom where to find it. In the same .bloom
folder, create settings.toml and add the following. If the file
already has a [scripts] section, add the setup_file
line to that section instead of creating a second one.
[scripts]
setup_file = ".bloom/setup.sh"
3. Make the script runnable and save both files in Git. Open a terminal in your original project folder and run these commands. Committing the files makes them available in new workspaces. If you're doing this on a feature branch, merge it into the branch you create workspaces from.
chmod +x .bloom/setup.sh
git add .bloom/setup.sh .bloom/settings.toml
git commit -m "Add Bloom setup script"
4. Create a new workspace in Bloom. Bloom runs the script from
the new workspace's folder and supplies the BLOOM_* variables used
above. If setup fails, check its output, fix the script and choose
Run Setup Again from the Workspace menu.
Once setup works, you can also create .bloom/archive.sh to remove
the workspace's Valet site and database when you archive it. Register it with
archive_file = ".bloom/archive.sh" in the same
[scripts] section. Keep cleanup limited to the URL and database
created for that workspace.
What happens to my sessions when I quit? #
Quitting Bloom stops running agent turns. To keep terminals running, install tmux and turn on "Keep terminals running after quitting" in Settings. Those terminals will still be available when you reopen Bloom.
Do I have to review everything in Bloom? #
No. Each workspace is a git worktree on your disk. You can open it in your editor, run your own tools and push its branch as usual.
Is there a Windows or Linux version? #
No. We have no plans for Windows or Linux.