Case study
- Marketplace
- Geospatial
- Full build
Land platform
A marketplace built for land rather than adapted from one built for houses. A listing is a shape on a map with a zoning classification and a legal status, not a pin with three photos of a field.
- Next.js
- PostGIS
- MapLibre

- Role
- Product, design, build
- Built with
- Next.js 15 · PostgreSQL + PostGIS · MapLibre
- Year
- 2026
The challenge
Every property marketplace in the region is built for houses, and a plot is not a small house. A house is a point with rooms and photographs; a plot is a shape on the ground whose value is decided by its boundary, its zoning class, its legal status and how far the nearest power line is. Fitting land into a listing model designed for bedrooms loses exactly the information a buyer needs, which is why searching for land regionally means phoning people.
What we built
Boundaries, not pins
Every listing carries a real polygon, stored in PostGIS and drawn on the map. You see the shape, the orientation and the road frontage.
Zoning and legal status as filters
What you are allowed to build, and whether the title is clean, are indexed fields — the first two things a buyer asks, so the first two things they can filter on.
Utilities with distances
Power, water, gas, sewage and road access, each with the distance to the nearest connection point. It is what decides whether a plot is cheap or only looks cheap.
Draw an area to search it
Results update inside a shape you draw on the map, rather than making you pick a region from a dropdown that does not match how anyone thinks about location.
Server-rendered and indexable
Filters live in the URL, so a filtered view is shareable and every result page is a page a search engine can read.
Technical approach
Boundaries are stored as real geometry in PostgreSQL with PostGIS and served to MapLibre, so a listing is a polygon rather than a pin, and area and road frontage are derived from the shape instead of typed in by a seller. Zoning and legal status are indexed columns, not free text, which is what makes them filterable. Search state lives in the URL and the pages are server-rendered, so a filtered view can be shared and every result is a page a search engine can read.
The product



Got something like this to build?
Start a conversation