What makes a session
A session starts the moment an app comes into focus and ends the moment you switch away from it. Meridian detects these boundaries by watching for app-switch events in the screenpipe frame stream. If you stay in VS Code for 45 minutes without switching away, that becomes a single session lasting 45 minutes. If you switch to Slack and back, those are three separate sessions.Active vs completed sessions
Meridian maintains exactly one active session at a time — the app currently in focus. The active session is stored in theactive_session table and updated with each ETL tick. It has no ended_at value yet.
When you switch apps, Meridian closes the active session, writes it as a completed row to app_sessions, and opens a new active session for the app you switched to. Only completed sessions are classified by category and linked to tickets.
The session data model
Theapp_sessions table in ~/.meridian/meridian.db holds one row per completed session. Every field is documented below.
audio_snippets are stored in meridian.db but intentionally excluded from all MCP tool responses. This keeps LLM context clean and reduces noise when AI tools query your session data. Audio content is still searchable via the search-sessions MCP tool.Where sessions live
Meridian writes all completed sessions to its own SQLite database at~/.meridian/meridian.db. This file is separate from screenpipe’s database and is owned entirely by Meridian. The min_frame_id and max_frame_id fields on each session let you trace back to the original screenpipe frames if you need them.
The database grows at roughly 10 MB per 9,000 frames of recorded activity. You can open it with any SQLite client.
Querying sessions directly
Usesqlite3 to query your sessions without going through the dashboard or MCP tools: