Crashbox

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.

field-notes-macos   release 1.14.2 (3121)   arm64
00x1b2f4e310libsystem_kernel.dylib + 0x2310__pthread_kill
10x1b2f8b8f4libsystem_pthread.dylib + 0x68f4pthread_kill
20x1b2e6e1f8libsystem_c.dylib + 0x2b1f8abort
30x1b2b1a6c4libswiftCore.dylib + 0x3f26c4swift::fatalError
40x1048a3c1cFieldNotes + 0x1b3c1cRecordingController.finishSegment(_:)  RecordingController.swift:214
50x1048a1f04FieldNotes + 0x1b1f04RecordingController.stop()  RecordingController.swift:171
60x10479e2a8FieldNotes + 0xae2a8SessionCoordinator.idleTimerFired()  SessionCoordinator.swift:88
70x1b3c02a80Foundation + 0x9ca80__NSFireTimer
80x1b2fe4d08CoreFoundation + 0x84d08__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__
user dev@example.com dSYM 7C3F1A9E-…-0B2 issue crashbox-v3 · 3 app frames · 7a1e…c94d

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.

1 / ingress

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.

2 / scrub

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.

3 / queue

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.

4 / group

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.

5 / symbolicate

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.

6 / alert

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.

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 onOne 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 limits1,000,000 byte body, 8,192 byte header lines, 750,000 byte items, 20 items per envelope. Projects can be set lower.
Accepted itemsExactly one event item containing a JSON object. Attachments, sessions, transactions, profiles and replays are rejected.
SymbolicationApple 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.
BackupsBackup 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.