TaskForge.
Real-time kanban where presence is a first-class citizen.
#tl;dr
TaskForge is a real-time collaborative kanban board — Trello meets Notion with multiplayer baked in. Customizable boards and columns, drag-and-drop cards, threaded comments, Google OAuth, all of it syncing live across every connected client.
- What: real-time kanban with cursors, presence, and threaded comments
- Hard part: drag-and-drop that stays consistent across N clients without conflict
- Why it matters: proves I can ship multiplayer state without writing my own sync layer
#the problem
Most kanban tools fall into one of two camps. Either they feel slow and bureaucratic (Jira), or they quietly fall apart the second more than one person opens the same board. Trello tries — it polls for updates and shows other people's changes eventually. "Eventually" is not the same as "now."
I wanted presence to be a first-class citizen. You see other cursors moving. You see cards being dragged. Comments land in real time. And the board still has the structure of a proper tracker you can actually run a sprint on.
#architecture
Frontend is a normal Next.js app. The real-time layer is a single Liveblocks room per board — every connected client subscribes to the same shared state. Mutations broadcast to all peers; persistence to Mongo happens out-of-band so the source of truth doesn't block UI updates.
#key decisions
Liveblocksvs.raw WebSockets + ShareDB
Building my own CRDT layer for a portfolio project is yak-shaving. Liveblocks gives me presence (cursors, avatars), shared storage, and conflict-free updates out of the box. I write zero websocket code.
MongoDBvs.Postgres + Prisma
Boards are nested document trees — board > columns > cards > comments. Mongo's
document model maps to this naturally. SQL would mean either 4 joins per fetch
or jamming JSON into a jsonb column.
NextAuth + Googlevs.Clerk / Auth0
One provider, zero per-MAU cost, ships with the Next.js conventions I'm already using. Adding email/password later is a flag flip.
drag-and-drop wired to Liveblocks state
Dragging a card locally updates the Liveblocks document. Every other client sees the move before the server has even acknowledged. Optimism is the default; conflicts are rare because Liveblocks orders mutations server-side.
#walkthrough




#the stack
- frontend: Next.js, React, TypeScript, Tailwind, shadcn/ui
- realtime: Liveblocks (rooms, presence, shared storage)
- auth: NextAuth.js with Google OAuth
- data: MongoDB Atlas for persistent board state
- deploy: Vercel
#what's next
- AI task elaboration — paste a vague ticket, get acceptance criteria in progress
- @-mentions + notifications
- swimlanes / WIP limits per column
- export board to markdown