Specialized · Symbolicator

app.min.js:1:63 tells you nothing.

Minified bundles reduce every production error to single letters on line one. Traceway resolves each frame back to the file, line, and function you wrote — the moment the error arrives.

Symbol officeapp.min.js:1:63n()src/user.ts:8:11checkout()30k+ stacks/s32×18 ms p99JS MAPDARTdSYMR8

Service facts

From the benchmark workflow in the repo

Head to head against Honeycomb's symbolicator on a 2 vCPU Hetzner ccx13.

30K+stacks/s, hot or cold
Over 32× Honeycomb's stack traces per second under churn, measured running as an OpenTelemetry Collector.
18 mschurn p99
Where Honeycomb hits ~3 s — the difference between a precompiled file and a re-parse on every miss.
361 MBpeak under churn
Against 4.5 GB for Honeycomb, because the working set lives in the page cache, not the heap.

Bring your own pipeline

Drop-in where Honeycomb used to sit.

The same engine ships as an OpenTelemetry Collector processor: same component type, same attribute contract, same config keys as the source_map_symbolicator. Pure Go, no glibc base image required — and MIT licensed, with or without Traceway behind it.

npx traceway-sourcemaps --directory ./dist

Run it after your build, in CI or locally; under the hood it's one multipart endpoint, so plain curl works too.

SymbolicatorService sheet

JavaScript
Source mapsVite, webpack, esbuild, Rollup, Metro, and the frameworks on them; inline sourceMappingURL data URIs supported.
Dart & Flutter
Obfuscation mapsResolved through the same compiled-cache pipeline as JavaScript.
iOS & Swift
dSYM uploadStripped crash addresses back to file, line, and function, with inline frames expanded.
Android
R8 mapping.txtThe Gradle plugin injects a per-build UUID and uploads the mapping; reads the same app.debug.proguard_uuid attribute as Honeycomb.
Auth
Per-project tokenOne POST endpoint for maps, dSYMs, and mappings; tokens are revocable.

On this line

Symbolication that keeps up with ingest.

Most symbolicators re-parse source maps on every restart and hold them in RAM. Ours compiles each map once, then memory-maps it from disk.

One engine, four formats

JavaScript source maps, Dart and Flutter obfuscation maps, iOS dSYMs, and Android R8 mappings through the same compiled cache.

Cache bounded by disk

Each artifact is compiled to a .tw once and memory-mapped; the OS page cache does the eviction, and the cache is bounded by disk size, not a RAM entry count.

OTel drop-in processor

Symbolicates spans, span events, and log records in any collector build — a drop-in replacement for Honeycomb's source_map_symbolicator.

Grouping survives missing maps

Errors from builds without maps stay minified but group correctly; resolved names are excluded from the hash, so groups don't reshuffle when maps arrive.

Private by design

Your maps never ship to browsers.

Maps upload to your instance's blob storage and are used server-side only — never served to browsers — so you can keep .map files out of your deployed assets entirely.

Next stop

Stop debugging app.min.js.

Upload your source maps once. Every production error after that points at the code you wrote.