Gridwarden
Incident timelines that assemble themselves while you are still firefighting.
- TypeScript
- tRPC
- Postgres
Gridwarden builds the incident timeline for you, by watching the places where the work already happens.
The observation
Nobody writes a good timeline during an incident. They write it afterwards, from memory, badly. But the raw material already exists: the alert that fired, the deploy that went out, the messages in the channel, the moment the graph came back.
What it does
It ingests those events, orders them, and lets you promote any of them into the official narrative with one click. The postmortem starts at eighty percent complete rather than blank.
export const promote = protectedProcedure
.input(z.object({ incidentId: z.string().uuid(), eventId: z.string().uuid() }))
.mutation(async ({ ctx, input }) => {
await ctx.db.insert(timelineEntries).values({
incidentId: input.incidentId,
sourceEventId: input.eventId,
promotedBy: ctx.session.user.id,
});
});
The part that mattered
Clock skew. Events arrived from six systems with six ideas of what time it was, and a timeline that lies about ordering is worse than no timeline. Gridwarden stores both the source timestamp and its own receipt time, and shows you when they disagree by more than a few seconds.