vibemon-app

Features

Agent Support

VibeMon normalizes multiple agent ecosystems into one display model. The rendering layer is shared, but the integration path is not.

Agent Integration path Best signal source Observability quality Important limitation
Claude Code Native hooks Session, turn, and tool hooks High None significant for basic monitoring
Codex Native hooks and non-interactive JSON output Interactive hooks for sessions, codex exec --json for automation Medium in interactive mode, high in automation Interactive tool hooks are currently Bash-focused
Kiro Native hooks Prompt, tool, and stop hooks High Fewer lifecycle events than Claude Code
OpenClaw Plugin bridge Plugin SDK hooks Medium to high Internal hooks are not enough by themselves for full tool-loop visibility

Bridge Types

Agent-Specific Notes

Characters

Character Color Description Auto-selected for
clawd Orange Default character Claude Code
codex Green Terminal robot Codex
kiro White Ghost character Kiro
claw Red Antenna character OpenClaw
daangni Peach/teal Round face, fluffy top Manual only (Character Lock)

All characters use image-based rendering (128x128 PNG). Character is auto-selected by bridge, not by the core display runtime. You can also manually change it via the system tray menu, or force it for every window with Character Lock.

Character Lock

Forces every window to always show one character, ignoring whatever character each project’s status reports.

States

State Background Eyes Text Trigger
start Cyan ■ ■ + ✦ Hello! Session begins
idle Green ■ ■ Ready Waiting for input
thinking Purple ▀ ▀ + 💭 Thinking User submits prompt
planning Teal ▀ ▀ + 💭 Planning Plan mode active
working Blue 👓 (glasses) (tool-based) Tool executing
packing Gray ▀ ▀ + 💭 Packing Context compacting
notification Yellow ● ● + ? Input? User input needed
done Green > < Done! Tool completed
sleep Navy ─ ─ + Z Zzz… 5min inactivity
alert Red ■ ■ + ! Alert Critical error/failure (ESP32: triggers alert light if configured)

Working State Text

The working state displays fixed text based on the active tool:

Tool Text
Bash Running
Read Reading
Edit Editing
Write Writing
Grep / WebSearch Searching
Glob Scanning
WebFetch Fetching
Task Tasking
Default Working

State Timeout

From State Timeout To State
start, done 1 minute idle
planning, thinking, working, packing, notification, alert 5 minutes idle
idle 5 minutes sleep

Desktop only: After 10 minutes in sleep state, the window automatically closes.

Display Behavior

Animations

App Mode

The Desktop App supports three mutually-exclusive top-level modes:

Mode Description
character One character window + following speech bubble; subject to the same sleep-state close timeout as other windows
window Per-project windows (multi or single sub-mode) - Default
input No windows shown at all; status is still collected in the background

Switch via the system tray menu (App Mode submenu) or API:

curl -X POST http://127.0.0.1:19280/app-mode \
  -H "Content-Type: application/json" \
  -d '{"mode":"character"}'

Switching modes doesn’t lose data: whatever was tracked in the background (Input Mode) or shown in a different mode is kept and immediately reflected once you switch back.

Character Mode

Window Mode

Per-project windows, with two sub-modes:

Sub-mode Description
multi One window per project (max 5) - Default
single One window with project lock support

Multi-Window Mode (Default)

Single-Window Mode

Switching Window Mode’s sub-mode

Use the system tray menu or API:

curl -X POST http://127.0.0.1:19280/window-mode \
  -H "Content-Type: application/json" \
  -d '{"mode":"single"}'

Input Mode

Project Lock

Lock the monitor to a specific project to prevent display updates from other projects.

Note: Project lock is only available in single-window mode.

Lock Modes

Mode Description
first-project First incoming project is automatically locked
on-thinking Lock when entering thinking state (default)

CLI Commands

# Claude Code example: lock current project
python3 ~/.claude/hooks/vibemon.py --lock

# Lock specific project
python3 ~/.claude/hooks/vibemon.py --lock my-project

# Unlock
python3 ~/.claude/hooks/vibemon.py --unlock

# Get current status
python3 ~/.claude/hooks/vibemon.py --status

# Get/Set lock mode
python3 ~/.claude/hooks/vibemon.py --lock-mode
python3 ~/.claude/hooks/vibemon.py --lock-mode on-thinking

# Reboot ESP32 device
python3 ~/.claude/hooks/vibemon.py --reboot

For Codex or Kiro, use the equivalent bridge path:

python3 ~/.codex/hooks/vibemon.py --lock
python3 ~/.kiro/hooks/vibemon.py --lock

OpenClaw uses its plugin bridge instead of a Python hook CLI.

Desktop App Features

Always on Top Modes

Mode Description
active-only Only active states (thinking, planning, working, packing, notification, alert) stay on top - Default
all All windows stay on top regardless of state
disabled No windows stay on top

When active-only is selected:

Change via system tray menu: Always on Top → Select mode

Click to Focus Terminal (macOS)

When running Claude Code in multiple terminal tabs, clicking a VibeMon window automatically switches to the corresponding terminal tab.

Supported Terminals:

Requirements:

Speech Bubble

A small, transparent, click-through window that displays selected info fields (status, project name, model, memory, 5h usage, weekly usage) next to the character. Positioned automatically so it never overlaps the character window and stays on-screen, with an animated slide when it needs to move. Only shown in Character Mode.

Settings Window

A dedicated settings window (tray menu → Settings…) with three sections in a sidebar:

Changes apply immediately through the same code paths as the tray menu, and the window re-syncs when refocused so tray-made changes are reflected.

System Tray Menu

Build

cd desktop

npm run build:mac     # macOS (DMG, ZIP)
npm run build:win     # Windows (NSIS, Portable)
npm run build:linux   # Linux (AppImage, DEB)
npm run build:all     # All platforms