Cadence
Shift scheduling for small clinics — replacing the shared spreadsheet that quietly runs most of them.
Role
Design & development
Timeline
9 weeks
Platform
Web · installable PWA
Stack
Next.js · Postgres · TypeScript
The problem
Smallpracticesschedulestaffinasharedspreadsheet,anditworksuntiltwopeopleopenitatonce.Thefailuremodeisnotdramatic—itisanursewhoshowsupforashiftthatwasoverwrittenonTuesday.Existingschedulingsoftwareispricedandscopedforhospitalsystems,soclinicsundertwentystaffkeepthespreadsheetandabsorbthecost.
Decisions
Optimistic UI with server reconciliation
Schedulers drag shifts around fast, and a round-trip per drag felt broken. Every change applies locally and immediately, then reconciles. When the server disagrees the shift animates back with a reason attached, which turned out to teach the scheduling rules better than any tooltip we wrote.
Conflicts surfaced, never auto-resolved
Our first build silently picked a winner on collision. Testing made it obvious this was worse than the spreadsheet — at least a spreadsheet is visibly wrong. Now both versions are shown side by side and a human chooses. Slower, and the only defensible option when someone’s shift is on the line.
Server Components for the read paths
The schedule grid is read far more than it is written. Rendering it on the server cut the client bundle by roughly two thirds and made the first paint feel instant on the ageing desktops these clinics actually run. Interactivity is confined to the small islands that need it.
Screens
Weekly schedule grid
add src to lib/case-studies.ts
Conflict resolution view
add src to lib/case-studies.ts
Mobile shift confirmation
add src to lib/case-studies.ts
Next project