Building a session & task tracking platform for an Opposition Leader's office
A from-scratch parliamentary session and task-tracking platform built for the office of Sri Lanka's Leader of the Opposition — RBAC, real parliamentary procedure types, government/opposition time-allocation tracking, and reporting, grown from an internal prototype into a system office staff now use daily, with a move toward official adoption in progress.
Freelance Full-Stack Engineer — sole developer, architecture through ongoing feature development
Jun 2025–present · prototype to daily internal use, moving toward official adoption
Before this platform, tracking what happened in a parliamentary session — which debates, which questions, who spoke, how much time each side used — lived in memory and manual notes, not in any shared system. A product owner from the office defined requirements from real day-to-day workflow; the build itself was solo, working directly from that domain knowledge rather than an existing system to migrate from.
The challengeParliamentary session tracking isn't a generic to-do list. A session can be a debate, a questions session, an adjournment motion, or several other procedurally distinct formats, each with its own rules around time and order. Time itself is politically meaningful — the opposition's speaking time in a session is allocated and tracked separately from the government's, and getting that wrong isn't just a bug. On top of that, the system needed real role-based access for planners, reviewers, and secretaries, an audit trail, and enough reliability that an internal prototype could grow into something staff actually rely on every day rather than reverting to notes.
Approach
Modeled data around real parliamentary procedure instead of generic tasks — eight distinct session/task types (debates, questions, adjournment motions, and more), with opposition time allocation as a first-class field validated against the session total, not derived after the fact.
Built full RBAC on AWS Amplify Gen 2: Cognito-backed invite-only auth (no self-registration), a Role/RoleAssignment schema supporting multiple roles per user, and a dynamic entitlements system so permissions adjust without a code change as the office's structure evolves.
Tracked attendance and time per MP per side (government/opposition), not just per session, so reporting reflects actual time used against what was allocated.
Built export tooling matching how the office actually needs data out — Word (.docx) exports with correct table formatting, and print-optimized layouts for session plans and task detail sheets.
Iterated from prototype toward daily-use software: search/sort/filtering across every table, configurable per-user column visibility, and structured logging and test coverage as the system moved from proof-of-concept toward something trusted for daily use.
What shipped
Session and task management covering real parliamentary procedure types, with speaker-order tracking and time allocation split by government/opposition side.
Full RBAC: Cognito invite-only auth, custom roles with a dynamic entitlements system, and per-role UI and data access control.
Attendance tracking per MP per session, including simple click-based hourly tracking.
Word (.docx) and print exports for session plans and task details, formatted for real office use.
Search, sort, and filterable tables with configurable, persisted column visibility across every major screen.
Scale of ownership
Since 2025, daily
In continuous use112
Commits (solo)~20,400
Lines of TypeScript8
Parliamentary procedure types modeledMoving toward official adoption
StatusA generic task tracker would have missed what actually matters here: time allocated to the opposition during a session is real parliamentary currency, not an implementation detail — which is why it's modeled as its own validated field rather than derived after the fact. The path from prototype to daily-use software to (in progress) official status is also the right order for something built inside a government-adjacent office: earn trust with boring reliability before asking for the label.
Have a codebase or product with similar problems?
Tell me what you're working on and where you're stuck. I'll determine whether I can help.
Discuss a Project