TSTier SlateAll templates

Collaboration

Kanban board - ordering cards without renumbering them

How cards are reordered with fractional ranks instead of renumbering, and how live updates reach every viewer.

  • System design
  • core
  • 8 step walkthrough
  • 5 tables

Share

  • Facebook
  • X

What this board gets wrong on purpose

The tension

Every write to a board takes the same row lock to get its next sequence number, so a board is a single-writer queue - comfortable for twenty people dragging cards, and the ceiling for an automation that bulk-moves 5,000 cards at a few hundred a second while every human on the board waits behind it. A hot insertion point (new cards always added to the top) grows the rank key by roughly one character every six inserts, until the rebalance job rewrites the whole column and broadcasts 2,000 moves to every open tab at once. And a client that was offline replays its moves against neighbours that have since moved, so its card lands in a place that nobody chose.

Practise this as an interview

Take Kanban board - ordering cards without renumbering them as a timed system design interview on a blank board - on your own, with the requirements to check yourself against, or with a candidate you invite.

Practise this as an interview

Start here

Why this design

A kanban board is a list that many people reorder at the same time while watching each other do it. That makes two questions that every task tool - Trello, Jira, Linear, Asana, GitHub Projects - has had to answer: how do you store the order of cards so that moving one does not rewrite the others, and how do twenty open tabs stay in agreement without a refresh. Interviewers like it because it looks like CRUD and is really an ordering problem plus a fan-out problem, and the naive answer to each (an integer position, broadcast everything) fails in a way you can calculate.

What you will learn

  • Why an integer position column turns one drag into a renumbering of the whole column, and how a fractional rank string makes a move one row.
  • How "key between a and b" works in base 62, why keys grow about one character per six inserts into the same gap, and when to rebalance.
  • Why the rank column must use a byte-order ("C") collation, or "a0V" and "a0v" sort differently in production than in tests.
  • A per-board sequence number written in the same transaction as the change, so clients can detect and repair a missed event.
  • Optimistic moves on the client, rebased when the server's version of events arrives.
  • WebSocket fan-out through a pub/sub channel per board, and what one move costs on a board 500 people have open.

How to read this board

  1. Press Play. CLIENT on the left, the WRITE in the middle, then the FAN-OUT along the bottom.
  2. 1 · Requirements and 2 · Capacity - why moves are cheap and fan-out is not.
  3. 3 · Storage - cards, ranks and the event log.
  4. 4 · Availability - reconnects, missed events and a gateway node dying with 40,000 sockets.
  5. 5 · How it works, 6 · Deployment plan, then the DATA MODEL.

1 · Requirements

Ask these before drawing anything

  • How large does a board get? A team board has 200 cards; an imported backlog has 20,000. Ordering and rendering choices change at the second number.
  • How many people have one board open at once? Usually 1 to 20; an all-hands planning board can be 500.
  • Must order be the same for everyone at every instant, or is "converges within a second" acceptable? It is always the second.
  • Is offline editing in scope? It changes conflict handling from "last writer wins with a fresh view" to genuine merging.
  • Are there automations or integrations that move cards in bulk?

Functional

  • Create, edit, move cards within and between columns; reorder columns.
  • A move is shown immediately to the person making it and to every other viewer within 1 second.
  • Two people moving cards at the same time both see the same final order.
  • A client that disconnects and reconnects catches up without reloading the board.

Non-functional

  • Move latency as felt by the mover: 0 ms (optimistic). Server acknowledgement p99 under 150 ms.
  • Fan-out p99 under 500 ms from commit to every connected viewer.
  • A move writes O(1) rows regardless of column length.
  • No lost moves: every committed change is recoverable by sequence number for 30 days.

The rest of this board

Board preview

Available on Tier Slate

This page publishes the question. The answer — 5 more written pages, an 8-step narrated walkthrough and a 5-table schema — is the board itself, and it opens in Tierslate.

  • 5written pages
  • 8walkthrough steps
  • 5tables28 columns

5 pages behind this one

  • Capacity estimation
  • Storage estimation
  • Availability
  • How it works
  • Deployment plan
Open this board in TierslateBrowse every board

More boards

Several people editing one thing without losing an edit.

  • Calendar scheduling - a time that suits five people
  • Code review - the comment is on a line that moved
  • Collaborative editor - two carets in one paragraph
  • Version control - the commit graph is a DAG
  • Whiteboard sync - the cursors cost more than the drawing
  • File sync - every laptop is a replica
  • Multiplayer game server - the server decides what happened
All 100 templatesOpen Tierslate
Tierslate

tierslate.com

HomeTemplatesPrivacyTerms