Launchpad / Features

Features

Every feature is scoped to a project and designed to stay out of the way of a terminal-first workflow. Visual tools where they help, keyboard where they don't.

Projects

A project is just a root directory. When you open one, every terminal spawned in that window starts at the project root, the file browser is locked there, and the git panel operates on that repo. ⌘P fuzzy-search stays inside the project.

This means you can run a CLI agent like claude or aider in a terminal tab and click around the file tree without ever sending a stray cd to the shell — the file browser is purely visual.

  • One window = one project. Opening a project in the picker takes over the current window (VS Code convention). Already-open projects get focused if you try to open them again.
  • Multi-window on demand. ⌘⇧N opens a fresh project picker so you can open a second project in parallel. Each window is fully independent.
  • Picker with recents. Projects are stored at ~/.launchpad/projects.json. Right-click (or the hover menu) to rename, open in a new window, or remove from the list.
  • Back to projects — a button in the toolbar tears down the workspace and returns to the picker.

Terminal

Full PTY-backed terminal with tabs, split panes, and a split workspace. Spawns real zsh/bash processes with proper signal handling, 256-color support, and correct escape sequences.

Tabs and panes

  • Multiple tabs (⌘T / ⌘W / ⌘1-9)
  • Split pane within a tab (⌘D) with draggable divider
  • Split workspace into left/right groups (⌘\) — each group has its own tab bar
  • Drag tabs between groups, or move with ⌘⇧M
  • Switch focus between groups with ⌘⌥← / ⌘⌥→
  • Clear screen (⌘K)

Under the hood

  • WebGL-accelerated rendering with canvas fallback
  • Unicode 11 width tables for correct CJK/emoji rendering
  • Backpressure flow control prevents xterm.js write queue overflow
  • Right-click context menu (Copy, Paste, Clear)
  • Drag files from the sidebar to paste paths
  • Configurable font, size, cursor style, scrollback
Deferred reader pattern. Each PTY's output reader thread starts only after the frontend registers the pane — preventing a race where early output gets dropped. See Architecture → PTY.

Code editor

Files open as tabs alongside your terminal tabs — one unified tab bar. Click a file in the sidebar or use ⌘P, and it opens in a full CodeMirror 6 editor. Lean by default — the heavier features below are opt-in, so the editor stays out of the way until you want them.

Editing

  • Syntax highlighting for JS, TS, JSX, TSX, Python, Rust, HTML, CSS, JSON, Markdown, SCSS, TOML, YAML, Shell
  • Find and replace (⌘F / ⌘H)
  • Bracket matching, close brackets, code folding, indent guides
  • Autocompletion, highlight selection matches, rectangular selection, crosshair cursor
  • File path breadcrumb + line/column status bar — click to toggle line endings, tab size, word wrap
  • Modified indicator, unsaved-changes warning on close, right-click context menu
  • Optional vim mode · save with ⌘S

Git-aware

  • Change gutter — a per-line bar showing what changed vs HEAD (added / modified / deleted), matching the file-tree colors. Reflects disk-vs-HEAD, so a staged hunk still shows.
  • Hunk navigation — jump between changed hunks with ⌥J / ⌥K
  • Inline hunk actions — click a gutter marker to Revert hunk (restore the HEAD version of those lines) or Stage file
  • Blame — a status-bar toggle reveals a left margin with short commit + age per line; hover for author + summary, click to open that commit's diff
  • Inline conflict editor — Accept Ours / Theirs / Both above each conflict block, auto-stages when resolved (see the git panel)

Navigation & intelligence

  • Symbol outline (⌘⇧O) — a fuzzy palette of the file's functions / classes / methods / headings, derived from the syntax tree and upgraded to the language server's richer documentSymbol list when LSP is enabled
  • Reveal active file in tree (opt-in) — keep the sidebar synced to the file you're editing
  • Language server (opt-in, off by default) — flip it on and the editor connects to typescript-language-server, rust-analyzer, or pyright for real diagnostics, completion, hover, signature help, go-to-definition, rename, and find-references. Nothing spawns a server until you ask for it.
  • Format on save (opt-in) — runs prettier / rustfmt / black / gofmt / shfmt on the saved file

Git panel

Open with ⌘G. A visual git workflow designed so you never have to remember git commands. Stage, commit, push, pull, stash, merge, create branches, amend, cherry-pick, rebase — all from buttons.

Working with changes

  • Quick actions toolbar — Pull, Push, Fetch, Stash, Pop in one click
  • Staged vs unstaged split — clear separation of what's going into your commit
  • Stage / unstage / discard — per-file buttons with confirmation on destructive actions
  • Commit form — multi-line textarea with conventional commit prefix dropdown (feat / fix / chore / ...) and character counter
  • AmendAmend (with staged) reuses the index, Amend message only keeps the existing tree. Both prompt before rewriting a commit that's already on a remote.
  • Diff preview — click any changed file to see a structured diff with line numbers and hunk headers

Branches and history

  • Branch management — create, switch, delete, merge branches. View local and remote branches with last commit info.
  • Commit history — last 30 commits with OID, message, author, and timestamp. Click to expand and see changed files with +/- line counts.
  • Right-click any commit for: Compare with HEAD / parent / arbitrary ref, Cherry-pick onto HEAD, Rebase from here…, Copy OID.
  • Compare two refs — opens a dedicated diff tab listing every changed file between the refs, with full hunks and +/- counts.
  • Ahead/behind indicators — see how your branch compares to remote at a glance
  • Auto-push with upstream — first push to a new branch automatically sets up tracking

Cherry-pick, interactive rebase, pending operations

  • Cherry-pick onto HEAD — pick a single commit forward; conflicts route through the Pending Operation banner with Continue / Abort.
  • Interactive rebase tab — right-click → Rebase from here… opens a dedicated composer. Drag commits to reorder, choose pick / reword / squash / fixup / drop / edit per row, then Apply. Conflicts pause the rebase, open the conflicted file inline, and surface Continue / Skip / Abort on the banner.
  • Backup tag — every interactive rebase creates rebase-backup-<branch>-<timestamp> before any history rewrite, so you can recover from a bad rewrite.
  • Pending Operation banner — when a merge / cherry-pick / rebase is paused, the banner shows the operation kind, current step / total steps (rebase), and Continue / Skip / Abort buttons.

Conflict resolution

  • Inline conflict editor — open a conflicted file and the editor renders an action bar above each <<<<<<< block with Accept Ours / Theirs / Both. Save when all blocks are resolved → file auto-stages and the panel updates.
  • 3-pane merge tab — for tougher conflicts, click Open 3-Way to see ours / merged / theirs side by side. Side panes are read-only; the center pane is editable with synchronized line-aligned scrolling. Save → auto-stages.
  • Per-file Ours / Theirs / Edit buttons in the conflicts section for whole-file resolutions.

GitHub and reliability

  • GitHub integration — Open Repo, Open Branch, and Create PR buttons (auto-detected from your remote URL, works for SSH and HTTPS, including git@github.com-alias: ssh-config aliases)
  • Stash management — save, pop, apply, and drop stashes
  • Cancellable network ops — push, pull, fetch, merge can be cancelled mid-operation, even on a stalled TCP connection
  • HTTPS-safe defaults — no interactive credential prompts (they'd hang forever in a GUI app with no TTY); SSH agent socket forwarded even when launched from Finder
  • Git cheatsheet — hit ? for a plain-English explanation of git concepts
libgit2 + system git. Local operations use the git2 crate for speed. Network operations shell out to your system git so they respect your SSH keys, credential helpers, and .gitconfig. No credential storage reinvention.

File browser

  • Tree view with expandable directories, rooted at the project directory
  • Color-coded by file type (JS yellow, Python green, Rust pink, config cyan) and git status (modified yellow, new green, deleted red, staged green, conflict pink)
  • Agent-safe — navigating folders never writes to a terminal. Browse freely while a CLI agent runs, without risk of sending a surprise cd.
  • Root-locked — nav-up caps at the project root, go-home jumps back to the root from any depth
  • CRUD operations — right-click to create new files/folders, rename, delete, reveal in Finder
  • Live filesystem watcher — files created, modified, or deleted from the terminal or externally appear instantly in the tree (no manual refresh needed)
  • Off-DOM tree building — folder expansion is flicker-free thanks to detached DOM fragment rendering
  • Click to open in editor, double-click folder to navigate
  • Drag files to terminal to paste the path
  • Right-click: copy path, copy name, reveal in Finder
  • Search / filter with ⌘F
  • Toggle hidden files, resizable sidebar

Quick open (⌘P)

Fuzzy file search across your project. Case-insensitive, ranked by path length. Skips hidden dirs, node_modules, target, and other build noise. Arrow keys to navigate, Enter to open as an editor tab.

Settings (⌘,)

All preferences in one place, applied live to open terminals and editors:

  • General — sidebar width
  • Terminal — font family (SF Mono, Menlo, Fira Code, JetBrains Mono...), font size, scrollback, cursor style, cursor blink
  • Editor — font size, tab size, word wrap, vim mode, indent guides, format on save, reveal active file in tree, language server
  • Git — auto-refresh interval, default commit prefix

Settings saved to ~/.launchpad/config.json. Project list saved to ~/.launchpad/projects.json.


Keep going: keyboard shortcuts · architecture.