Terminal-first project discovery and workspace launcher for Cursor IDE and Claude Code
Scan your filesystem for projects, pick what you need in a fast TUI,
arrange the folder order, and open everything as a multi-root workspace in Cursor — or fire up Claude Code in the primary folder with the rest attached via --add-dir.
If you juggle dozens of repositories every day, creating multi-root workspaces by hand gets old fast. Curspace turns that into a single command:
curspace
It discovers every project under the directories you configure, presents them in a filterable list, lets you reorder them (the first folder becomes the primary workspace root), names the workspace, and opens it in your editor of choice — Cursor or Claude Code.
- Auto-discovery — Recursively detects Go, Node, Java, Python, Rust, .NET, PHP, and Git projects by their marker files.
- Interactive TUI — Fuzzy filter, multi-select, rescan, and continue without leaving the terminal.
- Drag-to-reorder — Arrange the selected projects before saving; the first item becomes the primary workspace folder.
- Open single project — Pick any discovered project and open it directly in Cursor or Claude, no workspace file needed.
- Instant open — Creates a
.code-workspacefile and launches your editor (Cursor or Claude Code) in one step. - Editor picker — Every open action prompts for Cursor or Claude; Claude launches
claudein the primary folder with all other folders added via--add-dir. - Claude token picker — Save named Claude API tokens and pick one after choosing Claude; curspace sets
ANTHROPIC_AUTH_TOKENonly for that Claude launch. - Workspace hub — List, reopen, rename, and delete saved workspaces from the same TUI.
- Path autocomplete — Tab-complete directories when adding scan roots.
- Scan caching — Reuses previous discovery results for sub-second startup.
- Cross-platform — macOS and Linux,
amd64andarm64.
brew tap frknikiz/curspace
brew install curspacego install github.com/frknikiz/curspace@latestGrab the latest archive from the Releases page, extract it, and place the binary on your PATH.
# 1. Tell curspace where your repos live
curspace roots add ~/projects
curspace roots add ~/work
# 2. Launch the workspace hub
curspaceThat's it. The hub scans your roots, shows discovered projects, and guides you through selection, ordering, and naming.
Running curspace without arguments opens the interactive workspace hub where you can create new workspaces and manage existing ones.
| Key | Action |
|---|---|
n |
New workspace (scan & select) |
o |
Open a single project (editor picker appears) |
ctrl+r |
Force rescan from disk |
Enter |
Open selected workspace (editor picker appears) |
d |
Delete workspace |
r |
Rename workspace |
a |
Add a new project root |
s |
Open settings (terminal, default editor, Claude tokens) |
q |
Quit |
When you trigger an open action, a small picker asks whether to launch Cursor (c) or Claude Code (l).
If saved Claude tokens exist, choosing Claude opens a second picker for the token to use.
curspace open # scan, select, order, name, open in Cursor
curspace open --editor claude # same flow, but launch Claude Code
curspace open --refresh # force rescan, bypass cachecurspace roots add <path> # add a scan root
curspace roots remove <path> # remove a scan root
curspace roots list # show all rootscurspace scan # scan and print discovered projectscurspace workspace list # list saved workspaces
curspace workspace open <name> # open in Cursor (default)
curspace workspace open <name> --editor claude # open in Claude Code
curspace workspace delete <name> # delete workspace file
curspace workspace rename <old> <new> # rename a workspaceSaved Claude tokens live in ~/.curspace/config.json with the rest of the curspace config. The config file is written with 0600 permissions.
From the hub, press s, open Claude tokens, then press a to add a named token or d to remove the selected token.
curspace claude token add work # prompts for the token
curspace claude token add personal sk-ant-...
curspace claude token list
curspace claude token remove workWhen Claude is launched with a saved token, curspace sets it as ANTHROPIC_AUTH_TOKEN for the Claude process. Choose current Claude login / environment in the picker to launch without overriding the current environment.
| Key | Action |
|---|---|
↑ / ↓ |
Navigate |
Space / Tab |
Toggle selection |
Ctrl+A |
Select all visible |
Ctrl+D |
Clear selection |
Ctrl+R |
Rescan projects |
Enter |
Continue with selection |
Esc |
Clear filter / go back |
| Type any text | Live filter by name, path, or type |
| Key | Action |
|---|---|
↑ / ↓ |
Navigate |
Shift+↑ / Shift+↓ |
Move project up / down |
Enter |
Confirm order |
Esc |
Back to selector |
All state lives under ~/.curspace/:
~/.curspace/
├── config.json # roots and settings
└── workspaces/
├── my-workspace.code-workspace # generated workspace files
└── another.code-workspace
{
"roots": [
"/Users/you/projects",
"/Users/you/work"
],
"max_depth": 10,
"terminal": "iterm",
"default_editor": "claude",
"claude_tokens": [
{
"name": "work",
"value": "sk-ant-..."
}
]
}| Field | Default | Description |
|---|---|---|
roots |
[] |
Directories to scan for projects |
max_depth |
10 |
Maximum directory depth for recursive scanning |
terminal |
auto-detect | Terminal app used to launch Claude Code. macOS: iterm or terminal. Linux: any executable name (overrides $TERMINAL). Leave empty to auto-detect (prefers iTerm if installed/active, else Terminal.app). |
default_editor |
(empty) | Skip the editor picker and always launch this editor. Allowed: cursor, claude. Leave empty to be asked on every open. |
claude_tokens |
[] |
Named Claude API tokens available in the Claude token picker. Manage with curspace claude token .... |
Tip: Both terminal and default_editor can also be edited from the hub (press s).
| Type | Detected by |
|---|---|
| Go | go.mod |
| Node | package.json |
| Java | pom.xml, build.gradle, build.gradle.kts |
| Python | requirements.txt, setup.py, pyproject.toml, Pipfile |
| Rust | Cargo.toml |
| .NET | *.csproj, *.fsproj, *.sln |
| PHP | composer.json |
| Git | .git directory (fallback) |
curspace/
├── main.go # entrypoint
├── cmd/ # CLI commands (Cobra)
│ ├── root.go # default hub command
│ ├── open.go # scan → select → order → name → open
│ ├── scan.go # standalone scan
│ ├── roots.go # root management
│ └── workspace.go # workspace CRUD
├── internal/
│ ├── ui/ # TUI (Bubble Tea + Lip Gloss)
│ │ ├── app.go # hub application model
│ │ ├── selector.go # project multi-select
│ │ ├── orderer.go # project reorder
│ │ ├── prompt.go # text input prompt
│ │ └── ...
│ ├── workspace/ # .code-workspace read/write
│ ├── scanner/ # filesystem project detection
│ ├── discovery/ # scan + cache orchestration
│ ├── cache/ # scan result caching
│ ├── config/ # ~/.curspace/config.json
│ ├── cursor/ # Cursor IDE launcher
│ └── claude/ # Claude Code launcher (Terminal + --add-dir)
├── .goreleaser.yaml
├── LICENSE
└── README.md
git clone https://github.com/frknikiz/curspace.git
cd curspace
# build
go build ./...
# test
go test ./...
# vet
go vet ./...
# run locally
go run . roots add ~/projects
go run .Releases are automated via GoReleaser and GitHub Actions.
git tag v1.x.x
git push origin v1.x.xThis builds cross-platform binaries, publishes a GitHub release, and updates the Homebrew tap automatically.
Contributions are welcome! Please open an issue first to discuss what you'd like to change.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
Distributed under the MIT License. See LICENSE for details.