LMIS
Legislative Management & Information System
Legislative portal and role-based CMS, across three surfaces
- Web
- In production
A Legislative Management Information System: a public portal for ordinances, council sessions and transparency records, an admin CMS with role-based access, and a separate staff intranet — three surfaces over one Supabase project. Migrated off Vercel onto Cloudflare Workers mid-life.
Recorded on the live system — the public portal and the staff application. Staff contact details are masked.
What it is
One system, three front doors. The public gets a portal for ordinances, council sessions and transparency records. The staff who publish get an admin CMS with role-based access. Everyone inside the office gets an intranet on its own hostname. Same data, three deployments, three very different definitions of "usable."
Before
Ordinances, resolutions and council session records lived in paper files at the office. A resident who needed one asked in person, and staff searched the files.
Constraints
- Connectivity. It had to work on slow rural mobile connections. A portal designed for city bandwidth would fail exactly the people it is for.
What I built
Three separately deployed Next.js applications over one shared Supabase project. Splitting the deployments rather than gating routes inside one app means the public surface stays small and fast, and a change to the admin tooling cannot take the resident-facing site down. Each surface can be cached and rolled back on its own.
- The public portal. Ordinances and resolutions, council sessions and minutes, a document repository, a transparency portal, a records archive and a feedback channel.
- The admin CMS. Role-based access for the people who publish — superadmin, admin, editor and uploader.
- The staff intranet. An internal surface on its own hostname.
The migration
Originally deployed on Vercel, later moved to Cloudflare Workers.
After launch
I maintain it: fixes, updates and new features across all three surfaces.