Building Maintenance App — Multi-Tenant SaaS
A full-stack SaaS platform for HOA and property management. Tenants submit repair requests, managers assign work orders, and staff closes them out — all with role-based access and per-tenant data isolation.
February 28, 2026
Overview
Managing maintenance across multiple buildings is messy — requests get lost in emails, work orders have no paper trail, and when a management company changes, the building's history walks out the door with them. I built this platform to fix that.
The core idea is that records belong to the building, not the management company. Operators come and go; the maintenance history stays.
How It Works
The flow is straightforward:
- A tenant submits an issue with a description and optional photos (up to 4, stored on S3)
- A manager reviews it and creates a work order, assigning it to a maintenance staff member
- Maintenance staff works the job and marks it complete
- The manager closes the issue, optionally leaving a closure note
Every action is scoped to a tenant context embedded in the JWT — a manager from one building cannot see another building's data at the database level.
Roles
| Role | Access |
|---|---|
TENANT | Submit and track their own issues |
MAINTENANCE | View assigned work orders, update status |
MANAGER | Full issue + work order management for their buildings |
ADMIN | User management, building configuration |
SUPER_ADMIN | Cross-operator visibility |
Key Features
- Issue lifecycle — create, assign, update status, link/unlink work orders, close with notes (warns if open WOs exist), hard delete with automatic WO nullification
- Work orders — standalone or linked to an issue; role-gated actions throughout
- Photo attachments — S3 presigned PUT/GET, up to 4 photos per issue, 1-hour expiry
- Operator Continuity view — portfolio-level view across all buildings with a per-building management timeline
- Server-side search — paginated results with 400ms debounce on issues and work orders
- Vite code splitting — per-page lazy chunks keep initial load lean
Stack
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, MUI v5, Redux Toolkit, React Query, Vite |
| Backend | Node.js, Express, TypeScript, Prisma v5 |
| Database | PostgreSQL 16 |
| Auth | JWT with tenant context |
| Storage | AWS S3 (presigned URLs) |
| Validation | Zod (shared schemas across frontend and backend) |
| DevOps | Docker Compose, GitHub Actions CI, PM2, Nginx |
Architecture
The project is a monorepo with four packages:
packages/backend— Express API on port 3002 (11 Prisma models, 9 enums)packages/web— React dashboard on port 3000packages/shared— TypeScript types and Zod schemas shared across bothpackages/mobile— React Native scaffold (future)
Status
The platform is live in production. All core flows are working — auth, issues, work orders, photo uploads, operator continuity, user management, and pagination. Currently working on full visual polish and production hardening (HTTPS, domain, monitoring).