Overview
We're moving the family across the country and we needed a real way to evaluate properties — something that handled rural listings (acreage, well, septic, road frontage), let multiple family members weigh in, ranked them by something more useful than gut feel, and gave me a one-page brief I could hand to a realtor. The spreadsheet version fell over fast.
This is the working version. 71 listings across rural North Carolina and rural New York, deployed on my homelab at homes.shottsserver.com, used weekly by family members for actual decisions.
What's Honest Here
The rendering layer and most of the Leaflet integration are AI-assisted. I'm not going to claim I hand-wrote every map popup or every CSS gradient.
What's mine — and what I'd defend if a realtor asked why this app instead of Zillow:
- The data model. Property → ratings → notes → tier → realtor brief. I designed the columns we actually compare on (acreage, road frontage, well/septic, hazard zone, monthly cost band).
- The 7-star + S/A/B/C/D tier rules. 7 stars beats 5 because it forces a non-symmetric distribution. The tier rules are explicit thresholds, not vibes — S = top 10%, D = below median, with hard cutoffs on dealbreakers (flood zone, no road access).
- The FHA monthly-cost calculator. 6.5% APR, 30-year fixed, 3.5% down, plus property tax, insurance, and PMI computed from the listing data. This is the single biggest reason we stopped staring at price tags — monthly cost is what we actually live with.
- The auto-generated realtor brief. One PDF page per property, generated on demand: photos, acreage map, monthly cost band, our notes, tier. I email these instead of forwarding 14 Zillow links.
- The "vanilla JS, no build step" architectural choice. Intentional, not lazy. Zero deploy friction. I edit a file, refresh the browser, push the container. No webpack cache to clear, no node_modules to rebuild. This is a tool I want to fix at 11pm on a Sunday, not a portfolio piece.
What It Does
- 71 property cards across rural NC and rural NY, with photos, acreage, well/septic, road frontage, hazard zone, and monthly cost breakdown
- 7-star family voting — every family member rates each property; per-property and aggregate views
- S/A/B/C/D tier system with explicit rules, not vibes (top decile / quartiles, dealbreakers as hard cutoffs)
- FHA monthly-cost calculator — 6.5% / 30yr / 3.5% down + tax + insurance + PMI, recomputes per property
- Leaflet + OpenStreetMap — see geographic clusters, distance to nearest town, distance between candidates
- Auto-generated realtor brief — one-page PDF per property for handoff
- Notes per property with author attribution
- Graveyard — soft-delete listings that go off-market, restorable
Tech Stack
| Layer | Tech |
|---|---|
| Backend | Node.js, Express |
| Database | SQLite via sql.js (pure WASM, no native binary) |
| Frontend | Vanilla JavaScript, vanilla CSS, no framework, no build step |
| Maps | Leaflet + OpenStreetMap |
| Deployment | Docker on my Unraid server |
| Proxy | Nginx Proxy Manager with SSL at homes.shottsserver.com |
What I Did vs. What AI Did
My work:
- Designed the data model and the columns we actually compare on
- Designed the 7-star + S/A/B/C/D tier rules and the dealbreaker hard cutoffs
- Wrote the FHA monthly-cost calculator (rate, term, down payment, tax, insurance, PMI)
- Designed the realtor-brief format and the data flow that builds it
- Chose "vanilla JS, no build step" as a deliberate architectural call
- Deploy and operate the production instance my family uses
- Curate the listings — what gets in, what gets soft-deleted, what becomes a tier-S candidate
AI-assisted:
- Most of the rendering JavaScript and the property-card CSS
- Leaflet map integration, custom markers, popup formatting
- API endpoint scaffolding
- The graveyard / restore logic boilerplate
Why I'm Including This
It's not a showcase of pure coding skill. It's a working tool I built to solve a real problem on a real timeline, deployed on infrastructure I built and maintain. The family uses it every week. The tier rules and FHA calculator have already changed which properties we're driving out to see.
If you want to see what I prioritise when I'm not optimising for an interview, this is it.
What I Learned
- A 7-point scale forces a decision in a way a 5-point scale doesn't
- Monthly cost is the right unit for housing decisions; price is a distraction
- "No build step" is a real feature, not a limitation
- SQLite via WASM is a perfectly fine production database for read-heavy household tools
- Curating data is half the value — the app is the easy part
