Collective Ledger
A shared ledger for community savings: monthly installments, late fees, investments and admin votes, open to every member.
- Type
- Independent product
- Year
- 2026
- Platform
- Web, responsive
- Stack
- Next.js · Express · MongoDB
- My role
- Design and full-stack development







01 — Context
Collective Ledger runs the money of small savings communities. Members pay a monthly installment, the server works out any late fee, and the admin records what is invested, so every figure is something any member can check.
Beyond payments it covers governance: join requests the admin approves or declines, an admin the members elect once the community grows past five, and an audit log of admin actions. The screens shown here use sample data.
02 — Problem
Community savings usually live in a spreadsheet and a group chat. Totals drift, late fees are argued about, and nobody can see what the admin did with the money.
03 — Role
This is my own product. I designed and built it end to end:
- Designed the interface and the brand, including the logo, a dark and light theme, and a layout that works at phone width.
- Built the Next.js (App Router) frontend with Zustand stores and a typed API client.
- Built the Express and MongoDB API: members, communities, installments, payments, investments, votes and audit logs.
- Implemented JWT sign-in with email one-time-code verification, and role checks on every admin action.
- Wrote the money rules on the server: whole-paise arithmetic and the per-day late fee.
- Set up search metadata, structured data, a sitemap and deployment on Vercel.
04 — System
How money moves through the product
The workflow as built: from setting up a community to a record any member can read.
- Register community
- Set first-month amount and growth range
- Invite or approve members
- Monthly installment
- Late fee after the 10th
- Admin confirms payment
- Ledger and totals
- Role checks
- Admin vote above five members
- Audit log
- CSV export
05 — Engineering
Money in whole paise
Every amount is stored and calculated as an integer number of paise, never as a floating-point rupee value, so totals cannot drift by a fraction and the member and the admin always see the same figure.
Late fees as a server rule
Installments are due by the 10th, and after that the server adds ₹20 for every day late. The rule lives in one place, so it applies to every member the same way.
Approval and election flows
Join requests wait up to three minutes for the admin, then the member confirms their email with a one-time code. Once a community has more than five members, the admin role goes to whoever wins the vote.
Everything scoped to a community
Each request carries the community it belongs to, and the API scopes reads and writes to it. An audit log records admin actions, and payments, investments and the log export as CSV.
06 — Experience
The design is deliberately quiet: a serif display face, one accent colour and tabular figures, so numbers line up and the page reads like a ledger. Dues and contributions stay readable on a phone as well as a desktop.
07 — Challenges
Keeping the member's number and the admin's number identical
Both screens read the same server-calculated amounts, including late fees, so there is no second formula to disagree with.
Transparency without overwhelming people
Non-technical members need to verify the numbers without learning accounting. The workflow stays linear: set up, pay, confirm, review.
08 — Outcome
A deployed, working product with dashboards, an admin console, voting, investments, audit logs and CSV export.
It has no published user numbers, and none are claimed here.
09 — Stack
- Frontend
- Next.js (App Router) · React · TypeScript · Tailwind CSS · Zustand · Framer Motion · Recharts
- Backend
- Node.js · Express · MongoDB · Mongoose
- Auth
- JWT · Email one-time code
- Delivery
- Vercel
10 — Reflection
Money has to be designed in from the first model. Choosing integer paise on day one removed a whole class of bugs.
Governance features earn trust when they are easy to verify, not when they are elaborate.