Guide

Get LaboLabo running

Install steps for each OS, your first task, migrating from the Swift app, every keybinding, the control CLI, and what's still rough around the edges in this initial 1.0.0 release.

Installation

Every platform ships as a plain archive attached to the latest GitHub release — no installer, no package manager, no account. Pick your OS below.

macOS (Apple Silicon)

The quickest install is Homebrew: brew install love-rox/tap/labolabo — upgrades arrive with brew upgrade. Or install manually:

  1. Download LaboLabo-<version>.zip and unzip it — you get LaboLabo.app. Move it to /Applications if you like.
  2. The build is ad-hoc signed, not notarized (no Apple Developer ID). The first launch will be blocked by Gatekeeper — right-click the app and choose Open, or approve it from Settings › Privacy & Security after the first blocked attempt. You only need to do this once.

Windows

  1. Download LaboLabo-windows-<version>-x86_64.zip, extract it anywhere, and run labolabo-app.exe. The labolabo.exe (control CLI) and labolabo-hook.exe (hooks forwarder) binaries stay in the same folder — don't separate them.
  2. The build isn't code-signed, same as the other platforms — expect a SmartScreen prompt on first run (More info Run anyway).

Linux

  1. Download LaboLabo-linux-<version>-x86_64.tar.gz and extract it.
  2. Run ./install.sh — no root needed. It copies the binaries to ~/.local/share/labolabo-rs, symlinks labolabo-app/labolabo into ~/.local/bin, and adds an application-menu launcher. Or skip installing and run ./bin/labolabo-app directly.
Linux needs a Wayland or X11 session, fontconfig, and a working Vulkan driver — all present on any mainstream desktop install. Nothing extra to install for the prebuilt tarball.

Your first task

LaboLabo's unit of work is a task, not a directory. Each task owns its own tile/tab tree of terminal panes, and either a dedicated git worktree or an existing checkout you attach directly.

  1. Open LaboLabo. On a fresh install the sidebar is empty — use + Worktree to pick a git repository (a branch labolabo/<date>-<n> is created and checked out under <repo>/.worktrees/), or + Attached to pick any folder and work there directly, no worktree created.
  2. A terminal tab opens automatically in the task's directory. Run claude (or whatever CLI you use) — LaboLabo doesn't care what runs inside the terminal.
  3. Once Claude Code reports a hook event, a status dot appears on the tab chip and on the task's sidebar row: running, waiting for input, or idle.
  4. Split panes (Cmd+D / Cmd+Shift+D), add tabs (Cmd+T), or open the Git pane (Cmd+Shift+G) as a tile beside the terminal to see changed files, a diff, or the commit graph.
  5. Quit and relaunch — every task's sidebar entry and layout comes back, and any tab that had a recorded Claude session resumes it automatically (this can be turned off in Settings). Raw terminal scrollback itself is not restored — every pane gets a fresh shell/session on restart.

Migrating from the Swift app

If you already used the Swift version of LaboLabo, the Rust app can import its sessions as tasks — treated as a one-time migration, not a recurring feature.

  • On a genuinely fresh install — no task at all yet, active or archived — that also has a Swift database on disk, LaboLabo shows a one-shot confirmation dialog at launch: "Swift 版の データが見つかりました。作業とレイアウトを取り込みますか?" Choosing 取り込む (import) runs the import and shows a one-line result banner; 取り込まない (don't import) does nothing.
  • Either answer is remembered forever — the dialog is asked at most once, even on later launches with the Swift database still present. There is no menu item for this; it's a one-time migration aid, not a permanent feature.
  • The read from the Swift database is strictly read-only, so it's safe to run while the real Swift app is open elsewhere.

If you dismissed the dialog and change your mind later

  • Delete tasks.db (see "Where the data lives" in the README) and relaunch — this resets LaboLabo to a fresh install, so the dialog (and, if you accept it, the import) fires again. This also discards every task you've created in the Rust app since, so make sure that's really what you want first.
  • LABOLABO_FORCE_IMPORT_PROMPT=1 — a developer escape hatch that shows the dialog again on the next launch without touching tasks.db. It doesn't bypass the other two conditions (no task yet, a Swift database present) — it only un-sticks the one-shot answer.
After importing, avoid opening the same directory in both apps at the same time. Each app injects its own Claude Code hooks configuration into that directory's .claude/settings.local.json, and two concurrent injections into the same file can race.

Keybindings

Registered globally and dispatched to the selected task's focused pane. Cmd-modified keystrokes never reach the terminal's own input, so there's no conflict with typing.

KeysAction
Cmd+TNew tab in the focused pane
Cmd+WClose the focused pane's active tab (refused for a task's last pane, unless it's the app's only task — then quits)
Cmd+DSplit the focused pane right (new terminal in the task's directory)
Cmd+Shift+DSplit the focused pane down (same)
Cmd+1 … Cmd+9Select the Nth tab in the focused pane
Cmd+]Focus the next pane (tree order, wraps around)
Cmd+[Focus the previous pane (tree order, wraps around)
Cmd+VPaste the system clipboard into the focused pane
Cmd+CCopy the focused pane's current text selection, if any
Cmd+QQuit (hooks cleanup runs first)
Cmd+MMinimize the window
Cmd+,Open Settings
Cmd+Shift+GShow/hide the Git pane

On Linux, the "Cmd" modifier above maps to the Super/Windows key (gpui's platform binding) — it can collide with desktop-environment shortcuts. On Windows it maps to Ctrl.

Copying text

In a plain shell, drag to select and press Cmd+C — the usual terminal flow. Double-click selects a word, triple-click a line.

Full-screen apps that capture the mouse behave like they do in Ghostty. Claude Code handles drag selection itself and pushes the selected text straight to your system clipboard (via OSC 52, supported since 1.2.4) — just drag, no keystroke needed. For mouse-capturing apps that don't do that (vim, less, tmux), hold Shift while dragging to select with the terminal instead, then Cmd+C.

Prefer the terminal's own selection everywhere? Enable "Prefer text selection" in Settings — plain drag then always selects locally, and Shift becomes the way to send mouse events to the app. Scrolling is unaffected either way.

Control CLI

The labolabo binary talks to a running LaboLabo instance over a local control socket — the same mechanism a Claude session inside LaboLabo uses to open a teammate as a visible new tab, cmux-style. It only works from inside a terminal LaboLabo itself spawned: LABOLABO_TASK, LABOLABO_PANE, and LABOLABO_CONTROL_SOCKET are injected automatically into every pane, so commands resolve "the current task" without any flags.

# open a new tab in the current task and run Claude in it
labolabo tab open --title reviewer -- claude

# list every task
labolabo task list --json

# list tabs in the current task
labolabo tab list --task current

# switch focus to a task or a specific tab
labolabo focus --task <task-id>
labolabo focus --pane <pane-id>

There is no path that spawns a process without also adding it to the visible tile/tab tree — invisible background execution is explicitly not supported, by design.

Settings & Ghostty config

Cmd+, opens an in-window settings panel (close it with its own × or Cmd+, again).

  • Claude セッションの自動 resume (auto-resume) — on by default. Reopening a restored task automatically resumes its last Claude session.
  • Git ペインを既定で表示 (Git pane default visible) — on by default. Only affects tasks opened after the change.
  • スクロールバック行数 (scrollback line count) — applies to tabs opened after the change, not existing ones.
  • 言語 (Language) — 自動 (auto-detect from your OS locale) / 日本語 / English. Switching applies immediately, no restart.
  • アップデートを自動確認 (auto-check for updates) — on by default. A background, once-per-launch check against GitHub Releases; a new version shows as a dismissible sidebar banner. No telemetry, no OS notification.

LaboLabo has no font or color settings of its own — at startup it reads your existing Ghostty configuration (font-family, font-size, background/foreground/cursor-color/palette/theme) and matches it. Edit your Ghostty config to change how LaboLabo's terminal looks; there's nothing to configure inside the app itself.

Known limitations

1.0.0 is a from-scratch Rust rewrite that trades some polish for landing on three platforms at once. Read this section before filing a "missing feature" issue.

  • Windows and Linux are this release's newest platforms. The core (git engine, hooks, control CLI) is tested and builds on all three OSes in CI, but macOS has had by far the most real day-to-day use. Treat Windows and Linux builds as newer and less battle-tested — an honest first release, not a mature port.
  • IME (Japanese/CJK) composition has only been verified on macOS. The input-handling code path is platform-independent, but nobody has yet typed through a real IME on Windows or Linux.
  • No task rename yet — only archive and delete.
  • Fullscreen/maximized window state isn't restored between launches (position and size are).
  • Restart resumes each tab's last Claude session, not raw terminal scrollback — every pane starts a fresh session either way.
  • No repository registry yet — + Worktree asks you to pick a repository every time.
  • Cmd+]/Cmd+[ cycle panes in tree order, not by on-screen (left/right/up/down) position.

For the full, unabridged list see labolabo-app's README.