OPAL gives MuniBilling's operations staff a single admin console for work the legacy billing platform's own screens didn't cover well. It brings company management, data migration and third-party integrations into one UI that sits in front of several backend services.
I created OPAL in January 2025 and led its design and development, writing most of the code.
What it does:
- Company management — bills, customers, parcels, custom properties, RUBS (ratio utility billing) templates and settings for each client company
- Company import and export — a step-by-step migration wizard for accounts, account types, customers, parcels, bills, payments and users, with a spreadsheet-style tool to validate and correct data before it lands, plus import and export status tracking
- Property-management integrations — configuration, entity views and on-demand syncs for Yardi, Rent Manager, Fortress and Propexo
- Utility-data integration — Nectar connections and usage-data views
- Operations — job and per-partner sync logs, plus health checks with Microsoft Teams alerting
Architecture:
- Multiple backends, one UI — the app calls MuniBilling's .NET backend APIs directly and proxies partner APIs (Fortress, Propexo, Nectar) through server-side routes
- Shared single sign-on — one login across MuniBilling's tools, with role-gated admin routes
- Background processing — a .NET 8 job runner and a Pub/Sub-triggered Cloud Function for integration events
- Delivery — Docker images built by CircleCI and deployed to Google Kubernetes Engine
Technologies used:
- Next.js 14, React 18, TypeScript, Redux Toolkit
- Material UI with MUI X Data Grid Pro, Syncfusion Spreadsheet
- .NET 8 / C#, Google Cloud Functions, Google Cloud Pub/Sub
- Docker, CircleCI, Google Kubernetes Engine
