Your first copy

Attach a project, open a copy, run an app on its screen, and learn the handful of keys that matter.

Attach a project #

Press ⌘K and choose Add project. Pick a git repository. The app detects how the project launches when it can, and lists the repository's worktrees.

Open a copy #

In ⌘K, every worktree of the project appears as open a copy. Choose one. Opening a copy starts it; there is no separate play button.

The copy reports its phase as the host observes it, never on a timer:

PhaseMeaning
starting the virtual machine…the host accepted the command and is spawning the VM
booting…the guest kernel is up, the system is coming up
starting the desktop…the compositor is starting
runningusable
stopping…shutting down
failed to startit did not come up; the Logs tab says why

What you see #

A terminal, opened in ~/workspaces, and that directory is your worktree, mounted read-write over virtio-fs. Files you change in the copy change on your disk, and the other way round.

Run something:

sb run firefox

The first run fetches Firefox from the package cache into the shared store; you see the progress. The window appears on the copy's screen. A second copy that runs Firefox starts it from the store, without the download.

sb run accepts anything in nixpkgs by name, or any flake reference. See sb run.

Keys #

ChordDoes
⌘KCommand palette. Matches subsequences, so blndr finds Blender.
⌘OApp launcher for the focused copy.
⌘GCapture the mouse and keyboard for the copy, and release them.
⌘VPaste your Mac's clipboard into the copy.
Ctrl+anythingAlways goes to the guest, so Ctrl+C works in its shell.
⌘⏎Focus mode: hides the rail and the chat and zooms the pane. Press again to restore.
⌘</kbd> / ⌘⇧</kbd>Split the pane right / down.
⌘← / ⌘→Switch between copies.
⌘1⌘9The focused copy's app tabs.
⌘LFold and unfold the chat.
EscCloses palettes and dialogs, and releases capture.

A second copy of the same worktree #

⌘KOpen another copya second run of this worktree. The two copies share the worktree and nothing else: separate disks, separate memory, separate networks. This is how you compare two states of one project side by side.

Things that surprise people #

  • File watchers in the copy do not see your edits from the Mac. Inotify does not cross virtio-fs for host writes. Run dev servers inside a copy with polling: CHOKIDAR_USEPOLLING=1, Vite's server.watch.usePolling, cargo watch --poll. Latency is about half a second.
  • Build output lands in your real worktree. node_modules/, target/, dist/ written inside the copy appear on your disk, because the worktree is one directory, not a copy. Your .gitignore is what keeps them out of git.
  • Metadata-heavy work is slower than on a local disk. npm ci and cargo build over virtio-fs take longer than they do natively.
  • Clipboard is one way. ⌘V pastes into the copy; copying out of a copy to the Mac is not there yet.