I like to keep debugging workflows as lightweight as possible — no heavy vendor contracts, no bloated dashboards I never open, and minimal noise in my inbox. Over the years I’ve found a sweet spot: a small session-replay layer that records the exact UI interactions needed to reproduce issues, coupled with instant Slack alerts that let the product and engineering teams triage bugs fast. Below I’ll walk through a practical, hands-on way to set this up with open-source components so you can start capturing meaningful sessions and routing them to Slack in under an hour.
Why a lightweight session replay + Slack alerts?
Full-featured commercial replay tools can be great, but they also tend to be heavy — large bundles, complicated privacy controls, and recurring costs. For small teams and solo founders, the priority is different: see what a user saw for the few sessions that matter, and surface them to your team without creating noise.
Here’s what I aim for in a lightweight workflow:
What I use and why
Two open-source options I recommend:
For my lean setup I typically choose rrweb for recording and combine it with a small server that stores events in an object store (S3-compatible) and publishes alerts to Slack. That keeps the frontend light and gives you full control of storage and retention.
High-level architecture
Here’s the flow I recommend:
Step-by-step setup (rrweb + S3 + Slack)
Below is a concise plan you can implement incrementally.
1) Add rrweb to your app
Install rrweb via npm or yarn. On the client:
Key tips:
2) Backend uploader
Make a small endpoint (/upload-session) that accepts an events payload, compresses it (gzip), and pushes to an S3 bucket with a predictable key like sessions/{sessionId}/{timestamp}.json.gz. Store a lightweight index record in your DB that contains:
| Field | Purpose |
| session_id | Unique id for the session |
| user_id / anon_id | Who this session belongs to |
| url | Initial URL |
| events_blob_key | S3 key to the compressed events |
| created_at | Timestamp |
| alerted | Whether we already sent a Slack alert |
The logic is intentionally small: upload, record metadata, return 200. Keep the endpoint idempotent so retrying uploads is safe.
3) Simple rule engine for alerts
Alerts should be rare and signal-worthy. I usually trigger Slack notifications on one of these conditions:
To implement this, collect lightweight telemetry alongside rrweb events — browser console errors, network errors (capture via fetch/XHR wrapper), and a small click counter. Send a summary to the server; if any rule matches, mark the DB record for alerting.
4) Send Slack alerts with context
When a session meets your alert criteria, send a Slack message with:
Use Slack Incoming Webhooks or the Slack API to format a message. Keep the message compact but actionable. Example payload highlights:
5) Replaying the session
To replay the compressed rrweb events, you can either:
rrweb-player is a tiny library that provides an out-of-the-box UI for replays. You can wrap it in your own minimal UI that includes the Slack linkback and metadata.
Privacy and data minimization
Be intentional about what you record:
Open-source libraries give you control here — you’re responsible for what you capture, which is an advantage if you want strict privacy guarantees.
Tool comparison (quick)
| Tool | Pros | Cons |
| rrweb | Tiny, flexible, well-documented | Requires custom infra to host replays |
| OpenReplay | Full replay platform, has UI | Heavier to self-host |
| Commercial tools (FullStory, LogRocket) | Feature-rich, support | Costly, larger bundle sizes |
Operational tips
From experience, the small operational details matter more than the tech choice:
Setting this up has helped me triage UI bugs much faster: instead of a long Slack thread, I can open the replay, see what the user clicked, which network request failed, and who should own the fix. It’s not about capturing every interaction — it’s about capturing the right ones, keeping the setup light, and delivering context to the team where they already work: Slack.