Where the data comes from
There is no single register of running stores and clubs, so the directory combines several public datasets and scores each candidate for relevance instead of trusting any one of them.
How candidates are judged
Map data is tagged for sport in general, not running specifically: OpenStreetMap's shop=sports covers dive centres, ski bootfitters and yoga studios, and shop=shoes is mostly fashion retail. Every candidate is therefore scored against a set of signals rather than accepted because it appeared in a query.
Positive signals include an explicit sport=runningtag, a recognised running retailer or federation name, and running-specific words in the name. Signals for a different sport — golf, tennis, diving, cycling — disqualify a candidate unless something explicitly running-related also matched, which is what keeps “Boulder Running Company” while dropping “Boulder Nordic Sport”.
Anything scoring below 0.35 is discarded outright. Between 0.35 and 0.7 it is kept but held for review, so big-box chains and ambiguous names do not land in the directory unchecked. At or above 0.7 it is published, and the reasons the classifier matched are shown on every listing.
The same shop often appears in several sources. Records are matched on source identifier first, then on name combined with proximity, city or shared domain, so re-running discovery updates listings instead of duplicating them — while still keeping the dozen separate “Fleet Feet” branches apart.
Storage
This instance stores the directory in Supabase Postgres.
Preset areas
These are shortcuts, not limits — the console geocodes any US place name.
