All projectsRead as Markdown
Skip to the content
Real Estate IntelligenceOpen the demo

Read the market, not the listings.

Real Estate Intelligence turns public property listings into a market you can read place by place: asking prices per square meter, their history, comparables and time on market, each one with its source and its date.

Each block is a street block. Its height is the median asking price per m².Synthetic data

Is the zone moving, or only this listing?

Brokers and analysts read a place as a series, not as a feed. Every aggregate says how many listings it stands on, which sources reported them and when it was last computed.

  • Median asking price per m² by zone, neighborhood and street block
  • Movement over time, with the sample behind every point
  • Time on market, removals and returns to market
Median asking price
AskingR$ 10,920/m²
90 days
+3.1%

1,284 listings · 3 sources · 9 Oct 2026, 06:00Synthetic data

Is this apartment priced like its neighbors?

Buyers and investors see one property against the comparables around it, selected by stated criteria you can read and change. An asking price is never presented as what a property sold for.

  • Comparables with the reason each one was selected
  • Price history of the listing, cut by cut
  • Alerts when a watched place or property changes
68 m² · 2 bedrooms
AskingR$ 785,000
Against the neighborhood median
7.5% below
Time on market
64 days

Median R$ 12,480/m² · 212 properties · 9 Oct 2026, 06:00Synthetic data

Three listings. One property. Here is why.

For the engineer evaluating the work: a property and a listing are separate entities, history is first-class, and entity resolution explains itself. Every merge carries its evidence and can be reviewed.

  • Deterministic price, comparable and geospatial rules in the backend
  • Raw snapshots and provenance kept for reprocessing and audit
  • Traces across HTTP requests, jobs, collectors and model calls
Source A · first seen 6 Aug
AskingR$ 785,000
Source B · first seen 11 Aug
AskingR$ 790,000
Source C · returned to market 2 Oct
AskingR$ 785,000
Resolved as one property
match 0.91

Same number range · 68 m² · floor 7Synthetic data

What ran, what changed and what failed?

Data operators see collection as counted work. Runs are idempotent and checkpointed, concurrency is a visible number of slots, and nothing is fetched outside the terms of its source.

  • Rate limits, retries with backoff and graceful shutdown
  • Reprocessing from raw snapshots, isolated from routine actions
  • A review queue for the matches the rules could not settle
Last run
9 Oct 2026, 06:00
Snapshots read
1,284
Changed
212
Failed
0

Robots, rate limits and licensing respected per sourceSynthetic data

Ask in plain language. Get a run you can audit.

A question does not open a chat. It becomes a typed request you confirm, a calculation the backend performs and an explanation labelled as written by a model.

  1. Question

    What is the price per square meter of two-bedroom apartments in Pinheiros?

  2. Waiting for you

    Interpreted as a price per m² request. Confidence was below the 0.85 gate, so the run paused for confirmation.

    • Place · Pinheiros
    • Type · apartment
    • Bedrooms · 2
  3. Completed

    R$ 12,480/m² median asking price

    Computed by the backend · 212 properties · 9 Oct 2026, 06:00

  4. Explanation

    Asking prices in Pinheiros sit above the Zona Oeste median, and most of the sample was listed in the last 90 days.

    Written by a model about the figure above. It did not produce the figure.

  5. Synthetic data

Four rules the product does not bend.

Asking is not sale.
A listing carries an asking price. A sale price appears only when a source reports a transaction, and the two are never averaged together.
A model explains. It never computes.
Medians, comparables and geospatial filters are deterministic backend rules. A model may route a question or explain a result.
The street block, never the unit.
A property is located to its street block and number range. No screen pins a front door.
The source sets the terms.
Collectors follow robots rules, rate limits and licensing. In development the product runs on synthetic datasets.

Start from a place.

Pick a zone, a neighborhood or a street block and read what the listings add up to.

Where the project stands

Built: owned-synthetic ingestion, initial persisted properties and listings, prepared market figures and an isolated structured price tracer.

Not enabled: real-source processing, production matching, full history and comparables. Every figure on this page is synthetic; the natural-language journey illustrates the target experience.

Real Estate Intelligence · a portfolio project · figures in BRLPrivacy

The product

Real Estate Intelligence explores places, properties, listings and asking-price evidence. The current synthetic contract foundation includes owned-synthetic ingestion, initial persisted Property and Listing records, prepared market figures and an isolated structured price tracer.

  • Node.js
  • NestJS
  • React
  • TypeScript
  • PostgreSQL
  • RabbitMQ
  • LangGraph
  • OpenTelemetry
Open demoPublic source not configured.

The main flow

  1. Start with a place

    Explore the synthetic place hierarchy, prepared market figures, parent comparison and a twelve-month series. Search and counts remain labelled fixtures.

  2. Inspect a property and its listing

    Verified owned-synthetic parsed events persist initial single-listing aggregates. Property and Listing are distinct; asking prices never become transaction prices.

  3. Trace a structured price request

    API-owned durable runs and worker delivery call an isolated LangGraph through a scoped backend Market tool. Prepared seven-state examples are read-only and separately labelled.

Architecture

Owned synthetic source → collection worker → PostgreSQL → Property / Listing

React ↔ NestJS API → application → domain · infrastructure implements ports

Durable Ask run → worker → isolated LangGraph → scoped HTTP Market tool → API

Real Estate Intelligence

Four applications, an inward dependency direction

React web, NestJS API, worker and isolated AI application use domain/application/contracts/infrastructure packages. PostgreSQL schema ownership follows business contexts.

The backend owns the number

Deterministic calculations stay in the backend. The AI application receives neither database credentials nor an infrastructure dependency; typed HTTP tools expose allowed capabilities. Outbox/inbox patterns govern event delivery through RabbitMQ.

Availability and limits

All figures in this presentation are fixed synthetic illustrations, not production market measurements. Real-source processing, production matching, full history and comparables are not enabled. The tracer does not implement natural-language extraction, provider calls, confirmation, complete checkpoints or visitor quota.

Open demoPublic source not configured.