deckspace.dev / DeckSpace / docs / first-workspace

Your first workspace

A workspace is a name and a folder on disk. Everything else — panes, agents, memory — hangs off that folder.

DeckSpace ships no model. It runs the agent CLIs you already have installed, inside terminal panes, rooted at a directory you choose. Getting to real work is three things: finish or skip the first-run wizard, create a workspace pointed at a project folder, and put an agent in a pane.

The first-run wizard

On a genuinely fresh install one overlay appears before anything else. It is gated on a single browser-storage flag, deckspace.onboarded.v1, so it renders exactly once. Every step is skippable, Skip setup is visible on every step, and pressing Escape deliberately does nothing.

StepWhat it doesSkippable
WelcomeIntro only.yes
API keysStores provider keys for DeckSpace’s own features, and offers a one-click Detect installed AI CLIs scan.yes
VoiceVoice provider, voice and assistant name.yes
Your MacAn opt-in scan of how your home folder is organised, saved to the local memory vault. It does nothing unless you click the scan button.yes
PermissionsmacOS permission grants for dictation and the voice assistant.yes
AutonomyPicks one of three presets and writes it into the same setting Settings → Autonomy uses.yes

The Autonomy step offers three labelled choices, and they map onto the app-wide presets described in What walk-away does:

Wizard choicePreset it writes
Balancedplan
Ask every timeask
Full autonomywalkaway
The wizard’s own note about full autonomy is not the whole truth

The source comment beside the Full-autonomy option says agents “stay write-confined to their own folder.” The kernel write fence only wraps panes where the agent CLI is the pane’s process. The panes this wizard creates are shells with a command typed into them, which is a different path — see Opening the first pane below, and What walk-away does for which panes are fenced and which are not.

The first-run wizard does not create a workspace. When you finish or skip it and no workspace exists yet, it hands off to the workspace wizard described next. You can run the first-run wizard again later from Settings.

Creating the workspace

The workspace wizard has four steps. It also opens from the + button in the left rail (tooltip: New workspace) and from the New workspace button on the empty stage.

StepWhat you set
1 · StartWorkspace name, and a type: Standard (terminal grid), Swarm (opens into the swarm room), Canvas (opens into the browser view). The type only chooses which view the workspace opens into — everything stays reachable from the dock. Saved presets, if you have any, appear here.
2 · LayoutThe working folder, and how many terminals.
3 · AgentsOptionally pick one detected agent CLI and a first prompt.
4 · PermissionsThe same macOS voice and assistant grants as the first-run wizard. Optional.

On the Layout step you can click the folder button to open the native directory picker, or type or paste a path into the text field below it. The text field is always present, deliberately, because it still works when the native picker fails to open. Recently used folders appear as buttons.

The terminal-count buttons offer 1, 2, 4, 6, 8, 10 and 12, and the grid is derived from the count:

TerminalsGrid
11 × 1
22 × 1
42 × 2
63 × 2
84 × 2
105 × 2
124 × 3

The hard ceiling elsewhere in the app is 16 panes. The wizard does not offer every value up to that.

A folder that does not exist is refused, and the wizard stays open

Before adding the workspace, DeckSpace asks the backend to point at the path. That call rejects anything that is not a directory, and the workspace is not created — you get a warning toast naming the path instead of a workspace that renders in the rail but sends every command to the previous folder. A pasted path with a typo hits this.

Pick a project directory, not your home folder

The folder you choose is where every pane’s shell starts, where the file tree and git panel read, and where agents work. Two limits are worth knowing before you pick.

Leaving the folder blank is allowed. The wizard lets you finish with no folder at all, and that workspace is a bare terminal grid. Nothing points the backend anywhere, so the panes open in whatever directory the backend already held — on a fresh install, that is your home directory. If you did not mean to do that, set a folder.

Some roots are refused for code indexing. A workspace rooted at your home directory, at /, at a volume root, at ~/Library, or under /System, /usr, /bin, /sbin, /Applications, /Library, /private or /Volumes is excluded from the index walk. The workspace still opens and the panes still work; the features built on the index do not get one.

The file tree also never expands a fixed list of heavy directories, whatever root you choose — among them node_modules, .git, target, dist, build, .next, .venv, __pycache__, coverage, vendor, Pods and DerivedData.

What DeckSpace finds on your PATH

Detection is a PATH lookup, nothing more. DeckSpace checks each known command name against a PATH it assembles itself, and reports the ones it can resolve to a file. It does not run them, install them, or read your API keys.

AgentCommand it looks for
Claude Codeclaude
Codexcodex
Aideraider
Antigravityagy
Gemini (legacy CLI)gemini — retired 2026-06-18; new launches redirect to agy
OpenCodeopencode
Cursor Agentcursor-agent
Droiddroid
Copilot CLIcopilot
Grok CLIgrok
Ampamp
Qwen Codeqwen

Anything you have registered yourself is probed the same way and listed after the built-ins.

How that PATH is built

A GUI app launched from Finder or the Dock inherits a minimal PATH that has none of the version-manager shims your terminal has. DeckSpace works around that once per run, in this order:

  1. The PATH this process was started with.
  2. The PATH your login shell prints, obtained by running your $SHELL as -lic and reading $PATH. This step is capped at 1.5 seconds and the child is killed if it overruns.
  3. A fixed list of per-user directories under your home: .local/bin, .grok/bin, .opencode/bin, .cargo/bin, .bun/bin, .npm-global/bin, .deno/bin, .volta/bin, .local/share/mise/shims and bin.
  4. /opt/homebrew/bin, /usr/local/bin, /usr/bin, /bin.

The result is cached for the life of the app, and every pane and headless run uses it.

A scan that finds nothing looks exactly like a scan that worked

Step 2 is the one that finds nvm, asdf and mise shims. If your login shell takes longer than 1.5 seconds to start — a heavy .zshrc, a prompt framework, a network call in a shell hook — the probe is killed with no error, no toast and no log line in the UI. Detection then falls back to steps 1, 3 and 4 only, and an agent CLI that a terminal finds instantly is reported as not installed. The Agents step says “No agent CLIs found on PATH” and the wizard continues normally.

If you know a CLI is installed and DeckSpace disagrees, check whether it lives in one of the directories in steps 3 and 4. If it does not, either move or symlink it into one, or register it in Settings by its absolute path — an absolute path is checked directly and skips PATH resolution entirely.

The same login-shell probe is what supplies environment variables your GUI process never saw — an ANTHROPIC_API_KEY exported from ~/.zshenv, for example. It carries the same 1.5-second cap and the same silence when it expires, and only variables this process does not already set are added.

Both probes are compiled out on Windows

The login-shell PATH query and the login-shell environment query are both guarded #[cfg(not(windows))]. On a Windows build neither runs at all: PATH is the process PATH plus the fixed directory lists, and no shell-exported variable is ever picked up. Windows also adds .exe, .cmd and .bat when resolving a command name.

The first-run wizard’s Detect installed AI CLIs button does slightly more than the workspace wizard: it also runs each resolved binary with --version, capped at 3 seconds per CLI, on one thread per CLI. That version string is only ever shown to you. The scan runs on your click and never at startup, and its result is cached locally so a return visit renders instantly.

Opening the first pane

The workspace wizard ends with two buttons.

ButtonWhat happens
Open empty workspaceThe grid opens with a shell in each pane, rooted at your folder. You type whatever you want.
Open with <agent> in every paneOnly appears once you have selected an agent on step 3. Waits for each pane’s terminal to come up, then types that agent’s launch command into it.

For the second button, each pane receives an export OPX_GUARD=1 line first, then the agent command. That guard is the destructive-command seatbelt — it is a seatbelt, not a boundary. Panes you open and type into yourself never get it.

These first panes are not inside the kernel write fence

The fence wraps a pane only when the agent CLI is spawned as the pane’s own process. This wizard launches by typing a command into an already-running shell, which is the other path. The autonomy preset you picked in the first-run wizard still applies; the fence does not. What walk-away does has the full table of which panes are fenced, and which platforms have a fence at all.

The first prompt, and what happens to it

If you typed a first prompt and asked for more than one terminal, DeckSpace does not send the same text to all of them. It first runs your selected CLI once, headlessly, asking it to split your goal into exactly N parallel subtasks, then sends one subtask per pane.

If that split fails, every pane silently gets the identical prompt

The split is a single headless invocation of the form <bin> -p <prompt>. That -p flag is hardcoded for every agent, so a CLI that does not accept -p as its prompt flag exits non-zero. Any failure — wrong flag, missing auth, non-zero exit — is caught and falls back to filling all N panes with your original text. There is no error, no toast and no visible difference: you get N agents doing the same job.

The same fallback fires quietly when the CLI returns fewer lines than you have panes. If you want distinct work per pane, write the per-pane instructions yourself rather than relying on the split.

That split call also runs without the write fence: the wizard does not ask for it, and the default when it is not asked for is off. It is a short read-and-plan call, but it is a real agent run in your workspace root.

Panes whose terminal does not register within 8 seconds are skipped — the pane is there and usable, it just does not receive the launch.

What gets written into your folder

Adding a workspace with a folder triggers two writes into that folder. Both are idempotent and neither clobbers your files.

PathWhat lands there
.opxmemory/workspace.mdA pinned workspace note with the path and creation date, and two empty sections for you to fill. Written only if absent.
.opxmemory/daily-<date>.mdToday’s log note. Written only if absent.
.mcp.jsonThree MCP server entries — opxmemory, opxmemory_global, opxboard — so agent CLIs launched here can reach memory and the board.

If .mcp.json already exists, DeckSpace merges in only the keys that are missing and leaves everything else alone. If the existing file does not parse as JSON, or its top level is not an object, or mcpServers is not an object, it is left completely untouched and no servers are added.

Both writes are fire-and-forget

Adding a workspace must never fail because seeding failed, so errors from either write go to the developer console and nowhere else. If .opxmemory/ or the MCP entries are missing after creating a workspace, nothing on screen will have told you. Check the folder.

Note that .opxmemory/ is live product data read by the app’s Memory room, not scratch space. See Memory.

More than one workspace

Workspaces are listed in the left rail, each with its own name and colour, and the list is persisted so it survives a restart. Switching one repoints the backend at that folder.

A moved or unmounted folder is reported, not hidden

Switching to a workspace whose folder is no longer there switches the view immediately, then tells you that agents are still running in the previous workspace until you repoint it. Closing a workspace kills its shells and agents first, so nothing is orphaned.

Where to go next