A day-by-day, commit-by-commit devlog of shipping a full observability platform — error tracking, watchers, dashboards, alerting, source maps, on-call, and mobile SDKs. The honest version, trade-offs and all.
I was tired of finding production errors from customer emails and paying enterprise prices for noise. So I built an error tracker that installs in one line, groups the flood into issues, and wakes the right person — free to start.
Shipping Swift (iOS/macOS) and Kotlin (Android) crash-reporting SDKs against the same ingest contract, with server-side contract tests as the runnable proof.
A deep dive on building native on-call escalation in Laravel — the incident state machine, a per-minute scheduler that advances tiers, repeat-until-acknowledged, incident dedup, and stopping escalation with a signed URL.
A deep dive on JavaScript symbolication — decoding Base64 VLQ mappings, the cumulative-vs-reset field rule, binary-searching segments by column, and matching minified frames to the right source map.
Building a custom dashboard feature for Lookout — a widget/query builder that composes 18 watcher sources into stats, time series, and breakdowns, with portable SQL and pure-CSS charts.
A deep dive on synthesizing a service/dependency graph from existing trace spans — extracting destinations per span op, portable JSON extraction across SQLite and MySQL, and collapsing spans into nodes and edges.
A deep dive on Lookout's alert engine — the event catalogue, severity mapping, channels and subscriptions, the single notifier seam, and cache-based deduplication that makes adding a new alert a one-liner.
Adding a view.render span collector to the tracing SDK so Blade templates show up as traced operations — plus the 1.2.1 and 1.3.0 fixes it took to get right.
Getting lookout/tracing to install cleanly from a split mirror repo — version constraints, stability flags, and the path-repo trick for local development.
A deep dive on squashing migrations with php artisan schema:dump --prune in Laravel — how schema dumps work, why they speed up tests, and the cross-database SQLite gotcha.
A day of CI/CD pain — splitting SDK packages out to their own repos, fixing mirror push tokens, and auto-tagging main on every push so releases are boring.