Projects & Workspaces
A project is a folder you pointed Happy at. A workspace is a folder an agent works in. Usually they are the same folder. When two pieces of work would touch the same repository at once, each gets its own workspace: a Git worktree on its own branch, cut from the remote's trunk.
Projects
Importing registers the folder. Happy does not move it, copy it, or initialize Git. AGENTS.md files anywhere in the tree are read by every agent working there and re-read when they change. Your global AGENTS.md applies to every project.
Creating a workspace
- Fetch
originand fork the remote trunk. The project folder's checkout,HEAD, and branches are not touched. - Reserve a name, a folder under
~/Happy/Workspaces(macOS) or~/happy/workspaces(Linux), and a branchworktree/<name>. git worktree add, in the background.- Copy the files in
workspace.sync(a gitignored.env, say) and keep them current whenever the project root's copy changes. - Run
workspace.setup_commands, such aspnpm install --frozen-lockfile.
A workspace is ready once the checkout and file sync succeed; a failed setup command is logged as a warning. It starts with a cold build cache. A project without Git gets a plain copy of its folder instead of a worktree.
A new workspace takes the name of its first conversation, and the branch follows. A workspace you named is never renamed by an agent.
Archiving
Immediate and irreversible: the workspace leaves the list, the worktree and folder are removed in the background, the branch stays in Git. Archive when the work is finished or abandoned. Archiving from an agent is reviewed in Auto.
Agents in another workspace
An agent never edits another workspace by path. Work runs from inside the workspace:
- Subtask: a full conversation in your session list, in its own new workspace, with the creating agent as its coordinator. Only bots and their subtasks create them.
Only the creating session may archive a workspace.
When to create one
When work will run alongside other work and their changes could collide. That is the only reason. A subtask of what you are already doing, however many subagents help, stays in the current workspace.
Changes
Measured against the branch's merge base with the remote default branch (origin/main), falling back to the local one only when there is no remote. Desktop shows changed files beside the conversation.
[workspace]
setup_commands = ["pnpm install --frozen-lockfile"]
sync = [".env"]
protected_sync = [".env.production"]