|
I realized I'd spent $197 in a single day using Claude Code and Cursor without any visibility into what they were actually doing. No breakdown of which operations cost what, no record of what files were read or written, no way to audit what the agent executed on my behalf. So I built vigilo. It sits between your AI agent and your system as an MCP server, logging every tool call — file reads, writes, shell commands, git operations — to a local append-only JSONL ledger. For write operations it captures a unified diff. Every event gets a risk level (read/write/exec), timing, git context, model, and token count. Nothing leaves your machine. No accounts, no telemetry, no cloud. Arguments and results can be encrypted at rest with AES-256-GCM — the key never leaves ~/.vigilo/. Works with Claude Code and Cursor. Claude Code uses MCP + a PostToolUse hook to capture both MCP tools and built-in tools (Read, Write, Bash, Edit). Cursor uses MCP + cursor.com's API for real per-request token and cost data. The CLI gives you:
- vigilo view — full session history with collapsible events, diffs, costs
- vigilo stats — aggregate breakdown by tool, file, model, project
- vigilo watch — live tail as events happen
- vigilo dashboard — real-time web UI with SSE live feed, time-series charts, session explorer
- vigilo cursor-usage — actual billing data pulled from cursor.com The ledger is plain JSONL, rotates at 10MB, optionally encrypted. You can export to CSV or JSON anytime. Built in Rust. |
Few questions that'd help me understand the scope better:
The risk level tagging (read/write/exec) — is that purely for logging, or are you planning any threshold-based alerting? Like "pause and ask me before you rack up another $50 in exec calls"?
Also curious about the append-only guarantee. What's preventing a compromised agent from tampering with the ledger before your audit? Is that a threat model you've considered or intentionally out of scope?
The Cursor billing pull is clever — did cursor.com's API require any reverse engineering or is that documented somewhere?
Rust was the right call for something sitting in that critical path. Nice work shipping something you actually needed. This fills a gap that the agent tools themselves are weirdly uninterested in solving.