Case Study · 2026
Aurora Analytics
A data-dense dashboard built for a small ops team that lives inside it eight hours a day — real-time streaming charts, motion-driven KPIs, and a UI calm enough to last a full shift.
< 1.2s
Load time
38ms
TTFB
98
Lighthouse
6 wks
Timeline
Active sessions
12,847
↑ 18.4% vs last week
Role
Full-stack & UI design
Stack
Next.js · TypeScript · D3 · Postgres
Team
Solo build
Status
Shipped & in production
The problem
Seven tabs that should be one surface.
The ops team was context-switching between a legacy BI tool, raw SQL in a Retool panel, Slack alerts, and a spreadsheet they maintained by hand. Every morning standup started with five minutes of tab reconciliation. Data was never wrong — it was just always slightly out of sync.
The brief was simple: one screen, live data, no refresh button. The hard part was doing it without making the interface feel busy.
The solution
A query layer that streams, not polls.
I built a thin streaming layer on top of Postgres using server-sent events. Each chart subscribes to a typed channel; updates arrive as deltas and merge into the D3 data join without triggering a full re-render. The result is a dashboard that feels alive without the jitter of constant refreshes.
Streaming KPIs
SSE-powered metrics update in under 200ms with optimistic animations that smooth over network jitter.
Keyboard-first nav
Every panel, filter, and drill-down is reachable without a mouse. Power users never have to look away from the data.
Adaptive density
The layout respects user preference — compact for analysts, spacious for executive reviews — stored in a cookie.
Process
Six weeks, start to ship.
Wk 1–2
Discovery & schema
Shadowed two ops analysts for a day each. Mapped data sources, designed the Postgres schema, settled on SSE over WebSockets for simpler infrastructure.
Wk 3
Core components
Built the D3 chart primitives — line, bar, heatmap — as typed React wrappers with configurable easing. Established the design tokens.
Wk 4–5
Integration & polish
Wired streaming, keyboard nav, and the filter system. Ran daily reviews with the team to catch usability issues early.
Wk 6
Performance & launch
Profiled, lazy-split secondary panels, tuned Postgres indexes. Lighthouse 98 on mobile before shipping.
Outcome
The standup ritual disappeared.
Within a week of launch the team dropped their morning tab reconciliation entirely. Data confidence went up, and so did on-call response time — the alert panel now lives beside the charts that explain why it fired.