Stop reproducing bugs.
Replay them.
slomo records every function call, query, and crash — locally, with one line. When something breaks, don't guess. Rewind the tape.
Your app already knows why it crashed.
slomo kept the recording.
Everything below is automatic after enable(). No agents, no sidecars, no YAML.
Zero-config auto-trace
Every call in your code — args, results, durations, exceptions — via sys.monitoring. Stdlib and third-party frames cost nothing.
Crashes with variables
Tracebacks arrive with the locals of every crashing frame — including worker threads and the 500s your framework swallows.
One correlated timeline
SQL queries, HTTP calls, and log records land on the same timeline as your function calls.
Issues, deduplicated
Crashes are fingerprinted — the same bug tomorrow is occurrences += 1, not a new alert. Category and severity are automatic.
Root cause, named
slomo doctor points at the first bad function, the first bad variable, and a suggested fix — with evidence.
Private by construction
Everything stays in .slomo/ in your repo. Secrets are redacted at capture time — they never touch disk.
print() is archaeology.
This is a time machine.
enable() < 5ms · crash-safe JSONL · kill -9 loses one line, max
Recording in three steps.
One package, no services
$ pip install slomo # macOS $ brew install apilens/slomo/slomo
Python 3.12+. The recorder's hot path is stdlib-only.
Add one line
import slomo
slomo.enable()Works as-is with FastAPI, Flask, asyncio, workers. More depth: @track.
Ask the tape
$ slomo issues $ slomo doctor ID $ slomo replay ID
Plus live timeline --follow, search, and exports.
Built in the open.
Yours to shape.
slomo is MIT-licensed and early — which means your issue, PR, or wild idea can genuinely steer where it goes.
The recorder, the issue engine, the replay CLI — all of it in one repo. Issues, ideas, and PRs welcome; the roadmap (plugins, exporters, AI root-cause) is open for debate.

Creator & maintainer. Open to contributions of every size: