manx.directory

A case study in building a directory the Island will actually use - free to list, owner-maintained, and current.

Visit manx.directory
Live
Case Study

manx.directory is a business directory for the Isle of Man, built and owned by OLXR. It went live in August 2026, roughly a month after the first commit. This page describes the problem it solves, the decisions we made building it, and why we made them.

01 — Context

The Problem

The Isle of Man is full of businesses worth finding, and finding them is unreasonably hard. A great many are discovered entirely by word of mouth, which travels only as far as it travels and then stops. Plenty have no social media at all, or a page that was last updated years ago. The directories that do exist have drifted out of date - numbers that ring out, businesses that closed, opening hours that were right in 2019.

The practical consequence is that an Islander who needs an electrician, a plumber, or somewhere to eat ends up asking around, posting on social media, or scrolling through results that only half-remember what they are looking for. Businesses lose work they never knew was available. Residents fall back on the mainland, or on nothing at all.

The root cause is not that nobody has built a directory. It is that nobody has kept one current. A directory is only useful if the details in it are true, and details only stay true if the person who knows them - the owner - has both a reason and an easy way to maintain them. Every decision below follows from that.

02 — Solution

What We Built

manx.directory is a searchable directory of Isle of Man businesses, organised by category, by town, and by region. A visitor can search in plain language, browse fifteen top-level categories down through a hundred and seventy-seven sub-categories, or start from where they are - Douglas, Ramsey, Peel, Port Erin, Castletown, Onchan, or one of four regional areas covering the rest of the Island.

Every listing belongs to the business that runs it. Owners claim their entry, then maintain it themselves from a dashboard: opening hours with automatic "open now" status, contact details with per-field control over what is public, photos, a description, tags, FAQs, social links, and multiple categories. Changes go live the moment they are saved. That is the whole mechanism by which the directory stays current - the person who knows the answer is the person who edits it.

Listing is free, permanently, with every feature included. Nothing is held back behind a paywall. The paid tier is a promoted listing at £7.99 a month inclusive of VAT, which lifts a business to the top of its category and sub-category pages with a badge, and adds a statistics dashboard showing profile views over time, website and directions clicks, and contact reveals. Slots rotate fairly between promoted businesses rather than going to whoever paid first. Separately, an annual partner tier is sold directly to organisations that want to back local business, in return for a prominent homepage placement.

Behind the public site sits an operator console: moderation queues for new listings, edits and uploaded images, a full audit trail of every change, account management, taxonomy and place administration, reported-listing handling, and a view of what visitors are actually searching for.

03 — Build

Key Decisions

A directory lives or dies on whether the data is trustworthy and whether it is still true next year. Most of the engineering went into those two things rather than into features.

01
Free forever, with nothing held back

The obvious commercial model for a directory is to charge for a listing, or to cripple the free one until the owner pays. We did neither, because a directory is only useful if it is complete. Charging for entry guarantees the directory contains the businesses that could be bothered to pay rather than the businesses that exist - which is precisely the failure mode of every stale directory we were reacting to. So every feature sits in the free tier: full profile, photos, hours, tags, FAQs, multiple categories, the lot. Promotion buys reach and insight on top of a listing that was already complete, never access to the basics. It is a slower route to revenue and the only one that produces something worth using.

02
We host our own map tiles

Every business profile carries a map. The default approach - point Leaflet at OpenStreetMap's tile servers - is fine in development and wrong in production: the OSM Foundation's usage policy does not permit it for production traffic, and a map costs far more requests than the visitor numbers suggest. A single viewport pulls six to twenty tiles on first paint and more on every pan, so a few hundred profile views a day becomes six figures of requests a month aimed at a charity's servers. The commercial alternative is to hand a third party the IP address of every visitor along with the business they are looking at. We serve our own copy instead: the whole Island, zoom 0 to 15, is a single nine-megabyte vector archive in S3 behind the same CloudFront distribution as the site, and the browser reads the parts it needs with range requests. Nothing third-party sits in the path when a visitor opens a map, so the privacy policy has one fewer recipient to name - and the maps cannot break because somebody else changed their terms.

03
Search understands the query without machine learning

Search on a directory needs to handle how people actually type - "family friendly restaurant in douglas" rather than three separate filter selections. The fashionable answer is a language model or a vector index. We did not need one. The vocabulary of this problem is small and fixed: fifteen categories, a hundred and seventy-seven sub-categories, a known list of towns and regions, and a scoped tag set. So the query is matched against that vocabulary, the recognised terms are lifted out as structured filters, and whatever is left over is treated as free text. The example above resolves to a category, a place and a tag, with nothing remaining. The result is faster than an inference call, costs nothing to run, is entirely deterministic, and can tell the visitor exactly which parts of their query it understood.

04
Contact details are protected from harvesting

A directory is, from a scraper's point of view, a tidy list of business phone numbers and email addresses waiting to be sold on. If listing on manx.directory results in cold calls, owners stop listing and the directory dies. Contact details are therefore revealed on request rather than printed into the page source, behind Cloudflare Turnstile and rate limiting - a real visitor needs a handful, and sustained requests beyond that are harvesting. Owners also choose per field what is public at all, so a sole trader can publish a business email and keep a personal mobile private while remaining contactable through the site.

05
Moderation is automated first, human second

User-generated content on a public directory needs review, and reviewing everything by hand does not scale past the first few hundred listings. Uploaded images run through Amazon Rekognition twice - once for unsafe content, and once through OCR so that text baked into an image is checked by the same rules as text typed into a field, which is how contact details and URLs usually try to sneak past a content policy. Text changes are auto-flagged and held where they warrant a closer look, rather than blocked outright. Everything held lands in a moderation queue in the admin console alongside a full audit trail of who changed what and when. The automation decides what a human needs to look at; a human still makes the call.

06
Serverless, with one query interface and no passwords

An Island directory has genuinely spiky traffic and a long quiet tail, which is the case serverless was built for. The site is Next.js deployed through OpenNext to AWS Lambda behind CloudFront and WAF, with Aurora Serverless v2 underneath - scaled to zero in development, held warm with minimum ACUs in production. Two details made that comfortable to work in rather than merely cheap. The application talks to the database through a single query interface: locally it connects over a normal Postgres driver, deployed it uses the Aurora Data API, and the same SQL runs both ways. And there are no passwords anywhere - sign-in is a single-use magic link, tokens stored hashed with a fifteen-minute expiry. Nothing to leak, nothing to reset, and one fewer reason for a small business owner to abandon the sign-up.

04 — Identity

Brand

The identity was designed in-house alongside the product. It had two jobs at once: to feel genuinely of the Island, and to feel modern and dependable enough that a business would trust it with their listing. Both the palette and the mark are drawn from the Island itself rather than invented.

manx.directory primary lockup, reversed for dark backgrounds
The three-legs mark in full colour
manx.directory primary lockup in full colour
The app tile - gold mark on deep blue

The mark is a stylised reading of the Three Legs of Mann - three bent legs turning around a central gold hub, each ending in an open location point. The hub is the person doing the searching and the legs are the businesses around them, so the emblem reads as a directory as well as a piece of Manx heraldry. It is deliberately an original interpretation rather than a copy of the official coat of arms, so it can be used and registered without restriction. The same gold appears in the full stop of "manx.directory", tying the mark to the wordmark.

The whole asset set - lockups, app tiles, favicons, avatars - is generated from a single component by script, so the artwork and the code cannot drift apart.

The palette

The colours are borrowed from the Manx National Tartan, designed by Patricia "Paddy" McQuaid in 1957, in which each colour stands for a part of the Island: blue for the sea, green for the hills, purple for the heather, gold for the gorse, red for the fuchsia, white for the cottages. Building the brand from those gives it a real sense of place and a story worth telling, rather than a palette we made up. There is no official hex specification for the tartan - tartans are defined by thread colour and vary between weavers - so the values below were sampled and are the product's own reference, not a claim to a national standard.

Sea
Primary
#2C3F9C
Gorse
Accent / CTA
#E8B62C
Hills
Secondary
#2C7D43
Heather
Support
#7F57A4
Sky
Support
#6BA1B0
Fuchsia
Occasional
#B23A62
Cottages
Surface
#EFEEE6
Ink
Text
#14203A

Sea leads and carries the headers, links and primary interface. Gorse gold is the single accent that signals action, always with dark text on it because it is far too light to hold white. Hills green does the positive states - it is the colour of an "open now" pill. The rest are occasional accents that add variety without ever competing with the core. Type is Inter throughout, at a handful of weights, with no second display face; the wordmark ships outlined to paths so the logo never depends on a font being installed.

05 — Gallery

Screenshots

manx.directory Homepage

Homepage - search, categories, towns and regions

manx.directory For Businesses

For businesses - what a free listing includes

manx.directory About

About - the problem, and the answer

06 — Status

Where the Product Stands

manx.directory is live at manx.directory. The public directory, search, category and place browsing, business profiles with maps, the owner dashboard, magic-link sign-in, image handling and moderation, the admin console and the promoted-listing subscription are all in production. The full taxonomy is seeded - fifteen categories, a hundred and seventy-seven sub-categories, four regions and the Island's places.

From the first commit to a live site was about a month. That pace is a consequence of the architecture rather than of cutting corners: infrastructure defined in CDK and deployed from CI, one query interface that behaves the same locally and in AWS, and a seeded local database that means a developer needs no AWS credentials to work on the site.

The work now is coverage. A directory becomes useful at a threshold of completeness, and the priority is getting the Island's businesses listed and claimed by the people who run them. Everything else is secondary to that.

07 — Reference

Technical Reference

Web
Next.js (App Router) with React and TypeScript, server-rendered. Deployed serverless via OpenNext.
Compute
AWS Lambda behind CloudFront, with WAF in front. Region eu-west-2 (London).
Database
Aurora Serverless v2 (PostgreSQL 17) accessed through the RDS Data API. A single query interface runs the same SQL against a local Postgres in development. Versioned SQL migrations with a migration ledger, and seeded reference data.
Storage & media
Amazon S3 for photos, logos and badges. Sharp for server-side resizing and format conversion, with generated Open Graph share cards per business.
Maps
Self-hosted vector tiles - the whole Island as a single PMTiles archive in S3, served through the site's own CloudFront distribution and rendered client-side with Leaflet and protomaps-leaflet. OpenStreetMap data under ODbL, attributed on the map and in the footer.
Auth
Passwordless magic links. Single-use tokens stored as SHA-256 hashes with a fifteen-minute expiry; sessions valid for thirty days. No password is ever stored.
Payments
Paddle as Merchant of Record, handling checkout, VAT, receipts and the customer portal. Dunning orchestrated with EventBridge Scheduler and Step Functions.
Email
Amazon SES for sign-in links, listing confirmations and billing notices, from a catalogued set of templates.
Moderation & abuse
Amazon Rekognition for image content and OCR screening, automatic text flagging with hold-for-review, Cloudflare Turnstile on public forms, and rate limiting on contact reveals.
Infrastructure
AWS CDK in TypeScript across separate data and site stacks. Two isolated member accounts for development and production, with per-pull-request ephemeral environments.
CI/CD
Bitbucket Pipelines - build and infrastructure diff on every pull request, deploy to development on merge, deploy to production on a tagged release. AWS access via OIDC, with no long-lived keys anywhere.

Have a project in mind?

We are happy to discuss what you are building and whether we are the right fit.

Start the Conversation