Storage
Placeholder. Where records live after the collector receives them.
- Input: raw records from
collector.py. - Output: queryable store for
../03-analyze/. - Data it touches: everything measured; this is where retention and deletion apply.
Coverage (tentative)
- First: append-only JSONL per day, queried with DuckDB or SQLite. Zero services, enough for one team.
- Next: Postgres for orgs that already run one.
- Large orgs: ClickHouse, or the existing OTel backend (
../04-auto-analysis/cloud-logs.md).
Pitfalls
- Each record repeats user email and ~10 identity attributes: hash or drop on ingest if the owner asks.
- Retention and deletion requests (GDPR) must work per user.
- Raw records stay unmodified; derived tables are rebuilt from them, never edited in place.
- Data residency: the store's region is the owner's choice, stated at deploy.