See everything your AI coding tools are doing β in one place, in real time.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β
β Claude Code OpenCode Gemini CLI Aider Codex β
β β β β β β β
β ββββββββββββββββ΄ββββββββββββ΄βββββββββββ΄ββββββββββ β
β β β
β ββββββββββΌβββββββββ β
β β AISnitch β β
β β βββββββββββ β β
β β β TUI β β β Dashboard (real-time) β
β β βββββββββββ β β
β β βββββββββββ β β
β β β Webhook β β β Build anything β
β β βββββββββββ β β
β βββββββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
One command. Every agent. Every project. Live.
You have multiple AI coding assistants running at the same time:
π΅ Claude Code β working on your main project
π‘ OpenCode β reviewing a PR
π£ Codex β writing tests
π’ Aider β refactoring legacy code
The problem? You have 4 terminals open, tabbing between them, missing things, context-switching like crazy.
The solution?
aisnitch startNow you see everything in one dashboard:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π€ AISnitch [q] quit [?] help β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β π΅ Claude Code β thinking... β π src/app.ts β
β π‘ OpenCode β idle β π /projects/api β
β π£ Codex β³ coding... β π tests/users.test.ts β
β π’ Aider β task: "cleanup" β π /legacy/db β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β Events (42) [Space] freeze [c] clear β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β π΅ 14:30:01 agent.thinking "Implementing user auth..." β
β π΅ 14:29:58 agent.coding Edit β src/auth/login.ts β
β π‘ 14:29:55 agent.idle waiting for prompt... β
β π£ 14:29:52 tool_call Bash β git status β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# npm (recommended)
npm i -g aisnitch
# or Homebrew
brew install aisnitchaisnitchThat's it! aisnitch (no argument) starts the daemon, launches the dashboard server in the background, and opens the web dashboard in your browser.
Want the in-terminal TUI instead?
aisnitch startNo AI tools yet? Try the demo mode:
aisnitch start --mock all# Pick your tools
aisnitch setup claude-code # hooks into Claude Code
aisnitch setup opencode # hooks into OpenCode
aisnitch setup aider # hooks into Aider
# Verify everything
aisnitch adaptersaisnitch startOpens the TUI dashboard. Live events stream in as your tools work.
# Start the daemon (runs in background)
aisnitch start --daemon
# Now connect your app to ws://127.0.0.1:4820import { createAISnitchClient } from '@aisnitch/client';
import WebSocket from 'ws';
const client = createAISnitchClient({ WebSocketClass: WebSocket as any });
client.on('event', (e) => {
console.log(`${e['aisnitch.tool']}: ${e.type}`);
});aisnitch fs --daemon
# β Opens http://127.0.0.1:5174 in browser
# β Connects to daemon automaticallyconst client = createAISnitchClient();
client.on('event', (e) => {
if (e.type === 'task.complete') playSound('success.mp3');
if (e.type === 'agent.error') playSound('error.mp3');
if (e.type === 'agent.asking_user') playSound('ping.mp3');
});npm i -g aisnitchbrew install aisnitchgit clone https://github.com/vava-nessa/AISnitch.git
cd AISnitch
pnpm install && pnpm build
node dist/cli/index.js start# npm
npm update -g aisnitch
# Homebrew
brew upgrade aisnitch| Tool | Status | Setup Command |
|---|---|---|
| Claude Code | β Active | aisnitch setup claude-code |
| OpenCode | β Active | aisnitch setup opencode |
| Gemini CLI | β Active | aisnitch setup gemini-cli |
| Aider | β Active | aisnitch setup aider |
| Codex | β Active | aisnitch setup codex |
| Goose | β Active | aisnitch setup goose |
| Copilot CLI | β Active | aisnitch setup copilot-cli |
| OpenClaw | β Active | aisnitch setup openclaw |
| Cursor | β Active | aisnitch setup cursor |
| Zed | β Active | aisnitch setup zed |
| Devin | β Active | aisnitch setup devin |
| Kilo | β Active | aisnitch setup kilo |
| Pi (zealncer) | β Active | aisnitch setup pi |
| Any CLI | π§ Fallback | aisnitch wrap <command> |
π‘ Run
aisnitch adaptersto see which tools are currently connected.
Open a beautiful real-time dashboard in your browser:
aisnitch # Default: start daemon + dashboard + open browser
aisnitch fs # Same as `aisnitch`
aisnitch fs --dashboard-port 8080 # Custom port
aisnitch fs --no-browser # Just start the serverFrom another computer? Make sure the host machine has the daemon running:
aisnitch start --daemon # Start on host machine first
aisnitch fs # Connect from any browserAISnitch exposes a WebSocket stream at ws://127.0.0.1:4820. Connect with the SDK:
pnpm add @aisnitch/client zodimport { createAISnitchClient, describeEvent } from '@aisnitch/client';
import WebSocket from 'ws';
const client = createAISnitchClient({ WebSocketClass: WebSocket as any });
// Get notified when connected
client.on('connected', (info) => {
console.log(`Connected to AISnitch ${info.version}`);
console.log(`Tools: ${info.activeTools.join(', ')}`);
});
// Receive all events
client.on('event', (event) => {
console.log(describeEvent(event));
// β "claude-code is thinking... β user auth module"
// β "opencode is coding... β src/api/users.ts"
});
// Track sessions
setInterval(() => {
const sessions = client.sessions?.getAll() ?? [];
console.log(`${sessions.length} active sessions`);
}, 5000);import { createAISnitchClient } from '@aisnitch/client';
const SOUNDS = {
'session.start': 'sounds/boot.mp3',
'task.complete': 'sounds/done.mp3',
'agent.asking_user': 'sounds/ping.mp3',
'agent.error': 'sounds/error.mp3',
'agent.coding': 'sounds/keyboard.mp3',
};
const client = createAISnitchClient();
client.on('event', (e) => {
if (SOUNDS[e.type]) playSound(SOUNDS[e.type]);
});import { createAISnitchClient, formatStatusLine } from '@aisnitch/client';
const client = createAISnitchClient();
client.on('event', (e) => {
// Notify on important events
if (e.type === 'agent.error') {
postToSlack(`π΄ Error: ${formatStatusLine(e)}`);
}
if (e.type === 'task.complete') {
postToDiscord(`β
Done: ${formatStatusLine(e)}`);
}
});# See raw events in one line
node -e "
const WebSocket = require('ws');
const ws = new WebSocket('ws://127.0.0.1:4820');
ws.on('message', m => console.log(JSON.parse(m.toString()).type));
"aisnitch start # Open TUI dashboard
aisnitch start --tool claude-code # Filter by tool
aisnitch start --type agent.coding # Filter by event type
aisnitch start --view full-data # Show full JSONaisnitch # Default: daemon + dashboard + browser
aisnitch fs # Explicit form (same effect)
aisnitch fs --dashboard-port 8080 # Custom port
aisnitch fs --no-browser # Server onlyaisnitch start --daemon # Start daemon in background
aisnitch status # Check daemon status
aisnitch attach # Attach TUI to running daemon
aisnitch stop # Stop daemonaisnitch setup claude-code # Configure tool
aisnitch setup opencode
aisnitch setup aider
aisnitch setup claude-code --revert # Remove configurationaisnitch adapters # Show enabled tools
aisnitch logger # Stream raw events (no TUI)
aisnitch mock claude-code # Simulate events
aisnitch mock all --speed 2 # Demo mode (2x speed)
aisnitch wrap aider --model sonnet # Wrap any CLI
aisnitch setup claude-code # Run setup wizard
aisnitch self-update # Update AISnitch| Key | Action |
|---|---|
q / Ctrl+C |
Quit |
d |
Toggle daemon |
r |
Refresh |
v |
Toggle JSON inspector |
f |
Filter by tool |
t |
Filter by event type |
/ |
Search |
Esc |
Clear filters |
Space |
Freeze/resume |
c |
Clear buffer |
? |
Help |
Tab |
Switch panel |
ββ / jk |
Navigate |
[] |
Page inspector |
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β External AI Tools β
β ββββββββββββ ββββββββββββ ββββββββββββ ββββββββββββ β
β β Claude β β OpenCode β β Gemini β β Aider β ... β
β β Code β β β β CLI β β β β
β ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ ββββββ¬ββββββ β
β β β β β β
β ββββββββββββββ΄βββββββββββββ΄βββββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββ β
β β HTTP Receiver β β
β β :4821 β β
β βββββββββββ¬ββββββββββ β
β β β
β βΌ β
β βββββββββββββββββββββ β
β β EventBus β β
β β (validation + β β
β β normalization) β β
β βββββββββββ¬ββββββββββ β
β β β
β βββββββββββββββΌββββββββββββββ β
β βΌ β βΌ β
β βββββββββββββββ β βββββββββββββββ β
β β WebSocket β β β TUI β β
β β :4820 β β β Dashboard β β
β ββββββββ¬βββββββ β βββββββββββββββ β
β β β β
β βΌ βΌ β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β Client β β Sound β β Mascot β β
β β Dashboard β β Engine β β Companion β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
- Zero storage: Events live in memory only, never written to disk
- Privacy-first: No data leaves your machine
- Multi-instance tracking: Handles multiple sessions of the same tool
- Auto-reconnect: SDK handles reconnection automatically
- Zod validation: All events validated before processing
Every event follows CloudEvents v1.0 format:
{
"specversion": "1.0",
"id": "019713a4-beef-7000-8000-deadbeef0042",
"source": "aisnitch://claude-code/myproject",
"type": "agent.coding",
"time": "2026-03-28T14:30:00.000Z",
"aisnitch.tool": "claude-code",
"aisnitch.sessionid": "claude-code:myproject:p12345",
"aisnitch.seqnum": 42,
"data": {
"state": "agent.coding",
"project": "myproject",
"projectPath": "/home/user/myproject",
"activeFile": "src/index.ts",
"toolName": "Edit",
"model": "claude-sonnet-4-20250514",
"tokensUsed": 1500,
"inputTokens": 450,
"outputTokens": 1050,
"terminal": "iTerm2",
"cwd": "/home/user/myproject"
}
}| Type | Description |
|---|---|
session.start |
Tool started |
session.end |
Tool closed |
task.start |
User submitted prompt |
task.complete |
Task finished |
agent.thinking |
Model reasoning |
agent.streaming |
Output being generated |
agent.coding |
Editing files |
agent.tool_call |
Using Bash, Grep, etc. |
agent.asking_user |
Waiting for input |
agent.idle |
No activity (2+ min) |
agent.error |
Error occurred |
agent.compact |
Context cleanup |
~/.aisnitch/
βββ config.json # Your configuration
βββ aisnitch.pid # Daemon PID
βββ daemon-state.json # Connection info
βββ daemon.log # Daemon logs (5MB max)
βββ aisnitch.sock # Unix socket (IPC)
| Port | Purpose |
|---|---|
4820 |
WebSocket (connect here) |
4821 |
HTTP webhook receiver + health |
curl http://127.0.0.1:4821/health# Setup
git clone https://github.com/vava-nessa/AISnitch.git
cd AISnitch
pnpm install
# Build
pnpm build # ESM + CJS + TypeScript types
# Quality
pnpm lint # ESLint
pnpm typecheck # TypeScript
pnpm test # 300+ tests
pnpm test:coverage # Coverage reportaisnitch/
βββ src/
β βββ adapters/ # 13 tool adapters
β βββ cli/ # Commander CLI
β βββ core/ # Events, pipeline, config
β βββ tui/ # Ink terminal dashboard
βββ packages/
β βββ client/ # @aisnitch/client SDK
βββ docs/ # Technical docs
βββ tasks/ # Task board
- Documentation β Technical details
- Client SDK β Build on top
- Tasks β What's being worked on
- Contributing β How to contribute
Q: Does AISnitch store my data?
No. Events transit through memory only and are never written to disk. Nothing leaves your machine.
Q: Which tools are supported?
13 tools out of the box: Claude Code, OpenCode, Gemini CLI, Aider, Codex, Goose, Copilot CLI, OpenClaw, Cursor, Zed, Devin, Kilo, Pi. Plus any CLI via the wrap command.
Q: Can I build my own dashboard?
Yes! Use the @aisnitch/client SDK or connect directly to ws://127.0.0.1:4820.
Q: How do I update AISnitch?
npm update -g aisnitch # npm
brew upgrade aisnitch # HomebrewQ: Why "Snitch"?
Because it snitches on your AI agents β tells you what they're doing! π
Apache-2.0 β Vanessa Depraute