
A secure, multi-role property management platform for strata reserve planning and depreciation reporting.
Role: Project Manager, Full Stack Developer & UI/UX Designer. Responsible for project planning, user research, interface design, prototyping, and full stack development across frontend, backend, and database layers.
The Strata Reserve Planning (SRP) Depreciation Portal was developed as a comprehensive platform for a property management company specializing in strata reserve fund planning and depreciation reporting across British Columbia. The company required a centralized tool to manage inspections, appointments, surveys, and client documentation, replacing fragmented manual processes with a streamlined digital workflow.
The platform serves four distinct user roles: Admin, Client, Inspector, and Assistant, each with tailored dashboards, permissions, and workflows. The system was designed from the ground up as a secure, internal business tool rather than a public-facing application, reflecting the sensitive nature of the client documents and financial data managed within it.
Building the SRP Depreciation Portal presented several interconnected challenges that required careful planning and iterative problem-solving:
User research began with the creation of detailed personas representing the primary users of the platform. These personas captured user demographics, engagement levels, daily routines, and the specific value the application would provide to each user type.
Detailed user flow diagrams were created for each of the four roles, mapping every interaction from login through to task completion. These flows informed the navigation structure, permission boundaries, and feature priorities for each role.
Agile project management was adopted using Jira to organize sprints, track progress, and manage the product backlog. Weekly sponsor meetings were held each Friday, followed by a team meeting to assign the upcoming week's tasks and a sprint review to discuss what was completed and what could be improved. Team members took turns pushing code and tasks were assigned to play to individual strengths, whether that was tackling work immediately, deep research, or refining UI details, maximizing overall output.
Clear naming conventions and a well-defined project structure were established early in development to ensure consistency across the three-repository architecture. These conventions governed everything from git branch naming to database column formats.
Each team member worked on their own branch, then merged into dev via pull request. Code reviews were required for every push to catch bugs before they reached the shared codebase. No inline interfaces or styles were permitted, and reusable helper functions were used wherever possible to keep the code clean and maintainable.
| Type | Convention | Example |
|---|---|---|
| React Components | PascalCase | BookingCalendar.tsx |
| Hook Files | camelCase with use prefix | useAppointments.ts |
| Type Files | kebab-case .types.ts | appointment.types.ts |
| SCSS Partials | Underscore prefix | _colors.scss |
| CSS Classes | kebab-case | form-field, btn-primary |
| Assets | kebab-case | srp-logo.png |
| Type | Convention | Example |
|---|---|---|
| Controllers | camelCase + Controller suffix | appointmentController.ts |
| Services | camelCase + Service suffix | appointmentService.ts |
| Routes | camelCase + Routes suffix | adminRoutes.ts |
| Type Files | kebab-case .types.ts | appointment.types.ts |
| Type | Convention | Example |
|---|---|---|
| DB Tables | snake_case | appointment_request |
| DB Columns | snake_case | created_at, profile_id |
| Prisma Models | PascalCase | AppointmentRequest |
| Boolean Columns | is_* / has_* / must_* | is_admin, is_required |
| Input Types | Entity + Create/Update + Input | CreateStrataInput |
The project consists of three sub-repositories, each responsible for a distinct layer of the application.
frontend/src/
├── admin/ # Admin-specific features
│ ├── components/ # Admin-only UI components
│ ├── pages/ # Admin-only pages
│ ├── routes/ # adminRoutes.tsx
│ └── styles/ # Admin SCSS (components/, pages/)
├── client/ # Client-specific features
│ ├── components/ # Client-only UI components
│ ├── pages/ # Client-only pages
│ ├── routes/ # clientRoutes.tsx
│ └── styles/ # Client SCSS (components/, pages/)
└── shared/ # Shared across admin & client
├── assets/ # Images, icons, static assets
├── components/ # Reusable UI components
├── contexts/ # React contexts (AuthContext)
├── hooks/ # Custom React hooks
├── lib/ # apiClient, supabaseClient
├── pages/ # Shared pages (Login, SetPassword)
├── routes/ # ProtectedRoute, DashboardRouter
├── styles/ # Global SCSS (base/, variables/, utilities/)
├── types/ # ALL TypeScript type definitions
└── utils/ # Date formatting, strata plan formatting, recurring patternsfrontend/src/
├── admin/
│ # Admin features
│ ├── components/
│ ├── pages/
│ ├── routes/
│ └── styles/
├── client/
│ # Client features
│ ├── components/
│ ├── pages/
│ ├── routes/
│ └── styles/
└── shared/
# Shared code
├── assets/
├── components/
├── contexts/
├── hooks/
├── lib/
├── pages/
├── routes/
├── styles/
├── types/
└── utils/backend/src/
├── admin/ # Admin-specific features
│ ├── controllers/ # Admin HTTP handlers
│ └── routes/ # Admin route definitions
├── client/ # Client-specific features
│ ├── controllers/ # Client HTTP handlers
│ └── routes/ # Client route definitions
└── shared/ # Shared across admin & client
├── config/ # Static mappings and configuration
├── constants/ # Validation rules, Prisma includes
├── controllers/ # Shared controllers (auth, lookup)
├── helpers/ # responseHelper, dateUtils, etc.
├── lib/ # prismaClient, supabaseClient, emailService
├── middleware/ # auth.ts, adminMiddleware
├── routes/ # Shared routes (lookup, auth)
├── services/ # Business logic & all DB access
└── types/ # ALL TypeScript type definitionsbackend/src/
├── admin/
│ # Admin features
│ ├── controllers/
│ └── routes/
├── client/
│ # Client features
│ ├── controllers/
│ └── routes/
└── shared/
# Shared code
├── config/
├── constants/
├── controllers/
├── helpers/
├── lib/
├── middleware/
├── routes/
├── services/
└── types/supabase/functions/ ├── _shared/ # Shared utilities (cors, supabase, dropbox) ├── upload-document/ # Document upload handler ├── delete-document/ # Document deletion handler ├── preview-document/ # Document preview handler ├── download-fn-documents/ # Bulk document download ├── sync-documents/ # Document sync handler └── archive-fn-documents/ # Document archival handler
supabase/functions/ ├── _shared/ ├── upload-document/ ├── delete-document/ ├── preview-document/ ├── download-fn-documents/ ├── sync-documents/ └── archive-fn-documents/
Figma prototypes were created for both the Admin and Client platforms, serving as the initial design reference for development. These prototypes were then iterated on in the live application through weekly client meetings, allowing real-time feedback to shape the final user experience.
The platform was built as a three-tier architecture spanning three separate repositories: a React/TypeScript/Vite frontend, a Hono/Prisma backend API, and Supabase Edge Functions (Deno) for serverless document handling.
A deliberate strategy was employed for the development sequence. The Admin and Client platforms were designed and built first, as these two roles encompassed the full feature set of the application. This approach allowed for comprehensive user testing and bug resolution on the most complex interfaces before proceeding further.
The Inspector and Assistant platforms were then developed after the core platforms had been stabilized through testing. These roles are essentially filtered versions of the Admin platform, sharing the same underlying architecture but with restricted access and streamlined interfaces tailored to their specific workflows.
Weekly client meetings drove continuous iteration on the UI, with several key improvements emerging from real-world usage and feedback:
Before expanding the platform to include the Inspector and Assistant roles, in-person testing was conducted with the sponsor using the completed Admin and Client platforms. This hands-on testing session validated core workflows, uncovered usability issues, and confirmed that the foundational features were stable enough to build upon.
The testing sessions produced a structured bug fix plan of over 80 items, prioritized into five phases by complexity and dependency. Each phase was executed in order, with fixes verified before moving on.
A second round of testing after the initial fixes uncovered additional edge cases, particularly around appointment lifecycle management (cancellation and rebooking flows), notification visibility across multiple users on the same strata, survey finalization logic for users with restricted property type access, and document resubmission status tracking. These were triaged and addressed in subsequent sprints.
To support the sponsor in adopting the platform, documentation was created in both video and PDF formats. These guides walked through key workflows and features, providing a practical reference for day-to-day use of the system.
Given the sensitive nature of client documents and financial data handled by the platform, security was a foundational design principle rather than an afterthought.
The completed Strata Reserve Planning Depreciation Portal delivers a unified, role-based platform that replaces fragmented manual processes with streamlined digital workflows. Key outcomes include: