A single-user, mobile-friendly SPA for Slack-like interactions with coding agents via the ACP protocol (including copilot --acp and codex-acp), as well as direct integration with pi. Heavily inspired by Toad's ACP implementation, (which is stellar), but aimed at providing my own mobile agent interface over Tailscale.
Vibes and piclaw share the same web UI.
- Streaming web UI — real-time token-by-token updates over SSE, with Markdown, KaTeX, and Mermaid rendering
- Workspace explorer — file tree sidebar with previews, drag-and-drop upload, keyboard navigation, and downloads
- Code editor — built-in CodeMirror 6 with syntax highlighting for 13 languages, Vim mode, search/replace, and save
- Persistent storage — SQLite-backed messages, media, and full-text search
- Rich media — paste or drag images, attach workspace files, link previews with OpenGraph
- Dark/Light themes — follows system preference automatically
- Installable PWA — standalone webapp manifest with window-controls-overlay support
The UI is single-user, mobile-friendly, and streams updates over SSE:
- Thought/Draft panels — collapsible live reasoning and draft blocks, visible during streaming
- Queued follow-ups + steering — while the agent is busy, new messages queue automatically and queued items can be promoted to steering from the compose UI
- File attachments — drag, paste, or pick images; attach workspace files as reference pills
- Link previews — server-side OpenGraph fetch with image thumbnails
- Multi-turn threading — subsequent turns are visually threaded under the first
- Accept/Deny tool usage — approve, deny, or always-allow agent operations with command previews
- Context window indicator — colour-coded pie chart showing token usage (green / amber / red)
- Compose history — up/down arrow keys cycle through last 200 messages
- Full-text search — search conversations using SQLite FTS
- Mobile-first layout — responsive design for phone, tablet, and desktop
The sidebar shows a file tree with auto-refresh. Click a file to preview it or add a file reference pill to the next prompt. Drag and drop files onto the tree to upload them, with overwrite conflict detection.
- Keyboard navigation — arrow keys to browse, Enter to open/edit, Delete to remove, Escape to deselect
- Per-folder upload — hover a folder to reveal its upload button
- Touch support — long-press to delete files on mobile
- Hidden files toggle — show/hide dotfiles (persisted)
- Download — single files or entire folders as ZIP
Click the pencil icon on any text file preview (up to 256 KB) to open the built-in editor. It appears as a resizable centre pane between the sidebar and the chat.
- 13 languages — JS/TS, Python, Go, JSON, CSS, HTML, YAML, SQL, XML, Markdown, Shell, plus auto-detection
- Search and replace — Cmd/Ctrl+F
- Save — Cmd/Ctrl+S or the Save button; dirty state is tracked
- Vim mode — toggle with Alt+V (persisted)
- Whitespace visibility — toggle with Alt+W (persisted)
- Line wrapping, line numbers, active line highlight, and indentation markers
- Dark/Light theme — switches automatically with system preference
When the active agent is already working, sending another message does not start a second concurrent turn:
- Default busy-submit behavior — new messages are queued automatically as follow-ups
- Queue stack in compose — queued items appear above the textarea with
SteerandCancelactions - Queue consumption — when the current turn finishes, the next queued item is dispatched automatically
- Reconnect restore — queued items and pending steering state are restored from
/agents/statusafter reconnect
Caveats:
- Pi supports real mid-turn steering when available, so a
Steeraction can be injected into the active run immediately. - ACP does not currently support mid-turn input without interrupting the active prompt. In ACP mode,
Steeris emulated as next-turn priority: the item is removed from the visible queue, marked as pending steering, and dispatched before normal queued follow-ups after the current turn finishes. - The visible queue stack shows normal queued follow-ups. Pending ACP steering is indicated in the status area, but it is not shown as another queue item.
- The legacy
/queue <message>slash command still exists for Pi, but the primary UX is the compose queue stack and automatic busy-submit queueing.
Type a / command in the message input to control the agent or run utilities without sending a prompt. Built-in commands are handled instantly; unknown commands are forwarded to the agent as regular prompts.
| Command | Description |
|---|---|
/commands |
List all available slash commands |
/model |
Show the current model (Pi) or agent binary (ACP) |
/models |
Alias for /model |
/model <provider/model> |
Switch the Pi agent to a different model (live, no restart) |
/cycle-model [back] |
Cycle through available Pi models |
/thinking |
Show current thinking level and available levels |
/thinking <level> |
Set thinking level (off, minimal, low, medium, high, xhigh) live |
/cycle-thinking |
Cycle through the available thinking levels |
/context |
Show current Pi context-window usage |
/ctx |
Alias for /context |
/state |
Show current agent/session state |
/abort |
Cancel the current agent operation |
/restart |
Reset the agent session (or hard restart as fallback) |
/shell <command> |
Run a shell command and display the output |
/bash <command> |
Run a shell command and display the output inline |
/prompt |
Show or set the user system prompt |
/user-name |
Set or show your display name |
/user-avatar |
Set or show your avatar URL |
/user-github |
Set name and avatar from a GitHub profile |
/agent-name |
Set or show the agent display name |
/agent-avatar |
Set or show the agent avatar URL |
/queue <message> |
Legacy Pi queue command for after the current turn |
Note:
/model,/thinking, and/abortare Pi-specific live controls. ACP agents do not expose equivalent runtime controls.
Queue/Steer note: busy submits queue automatically for both Pi and ACP. Steering is exposed in the compose queue UI. Pi steering is real mid-turn steering; ACP steering is emulated as next-turn priority.
# Install directly from GitHub
pip install -U git+https://github.com/rcarmo/vibes.git
# Install a specific tag
pip install -U "vibes @ git+https://github.com/rcarmo/vibes.git@v0.1.0"
# Or with uv (faster alternative, installs as isolated tool)
uv tool install git+https://github.com/rcarmo/vibes.git
# Install a specific tag with uv
uv tool install "vibes @ git+https://github.com/rcarmo/vibes.git@v0.1.0"Or for development:
git clone https://github.com/rcarmo/vibes.git
cd vibes
pip install -e ".[dev]"# Run the server (defaults to copilot --acp)
vibes
# Or with custom options
VIBES_DEFAULT_AGENT=pi VIBES_HOST=127.0.0.1 VIBES_PORT=3000 vibes
# Use codex-acp as the agent
VIBES_ACP_AGENT="codex-acp" vibes
# Manage agent permission whitelist
vibes whitelist add "Run command"
vibes whitelist remove "Run command"
vibes whitelist listSee docs/CONFIGURATION.md. For Pi RPC integration, see docs/PI_MODE.md.
See docs/API.md.
# Install dev dependencies
pip install -e ".[dev]"
# Run tests
make check # lint + tests (344 tests)
# Run frontend linting (requires bun)
make lint-frontend
# Rebuild frontend bundle
make build-frontend # bundles JS + CSS via bun
# Run with make
make serveMIT
