Projects
The sidebar on the left of Threads (/), one row per project.
Adding a project
Add project opens the native folder picker. It runs in the main process, not the renderer — the window itself has no filesystem access — so picking a folder there is also the consent that makes it readable by anything else in the app: the tree in Files, the viewers, a terminal.
The row
A project's name selects it: the selected project is where a new thread starts. Under the name is a git badge, and to the right a ⋯ opens the actions row.
The git badge
It reads main ±3 ↑1 ↓2 — branch, then how many files are changed (working tree, index and untracked together), then commits ahead of and behind the upstream. A folder that is not a git repository shows no badge, and neither does one whose git status takes more than two seconds to answer: a slow repo should not stall the sidebar. Answers are cached for five seconds, so switching between projects does not re-run git on every render.
Actions
- Open in Terminal opens the Terminal screen with this project as the shell's working directory.
- Reveal in Finder shows the folder in the OS file manager.
- Project settings — see below.
- Pin to top / Unpin.
- Remove from list asks first. It removes only the sidebar entry: no file is touched, and a thread still running in that project keeps running.
Ordering
Pinned projects sort first. The rest sort by most recently opened. A project that only appears because a session happens to be running in it — you never opened it yourself — sorts last, alphabetically among its kind.
Pins and recency are stored in the global settings document under ide.projects, so the order survives a restart.
Project settings
The sheet writes <project>/.snowpea/settings.json through the core, the same settings.set call with scope: "project" that the TUI uses — and the same file the TUI reads, so a change here is visible there too. It edits three things:
- Default mode — the permission mode (
plan/accept/auto) a new thread in this project starts in. - Model — what this project's agents run on, with an explicit "Inherit from global settings" option that names the current global default rather than leaving it unstated.
- Backend — local, docker, or ssh.
Project settings win over global ones, key by key. A session's own /mode or /model wins over both. Anything left on inherit is decided in Settings.