Replay is one stream — your whole stack on one timeline
Try it
Press play. Watch a session unfold.
Real interactions — scrub the timeline, switch tabs, click Generate Fix. No video, no recording — built from the same primitives as the live player.
Press play to start the session…
See exactly what they saw
DOM replay synced with console, network, navigation, URL breadcrumbs, and Substrate I/O. PII masked by default; optional network-body capture with 4-layer secret redaction.
Surface the frustration
Rage clicks, dead clicks, slow Web Vitals, source-mapped error stacks — auto-detected and ranked. Filter the list to sessions that actually matter.
Collaborate on the fix
Share any moment with ?t=<ms> deep links. Drop comments anchored to a timestamp, @mention teammates, follow one user's journey across every session.
Ship the fix
Click Generate Fix. AI reads the trace, the replay, and your code, then opens a PR with 11 safety gates already passing.
Player details
Designed for reviewers, not viewers.
The small things that make a debugging tool feel professional.
Keyboard-first
Space / J / K / L shortcuts, ? for the cheatsheet, comma/period jump to the previous/next event boundary (not fixed ticks).
Source-mapped stacks
Stack frames resolve via your deployed .map files, rendering as src/checkout.tsx:42 with one-click open in GitHub.
URL breadcrumbs
Every SPA route change is captured via a history.pushState watcher and surfaces as a chip strip above the viewport with dwell times.
User journey pages
Click an end-user pill in any session to land on /replays/users/<id> — every session they’ve ever had, with frustration-score sort.
vs. the rest
Replay parity. Plus three things nobody else does.
| Feature | InariWatch | Sentry | LogRocket | Datadog |
|---|---|---|---|---|
| DOM replay | ||||
| Console + network panels | ||||
| Source-mapped error stacks | ||||
| Network body capture with masking | partial | |||
| URL breadcrumbs | ||||
| Web Vitals on the timeline | split | |||
| Rage / dead-click detection | partial | |||
| Share at timestamp | partial | |||
| Comments anchored to moments | ||||
| Per-user session journey | partial | partial | ||
| AI-narrated chapters | ||||
| Backend I/O on the same timeline | ||||
| One-click PR from a replay |
Compared 2026-04. Things change — if a competitor ships parity, we’ll update this table.
How it works
From install to merged PR.
Step
01
Drop in the SDK
Install the capture core + replay integration. Zero config. Records DOM, console, network, navigation, Web Vitals, and errors.
npm install @inariwatch/capture @inariwatch/capture-replay
import { init } from "@inariwatch/capture";
import { replayIntegration } from "@inariwatch/capture-replay";
init({
dsn: process.env.NEXT_PUBLIC_INARIWATCH_DSN,
projectId: process.env.NEXT_PUBLIC_INARIWATCH_PROJECT_ID,
integrations: [replayIntegration()],
});Step
02
Sessions auto-correlate
Every replay with an error gets linked to an alert (or creates one). Frustration signals surface to the top of the list.
// optional — identify the user
window.__INARIWATCH_USER__ = {
id: user.id,
email: user.email,
};Step
03
Click Generate Fix
AI reads the replay + the alert + your code, runs 11 safety gates, opens a PR. Auto-merge if every gate is green.
→ Diagnose → Read code → Generate fix → Self-review
→ Security scan → Substrate replay → Staging E2E
→ Open PR → Auto-merge → Watch for regressionsBuilt privacy-first
PII masked by default
Inputs, passwords, and labelled blocks are blocked from capture before they ever leave the browser. 25 heuristic rules + optional AI classifier.
Network bodies: opt-in only
OFF by default. When enabled, 4 layers of defence: URL denylist, JSON key masking, value-shape regex (JWT / AKIA / sk_live_), and header redaction.
Per-project retention
Configurable from 1 to 366 days. Daily cron sweeps expired sessions out of R2 and the database — GDPR right-to-erasure honoured as code.
End-user emails optional
Opt-in hashing per project. We never scrape the DOM — you set the user contract via window.__INARIWATCH_USER__ explicitly.