Something went wrong. RecordingController.swift, line 214.
Crashbox is a self-hosted crash and error service for a documented, event-only subset of the Sentry envelope protocol. Keep a supported SDK, store scrubbed events and private debug artifacts on infrastructure you operate, and inspect grouped issues, regressions and symbolicated stack traces.
What happens to an event
Ingress validates and scrubs each event before a successful queue commit returns 200. Grouping and symbolication run afterwards in bounded, project-scoped workers.
Limits before expensive work
Crashbox bounds request, header and item sizes before parsing. It also caps decompression, JSON shape and event fields. Rejections use stable errors and never echo the payload.
Scrub before the queue
Recursive server-side scrubbing removes secrets and common PII before durable admission. Crashbox never logs raw request bodies or unsanitized payloads.
Commit before success
Crashbox returns 200 only after the scrubbed event commits to the bounded SQLite admission queue. Per-project quotas keep one sender from taking every queue slot.
Versioned, deterministic issues
crashbox-v3 groups exception events by exception type and a bounded tail of application frame identities. It ignores line numbers, absolute addresses and exception messages. Message-only events use a normalized message and thread stack.
dSYMs and source maps
Upload private debug artifacts per project. Apple frames resolve to function, file and line. Browser frames use the release's source map.
Alerts only on transitions
New, regressed and resolved are explicit issue transitions. Crashbox decides when one warrants an alert and hands it to your gateway.
Use a supported SDK in event-only mode.
Current fixtures pin Sentry Cocoa 8.58.4, sentry-sdk 2.68.1 and @sentry/core 10.72.0. Compatibility applies to the event-only settings shown here, not every item those SDKs can emit. Revalidate the fixture and canary before an SDK upgrade.
SentrySDK.start { options in
options.dsn = "https://PUBLIC_KEY@crashbox.example.com/42"
options.releaseName = "com.example.fieldnotes@1.14.2+3121"
options.environment = "production"
options.enableAutoSessionTracking = false
options.sendClientReports = false
options.tracesSampleRate = 0
}
Upload the matching dSYM through the private artifact interface. Frames resolve only when the build UUID matches. The artifact stays on infrastructure you operate, including any encrypted backup destination you configure.
sentry_sdk.init(
dsn="https://PUBLIC_KEY@crashbox.example.com/7",
release="orders-api@2026.09.1",
environment="production",
auto_session_tracking=False,
send_client_reports=False,
traces_sample_rate=0,
profiles_sample_rate=0,
_experiments={"transport_compression_algo": "gzip"},
)
The gzip experiment key is pinned to sentry-sdk 2.68.1 and needs revalidation before an upgrade. Crashbox accepts error and message events. It rejects transactions, profiles and replays with a stable response.
Sentry.init({
dsn: "https://PUBLIC_KEY@crashbox.example.com/11",
release: "catalog-web@4.2.0",
environment: "production",
autoSessionTracking: false,
sendClientReports: false,
sendDefaultPii: false,
enableLogs: false,
tracesSampleRate: 0,
profilesSampleRate: 0,
replaysSessionSampleRate: 0,
replaysOnErrorSampleRate: 0,
});
Upload a source map through the private, project-scoped artifact interface. Crashbox records the map used for each completed frame. Browser ingestion returns credential-free Access-Control-Allow-Origin: *, and preflights allow only POST and the documented request headers.
Small on purpose
Crashbox does one job and refuses the rest at the edge. That is what keeps it possible to run on a single host and reason about under load.
Crashbox owns
Crashbox accepts error events, records issues and exposes the processing result to operators.
- Projects and public DSN keys, with per-project isolation and quotas
- Bounded envelope ingestion and a durable admission queue
- Recursive secret and PII scrubbing before storage
- Deterministic grouping, occurrence counts, regressions and release history
- dSYM and source-map catalogs and asynchronous symbolication
- Retention, encrypted off-host backups and restore drills
- Deciding when an issue transition should raise an alert
Crashbox does not own
Anything that would turn a crash service into an observability platform.
- Logs, metrics, distributed tracing, profiling or session replay
- Alert-provider credentials or cross-service notification routing
- Customer email, push or SMS notifications
- A custom SDK, when the upstream Sentry SDK can be configured
| Runs on | One application host. Python 3.12, Gunicorn, PostgreSQL 17 and a SQLite admission queue. systemd units and reverse-proxy contracts are included. Event data and private artifacts stay on infrastructure you operate. |
|---|---|
| Default ingest limits | 1,000,000 byte body, 8,192 byte header lines, 750,000 byte items, 20 items per envelope. Projects can be set lower. |
| Accepted items | Exactly one event item containing a JSON object. Attachments, sessions, transactions, profiles and replays are rejected. |
| Symbolication | Apple dSYMs via atos on macOS or a pinned LLVM 18 toolchain on Linux. JavaScript source maps per release. Uploaded files are treated as data, never executed. |
| Backups | Backup tooling writes encrypted off-host bundles and includes a separate-host weekly restore verifier for PostgreSQL, SQLite and artifacts. You choose the destination. |
Run Crashbox on infrastructure you control.
The repository includes fixture tests and end-to-end canaries for each supported path. Run the matching canary and keep a tested rollback path for every SDK version and application you move. For deployment questions, write to us.