Everything you need to know, nothing you don't.
English | Català | Español | Svenska
The year is 2026. We build on tmux (2007), git worktrees (2015), terminals (1978, the VT100 era, when even David was only a future project), and GPU rendering (thanks Mitchell for Ghostty). Old tools, new tricks.
You need two things: a Mac and a vague sense that your current workflow could be better.
brew install --cask factory-floor
Factory Floor works best when these are installed (it’ll tell you if they’re missing):
No config files required. Factory Floor detects your git setup, installed tools, and GitHub connections automatically.
The three things you’ll interact with every day.
A project is a git repository. Drop a directory on the sidebar or click the + button. Factory Floor checks if it’s a git repo (and offers to initialize one if it’s not).
The project overview shows repository info, GitHub details (stars, forks, open issues), up to 5 recent PRs, and auto-discovered markdown documentation from your repo.
Projects sort by Recent (last activity) by default. Toggle to A-Z if you’re that kind of person.
Right-click a project in the sidebar for quick access: Reveal in Finder, Open in External Terminal, Open on GitHub, or Remove (files stay on disk, we’re not monsters).
A workstream is where the work happens. Each one gets its own git worktree, branch, terminal, coding agent, and browser tab. They’re completely isolated from each other.
⌘N creates a new workstream. Behind the scenes:
ff).env and .env.local from the main repo (if enabled)The UI shows up instantly — worktree creation happens in the background.
With Auto-rename branch enabled in settings, the coding agent renames your branch to match the task on the first prompt. So ff/coral-tidal-reef becomes ff/fix-login-timeout.
When a PR is merged, Factory Floor shows a “Purge” badge so you know it’s safe to clean up.
The coding agent tab runs Claude Code in an embedded terminal. It sits right after the Info tab in every workstream.
Quick actions run one-shot Claude tasks from the sidebar:
These run as background claude -p calls. Enable Quick action debug mode in settings if you want to know how the sausage is made. Trust us, David spent more time than he can admit debugging weird behaviors in there.
Terminals, browsers, and shortcuts — the tools inside each workstream.
Terminals are GPU-rendered via Ghostty. They’re fast.
You can drag files and text onto the terminal. Because sometimes the mouse is fine, actually.
⌘Shift+E opens the workstream directory in your preferred external terminal app.
Every workstream can have browser tabs (⌘B). The browser is embedded — no window switching needed.
When your run script starts a dev server, Factory Floor detects the listening port automatically and navigates the browser to it. No configuration needed. The ff-run launcher monitors the process tree for TCP listeners.
The browser shows a connection error page with a retry button if the server isn’t ready yet. It’ll auto-navigate once the port is detected.
Factory Floor is keyboard-first. Here’s everything.
| Shortcut | Action |
|---|---|
| ⌘N | New workstream (or project, if none exist) |
| ⌘Shift+N | New project |
| ⌘, | Settings |
| ⌘/ | Help |
| Shortcut | Action |
|---|---|
| ⌘Return | Focus Coding Agent |
| ⌘I | Info panel |
| ⌘E | Environment |
| ⌘T | New Terminal |
| ⌘B | New Browser |
| ⌘W | Close tab |
| ⌘L | Address bar (browser) |
| ⌘0 | Back to project |
| ⌘1-9 | Switch tab |
| ⌘Shift+[ | Previous tab |
| ⌘Shift+] | Next tab |
| Ctrl+Shift+R | Rebuild setup |
| Ctrl+Shift+S | Start/restart run |
| Shortcut | Action |
|---|---|
| Ctrl+1-9 | Switch workstream (from any view) |
| ⌘Shift+O | Open in external browser |
| ⌘Shift+E | Open in external terminal |
How to automate the boring parts.
Drop a .factoryfloor.json in your project root to automate the workstream lifecycle.
{
"setup": "npm install",
"run": "PORT=$FF_PORT npm run dev",
"teardown": "docker-compose down"
}
| Hook | When it runs |
|---|---|
setup |
Once, when a workstream is created. Install dependencies, run migrations, whatever. |
run |
On demand via the Environment tab (⌘E). Wrapped in ff-run for port detection. |
teardown |
When a workstream is archived or purged. Stop containers, clean up. |
All fields are optional. Scripts run in the workstream directory using your login shell. Yes, even fish. Don’t ask how long that took.
Factory Floor also reads conductor.json and .superset/config.json if .factoryfloor.json doesn’t exist. Because compatibility is polite. (Time for a standard?)
Split-pane layout: Setup on the left, Run on the right.
Every terminal, setup script, and run command in a workstream has these variables:
| Variable | What it is | Example |
|---|---|---|
FF_PROJECT |
Project name | my-app |
FF_WORKSTREAM |
Workstream name | coral-tidal-reef |
FF_PROJECT_DIR |
Main repository path | /Users/you/my-app |
FF_WORKTREE_DIR |
Worktree path | ~/.factoryfloor/worktrees/my-app/coral-tidal-reef |
FF_PORT |
Deterministic port (40001-49999) | 42847 |
Each workstream gets a deterministic port based on a hash of the worktree path. Same workstream, same port, every time. No port conflicts between workstreams. Use it in your run script: PORT=$FF_PORT npm run dev. If your thing is running thousands of workstreams simultaneously, you might get a collision 🎲 but hopefully you run out of memory first.
When enabled (Settings > General), Factory Floor symlinks .env and .env.local from your main repo into each worktree. So your secrets follow you without copy-pasting. Speaking of secrets, have we told you about Vaultuner?
Open with ⌘, or click the gear icon.
ff).env and .env.local to worktreesConnecting Factory Floor to everything else.
Install the ff command from Settings > Environment > Install CLI. Then:
ff /path/to/your/project
Opens the directory in Factory Floor. That’s all it does, and that’s all it needs to do.
Requires the gh CLI with authentication (gh auth login).
From the sidebar, run one-click operations: Create PR (AI-generated title and description), Push (to origin with -u), or Abandon PR (closes with a comment). Because if you’re tired of typing “now commit, push, and open a PR” into Claude for the hundredth time, you’re not alone.
Factory Floor shows a badge in the sidebar when a newer version is available. You can also check manually from Factory Floor > Check for Updates…
Homebrew users:
brew upgrade factory-floor
DMG users: updates are handled automatically via Sparkle. Check manually from the menu: Factory Floor > Check for Updates…
Enable Bleeding edge updates in Settings > Advanced for pre-release builds. For those who like to live on the edge and file bug reports.
Nope. No syntax highlighting, no autocomplete, no minimap. Our nonexistent VCs have not been pushing any corporate agenda. We intend to have you using the tools you already love: Zed, VS Code, whatever. Factory Floor gives you a coding agent, a browser, and a worktree. Besides, who’s writing code anymore?
Also nope. Your git client already does this better than we ever would. We just make sure each workstream has a clean branch ready for review. You are keeping your PRs small and avoiding merge conflicts, right? …Right?
Factory Floor detects tools from your login shell. If claude, gh, git, or tmux aren’t showing up:
-L factoryfloor), so your personal tmux config won’t interfere$FF_PORT (or the port gets detected from the process tree)ff-run launcher wraps the run script — it monitors child processes for listening TCP ports