Bucuresti Invest - Real Estate Analysis Platform

Bucuresti Invest — Real Estate Investment Analysis Platform
Overview
Bucuresti Invest is an end-to-end real estate analysis platform for Bucharest. It scrapes apartment listings from Publi24.ro, enriches them with historical price data and neighborhood statistics, and surfaces the best-in-class investment opportunities based on calculated financial metrics — not vibes.
Built for the specific problem of buying an investment property in a market where listings are scattered across portals, prices change daily, and there is no single source of truth for neighborhood-level yield data.
🎯 What It Does
Scraper
- Scrapy-based crawler on Publi24.ro (the largest Romanian classifieds portal for real estate)
- Incremental mode for daily updates, full-refresh mode for backfills
- Deduplication across listings that get reposted
- Price-history tracking — every listing's price change is kept so you can detect motivated sellers
API
- FastAPI backend exposing listings, analytics, and investment calculations
- Endpoints:
GET /api/listings/hot-deals— best investment opportunities, rankedGET /api/listings/{id}/price-history— price deltas over timeGET /api/analytics/neighborhoods— yield, price/m², velocity per neighborhoodGET /api/analytics/price-trends— historical evolution per sectorPOST /api/investment/calculate— ROI, cap rate, cash-on-cash return from user inputs
Dashboard
- Next.js frontend with analytics and visualizations
- Neighborhood heatmap of yields and price/m²
- Price-trend charts per sector
- Hot-deals feed with filter presets (rental yield, price drops, undervalued)
- Investment calculator for modeling specific properties (mortgage rate, down payment, occupancy, tax)
🛠️ Tech Stack
| Layer | Technology |
|---|---|
| Scraper | Python + Scrapy |
| API | Python + FastAPI |
| Database | PostgreSQL with purpose-built indexes and functions |
| Frontend | Next.js + TypeScript |
| Orchestration | Docker Compose (Postgres + API + Dashboard + Scraper) |
| Seed data | Neighborhood polygons, bootstrap price/m² benchmarks |
🏗️ Data Model
The Postgres schema is split into:
listings— current state of every listing (price, m², rooms, floor, neighborhood, URL)listing_history— every price change, detected by the scraper's daily diffneighborhoods— Bucharest sector + neighborhood hierarchy with geographic boundariesanalytics— pre-computed per-neighborhood aggregates (median price/m², 90-day velocity, rental yield estimates)
Migrations are split cleanly: 001_initial_schema, 002_indexes, 003_functions, 004_seed_neighborhoods — so the whole stack spins up from zero with a single docker-compose up.
🧮 Investment Math
Beyond surface listings, the platform computes real investment metrics:
- Cap rate = annual net operating income / purchase price
- Cash-on-cash return = annual pre-tax cash flow / cash invested (accounts for down payment, mortgage payments, taxes, expenses)
- Price/m² vs neighborhood median — instantly see if a listing is 20% below comps
- Price trajectory — listings that have dropped 2–3 times signal motivated sellers
💡 Why I Built This
Bucharest real estate is a massive market with surprisingly bad tooling. Imobiliare.ro and Publi24 are optimized for end-buyers browsing emotionally; there's no platform that treats properties as investments with the numbers front and center. Bucuresti Invest is the tool I wanted when I was looking at apartments — a screen that ranks opportunities by math, not by how pretty the listing photos are.