Files
WhispAssist/docs/adr/0006-storage-sqlite.md
T

40 lines
2.0 KiB
Markdown

# ADR-0006 — Storage: SQLite index + on-disk audio/transcript files
- **Status:** Accepted
- **Date:** 2026-06-30
- **Context source:** Design doc §"Recording Persistence and Storage", §"Crash Recovery"
## Context
WA stores recordings, transcripts, notes, speakers, participants, tags, and meeting metadata
locally; needs fast list/filter/search; must survive crashes; and must let users choose the base
directory, set retention, and export.
## Decision
- **Large/opaque artifacts on the filesystem:** audio (`.wav`/compressed) and the canonical
transcript JSON live as files under the storage root, one folder per meeting.
- **Index & relations in SQLite** (via `sqlx`): meetings, speakers, participants, tags, action
items, and file paths; **FTS5** virtual table over transcript/notes text for full-text search
(FR-SEARCH-1).
- **Audio is the source of truth.** Audio is flushed to disk during capture; transcript/notes are
derived and regenerable. Auto-save transcript/notes at intervals; on startup, detect meetings
with audio but no finalized transcript and offer recovery (FR-REL-1).
Default root: `%LOCALAPPDATA%\WhispAssist` with per-meeting subfolders; user-configurable base
directory and retention policy (size cap / age cap) in Settings (FR-STORE-2).
## Consequences
- **Positive:** embedded, serverless, zero-config; FTS5 covers search; files keep the DB small and
make export/backup a folder copy; crash recovery is straightforward because audio persists first.
- **Negative:** must keep DB rows and files consistent (transactional writes + a reconcile pass on
startup); retention enforcement is a background job that must respect "audio is source of truth"
(never orphan a meeting's audio while its transcript is mid-generation).
- Optional at-rest encryption (NFR-SEC-3) can wrap the storage root and/or use SQLCipher; deferred
to Phase 8.
## Revisit if
We need multi-device sync (would change the data model and conflict story) — out of scope for the
local-only product.