Stop 22 · Build Portfolio ProjectsProjects · 13/15

Project Management Tool (Trello Clone)

Part of the Frontend Developer Roadmap

In short

This is the Kanban board grown up: many boards, team members, deadlines and an activity log. It shows you can keep a big, connected chunk of state organised as an app grows.

A fuller project-management app — boards, tasks, assignees, deadlines and activity history — a step up in complexity from the earlier Kanban Board project.

The jaadu with a clipboard organises a college fest as small teams carry lights and bunting.

Think of it like this

Organising the college fest

Many teams (boards), each with tasks, owners and deadlines. The convenor wants to see who moved what and when. Without a clear system, the fest falls apart. Your tool is that system.

Watch it happen

One move, logged and shared

Aman
Store
Activity log
Teammates

move c1 → Done

1/5Aman drags Posters to Done. The store updates c1's listId and both lists' cardIds.

The big ideas

What you need to know

Normalised state

Boards, lists and cards stored by id, not deeply nested. Shows you can design data that scales.

Members and permissions

Invite people, assign cards, limit who can edit. Proves you think about multi-user apps.

Activity log

'Aman moved Posters to Done, 2 min ago.' Shows auditability, which real teams need.

Search and filters

By member, label or due date across a whole board.

How it works

Build plan

  1. 1

    Reuse your Kanban

    Start from the board and moveCard logic you already built.

  2. 2

    Normalise the data

    Separate lookups for boards, lists, cards and users.

  3. 3

    Card details

    Modal with description, due date, labels and assignees.

  4. 4

    Activity log

    Record an entry for every create, move and edit.

  5. 5

    Backend and members

    Real database, auth and invites.

See it in code

Walk through the code

js
1// Normalised: each thing stored once, linked by id2const state = {3  cards: { c1: { id: "c1", title: "Posters", listId: "l1", assignees: ["u1"] } },4  lists: { l1: { id: "l1", title: "To do", cardIds: ["c1"] } },5  users: { u1: { id: "u1", name: "Aman" } },6  activity: [],7};8 9function logActivity(state, userId, text) {10  const entry = { id: crypto.randomUUID(), userId, text, at: Date.now() };11  return { ...state, activity: [entry, ...state.activity] };12}

1/4Cards, lists and users each live once, in a lookup by id.

Renaming Aman means changing one place, users.u1, instead of every card he's on. Activity entries are added to the front, so the newest shows first.

Save yourself the pain

Common mistakes

Oops

Nesting cards inside lists inside boards inside users.

Do this instead

Store each entity once in a lookup by id, and link with ids. Updates become one-line changes.

Oops

Copying Trello's whole feature list before shipping anything.

Do this instead

Pick 5 core features, finish them well, and list 'next steps' in your README.

Your mission

Milestone 1: boards and a log

~45 min

Quick check

A user's name appears on 200 cards. In a normalised store, how many places do you update when they change their name?

Go deeper

  1. 1Add task assignees, due dates and priority labels.
  2. 2Implement an activity log/history for each task.
  3. 3Support multiple boards/projects, not just a single board.

More projects at this stop

Stuck on this topic? Ask an Insider

Get 1:1 guidance from people who've walked this exact path — on the InsideEdge app.

Download
InsideEdge