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 |
start, thinking, working, notification, packing, and done.PreToolUse, PermissionRequest, and PostToolUse. For CI or batch jobs, codex exec --json exposes a much richer event stream.preToolUse and postToolUse, plus namespaced MCP tool names.| 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.
Forces every window to always show one character, ignoring whatever character each project’s status reports.
auto (default): each project shows its own characterPOST /character-lockauto doesn’t retroactively fix already-open windows — they pick up each project’s real character again on its next status update| 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) |
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 |
| 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.
start stateThe 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.
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 |
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"}'
POST /status, WebSocket) are still validated and recorded in the backgroundLock the monitor to a specific project to prevent display updates from other projects.
Note: Project lock is only available in single-window mode.
| Mode | Description |
|---|---|
first-project |
First incoming project is automatically locked |
on-thinking |
Lock when entering thinking state (default) |
# 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.
| 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
When running Claude Code in multiple terminal tabs, clicking a VibeMon window automatically switches to the corresponding terminal tab.
Supported Terminals:
Requirements:
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.
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.
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