built on Claude Code

The agent visual desktop.

Vibisual is an all-in-one desktop for Claude Code — your terminal window, made visual. You still write in an editor pane; what changes is everything around it. The files it touched, the commands it ran, the preview it started, the run drawn as a map you glance at instead of scrolling through. One window instead of six.

Windows · macOS · Linux — needs the Claude CLI on your PATH

Download · Star on GitHub · 2-minute walkthrough

What it does

See where the run is without reading it

Claude Code emits a hook event at every meaningful point — a prompt submitted, a tool about to run, a sub-agent spawned, a session ended. Vibisual turns those into nodes and edges on a canvas, so “which one is stuck?” is a glance instead of a scroll back through output.

Set up an agent team without writing flags

Drop a bubble to define a sub-agent — model, permission mode, tools, isolation, max turns, skills, per-agent rules — and wire task edges for handoffs. Vibisual reads the graph and launches the matching Claude Code run, so the configuration stays something you can point at.

Fix it in the same window

Double-click a bubble and the workspace opens in place: the agent's live stream, a file tree, an editor with syntax highlighting, diffs and a terminal. No second app to alt-tab into, and the canvas keeps running behind it.

Quick start

Vibisual runs on top of the Claude CLI, which must already be installed and on your PATH.

Install

Every release ships a Windows installer, macOS builds for Apple Silicon and Intel, and a Linux AppImage. Download the one for your system and run it. The builds are not code-signed yet, so Windows SmartScreen and macOS Gatekeeper ask for confirmation the first time.

Build from source

Node 20+. On first launch Vibisual writes a managed hook block into ~/.claude/settings.json and keeps a timestamped backup. Set VIBISUAL_SKIP_HOOK_INSTALL=1 to wire hooks yourself.

status · early preview

This 0.1.x preview is for experimentation, demos and feedback. Expect bugs, incomplete features and occasional breaking changes. Not recommended for critical production workflows or repositories with highly sensitive data.

security & privacy

Hook payloads may include prompts, tool calls, file paths, shell commands and session metadata. Command hooks run with your local user permissions. Review the generated hook configuration before use, especially in repositories holding secrets or customer data.

Vibisual is an independent open-source project, not affiliated with, endorsed by or sponsored by Anthropic. Claude, Claude Code and Anthropic are trademarks of Anthropic, PBC.

vibisual {{ verBadge }}
{{ t.eyebrow }}

{{ t.h1a }} {{ t.h1em }}

{{ t.nameLine }}

{{ t.sub }}

{{ stat1 }} {{ t.st1 }} {{ stat2 }} {{ t.st2 }}
{{ stat3 }} {{ t.st3 }}
{{ stat4 }} {{ t.st4 }}
{{ t.canvasHint }} vibisual · canvas
{{ b.count }} {{ b.label }} {{ b.badge }}
{{ l.text }}
{{ g.text }}
{{ t.bubDblHint }}

{{ t.canvasCaption }}

IDE → ADE → VDE

{{ t.vdeLead }}

IDE {{ t.vde1 }} VS Code, Cursor
ADE {{ t.vde2 }} Warp
VDE {{ t.vde3 }} Vibisual

{{ t.whatTitle }}

01

{{ t.f1t }}

{{ t.f1b }}

SessionStart → node created · orchestrator UserPromptSubmit → "split the checkout refactor" PreToolUse Task → edge → api-builder PreToolUse Edit → bubble · routes/checkout.ts PostToolUse Bash → 41 passed
02

{{ t.f2t }}

{{ t.f2b }}

node · test-runnerunsaved
modelclaude-sonnet-4.6 toolsBash, Read, Grep rulesnever edit src/** in-edgeapi-builder → test-runner
03

{{ t.f3t }}

{{ t.f3b }}

stream files diff terminal
routes/checkout.ts - const total = items.reduce(sum) + const total = priceWithTax(items) + if (!total) throw new BadRequest() 2 files changed · saved to the agent's branch
walkthrough {{ t.videoTitle }} {{ t.videoSub }}

{{ t.instTitle }}

{{ t.instLead }}

{{ t.instWin }}
{{ f.name }}

{{ t.instWinBody }}

Releases →
{{ t.instSrc }}
$ git clone https://github.com/Vibisual/vibisual.git $ cd vibisual && pnpm install $ node scripts/runapp.mjs # pnpm build:win

{{ t.instSrcBody }}

Contributing →
{{ t.statusLabel }}

{{ t.statusBody }}

{{ t.secLabel }}

{{ t.secBody }}

{{ t.ctaTitle }}

{{ t.ctaSub }}

{{ ui.blog }}

{{ ui.blogTitle }}

{{ ui.blogLead }}

{{ art.date }}{{ art.tag }}{{ art.read }}

{{ art.title }}

{{ art.excerpt }}

{{ pa.v }}

{{ art.author }}
{{ ui.docs }}/{{ doc.g }}/{{ doc.title }}

{{ doc.title }}

{{ doc.lead }}

{{ ui.updated }} {{ doc.updated }}

{{ s.h }}

{{ pa.v }}

{{ c.v }}
{{ r.k }} {{ r.v }}
note

{{ s.note }}

{{ pick.title }} {{ t.ideWindowTag }}
{{ pick.label }} {{ pick.typeLabel }}
{{ pick.agentTabName }}
{{ tb.name }}
{{ ac.under }} {{ ac.badge }}
{{ pick.rootName }}
{{ tr.name }}
{{ pick.selPath }}
{{ as.you }} {{ ideAsk }}

{{ pick.body }}

{{ as.activity }} {{ pick.toolRun }} {{ tn.v }}
Read {{ pick.readTarget }}
{{ as.output }}
{{ pr.k }}{{ pr.v }}

{{ nt.head }}

{{ nt.body }}

{{ pick.runWord }} {{ ideAsk }}
All Model {{ pick.localModel }}
{{ dn.v }}
{{ as.follow }}
> {{ as.ph }} {{ as.run }}
{{ as.readOnly }}
{{ term.note }} {{ term.fontSize }}
{{ tl.a }}{{ tl.b }}
{{ pick.stBadge }} {{ pick.stState }} {{ pick.stModel }} {{ pick.stCtx }} {{ pick.stTok }} {{ pick.stAc }} {{ pick.stSess }}
{{ brain.title }} {{ brain.project }} {{ brain.howTo }}
{{ brain.search }} {{ bty.v }}
{{ sp.title }} {{ sp.hint }} {{ sp.count }}
{{ brain.topicsLabel }}
{{ tp.v }} {{ tp.n }}
{{ brain.axesTitle }} {{ brain.turnOff }}
{{ ax.t }} {{ ax.h }}

{{ brain.keepsData }}

{{ brain.docTitle }}

{{ brain.docPath }}

{{ bc.ti }}

{{ bc.typeName }} {{ bc.alwaysLabel }} {{ bc.needsLabel }} {{ bc.curLabel }} {{ bc.ckey }} {{ bc.ago }} {{ bc.help }}

{{ bc.needsText }}

{{ bc.stillValid }} {{ bc.markStale }}

{{ bc.body }}

{{ bc.file }}
{{ bc.detail }}

{{ t.ideAnnoLead }}

{{ an.n }} {{ an.h }}

{{ an.b }}

{{ an.k }}
{{ t.ideNextTag }} {{ t.ideNextBody }}