August 2026
Work Planner
A collaborative kanban board, JIRA-board style: multiple boards per user, keyboard-operable drag and drop, due dates, and OAuth-only sign-in.

- Role
- Solo build — frontend, backend, infrastructure
- Stack
- Next.js, TypeScript, Tailwind, Postgres, Drizzle, Auth.js, Vercel, Docker
What it brings
- Boards, columns and cards backed by a real Postgres schema — well past the health-route scaffold the README still describes.
- Keyboard-operable drag and drop between columns, built on dnd-kit.
- The root is a public demo board — the real app, seeded per visit and saving nothing, so there is something to poke at without an account. OAuth (Google and GitHub) gates the boards that persist.
- 291 tests across the stack: 211 unit and component, 80 Playwright end-to-end.
Technical design
triggerPusher channelpresigned PUT/GET
Client
Next.js 16 App Router
dnd-kit board
pusher-js subscriber
Server
Server Actions
lib/actions — the whole write surface.
Auth.js
proxy.ts
Sends unauthenticated /boards/* to sign-in.
Data
Postgres (Neon)
Drizzle ORM
cards.rank
External
Pusher
S3
Reached over presigned URLs.
Server Actions
Drizzle
- Writes go through Server Actions, not route handlers. app/api holds only auth, Pusher auth, attachment redirects and health; everything else lives in lib/actions next to its tests.
- Cards carry fractional ranks. Dragging a card writes one row instead of renumbering the column it landed in.
- Attachments go straight to S3 over presigned URLs. File bytes never pass through the app, which keeps uploads clear of the function's request limits.