Addris

Addris

Addris started from a simple frustration: when you look at a property, the listing tells you about the building, but almost nothing about the place. What's actually around it? What's being built nearby? Is it on a flood plain? How far to a charger, a bus stop, a school? That context is the thing that actually changes a decision — and underneath the frustration sits a textbook architecture problem. The information exists, but it's spread across a dozen government datasets that share no schema, no identifiers, and in places no coordinate system. The product is really a bet that the integration is worth doing once, properly, so nobody else has to.

What it does

Addris pulls those sources into one map and one queryable picture of an area. Behind it sits a fair bit of Ireland: over 635,000 properties from the Price Register, ~155,000 commercial properties, planning applications, transport stops from the national GTFS feed, EV chargers, local services, and flood-risk zones from the OPW. You point it at an address and it tells you the story of the area around it — sold prices, planning activity, and the trajectory of the neighbourhood — not just the four walls. The user-facing surface is deliberately simple; the hard part, and the actual moat, is everything that has to happen to make a dozen incompatible feeds answer a single spatial question in milliseconds.

The hard part was the data

The product is geospatial, but the real work was the data pipeline. A dozen government sources, none of them map-ready: free-text addresses with no coordinates, planning data from per-council ArcGIS servers, transport as NTA GTFS zips, commercial valuations in Irish Transverse Mercator rather than WGS84. Every source gets the same shape — an EventBridge schedule fires an ingest Lambda that fans the dataset into batches on SQS, and a write Lambda drains the queue. Putting SQS in the middle is the whole trick: it hands me retries, a dead-letter queue, and natural back-pressure against the database for free, and because it's all serverless the compute bill between weekly refreshes is zero.

Everything is keyed on location, which in Ireland means Eircodes — and Eircodes are gloriously non-geographic, so you can't infer a neighbour from a code. So geocoding is a three-tier cascade, cheapest-and-most-accurate first: a HERE-licensed eircodes table (~119k exact-key lookups, no API call), then a geocode_cache so any address is resolved only once, then a self-hosted Photon instance on EC2 for the long tail. Every resolved record carries a confidence level — eircode, street, locality or low — so the map can stay honest about how precisely a point is placed.

On the storage side it's PostGIS on RDS: each point is a geometry(Point, 4326) with a GIST index, so a map-viewport query is an ST_Within against the bounding box and "everything within 2km" is an ST_DWithin — index lookups, not full scans across 635k rows. Nothing talks to Postgres directly; a fan-out of Lambdas will happily open ten thousand connections and melt it, so everything goes through RDS Proxy with IAM auth for pooling. Hot viewport results are cached in ElastiCache Redis keyed on coordinates rounded to three decimals, and MapTiler renders the basemap while the data stays mine. The Eircode geocoding layer alone represents real money and time, which is exactly why it's the one dataset I made sure was backed up before anything else. I wrote the full pipeline up — trade-offs and all — in Serverless geospatial at scale.

Addris architecture diagram: a dozen Irish open-data sources are pulled by an event-driven pipeline — EventBridge schedule, ingest Lambda, an SQS queue with a dead-letter queue, then a write Lambda — resolved through a three-tier geocoding cascade (HERE-licensed eircodes table, a geocode cache, then self-hosted Photon) with each record reprojected to WGS84 and tagged with a confidence level, stored in PostGIS on RDS behind RDS Proxy with a GIST spatial index, cached in ElastiCache Redis on coordinates rounded to three decimals, and served with MapTiler tiles — with the whole stack now paused to cold storage.
The pipeline, end to end: event-driven ingestion, a cheapest-first geocoding cascade (highlighted), and PostGIS behind RDS Proxy with a Redis hot path. The geocoding layer is the costly core — slow to rebuild, so it's the one dataset backed up before anything else.

An honest status update

Here's the part most write-ups skip. Addris is paused — and the way it's paused is itself an architecture decision. Customer discovery pointed me at a stronger opportunity in B2B (feeding this area intelligence into partners who already have the customers) rather than another consumer property portal. The question then wasn't whether to stop, but how to stop without throwing away the expensive part.

So I designed the pause for reversibility. The application infrastructure is torn down to near-zero cost; every dataset — above all the irreplaceable geocoding layer — is preserved in cold storage; and the whole thing is described in code, so a one-command playbook brings it back online in an afternoon. Because the infrastructure is Terraform and the data is backed up by value rather than by habit, "paused" means dormant, not lost. That's not failure — it's pointing real, intact work at the right buyer. You can see the project at addris.ie, currently on hiatus while I chase the B2B angle.