.slomo/, created next to your code on first enable(). Its location defines your project root — the boundary for auto-tracing’s “project code” rule.
The one rule: JSONL is truth, SQLite is cache
timeline.jsonl files are append-only JSON Lines — one event per line, written by the recorder, never mutated. Everything else slomo shows you is computed from them.
issues/index.sqlite (the issue index, including the full-text search index) is a cache. Corrupt it, delete it, copy sessions between machines without it — then:
Crash-safety mechanics
- Append-only writes — a crash mid-write can only damage the final line.
- fsync on the crash path — the exception that kills your process is flushed hardest.
- Tolerant reader — a truncated final line is skipped, not fatal. A
kill -9loses at most one partial event.
Manual housekeeping
Everything is plain files, so ordinary tools work:
Retention is also automatic:
[storage] retention_max_sessions (default 200) bounds stored sessions; see slomo prune.
Multi-process behavior
One writer process owns a session directory — sessions are never shared, so there is no cross-process locking to break. Forked children create sibling session directories labeledforked_from. Timestamped directory names keep slomo sessions chronological.
Version control
Add the directory to.gitignore:
Portability
A session directory is self-contained —metadata.json + timeline.jsonl + snapshots/. You can tar one up, move it to another machine, drop it under that machine’s .slomo/sessions/, rebuild the index, and replay it there. (For sharing a diagnosis rather than raw data, prefer slomo export.)