real-time
Command Dashboard
One live view of The Keyholding Company's incident activity - around 1,000 incident messages a day - piloted with EY.
- Next.js
- TypeScript
- TanStack Query
- WebSockets
- Playwright
- GrowthBook
Overview
The Keyholding Company provides security services to more than 6,000 enterprise clients. Incident information was fragmented across separate sections of the existing platform - tracking what had been raised, what was progressing, and what hadn't been actioned meant searching and filtering across multiple areas. I built the frontend of Command, a dashboard that consolidates that activity into one live view, carrying around 1,000 incident messages a day.
Decisions
WebSockets, with the failure modes written down
Incident updates needed to reach the screen without a refresh, so they are pushed over WebSockets. I wrote the ADR for the approach, and most of it deals with the parts that go wrong: how the client reconnects when a connection drops, and how the socket is authenticated.
Agreeing the types before the API existed
The dashboard was built alongside its backend. Rather than wait, we agreed shared TypeScript types for the API up front, and I built the frontend against that contract - data fetching with TanStack Query and the live views were never blocked on endpoints that didn't exist yet.
Piloting behind a flag
Command shipped to EY, the first enterprise client, behind a GrowthBook feature flag. The pilot was explicitly meant to surface improvements before a wider rollout, and the flag kept it scoped to one client - and switchable off without a deploy - while that happened. The frontend is tested end-to-end with Playwright.
Outcome
What used to be a search-and-filter exercise across separate platform sections became one consolidated live view: raised, in-progress, and un-actioned incidents in a single place, updating as messages arrive. It shipped to the pilot client roughly three months after the WebSocket ADR was written, on a type contract agreed before the API existed.