VibeSpace is a backend-agnostic workspace for coding agents. You bring the agent CLI(s) — Claude Code, Codex, or another harness wired up via an adapter — and VibeSpace adds persistent multi-session management, a tiling window manager, and a structured chat view on top.
You need Node.js, dtach, and at least one agent backend CLI.
| Dependency | macOS | Ubuntu/Debian |
|---|---|---|
| Node.js 18+ | brew install node |
See NodeSource |
| dtach | brew install dtach |
sudo apt install dtach |
| An agent CLI (≥1) | ||
| • Claude Code | npm install -g @anthropic-ai/claude-code |
same |
| • Codex | install codex, ensure it's on PATH |
same |
After installing a backend CLI for the first time, run it once in your terminal to complete login/setup:
claudefor Claude Code sessionscodexfor Codex sessions
curl -fsSL https://raw.githubusercontent.com/ProblemFactory/vibespace/master/install.sh | bashThe installer checks dependencies, prompts for install location (default ~/vibespace), clones the repo, and builds.
git clone https://github.com/ProblemFactory/vibespace.git
cd vibespace
npm install
npm run buildmacOS note: If
npm installfails with node-pty errors, runnpm rebuild node-pty --build-from-source.
cd ~/vibespace
npm startOpen http://localhost:3456 in your browser. On startup, a loading screen is displayed while the workspace restores your previous session layout. It fades away once all windows are created.
| Variable | Default | Description |
|---|---|---|
PORT |
3456 |
Server port |
HOST |
0.0.0.0 |
Bind address (127.0.0.1 for local-only) |
CLAUDE_CMD |
claude |
Path to Claude CLI binary |
CODEX_CMD |
codex |
Path to Codex CLI binary |
Example: PORT=8080 HOST=127.0.0.1 CODEX_CMD=/usr/local/bin/codex npm start
The UI has four main areas:
- Sidebar (left) — Session list grouped by working directory. Star, archive, rename, and organize sessions into tasks.
- Workspace (center) — Tiling window manager with draggable, resizable windows for terminals, chat views, file explorers, editors, and browsers.
- Toolbar (top of workspace) — Theme selector, layout presets, grid controls, new session, settings.
- Taskbar (bottom) — Window tabs, virtual desktop previews, backend usage pies, window count. Drag the top edge to resize.
- Click "+ New Session" in the toolbar or sidebar
- Choose a backend: Claude or Codex
- Enter a working directory (with autocomplete) and optional CLI arguments
- Choose Terminal or Chat mode (default is configurable in Settings > Session > Default session mode)
- A window opens with your session
Terminal mode gives you the full backend TUI via xterm.js. Chat mode gives you a structured message view with markdown rendering, tool visualization, live thinking/status updates, and interactive permission prompts. See Chat Mode for details.
The new-session dialog applies backend-specific defaults from Settings:
- Claude: default model, permission mode, effort, extra args
- Codex: default model, permission mode, reasoning effort, extra args
- Press
Ctrl+\thene(command mode) - Or click the folder icon in the toolbar
The sidebar auto-discovers both Claude Code sessions and Codex threads on your machine:
- Claude sessions can appear as LIVE, TMUX, EXTERNAL, or STOPPED
- Codex threads can appear as LIVE, EXTERNAL, or STOPPED
When resuming a stopped session, a split button lets you choose Terminal or Chat mode. The mode you last used for a session is remembered, and backend-specific defaults are re-applied when a session is resumed from the sidebar.
cd ~/vibespace
git pull
npm install
npm run buildOr re-run the one-line install command.
git push is gated by a tracked pre-push hook (installed by npm install). Since 2026-09-07 the gate has two tiers, because one 11.5-minute battery is a gate people learn to skip:
| command | what it runs | when | |
|---|---|---|---|
| Fast | npm run ci |
build + every suite under ~10 s + one real chat turn | before the push — a red here blocks it |
| Heavy | npm run ci:heavy |
headless-chrome UI suites, real worktree servers, real agent CLIs, the real opencode binary |
after the push, launched detached by the hook in its own worktree at the pushed commit |
The heavy tier writes data/ci-heavy/<sha>.green or .red (gitignored). A red result blocks your next push — with the failing suite names and the log path — until a green heavy run exists for a newer commit. The question is asked about every ref you are pushing, not about whichever branch you happen to be standing on. So the feedback stays out of your critical path, but nothing gets stacked on top of a commit that is known to be broken.
npm run ci # the fast gate (what the hook runs)
npm run ci:heavy # the heavy tier at HEAD, in its own worktree — this is
# what clears a block, so it always writes a marker
npm run ci:status # last heavy result per commit + is HEAD blocked?Only one heavy tier runs per machine. Its suites bind ports and check worktrees out at shared /tmp paths, so a second run waits for a lock (ci:status shows who holds it) and a run started for a commit your new one descends from is superseded. A run that never gets its turn writes no verdict and says so — it never looks like a pass. If you run node scripts/ci.mjs --heavy against a dirty tree it refuses immediately, because a marker names a commit and your tree is not that commit; --dirty-ok runs it anyway with no verdict.
The same rows appear in ⚙ → Diagnostics report… under Release gate — heavy tier. Docs-only pushes skip the gate entirely; VIBESPACE_SKIP_CI=1 git push is the emergency bypass. Every suite under scripts/test-*.mjs is in exactly one tier or in scripts/ci.mjs's EXCLUDED list with a stated reason — npm run build fails if a new suite is in neither.
- Chat Mode — Structured messages, tool visualization, permissions, subagents
- Terminal Management — Session persistence, multi-device sync, clipboard paste
- Window Manager — Grid layouts, command mode, presets
- Session Management — Tasks, star/archive, filters
- Keyboard Shortcuts — Complete reference
