Error tracking for indie hackers running production
error tracking for indie hackers
Solo production apps: DSN swap, two containers, no overage meter when the deploy breaks.
On this pageShowHide
- The invoice fear
- What I run alone
- Story beat
- Gotcha: dual identity in the SDK
- Gotcha: source maps on a solo release
- When to stay on a suite
- Startup vs solo
- Limits
- Friday checklist I keep in the repo README
- Money honesty for solos
- Variety note vs startups page
- Compare without twinning the startups page
- Partial compatibility reminder
- Takeaway
- Questions
This page is for solo founders and indie developers running a real production app: paying users, a deploy pipeline, and a pager that is usually just you. It is not a weekend side-project pep talk. Positioning on this site is lightweight self-hosted error tracking for SaaS, B2B teams, indie developers, and founders on real production. Solo is a team size, not a toy constraint.
The invoice fear
You already ship an official Sentry SDK. Developer is free for one user (confirm live error quota on sentry.io/pricing). That fits until a contractor needs access, or a deploy loops past the free month. Team is about $26 then pay-as-you-go (fetched 2026-10-05). The fear is not the base plan. The fear is the spike on the day the product breaks and you are the only person reading the stack.
What I run alone
I run Epure on a small VPS beside the app. Two Compose services: epure and postgres:16-alpine. docker compose up -d, wait for GET /health → {"status":"ok"}, create a project, paste the DSN, set traces/replay/profile sample rates to 0, send one exception, confirm HTTP 202 and an Issues row. Apache 2.0. No Redis in the OSS compose. Grouping is SHA-256 of exception type plus top in-app frame. Custom fingerprint overrides when two call sites are one bug.
Dated idle receipts live on Resource footprint. Link them. You still own pg_dump, image pins, and disk alerts. That is the trade for no vendor overage meter.
Story beat
A Friday deploy broke password reset. I was at a cafe with one laptop. Sentry Developer would have been fine on quiet days; the loop was not a quiet day. I had already pointed staging at Epure the week before. Production DSN swap took one env change and a restart. The issue title was the exception type. The count told me the blast radius. The stack had our frame. I patched, rolled forward, and went back to the queue. Nobody asked me to approve an overage.
Gotcha: dual identity in the SDK
Indie apps often share one Sentry init across web and API. When you swap only the web DSN and leave the API on a metered host with tracing enabled, you still get a bill surprise from the API. Swap every process that throws in production, or dual-send on purpose during a migrate week. Point the DSN. Migrate from Sentry.
Gotcha: source maps on a solo release
Your Vite or Next production build minifies to single-letter frames. Without maps for that release, Epure still stores the event, but grouping collapses. Upload maps for the release you ship. Sourcemaps. This is not optional polish for a solo production app with a real UI.
When to stay on a suite
Stay if you use session replay to support customers yourself, if you need mobile crash pipelines, or if you want Sentry's full product and will pay for it. Self-host Sentry only if you accept about 16 GB and a large compose; disclose COMPOSE_PROFILES=errors-only when arguing a smaller Sentry footprint. When error tracking is enough.
Startup vs solo
If you are 2-15 people with shared on-call, read Error tracking for startups. The product can be the same. The seat politics and alert routing differ. Solo pages should not pretend a five-person team is "indie" for SEO.
Limits
Epure does not replace your uptime checker, your logs, or your APM if you need those jobs. Cloud list prices are published and Cloud is not live. Self-host is what you can run tonight. Best free. Best self-hosted. Cheapest.
Friday checklist I keep in the repo README
docker compose -f docker-compose.yml -f deploy/docker-compose.prod.yml ps · curl -sS "$EPURE_PUBLIC_URL/health" · # expect {"status":"ok"}
Then open Issues, filter environment=production, sort by last seen. If the list is empty after a known throw, walk Events not showing before you blame the product. If ingest returns 401, walk Invalid DSN.
Money honesty for solos
A $0 Apache license is not a $0 life. Budget an hour a month for upgrades and a backup restore test. That hour is cheaper than an afternoon arguing with a metered invoice during an outage, for my apps. If you hate operating Postgres, you want a hosted product, and you should buy one that is actually live. Epure Cloud list prices are not a live purchase path as of 2026-10-05.
Variety note vs startups page
This essay opens on invoice fear and a cafe incident. The startups topic opens on team size and alert routing. Keep those shapes distinct when you edit either URL.
Compare without twinning the startups page
Startups care about who gets paged and whether seats are metered. Indies care about whether Friday alone is survivable. Same Epure binary. Different story. If you hire two engineers next quarter, reread the startups topic and decide if alert routing and shared triage change the host. Until then, optimize for one brain, one VPS, one Issues list, and a backup you have restored once.
Partial compatibility reminder
Pointing a Sentry SDK at Epure is envelope ingest for exceptions. It is not a claim that Sentry Cloud feature parity arrived on your VPS. Set unused sample rates to 0. Read Sentry SDK compatible if you need the honest matrix.
Takeaway
If you are the only person who will open the stack at 11pm, optimize for a boring box and a predictable bill. Two containers and a DSN swap are boring on purpose. Keep Sentry when the suite is how you support customers. Otherwise run the small host and spend the saved attention on the product.