Breek.gr had been live for about two months when I started this, in a first version built by external contractors. I wanted to know what they had actually delivered, and the fastest way to learn an API is to consume it yourself, in anger, with a real interface on top.
So I wrote a sister application: a public directory of property managers across Greece. A company could publish itself and its roster, show the areas it operates in, and be found by someone looking for a manager. It made a top-line argument for the product, and it was my exercise at the same time.
What was in it
It started as an exercise and turned into a testbed, because I kept adding the things I had wanted an excuse to build.
- Geography as the core. I used my own ExNominatim as a path dependency, pointed at a self-hosted Nominatim, to resolve places and pull boundaries. Locations carry geohashes.
- Four caches with different clocks: twenty minutes for Breek’s own API, ninety days for Nominatim lookups, ninety days for polygons, ninety days for neighbours. Different data changes at different speeds, and treating it as one cache is how a directory starts showing stale boundaries.
- Polygons that fit in SQLite. Region boundaries arrive as enormous coordinate lists. The pipeline rounds coordinates to a set precision, then sparsifies: beyond 1500 vertices it takes chunks of the list and drops one point in three, unless that point is on a keep list. A boundary that renders in milliseconds and stores in a row, instead of a geometry that needs PostGIS to be useful.
- Leaflet maps with a
deleafletize/1helper to turn what the map sends back into something the database accepts. - LiveView 1.0 release candidates, before 1.0 shipped. Live components for the forms, PubSub for the lists that had to move without a reload, and a search-ahead agent that fires a query before you finish typing so the next keystroke lands on a warm cache.
- Notifications and invitations: time-tiered updates (today, this week, this month, older) and invitations to join a company, which later became a cookbook I still use.
- Gettext strings, with automatic translation of taglines, because a directory of Greek managers has to speak Greek.
What came of it
As a product: nothing. It was parked, and it might be resurrected one day as a public-facing feature, but it has not been.
As evidence: it mattered more than most things that shipped. Two or three months into operating Breek.gr v1, this was the first concrete sign that the split architecture — a REST API behind a separate front end — might be the wrong long-term shape, and that a single Elixir and Phoenix LiveView application could carry the product further, with better interactivity and a public face for the parts that deserve one.
A year later, with traffic up and the legacy REST API straining under decisions we had made early, that sign became a plan. I started a strangler fig: an Elixir sister backend that has since grown to serve most of the requests the web application makes.
So an exercise that produced no feature of its own scoped the technical future of the product. That is a better return than most of the features I have shipped.