M01

Methodology

Every figure and constant on this page is read out of the code and the committed data packs at build time — the page cannot say one thing while the pipeline does another. The constants describe the pipeline's current rules; the shipped packs are an earlier compiled snapshot (build dates below), so a pack can predate a rule stated here.

The corpus

Listings come from a Google Places (New) quadtree crawl of each mapped region, committed to this repository as per-region packs. A pack keeps a listing's name, Google rating, rating count, price level, address, self-assigned Google type tags, website and place_id; listings whose business status is not OPERATIONAL are dropped when the pack is built. The crawl's collection dates are not recorded, so listing freshness is unknown — the pack build dates below are when each routing pack was compiled, not when its listings were fetched.

The mapped regions overlap deliberately — the Bay Area pack includes San Francisco — so the pack counts above are not additive.

The road graph

Routing runs over an OpenStreetMap road graph: drivable highway=* ways only, filtered by a car-access projection (a way is out when its motorcar/motor_vehicle/vehicle/access tags deny general traffic). Ways are contracted to junctions and endpoints, keeping one extra mid-way node every 400 m so snapping stays accurate — those kept nodes are not intersections. Only the largest strongly connected component ships, and minor roads more than 4 km from every listing are dropped. A listing joins the crawl's graph only when it sits within 1,000 m of a graph node.

The speed model

Every edge weight is a free-flow travel time: segment length divided by speed, where speed is 0.85 times the tagged OSM maxspeed — people rarely average the posted limit in a city — or a per-class default when the way is untagged, plus 4 seconds per intersection, split half over each real endpoint. Each weight is stored as a 16-bit decisecond, so the largest representable edge is 65,535 deciseconds. No traffic, no turn restrictions, no parking hunt, no queue at the counter.

Routing, in your browser

Route calculations happen locally: the region pack downloads once, then a one-to-many Dijkstra over the compressed graph runs in a Web Worker and answers in milliseconds. Distances are computed out to a 2-hour horizon; a place beyond it is simply uncharted.

What does leave the page: map tile requests for the area on screen, a coarse region lookup on a first bare visit, and the pin a shared link carries.

Scores and rankings

The quality score is the listing's Google rating scaled to 100 — a rating-derived proxy, not a taste, freshness or consistency measurement. Static reports rank the top 10 highest-rated listings of each frontier, and only listings with at least 20 ratings are eligible; equal ratings break toward the larger sample. Unrated places cannot be charted.

What counts as a frontier

A listing joins a frontier when its own name or Google Places type tags match the category rule — cuisine alone is never inferred. The committed rules:

Honest limits

Drive times are free-flow estimates, not promises — the frontier cannot see the line out the door. Crawl freshness is unknown: collection dates were not recorded, and each pack is a fixed snapshot of its crawl. Google's Places terms restrict caching API content beyond narrow exceptions.

Only places whose Google listing says “Halal Restaurant” or whose name contains “halal”. Cuisine alone is never treated as certification — many halal kitchens are missing here, and listed status is unverified.

FrontierFood is an independent parody research project about the geospatial accessibility of lunch. Not affiliated with Cognition or Google.

Open the live map →

Field notes: the numbers behind these packs →