
Cathy CCRMS — Condo Rental Management PWA
An offline-first rental engine built for one person — my mother — to run twenty condo units from her phone, signal or no signal.
Client
Private — One Spatial Iloilo (20 units)
Year
2025
Role
Sole Developer
Why It Exists
My mother is a real estate agent. Somewhere along the way she also became a landlord — managing twenty condo and parking units at One Spatial Iloilo, a residential development in Mandurriao, for the owners who trusted her to keep them rented and paid. The problem was that all of it lived in her head, a notebook, and a few messy spreadsheet tabs. Who paid this month. Who paid half. Whose deposit was ₱15,000 and whose was ₱20,000. Which contract ended in March and which one quietly lapsed two weeks ago without anyone noticing. She's out showing units most of the day, often inside the building where the signal drops to nothing. The tools she had assumed she was sitting at a desk with good internet — she rarely was. So things slipped. A renter would insist they'd already paid, and she had no clean record to check against. A deposit refund would get miscalculated. The stress of holding twenty rental timelines in your memory is not a small thing, and I watched it wear on her. CCRMS exists so she never has to remember any of it again.
What I Built
I built CCRMS as an offline-first, mobile-first Progressive Web App — designed for one person, my mother, used one-handed on a phone while standing in a hallway. There was no team and no client meeting; the requirements came from watching how she actually worked and asking a lot of questions at the dinner table. The decision that shaped everything was making the device the source of truth, not the cloud. The app runs entirely on IndexedDB through Dexie.js, so it works at full speed whether or not there's a signal — internet is only ever used for backup, never for the app to function. The harder, more interesting work was the rental engine. I wrote a standalone algorithm specification before I wrote the code: deterministic money math where the same inputs always produce the same numbers. Payments always apply to the oldest unpaid period first, automatically. Security deposits are isolated from rent entirely — they never silently get consumed to cover a balance. Due periods are generated up front at contract creation so balances can't drift. Every rule had one north star: my mother must always be able to understand why a number is what it is.


The Hardest Part
The hardest part wasn't the offline layer — it was the money. Rental accounting looks simple until you actually model it. Partial payments, mid-contract extensions, daily versus monthly versus yearly rentals, deposits that get partly refunded and partly forfeited, periods that need to be waived without being marked paid. Each of these interacts with the others, and a single wrong assumption produces a balance that's quietly off by a few thousand pesos — the exact kind of error that erodes trust in software built for someone who already didn't fully trust software. So I stopped coding features and wrote the logic down as an authoritative spec first — end-date resolution, due-period generation, payment allocation, balance computation as a locked formula. That document became the referee: if the code and the spec ever disagreed, the spec won. Forcing myself to articulate every rule in plain language before implementing it caught contradictions I would never have found by just writing components. It taught me that for anything involving money, the specification is the hard part — the code is almost a formality after that.
What I'd Do Differently
I'd design the sync layer from day one instead of treating it as a Phase 2 problem. I made the right call keeping the MVP local-only and shippable, but because I deferred sync, I didn't model records with sync in mind early enough — UUIDs, timestamps, and conflict resolution are far cheaper to bake in at the schema stage than to retrofit. If my mother ever wants this on a second device or a tablet, the merge logic is the part I'd have to be most careful about, and I'd rather that foundation already existed.
The Impact
CCRMS is in daily use. My mother manages all twenty units through it now — rentals, parking, payments, deposits, due dates — and the notebook is gone. She can see what she's collected this month and who's overdue in a single glance, standing inside a building with no signal, and the number is one she trusts because the app can always show her how it got there. There's a particular weight to shipping software your own mother depends on. There's no support ticket queue between us — if it breaks, I hear about it at home, and if it works, I watch it quietly give her back time and peace of mind. That's the most honest user feedback I've ever had, and it made me a more careful developer.
“Every rule had one north star: my mother must always be able to understand why a number is what it is.”

Skills Demonstrated
- Offline-first PWA architecture with IndexedDB as the source of truth
- Deterministic financial logic designed from an authoritative specification
- Domain modelling of real-world rental lifecycles (payments, deposits, extensions)
- Auditable, human-override-first business rules for a non-technical user
- Mobile-first, one-handed UX for low-connectivity field use
Tools & Technologies