Project Planner

Project Planner

A multi-project task tracker for a small team that wanted Linear workflow without Linear price — Kanban, filterable grid, and per-project dashboards over one dataset.

Role
Lead developer
Year
2026
Stack
Next.js · TypeScript · Tailwind
Project Planner interface

Project Planner came out of wanting Linear workflow without paying for it, and out of the observation that triage and execution want different interfaces. The same tasks appear in a filterable table for sorting through the backlog and a drag-and-drop Kanban board for actually moving work along.

It runs on Next.js 14 with Prisma over PostgreSQL. Projects, priorities, statuses and categories are all user-defined rows rather than hardcoded enums, so the Kanban columns are literally whatever statuses you configured in settings. Auth is username plus a PIN, bcrypt-hashed and signed into a 7-day HS256 JWT stored in an httpOnly cookie and verified in edge middleware. No email flows, no password resets. Tasks soft-delete, so there is a real trash view with restore.

Every mutation is optimistic and hand-rolled rather than delegated to a mutation helper. Each handler snapshots the affected caches, writes the expected result immediately, and restores the snapshot if the request fails. Dragging a card across the board moves it with no spinner and no flicker, which took several rounds of reference-equality fixes to a custom memo comparator on the column component to keep smooth.

Engineering notes

Optimistic updates with manual rollback

Each handler snapshots the query cache, applies the change, and replays the snapshot on failure. Doing it by hand meant a single move could patch several cache keys at once and roll all of them back together.

Taxonomies as data, not enums

Statuses, priorities and categories are per-user database rows with a rank column. The board renders whatever the user configured, so nobody is stuck with a hardcoded todo / doing / done.

AI prompts grounded in a project context document

Each project can hold a context document describing its real stack and file layout. Tasks are turned into coding-agent prompts by Gemini 2.5 Flash, with a system prompt that forbids referencing any identifier not present in that context, because ungrounded prompts kept inventing file names.

Built with

Next.jsTypeScriptTailwindPrismaPostgreSQLTanStack QueryGemini AIRadixZod