Troubleshooting
Fixes for the handful of things that go wrong with a self-hosted TinyReplay.
No recordings appear
The dashboard shows "Listening for sessions" but nothing lands.
- Confirm the snippet is on the page and the network tab shows a
POSTto/api/ingestreturning200. - The SDK flushes about every 5 seconds - interact with the page, then wait.
- If
INGEST_TOKENis set, the snippet must send the same token. A401from/api/ingestmeans it doesn't match - see Auth. - A
429means the per-IP rate limit tripped; see Rate limits.
Ingest returns 503
The store can't accept writes - usually the disk is full or the database is locked.
- Check the health lamp in the dashboard header; red means failing. Hover it for the reason.
- Free disk space, or set a retention window and run Settings → Storage → Reclaim space to compact the database.
- The SDK retries a failed batch once (after ~2 s); if the store is still down it drops that batch and keeps recording, so future flushes resume automatically once space is freed.
Storage keeps growing
By default TinyReplay keeps every session forever.
- Set a window in Settings → Retention (or the
RETENTION_DAYSenv var). Sessions older than the window are swept hourly. - Settings → Storage → Reclaim space applies retention immediately and compacts the file.
Masking isn't applied
Masking happens in the SDK at capture time, before data reaches the server.
- Mark sensitive elements per the SDK masking guide; the server cannot mask what was already recorded unmasked.
- Re-record after fixing the markup - existing sessions keep whatever was captured.
The snippet won't load
- The bundle is served from your own server, not a CDN. Confirm
/sdk/...returns200. - A strict Content-Security-Policy on the recorded site can block the snippet or the connection to
/api/ingest; allow your TinyReplay origin inscript-srcandconnect-src.