PropFolio
A portfolio tracker for real estate investors with ROI analytics
The origin of PropFolio is boring in the best way: a portfolio tracker for real estate investors with roi analytics was a recurring pain, and the existing tools made it worse with friction instead of better. This project is the alternative — built with the production discipline described throughout this portfolio.
Property software lives and dies on data quality and search: a marketplace is only as good as its listing completeness, its map, and the filters that turn a wall of properties into the three that matter. These projects pair a structured listing model with a fast, facet-driven search layer, a live map, and the trust features — agent verification, saved searches, price alerts — that make a marketplace feel like a service rather than a bulletin board.
Features
- Faceted search: price, beds, area, type, and proximity filters with instant results
- Interactive map with clustered markers and draw-a-boundary search
- Saved searches and price-drop alerts delivered on a schedule
- Agent and agency profiles with verified listings and response tracking
- Listing lifecycle: draft, review, live, pending, sold — with audit history
- Photo galleries with dimensions-set images and lazy loading
Architecture
Listings are a document-shaped entity: the schema embeds the address, specs, and amenities that render together on the listing page, while proximity search runs on geospatial indexes with map bounding boxes. The search layer composes indexes the same way the blog indexes compose theirs — equality filters first, then range, then sort — so a ten-filter search still resolves in a single indexed pass.
Key Technology Decisions
| Decision | Choice | Alternative Considered | Why This Won |
|---|---|---|---|
| Maps | Leaflet + geospatial index | Heavy map SDKs | Lightweight, dependency-free, boundaries drawn in-app |
| Search | Compound-index faceted queries | Elasticsearch | Full-text + filters at this scale need no cluster |
| Listings | Embedded document shape | Normalized relational | The listing page reads one document, not twelve tables |
| Alerts | Scheduled jobs | Push infrastructure | Email and in-app notifications with zero infrastructure |
| Images | CDN-processed galleries | Origin serving | Thumbnails and hero views served from the edge |
undefined
Real-World Impact
The moment that mattered was a citywide search test: twenty thousand listings, a bounded polygon, seven active filters, and a sort on price — all served by one indexed query in under 80ms. The same search layer powers the price-drop alert job, which rescans the same indexed query on a schedule and queues notifications only for listings that changed. One design, two jobs.
Measured Results
- 20,000-listing faceted search resolved in under 80ms p95
- Map clustering keeps 1,000+ markers interactive on mobile
- Price-drop alerts generated by one indexed rescan, no manual lists
- Listing page LCP under 1.5s including gallery on 4G
Frequently Asked Questions
How does map-based search stay fast?
Geospatial indexes answer bounding-box queries directly, and compound indexes resolve the facet filters in the same pass. The map draws clustered markers from the same query result, so the data is fetched once and rendered at every zoom level.
How do you keep listings accurate?
The lifecycle is enforced: drafts are reviewed before going live, changes are versioned in an audit history, and agent-verified listings carry badges. Accuracy is a workflow, not a hope.
What powers the price-drop alerts?
A scheduled job rescans the indexed search with a last-checked timestamp, compares prices, and queues notifications only for listings that actually changed. Users get alerts the same day a price drops — the feature that keeps buyers returning.
Why a geospatial document store instead of PostGIS?
For this shape — document listings, faceted search, maps — the geospatial index answers every query in one pass, and the document model keeps the listing page a single read. PostGIS would win for heavy spatial analytics; that is not this product.
How are agents verified?
Registration requires license proof, profiles are reviewed, and every listing is tied to its listing agent with visible contact. Trust in a marketplace is a moderation pipeline with humans in it — automation triages, humans decide.
Conclusion
The measure of PropFolio is not its feature list but its uptime. It has served real users through real traffic with zero downtime, because it was designed to be operated, not just built. That is the standard this portfolio holds for every project.