Capstone 12 · Full-Stack

The Commons

Mutual aid networks run on spreadsheets, group chats and memory, and they lose things constantly. Build the tool properly. People post offers and requests. Others claim them. Both sides need to know what happened. That much is a CRUD application and you can already build it. What makes this a capstone is that it is built for strangers, which is a different problem. Anything anybody can post, somebody will abuse. So it needs moderation: reporting, a queue somebody works through, and the ability to remove content and restrict an account. It needs roles, because a coordinator can do things a member cannot. It needs to handle personal safety: an approximate location rather than an exact address until a claim is accepted, and a way to contact somebody without publishing their phone number. And it needs to work for the people most likely to need it, which means a slow phone on bad data, and a screen reader.

Concepts used

Full stack architectureRoles and permissionsModerationNotificationsPrivacy by designAccessibilityDeploymentTesting

Your dataset

Seeded neighborhoods, categories and a realistic volume of posts.

Milestones

1Model offers, requests, claims and their states, and write down what each state means.
2Build posting and claiming, with the state transitions enforced server-side.
3Add roles: member, coordinator, moderator, with permissions filtered in the query.
4Add reporting and a moderation queue, including removal and account restriction.
5Design for safety: approximate location until a claim is accepted, and contact without exposing details.
6Add notifications for the things people actually need to know, and nothing else.
7Test the abuse paths as an attacker: claim someone else's item, edit another's post, escalate your own role.
8Deploy, then use it on a phone on mobile data and fix what that finds.

Your workspace

Build the full project here. Work through the milestones in order, in both languages.

SANKOFA SANDBOX
loading editor…
Your turn → Build it in Python first, then rebuild it in JavaScript. The logic transfers, only the syntax changes.
← All projectsNext: Cue →