Querying Events#
Vibetracker stores events in SQLite at ~/.vibetracker/events.db. You can query this data using the CLI or directly with SQLite tools.
Using the CLI#
The query command executes SQL and returns JSON:
vibetracker query "SELECT * FROM events LIMIT 5"Direct Database Access#
You can also use any SQLite client:
sqlite3 ~/.vibetracker/events.db "SELECT * FROM events LIMIT 5"Or with Bun:
import { Database } from "bun:sqlite"
const db = new Database(process.env.HOME + "/.vibetracker/events.db")
const events = db.query("SELECT * FROM events LIMIT 5").all()Common Queries#
Session Statistics#
Total sessions and events:
SELECT
COUNT(DISTINCT session_id) as sessions,
COUNT(*) as total_events
FROM eventsSessions per day:
SELECT
DATE(timestamp) as day,
COUNT(DISTINCT session_id) as sessions
FROM events
GROUP BY DATE(timestamp)
ORDER BY day DESCAverage session duration:
SELECT
AVG(session_duration_ms) / 1000.0 / 60.0 as avg_minutes
FROM events
WHERE event_type = 'session_end'
AND session_duration_ms IS NOT NULLToken Usage#
Total tokens by model:
SELECT
model,
SUM(prompt_tokens) as prompt_tokens,
SUM(completion_tokens) as completion_tokens,
SUM(total_tokens) as total_tokens
FROM events
WHERE total_tokens IS NOT NULL
GROUP BY model
ORDER BY total_tokens DESCTokens per session:
SELECT
session_id,
SUM(total_tokens) as tokens,
COUNT(*) as turns
FROM events
WHERE event_type = 'turn_end'
GROUP BY session_id
ORDER BY tokens DESC
LIMIT 10Daily token usage:
SELECT
DATE(timestamp) as day,
SUM(total_tokens) as tokens
FROM events
WHERE total_tokens IS NOT NULL
GROUP BY DATE(timestamp)
ORDER BY day DESCTool Usage#
Tool call frequency:
SELECT
tool_name,
COUNT(*) as calls
FROM events
WHERE event_type = 'tool_call'
GROUP BY tool_name
ORDER BY calls DESCTool success rate:
SELECT
tool_name,
COUNT(*) as total,
SUM(CASE WHEN tool_success = 1 THEN 1 ELSE 0 END) as succeeded,
ROUND(100.0 * SUM(CASE WHEN tool_success = 1 THEN 1 ELSE 0 END) / COUNT(*), 1) as success_rate
FROM events
WHERE event_type = 'tool_call'
GROUP BY tool_name
ORDER BY total DESCAverage tool duration:
SELECT
tool_name,
ROUND(AVG(tool_duration_ms), 0) as avg_ms,
COUNT(*) as calls
FROM events
WHERE event_type = 'tool_call'
AND tool_duration_ms IS NOT NULL
GROUP BY tool_name
ORDER BY avg_ms DESCSlowest tool calls:
SELECT
tool_name,
tool_input,
tool_duration_ms
FROM events
WHERE event_type = 'tool_call'
AND tool_duration_ms IS NOT NULL
ORDER BY tool_duration_ms DESC
LIMIT 10File Operations#
Most edited files:
SELECT
file_path,
COUNT(*) as edits,
SUM(file_lines_added) as lines_added,
SUM(file_lines_removed) as lines_removed
FROM events
WHERE file_path IS NOT NULL
GROUP BY file_path
ORDER BY edits DESC
LIMIT 20File operations by type:
SELECT
file_action,
COUNT(*) as count
FROM events
WHERE file_action IS NOT NULL
GROUP BY file_actionNet lines of code changed:
SELECT
SUM(COALESCE(file_lines_added, 0)) as added,
SUM(COALESCE(file_lines_removed, 0)) as removed,
SUM(COALESCE(file_lines_added, 0)) - SUM(COALESCE(file_lines_removed, 0)) as net
FROM events
WHERE file_path IS NOT NULLGit Context#
Sessions by repository:
SELECT
session_git_repo,
COUNT(DISTINCT session_id) as sessions,
COUNT(*) as events
FROM events
WHERE session_git_repo IS NOT NULL
GROUP BY session_git_repo
ORDER BY sessions DESCActivity by branch:
SELECT
session_git_branch,
COUNT(DISTINCT session_id) as sessions
FROM events
WHERE session_git_branch IS NOT NULL
GROUP BY session_git_branch
ORDER BY sessions DESC
LIMIT 20Error Analysis#
Error frequency:
SELECT
error_code,
error_message,
COUNT(*) as occurrences
FROM events
WHERE event_type = 'error'
GROUP BY error_code, error_message
ORDER BY occurrences DESC
LIMIT 20Sessions with errors:
SELECT
session_id,
COUNT(*) as error_count
FROM events
WHERE event_type = 'error'
GROUP BY session_id
ORDER BY error_count DESC
LIMIT 10Agent Source Comparison#
Events by source:
SELECT
source,
COUNT(*) as events,
COUNT(DISTINCT session_id) as sessions
FROM events
GROUP BY sourceToken usage by source:
SELECT
source,
SUM(total_tokens) as tokens,
COUNT(DISTINCT session_id) as sessions,
ROUND(1.0 * SUM(total_tokens) / COUNT(DISTINCT session_id), 0) as tokens_per_session
FROM events
WHERE total_tokens IS NOT NULL
GROUP BY sourceSubagent Analysis#
Subagent usage by type:
SELECT
agent_type,
COUNT(*) as spawned
FROM events
WHERE agent_type IS NOT NULL
GROUP BY agent_type
ORDER BY spawned DESCFiltering Tips#
By Time Range#
-- Last 24 hours
WHERE timestamp > datetime('now', '-1 day')
-- Last 7 days
WHERE timestamp > datetime('now', '-7 days')
-- Specific date range
WHERE timestamp BETWEEN '2025-01-01' AND '2025-01-31'
-- Today only
WHERE DATE(timestamp) = DATE('now')By Session#
-- Specific session
WHERE session_id = 'abc123'
-- Sessions in a repository
WHERE session_git_repo LIKE '%vibetracker%'By Event Type#
-- Only tool calls
WHERE event_type = 'tool_call'
-- Session boundaries
WHERE event_type IN ('session_start', 'session_end')Table Schema#
The events table contains all fields from the Event Schema. Columns map directly to event fields with the same names.
Indexes available for performance:
| Index | Columns |
|---|---|
idx_events_timestamp | timestamp |
idx_events_session | session_id |
idx_events_synced | synced_at |
idx_events_agent | agent_id |