Epure
Get startedQuickstart

Quickstart

Host up → DSN → one exception → Issues. Epure does not ship a client SDK. Use the official Sentry package for your runtime, change only dsn, set tracing/replay/profiling sample rates to 0.

Fastest with the dashboard: after step 2, use Setup and Apply with AI (same stacks and snippets as this page). Fastest without an SDK: Try ingest. Full map: Pick your SDK.

Which package?

If you ship…PackageDeep dive
SPA in the browser (React, Vue, …)@sentry/browserBrowser
React (SDK wrapper)@sentry/reactBrowser
Node API / worker@sentry/nodeNode
Next.js@sentry/nextjsNext.js
Pythonsentry-sdkPython
Gosentry-goGo
Rubysentry-rubyRuby
PHPsentry/sentryPHP
Java (JVM, not Android)io.sentry:sentryJava
.NETSentry (NuGet).NET

JS/TS fixtures in CI use 7.120.0. Match the Issues environment filter to your SDK tag (local in the examples below).

Already have a host?

Skip step 1. Copy the DSN from Settings → SDK connection or open Setup, then start at step 2.

Deploy on Render, Railway, Coolify, or Dokploy?

Import the checked-in templates from GitHub — no marketplace export. See PaaS and panels or the one-click deploy guide.

Start the two containers

Compose files live at the public product repo root.

Clone and compose up

command

git clone https://github.com/epure-sh/epure.git
cd epure
docker compose up

8080 taken? cp .env.example .env, set EPURE_PORT, recreate epure (URL follows on localhost). Configuration.

Confirm health

No auth. Run after compose is up.

command

curl -sS http://localhost:8080/health

Expected

{"status":"ok"}

Open http://localhost:8080. Register — new accounts get Acme Web + Acme API preview issues. Full install notes: Installation.

For high-volume local UX fixtures (fixed numeric DSN ids):

./scripts/seed.sh --email you@example.com --password 'choose-a-password'

Copy a DSN and open Setup

  1. Create or open a project → Setup (/p/:projectId/setup) or Settings → SDK connection.
  2. Create a DSN key if none exists. The secret is shown once.
http://{public_key}@localhost:8080/{dsn_project_id}

Copy the full string from the dashboard — do not paste the project UUID from the URL into the DSN.

After ./scripts/seed.sh, you can skip the UI and use the seed DSN in Try ingest.

Setup wizard · Apply with AI

On Setup, pick Fresh install or Migrating from Sentry, then choose your stack (JavaScript, TypeScript, React, Node, Next.js, Python, Go, PHP, Ruby, Java, .NET — same icons as the dashboard).

ActionWhat you get
Copy installOne-line command (npm, pip, go get, …) pinned like the snippets below
Copy initDSN-filled Sentry.init (or runtime equivalent) for your stack
Apply with AIFull agent prompt: discovery questions, install/init workflow, your DSN, and a link to the matching platform doc on epure.sh

Paste the prompt into Cursor Agent, Claude Code, or any editor that edits the repo. The prompt mirrors a wire-up checklist (sample rates 0, one test exception, confirm 202 → Issues). From Sentry? Choose Migrating from Sentry so the prompt searches for existing Sentry.init and swaps only dsn. Short path: Migrate from Sentry. Full checklist: docs.

Browser SPAs: set EPURE_CORS_ORIGINS before client-side sends — Browser · CORS.

Install the official SDK

npm install @sentry/browser@7.120.0

Init once, then throw

Call init at startup. Set unused sample rates to 0. Transactions, replay, and profiles are discarded.

import * as Sentry from "@sentry/browser";

Sentry.init({
  dsn: "http://YOUR_PUBLIC_KEY@localhost:8080/YOUR_PROJECT_ID",
  environment: "local",
  release: "my-app@0.0.0",
  tracesSampleRate: 0,
  profilesSampleRate: 0,
  replaysSessionSampleRate: 0,
  replaysOnErrorSampleRate: 0,
});

Sentry.captureException(new Error("Epure quickstart test"));

Migrating from Sentry SaaS: keep the same init options; replace only dsn. 60-second guide · full checklist.

For Sentry JS v8+, also set enableTracing: false when the option exists.

Confirm 202, then Issues

Ingest returns 202 before the row appears. Locally the worker usually flushes in under a second.

Expected ingest body:

{ "id": "660e8400-e29b-41d4-a716-446655440001" }

Refresh http://localhost:8080. Match the environment filter to Sentry.init (local). You should see an unresolved issue for Error / Epure quickstart test.

On Setup, the Verify step waits for the same signal. Empty feed copy: 0 UNRESOLVED EXCEPTIONS. If that is you after a 202, open Verify.

Try ingest without an SDK

POST legacy store JSON for the same 202. Seed fields match ./scripts/seed.sh.

Try ingest

Build a store POST for a host you already run. Seed defaults match ./scripts/seed.sh. Auth is sentry_key only (v0.1.5+). Change host if EPURE_PORT is not 8080. Fields persist in this tab.

store curl

curl -sS -D - -o /tmp/epure-ingest.json -X POST
  "http://localhost:8080/api/550e8400-e29b-41d4-a716-446655440000/store/"
  -H "X-Sentry-Auth: Sentry sentry_version=7, sentry_key=a1b2c3d4e5f6g7h8i9j0"
  -H "Content-Type: application/json"
  -d '{
  "platform": "javascript",
  "exception": {
    "values": [{ "type": "Error", "value": "Epure try-it" }]
  }
}'

Expected

HTTP/1.1 202 Accepted

{ "id": "<event-uuid>" }

Then open Issues. This panel does not POST from the browser. CORS and your DSN stay on your machine.

Envelope fixture from the repo root:

Post a browser envelope fixture

command

curl -sS -D - -o /tmp/epure-envelope.json -X POST \
"http://localhost:8080/api/550e8400-e29b-41d4-a716-446655440000/envelope/" \
-H "X-Sentry-Auth: Sentry sentry_version=7, sentry_key=a1b2c3d4e5f6g7h8i9j0" \
-H "Content-Type: application/x-sentry-envelope" \
--data-binary @fixtures/sentry/browser/envelope.txt

Expected

HTTP/1.1 202

Expect HTTP/1.1 202 and {"id":"..."}.

Next

What does Apply with AI do?

It copies a structured prompt into your clipboard: stack confirmation questions, install/init steps, your project DSN, and the matching epure.sh platform doc. It does not call an external API — you paste into Cursor Agent or another coding agent. Use Fresh vs Migrating from Sentry on Setup so the workflow matches your repo.

Does Sentry JS 8.x work?

Often yes, though CI fixtures are 7.120.0. On v8+, set enableTracing: false when the option exists, and keep traces, profiles, and replay sample rates at 0. Pin 7.120.0 if you want the same line the docs exercise. Confirm a throw with Verify.

Can I use Python or curl only?

Yes. Envelope and store accept official Sentry SDKs and raw JSON, with store as the smallest wire path. Use Other runtimes or the Try ingest panel above. Demangle stays JS/TS only, so frames stay as sent.

Why is Issues empty after a 202?

Accept is non-blocking. Wait about a second, then match the environment chip to the SDK tag (local in these examples). Confirm you opened the project that owns the DSN. If the feed still says 0 UNRESOLVED EXCEPTIONS, follow the table on Verify.