
MapaTrhu · Producto de datos
Primero el contexto. Después, la decisión.
MapaTrhu reúne anuncios de varios portales, evolución de precios, contexto de ubicación y comparación en un único espacio de trabajo para comprar una propiedad.

Decision journey
Five steps from the map to fair-price context.
The selected market stays put when a user opens a listing from the map. Price, locality and comparable offers load progressively, each one arriving at the moment it can inform the next decision.

Scroll the diagram horizontally.
- 01
Search the market
Listings from multiple portals share one map. Viewport and filters update the results together, keeping the visible market relevant.
- 02
Open the property
The detail keeps the selected area in context and adds source, price, history, attributes, and photos without returning to a stack of portal tabs.
- 03
Read the price map
The price map compares districts and localities through a consistent price-per-square-metre view, giving one asking price a market frame.
- 04
Understand the locality
Seventeen optional layers add transport, parks, schools, demography, risks, services, and analytical signals directly to the map.
- 05
Check fair-price context
The estimate uses comparable price per square metre, time weighting, and data availability. It communicates context and confidence, not a guaranteed value.
Información
- Tipo de proyecto
- Producto propio de datos inmobiliarios
- Plataforma
- Aplicación web pública
- Nuestro papel
- Construimos el producto desde cero y seguimos operándolo, desde la recogida de anuncios hasta la interfaz del mapa.
- Estado
- En producción y gratis en mapatrhu.sk
Tecnología
- React 19
- TypeScript 6
- Vite 8
- MapLibre 5
- TanStack Query
- Zustand
- Tailwind CSS 4
- Paraglide
- FastAPI
- Python 3.14
- PostgreSQL 17
- PostGIS 3.5
- pgvector
- psycopg3
- Redis 8
- aiohttp
- Docker
- Caddy
Lo que aprenderá
- 01Cómo conectar anuncios de varios portales sin perder su historial.
- 02Cómo mantener el mapa legible y rápido a medida que crece el volumen de datos.
- 03Cómo el precio, la ubicación y la comparación reducen la incertidumbre al comprar.
01
Un mercado fragmentado
Una misma propiedad aparece en varios portales, con textos distintos y sin historial continuo. El comprador arma su visión del mercado con pestañas abiertas, hojas de cálculo e impresiones.
“La decisión de comprar una vivienda necesita más que una foto y un precio anunciado.”



02
El mapa como espacio de trabajo
El mapa es el espacio de trabajo principal. Al desplazarse y filtrar, los puntos, resultados y capas de ubicación cambian juntos para mantener claro el vínculo entre el anuncio y el lugar.



03
El precio necesita contexto
El mapa de precios compara distritos y ubicaciones. En el detalle se añaden evolución del precio, accesibilidad y servicios cercanos. Una estimación no es certeza. Cada cifra lleva fuente y confianza.



04
Una lista pensada para comparar
Los anuncios se pueden guardar, seguir mediante alertas y comparar en paralelo. Los mismos campos para cada propiedad convierten una preferencia difusa en una lista que se puede revisar.




05
Un producto de datos vivo
La recopilación y deduplicación corren sobre PostgreSQL y FastAPI. El mapa es MapLibre en React. Rise lleva producto, diseño, desarrollo y operación, así que interfaz y capa de datos avanzan juntas.

Design and engineering
The decision journey shaped the system layers.
A listing keeps its origin, its identity and its price context through every movement of the map. Collection, calculation and public reads sit in separate layers so none of them slows the others down.
Cómo construimos el sistema
Del primer filtro a la selección
Mapeamos las decisiones del comprador y la información necesaria desde el primer filtro hasta la selección final.
Cada anuncio conserva su origen
Comparamos los campos de los portales y conservamos el origen de cada anuncio y de sus cambios.
El mismo inmueble, un registro
Diseñamos un modelo común y una clave determinista para vincular el mismo inmueble entre distintas fuentes.
Una responsabilidad por capa
Separamos la captura en bruto, la identidad, los cálculos y las lecturas públicas para poder cambiarlos y revisarlos por separado.
El área visible determina la consulta
Perfilamos las consultas del mapa y añadimos un modelo de lectura, caché y tareas programadas alrededor del área visible real.

Scroll the diagram horizontally.
- 01
Client and map
React 19, TypeScript 6, Vite 8, MapLibre 5, TanStack Query, and Zustand keep filters, viewport, detail, and comparison in one state.
- 02
API and services
FastAPI in platform_v2 registers 81 route modules. Seventy-three services and raw psycopg3 separate domain decisions from SQL reads.
- 03
Ingestion and identity
aiohttp collectors read about 26 portals over HTTP, preserve the raw record, and deterministically link the same listings without losing provenance.
- 04
Geo intelligence
PostGIS 3.5 serves spatial selections, 17 layers, and an H3 resolution-7 grid. pgvector adds text retrieval and similarity.
- 05
Data and operations
PostgreSQL 17, Redis 8, materialized views, systemd jobs, Docker, Caddy, and imgproxy support fast reads and regular data refresh.
Listing data pipeline
Every listing passes through five controlled stages.
Raw portal data never reaches the map. A record keeps its source, gets normalized, is linked to the property it duplicates and picks up calculated signals. Only then does it enter the read model.

Scroll the diagram horizontally.
- 01
Capture the source
HTTP collectors for about 26 portals store the raw response and keep downloading separate from later processing.
- 02
Normalize
Parsing and geocoding turn different names, prices, areas, addresses, and coordinates into the shared listings working model.
- 03
Link identity
A SHA-1 key built from country, rounded price and area, city, street, and rooms links sources while preserving their history.
- 04
Calculate signals
A cohort price-per-square-metre z-score and ROI methodology populate property_metrics_current. The output remains an estimate with an explained source.
- 05
Serve the map
FastAPI, read models, and two-tier caching serve the MapLibre map, 17 layers, details, alerts, and saved searches.






