| Date | Method | Note | Amount |
|---|---|---|---|
| 02 Oct | Bank transfer | 2nd tranche | 2,500,000 |
| 18 Sep | Cheque | Cleared | 3,000,000 |
| 01 Sep | Cash | Office cash | 1,000,000 |
| 20 Aug | Bank transfer | — | 4,000,000 |
Recreated with demo data. The real screens stay private; a walkthrough is available on request.
Multi-town Real Estate ERP
One system for a developer running about 13 towns
- In progress
- Paid client work
- Sole developer
The problem
Each town has its own landowners, plots, payments and expenses. The office needed one system where every town's records stay separate, while the owner can still see everything combined.
My role
I'm the only developer, from database design to the screens. I'm also a partner in the business: the owner brings in clients and I do all the software work.
Working today
- Town-scoped views: open a town and see only its acquisitions and totals
- Landowner ledgers showing what was agreed, what's paid and what's still owed
- Land acquisitions with a draft and approval step
- Payment recording by cash, cheque or bank transfer, with a note on every entry
- Daily payments report filtered by date range and method
Architecture
- Browser · React + Vite + TypeScriptTown-scoped screens, forms with notes, filters
- API · Express + Node.js + TypeScriptLogin, validation, business rules, money totals
- PostgreSQL 15 in Docker · KnexDecimal money, transactions, forward-only migrations
Decisions & trade-offs
WhyPosted money records stay as they are, so every change can be traced.
CostFixing a mistake means posting a reversing entry instead of a quick edit.
WhyTotals come from the database, so every screen shows the same number.
CostEach new screen needs its own API work.
WhyThe live database is never reset or rolled back.
CostA schema mistake is fixed with a new migration, not by editing an old one.
WhyAccounting rules are written down first. A security cheque isn't income, and moving cash between registers isn't an expense.
CostSlower start, fewer surprises later.
Next
Owner-managed roles and permissions, sold plots, resale and transfers, commissions, reports and backups. Each phase is tested and reviewed on screen before the next one starts.
- React
- TypeScript
- Vite
- Node.js
- Express
- Knex
- PostgreSQL
- Docker