epure
Health Pass
- License — License: AGPL-3.0
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Community trust — 12 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
Calm error tracking for SaaS built by one or two developers. Keep your Sentry SDK, change the DSN. Self-host free (AGPL-3.0) in two containers.
Epure
Calm error tracking for SaaS built by one or two developers. Each new bug shows once, alerts fire only on a new issue, a regression or a spike, and the bill is flat.
- Keep your Sentry SDK. Change the DSN to Epure and set
tracesSampleRate: 0. To roll back, restore the old DSN. - Your coding agent reads the issue.
claude mcp add epure -- npx -y @epure-sh/mcp, or the hosted server athttps://app.epure.sh/mcp. - Pricing. Self-hosting is free. Cloud Pro is $29 a month, Scale $89, monthly, unlimited seats, no automatic overage: epure.sh/pricing.
- Licence. Engine AGPL-3.0. The
@epure-sh/cliand@epure-sh/mcpclients are Apache-2.0.
| Two containers | One flood, one issue | Errors only |
|---|---|---|
| Epure plus Postgres 16. Idle about 5 MiB plus 48 MiB, measured 23 Sep 2026. | Spike valve. 100 stored per minute per identical error, 150 per throw site, every repeat counted. | No tracing, replay or profiling. Keep those sample rates at 0 in the SDK. |
From clone to Issues

Docs: architecture, deploy, and DSN migration.
Quickstart
1. Start it
git clone https://github.com/epure-sh/epure.git
cd epure
docker compose up -d
2. Copy the DSN
Open http://localhost:8080. Register, create a project, copy the DSN.
3. Throw one error
Keep the official Sentry SDK. Paste the Epure DSN. Set tracing, replay, and profiling sample rates to 0 (Epure does not store those payloads).
import * as Sentry from "@sentry/node";
Sentry.init({
dsn: process.env.SENTRY_DSN, // DSN from step 2
sendDefaultPii: false,
tracesSampleRate: 0,
replaysSessionSampleRate: 0,
replaysOnErrorSampleRate: 0,
profilesSampleRate: 0,
});
Sentry.captureException(new Error("Epure test event"));
4. Open Issues
Epure test event is on the page. Grouped, with the stack.
Other languages, same DSN: Pick your SDK. It also lives under Settings → SDK connection, and the in-app Setup wizard shows it.
Deploy
On a VPS
./configure --prod
docker compose -f docker-compose.yml -f deploy/docker-compose.prod.yml --profile tls up -d
Run ./configure --prod before the first up, or after docker compose … down -v. If Postgres data already exists, the script reuses secrets from .env or applies new ones into the database — it does not overwrite .env with fresh random passwords while leaving the volume on the old ones. To rotate secrets intentionally: ./configure --prod-rotate-secrets. ./configure --prod asks for a public HTTPS hostname (not a raw IP). --profile tls starts Caddy on ports 80 and 443. Open https://your-hostname/login and repeat steps 2 to 4.
http://YOUR_SERVER:8080 will not keep you signed in. /health can still return ok. The browser drops the Secure session cookie and sends you back to the login form with no error. Drop --profile tls only when you already terminate HTTPS yourself.
After that account exists, set EPURE_REGISTRATION=false and recreate the container. Sign-in stays available. New workspaces cannot be created from the public URL. Invitation links still work.
What this binary stores, and what it refuses to store, is in docs/privacy.md. The sign-in page links to /privacy.
Pin EPURE_IMAGE to the current release tag once the URL is public (Releases · Installation).
On a platform
| Platform | Start here |
|---|---|
| Render | Blueprint render.yaml. |
| Railway | Drag deploy/railway/docker-compose.yml onto the project. Notes. |
| Coolify | Compose, base directory deploy/templates/coolify. |
| Dokploy | Compose file deploy/templates/dokploy/docker-compose.yml. |
Then the same steps: register, copy the DSN, throw once, open Issues. Longer list: Installation · deploy/.
Architecture
Two containers. The SDK talks to ingest; ingest returns 202 and a worker writes Postgres. The dashboard is the same binary.
Details
- Grouped issues and readable stack traces
- JS/TS sourcemaps
- Releases and regressions
- Alerts and webhooks
- Multi-project orgs and DSN rotation
- RBAC and PostgreSQL RLS
- Keyboard triage
- Spike protection
Epure does not store distributed traces, session replay, continuous profiling, generic logs, or infrastructure metrics. It does not symbolicate iOS/Android. Keep those sample rates at 0 in the SDK.
| Epure | Bugsink | Sentry self-hosted | GlitchTip | |
|---|---|---|---|---|
| Primary focus | Error tracking | Self-hosted error tracking | Errors plus tracing, replay, profiling | Errors and performance |
| Deployment | Two-container Compose | Single-container docker run |
Large multi-service cluster | Multiple options |
| License | AGPL-3.0 engine, Apache-2.0 CLI/MCP. No ee/ folder |
PolyForm Shield 1.0.0 | Check current Sentry license | MIT |
| Database | PostgreSQL 16 | See their docs | Multiple datastores | PostgreSQL |
Project Status: Beta. Epure Cloud runs this engine in production; open release gates (published capacity results, grouping quality measurement) are tracked in docs/ingester-audit.md. Two-container Compose, PostgreSQL 16 with RLS, Spike Valve flood protection, and official Sentry SDK wire compatibility. Changelog.
License: the engine (Rust crates and web UI) is GNU AGPL-3.0. The client packages @epure-sh/cli and @epure-sh/mcp stay Apache-2.0, so installing them never affects your code. Releases up to v0.1.7 were Apache-2.0. No separate closed-source core.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found