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.

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
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
Reuse your Kanban
Start from the board and moveCard logic you already built.
- 2
Normalise the data
Separate lookups for boards, lists, cards and users.
- 3
Card details
Modal with description, due date, labels and assignees.
- 4
Activity log
Record an entry for every create, move and edit.
- 5
Backend and members
Real database, auth and invites.
See it in code
Walk through the code
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
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
- 1Add task assignees, due dates and priority labels.
- 2Implement an activity log/history for each task.
- 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.