Docket
Document-request triage for personal-injury law firms, shipped live in a 48-hour sprint.
- Year
- 2026
- Role
- Design Engineer
- Tags
- UIUX designDesign SystemFrontendLegal Tech
What's done, what's stuck, and what needs me right now?
Paralegals at personal-injury firms chase a dozen document requests per case (police reports, medical records, insurance verifications), each stuck in its own lifecycle with a slow third party. Docket is a triage board for the question their day runs on, designed and shipped solo in a 48-hour sprint. This is the real app, not a video: launch it and work the case.
What's done, what's stuck, and what needs me right now?
Paralegals at personal-injury firms chase a dozen document requests per case (police reports, medical records, insurance verifications), each stuck in its own lifecycle with a slow third party. Docket is a triage board for the question their day runs on, designed and shipped solo in a 48-hour sprint. This is the real app, not a video: launch it and work the case.
Nine lifecycle statuses collapse into five buckets ordered by what the paralegal should do about them. Blocked requests rise to the top as full cards with the blocker spelled out and a one-click next action: re-send the form, approve the fee, confirm the claim number. Overdue is a flag, not a status, so time at risk reads at a glance in a single warm accent reserved for exactly that.

Selecting a card opens the full record: dates, assignee, expected pages, the blocker called out in plain language, an activity timeline, and a notes field for logging a call. The primary action follows the state: a blocked request offers Re-send form, a request in flight offers Mark received.

Every action is an optimistic update: the card moves buckets instantly, the timeline logs it, and an undo toast waits at the bottom of the screen. No confirmation dialogs. Act first, take it back if you need to.

New requests start life as drafts in the same pane: category, document type, source, assignee, due date. Changes persist automatically, and submitting drops the request into the live checklist.

The case data deliberately spans rejected, on-hold, and partially received requests, plus empty and loading on top. A search that matches nothing gets a real empty state with a way back, not a blank column.

Credits
- Context
- Solo 48-hour build sprint, June 2026
- Stack
- Next.js 16, React 19, TypeScript, Tailwind CSS v4, Vitest
- Design system
- Token-driven: color, type scale, radius, and shadow defined once, components built from a small reusable kit