Day one: the first commit
Why I'm building yet another error tracker, and the foundation that landed on day one — auth, organizations, projects, and an ingest API.
Every project has a day one. Today is Lookout's.
I've spent years squinting at error trackers that either cost a fortune at scale or hide the one detail I actually need behind three clicks. So I'm building my own — an observability platform that ingests errors with a single API call, groups them sensibly, and shows me the story behind a crash instead of a wall of noise.
The first commit is never glamorous, but it sets the shape of everything after it. Here's what landed:
What's in the box
- Authentication — register, login, password reset, the usual. Nothing exotic yet, but it's the gate everything else sits behind.
- Organizations & membership — because error tracking is a team sport. Projects belong to an org; people belong to an org; billing will hang off the org later.
- Projects & API keys — each project gets a key. That key is the entire authentication story for ingest: one header, one POST, done.
- The ingest API — the heart of it. An error event comes in as JSON — message, level, exception class, stack trace — and becomes a row I can group and query.
- Alert rules (scaffolding) — just the bones for now. The real alerting engine is months away, but I want the seam to exist from the start.
- Billing — wired early so I'm never bolting payments onto a mature app.
The one decision that matters
The ingest contract. Everything downstream — grouping, watchers, dashboards, the SDKs in five languages I haven't written yet — depends on the wire shape of an event. So I spent most of today not writing features but arguing with myself about field names. message, exception_class, level, stack_frames, context. Boring, load-bearing decisions.
If I get that right, every future SDK is a thin client. If I get it wrong, I'm writing migrations forever.
Day one down. Tomorrow: making login actually pleasant, and letting people sign in with the accounts they already have.