When error tracking is enough (no session replay, no APM)
error tracking without session replay
If your daily loop is a grouped exception and a readable stack, you do not need session replay or distributed tracing on the same box. Keep the official Sentry SDK, paste a new DSN, and run a two-container tracker.
On this pageShowHide
Error tracking without session replay is enough when production fails and you need a grouped issue with a stack you can read, not a video of the session and not a distributed trace of every hop. If that is the daily job, a lite ingest host beats a full observability suite on the same invoice and the same VPS.
This note is the decision cut, not a roster and not an install runbook. For service count see Two-container error tracking. For dated RSS rows see Sentry self-hosted RAM. For the DSN swap path see Sentry SDK compatible and Migrate from Sentry. Product refusal of replay and APM sits on Welcome.
The job that fits
You ship a web or API product. An official Sentry SDK already lives in the app. When a deploy regresses, you open Issues, see the fingerprint, read frames, and ship a fix. Breadcrumbs help. Releases help. A webhook into chat or a tracker helps. You do not open a session replay to guess which button the user clicked, and you do not chase spans across five services before you know the exception type.
That loop is common on small teams. One person owns the SaaS and the Compose file. Metered traces and replay feel like a second incident when a crash loops overnight. The suite is correct for teams that debug with video and APM every day. It is oversized when the pager text is the stack.
- Fit: grouped exceptions, breadcrumbs, JS/TS sourcemaps, releases, webhooks, keyboard triage on a box you operate.
- Not fit: session replay as the primary repro tool, distributed tracing as the daily map, continuous profiling, native mobile symbolication depth.
- SDK path: keep
@sentry/browser,@sentry/nextjs,@sentry/node,sentry-python, or a peer official client. Changedsn. Do not rewrite instrumentation for Honeybadger-style APIs unless you want that product.
Proof on the wire, not a brochure
Lite hosts that speak the Sentry envelope keep event items and discard or skip the rest. On Epure, envelope event items are parsed, queued, and persisted. transaction items are discarded because the product is error tracking, not APM. replay_*, profile*, session, attachment, and check_in are skipped. An envelope with no event item returns 400 invalid_envelope. Success is 202 Accepted plus { "id" }, then an unresolved Issues row (Envelope, Verify).
That keep/drop table is the honest answer to “without session replay.” Replay packets can still leave the browser if sample rates stay on. They do not become Issues on Epure. Set tracesSampleRate, replaysSessionSampleRate, and profilesSampleRate to 0 so you are not shipping volume nobody stores. Compatibility is partial: supported exception paths over DSN swap, not 100% Sentry protocol parity. Quickstart CI pins include @sentry/browser@7.120.0 and @sentry/node@7.120.0. Other runtimes are listed on Platforms. Sentry 8.x+ is not claimed as CI-proven here.
event
- Behavior
- Parsed, queued, persisted
transaction
- Behavior
- Discarded (error tracking, not traces)
replay_*, profile*, session, attachment, check_in, other
- Behavior
- Skipped
| Dimension | Behavior |
|---|---|
| event | Parsed, queued, persisted |
| transaction | Discarded (error tracking, not traces) |
| replay_*, profile*, session, attachment, check_in, other | Skipped |
First-party Envelope docs. Non-event items do not invent per-item HTTP codes beyond that table.
Footprint honesty when Sentry RAM enters the argument
Self-hosted Sentry’s published floor is high because the default product includes tracing, replay, profiling, and the brokers under them. As of 2026-09, comparisons on this site cite about 16 GB RAM, 16 GB swap, and 20+ containers (Sentry self-hosted). That warning is correct for that suite.
Fair disclosure: from Sentry 24.8.0+, self-hosted can set COMPOSE_PROFILES=errors-only. That profile keeps Issues, Alerts, Integrations, Dashboards, Releases, and Errors, and drops traces, replays, profiles, and related services (errors-only docs). Worth trying if you want to stay inside their stack. On a small VPS it was still more fleet than we wanted to operate. Epure stays two containers: Rust binary plus PostgreSQL 16, no Kafka, no ClickHouse, no Redis in the OSS compose (Installation).
Dated idle receipts, do not average rows. On 2026-09-23, classic Compose on a 2 vCPU / 769 MiB Linux VPS (Alibaba Cloud) measured about 5 MiB RSS for Epure and about 48 MiB RSS for Postgres with docker stats, about 53 MiB combined. A short store-ingest burst on that host, about 280-330 requests per second, kept Epure under about 12 MiB RSS. On 2026-09-12, a different Docker Desktop idle measured about 82 MiB combined for app plus Postgres. Neither row is a vendor minimum. Re-measure on the box you pay for (Sentry self-hosted RAM).
Idle, 2026-09-23
- Host
- 2 vCPU / 769 MiB Linux VPS, Alibaba Cloud
- RSS
- Epure ~5 MiB, Postgres ~48 MiB, ~53 MiB combined
Burst, same host
- Host
- Short store-ingest, ~280-330 req/s
- RSS
- Epure under ~12 MiB RSS; Postgres heavier
Idle, 2026-09-12
- Host
- Docker Desktop (dev machine)
- RSS
- ~82 MiB combined, app + Postgres
| Dimension | Host | RSS |
|---|---|---|
| Idle, 2026-09-23 | 2 vCPU / 769 MiB Linux VPS, Alibaba Cloud | Epure ~5 MiB, Postgres ~48 MiB, ~53 MiB combined |
| Burst, same host | Short store-ingest, ~280-330 req/s | Epure under ~12 MiB RSS; Postgres heavier |
| Idle, 2026-09-12 | Docker Desktop (dev machine) | ~82 MiB combined, app + Postgres |
Method: docker stats on classic Compose. Quote the dated row that matches your audience. Do not invent a blended floor.
How you run the narrower path
Clone the public product repo, pin the image, bring up two services, hit health, create a project, paste the DSN. Laptop defaults publish host 8080 for the app and 5433 for Postgres. No .env is required for localhost. A real hostname needs the prod overlay under deploy/, real passwords, HTTPS in front, and EPURE_PUBLIC_URL set to https://… (Installation, Configuration).
EPURE_IMAGE=ghcr.io/epure-sh/epure:v0.1.3 docker compose up -d
curl -sS http://localhost:8080/health should return {"status":"ok"}. Open :8080, register, create a project, copy the DSN from setup or Settings. Point the official SDK at that DSN with traces, replay, and profiles sample rates at 0. Confirm with Verify: expect HTTP 202, then an Issues row. Empty Issues after 202 usually means env filter, wrong project, or worker flush, not “replay was required.”
Crash loops should raise the count without storing every duplicate body. Documented spike-valve defaults: about 100 raw events per minute per fingerprint (HTTP 202, counter rises, excess bodies drop), a project cap of 5000 events per hour (then HTTP 403 ingest_cap_exceeded), and a 2 MB body limit (HTTP 413 payload_too_large). Knobs may move before 1.0 (API Errors, Spike valve flood).
When the cut fails in practice
The decision fails in both directions. Teams leave Sentry and miss replay on day three. Teams keep the full suite on a $4 VPS and spend the week fighting Compose. Name the failure before you swap the DSN.
- You actually debug with replay. Support watches session video to reconstruct clicks. Dropping replay is not a RAM win, it is a lost tool. Stay on Sentry Cloud or another host that persists replay.
- You actually debug with traces. The bug only appears as a slow span across services. Lite error hosts discard
transactionitems. Stay on an APM product. - You expected 100% wire parity. Sample rates at 0, then surprise empty Issues for a transaction-only envelope, or missing mobile native symbols. Epure is partial: exceptions and JS/TS maps, not a clone of Sentry Cloud.
- You left replay sample rates on. The browser still uploads replay payloads. The lite host skips them. You pay client bandwidth for nothing. Set rates to 0.
- You quoted RAM without naming the box. Mixing the 2026-09-12 Docker Desktop ~82 MiB idle with the 2026-09-23 VPS ~53 MiB idle into one “under 70 MiB” claim is fiction. Cite the dated row.
- You compared Epure’s two containers to Sentry’s full suite without mentioning
COMPOSE_PROFILES=errors-only. Fair arguments disclose that profile, then note it is still a large fleet.
Peers and hard limits
GlitchTip, Bugsink, Telebugs, and Epure all cover the “errors without the suite” corner with different contracts. GlitchTip: MIT, about four containers, Postgres, long clock on the wire. Bugsink: one Django container, SQLite-first, Polyform Shield. Telebugs: $299 once, Rails + SQLite, 1 GB documented minimum. Epure: Apache 2.0, Rust + PostgreSQL 16, two containers, spike valve, dated idle RSS. Head-to-heads: vs Sentry, vs GlitchTip, vs Bugsink, vs Telebugs.
Containers
- Sentry self-host
- 20+ (full); errors-only profile still a fleet
- GlitchTip
- About 4
- Bugsink
- 1
- Epure
- 2
Default store
- Sentry self-host
- Postgres, heavy stack
- GlitchTip
- Postgres
- Bugsink
- SQLite (Postgres optional)
- Epure
- PostgreSQL 16
License
- Sentry self-host
- FSL
- GlitchTip
- MIT
- Bugsink
- Polyform Shield
- Epure
- Apache 2.0
Replay / APM
- Sentry self-host
- In the full product
- GlitchTip
- Errors focus
- Bugsink
- Errors focus
- Epure
- Does not ship; discarded on ingest
| Dimension | Sentry self-host | GlitchTip | Bugsink | Epure |
|---|---|---|---|---|
| Containers | 20+ (full); errors-only profile still a fleet | About 4 | 1 | 2 |
| Default store | Postgres, heavy stack | Postgres | SQLite (Postgres optional) | PostgreSQL 16 |
| License | FSL | MIT | Polyform Shield | Apache 2.0 |
| Replay / APM | In the full product | Errors focus | Errors focus | Does not ship; discarded on ingest |
First-party bias on the Epure column. Peer cells follow public docs already used on Epure comparison pages. RAM floors belong on the dated benchmark pages.
Hard limits on Epure, stated so you can leave: no distributed tracing product, no session replay product, no continuous profiling, no generic log ingestion, no iOS/Android symbolication depth (JS/TS .map only). Redis, Kafka, and ClickHouse are not required dependencies. Managed Cloud (Pro $24 for 200k events, Plus $79) is a separate hosted option with published prices; self-host license cost is $0 on Apache 2.0. The path here is the GitHub compose install, not a checkout flow (Pricing, Self-host).
Stay on this path if
- The next grouped exception is the pager text you act on.
- You already ship an official Sentry SDK and can set traces, replay, and profiles sample rates to 0.
- You want two Compose services, Postgres by default, and Apache 2.0, with dated idle RSS you can re-run.
Pick something else if
- Session replay or APM is how you debug: stay on Sentry (Epure vs Sentry).
- One SQLite container is the constraint: Epure vs Bugsink.
- MIT Django with a longer self-host clock: Epure vs GlitchTip.
- You need a PaaS button more than this decision note: One-click deploy.
Deep links: Quickstart | Verify | Installation | Envelope | Sentry self-hosted RAM.