Skip to content
Greta.Agency
Case Studies

How to Build a Kanban Board Like Jira (Without the Bloat)

Jira's Kanban board is powerful and painfully over-engineered. Here's how to build the core experience — drag-and-drop columns, real-time updates, swimlanes — in a week.

MichaelApril 7, 20264 min read

Feature Overview

A Kanban board at its core is three things: a visual representation of work items, the ability to move items between states (columns), and real-time synchronization when multiple people use it simultaneously.

Jira's version adds 40 more things on top of this. Most of them exist for enterprise compliance, not user value. The core Kanban experience is achievable in 5–7 days.

Tech Approach

Data model:

Board {
  id, name, team_id, created_at
}

Column {
  id, board_id, title, position, color, wip_limit?
}

Card {
  id, column_id, board_id, title, description,
  position, assignee_id?, due_date?, priority?, labels?
}

The position field on both Column and Card is a float. When you drag a card between two cards with positions 1.0 and 2.0, the new card gets position 1.5. This avoids rewriting all positions on every drag — only the moved card updates.

Drag and drop:

Use dnd-kit (not react-beautiful-dnd — it's unmaintained). dnd-kit is modular, accessible, and supports both vertical and horizontal drag contexts simultaneously, which you need for a multi-column board.

The drag state lives in component state during the drag, and commits to the database onDragEnd. Never write to the database on every drag event — batch it to the drop.

function onDragEnd(event: DragEndEvent) {
  const { active, over } = event;
  if (!over) return;

  const newPosition = calculatePosition(over.id); // midpoint calc
  updateCard({ id: active.id, column_id: over.data.columnId, position: newPosition });
}

Real-time updates:

Supabase Realtime lets you subscribe to database changes and push them to all connected clients. When any user moves a card, all other users see it move within ~200ms.

supabase
  .channel('board-changes')
  .on('postgres_changes', {
    event: 'UPDATE',
    schema: 'public',
    table: 'cards',
    filter: `board_id=eq.${boardId}`
  }, (payload) => {
    updateCardInState(payload.new);
  })
  .subscribe();

This handles the multi-user synchronization without any custom WebSocket infrastructure.

Simplified Steps

Day 1: Data + auth

  • Set up Supabase project with the schema above
  • Add Row Level Security policies (users can only see boards they're members of)
  • Build the Next.js API routes for CRUD operations

Day 2: Board UI

  • Render columns and cards from the database
  • Build the column header with card count
  • Build the card component (title, assignee avatar, priority badge, due date)

Day 3: Drag and drop

  • Install and configure dnd-kit
  • Implement card drag between columns
  • Implement card reorder within a column
  • Calculate new positions on drop and update database

Day 4: Real-time

  • Wire up Supabase Realtime subscriptions
  • Handle optimistic updates (update local state immediately, reconcile with server on conflict)
  • Test with two browser windows simultaneously

Day 5: Card detail

  • Build the card detail modal/sidebar (description, comments, assignee, due date, labels)
  • Add keyboard shortcut to open card detail (Enter key when card is focused)

Day 6–7: Polish

  • WIP limits (visual warning when a column exceeds its limit)
  • Column collapsing
  • Board-level search and filtering
  • Drag handle accessibility (keyboard drag support via dnd-kit)

Stack Suggestions

| Use case | Stack | |---|---| | MVP (1 week) | Next.js + Supabase + dnd-kit + Tailwind | | Teams product | Next.js + Supabase + dnd-kit + Clerk auth | | Enterprise | Next.js + PostgreSQL + custom WebSockets + role-based permissions | | Embedded in existing app | React component library + your existing backend + dnd-kit |

What Jira Does That You Probably Don't Need

  • Sprint planning and velocity charts (only needed for Scrum methodology)
  • Custom workflow transitions with rules and automation (add this in v2)
  • Advanced roadmaps and dependency tracking (add this when customers ask)
  • Issue linking and subtasks (add when the team grows past 10 people)

Build the core first. Every team that's ever used Jira has wished it was simpler. That's your product opportunity.

Estimated Complexity

  • MVP Kanban (drag + drop + real-time): 5–7 days
  • With assignments, due dates, comments: 10–14 days
  • With sprint planning, automation rules: 4–6 weeks
M

Written by

Michael

Lead Engineer, Greta Agency

Michael has built project management tools, kanban systems, and workflow automation for 20+ clients.