Try it: the POI intent tester
Type a query below and watch Mailwoman's kind classifierkind classifierStage 2.5 of the runtime pipeline: categorizes the input into one of seven query kinds (structured_address, postcode_only, locality_only, intersection, po_box, landmark, vague) so the coordinator can route to the right parsing strategy. decide whether it's a POIpoint of interest (POI). A named place that is not strictly an address — landmark, transit stop, venue, amenity, or franchise. Mailwoman tags these as venue and resolves them through the gazetteer. query or an address, then extract the subject — a taxonomy category (hospital, drinking fountain) or a chain brand (chevron, applebee's) — split off the location anchor, and render an OverpassQL export you can paste into Overpass Turbo.
The intent detection runs entirely in your browser with no network request: it's the same matchPOISubject + createKindClassifier + OverpassQL emitter Mailwoman ships as a library — see @mailwoman/kind-classifier and @mailwoman/poi-taxonomy. A brand subject resolves to its Wikidata QID from the same brand table the runtime uses. Hitting "Search live" on a category result adds byte-range HTTP requests against the published gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. + POIpoint of interest (POI). A named place that is not strictly an address — landmark, transit stop, venue, amenity, or franchise. Mailwoman tags these as venue and resolves them through the gazetteer. layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. — still no server-side code, no model weightsmodel weightsThe learned parameters of the neural classifier, shipped as ONNX files in the @mailwoman/neural-weights-* packages. Weights are locale-specific bundles that include the model, tokenizer, and a model-card.json metadata file., but not offline either.
Loading POI tester…
Reading the result
- Kind badge — the StagestageOne of the dataflow stages in the runtime pipeline (normalize, locale gate, kind classify, phrase group, token classify, sequence correct, reconcile, resolve). Distinct from tier (model vocabulary) and phase (plan milestone). 2.5 kind classifierkind classifierStage 2.5 of the runtime pipeline: categorizes the input into one of seven query kinds (structured_address, postcode_only, locality_only, intersection, po_box, landmark, vague) so the coordinator can route to the right parsing strategy.'s verdict (
poi_query,structured_address, …) with its confidence. Expand it to see the runner-up kinds. - Category chip — which taxonomy category the subject phrase matched, when the kind is
poi_query. - Brand chip + QID — when the subject is a chain brand, the brand's canonical name plus a linked Wikidata QID (
Q319642= Chevron). Brands resolve by that QID against the layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6.'sbrand_wikidataindex, not by category — so they carry no OverpassQL export and no OSMOpenStreetMap (OSM). A community-curated global map database (ODbL-licensed) with addr:* tagged features and place hierarchies. A secondary corpus source and a source of street names.-tag k-ring. - build-local badge — this category's data lives only in ODbL sources (OpenStreetMapOpenStreetMap (OSM). A community-curated global map database (ODbL-licensed) with addr:* tagged features and place hierarchies. A secondary corpus source and a source of street names.). Mailwoman ships the builder for the local layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6., not the data itself — see Amenity queries for why that split exists.
- anchor — the text left over after the subject phrase is split off (
near Springfield,, New York). This is what the runtime pipelinestaged pipelineMailwoman's runtime architecture: a sequence of pure-function stages (normalize → query-shape → locale-gate → kind-classifier → phrase-grouper → classifier → decoder) connected by typed handoffs. Each stage is published as its own npm package. would hand to the address parser to resolve a location constraint. - OverpassQL export — a ready-to-run query against the category's OSMOpenStreetMap (OSM). A community-curated global map database (ODbL-licensed) with addr:* tagged features and place hierarchies. A secondary corpus source and a source of street names. tag, scoped to the anchor when one resolved. Overpass is an export target, not a serving backend: Mailwoman prints the query, it never runs it for you.
- Search live — for a category result with an anchor, range-loads the published
poi.db(13.68M Overture-places rows, US/CA/MX/FR) straight in your browser via sql.js-httpvfs and shows real, distance-ranked results — no server, no model weightsmodel weightsThe learned parameters of the neural classifier, shipped as ONNX files in the @mailwoman/neural-weights-* packages. Weights are locale-specific bundles that include the model, tokenizer, and a model-card.json metadata file., just byte-range reads against the same admin gazetteergazetteerA geographical index that maps place names and postcodes to real-world coordinates. Mailwoman uses a custom-built Who's On First (WOF) SQLite database as its gazetteer — the 'atlas' half of the grammar/atlas architecture. + POIpoint of interest (POI). A named place that is not strictly an address — landmark, transit stop, venue, amenity, or franchise. Mailwoman tags these as venue and resolves them through the gazetteer. layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. the CLI'smailwoman poiand themailwoman_poi_searchMCP tool query. It's a k-ring walk capped a few hundred meters out per click, category-only, and only as good as the anchor: an unresolvable place nametoponymA proper name for a geographic place. shows "couldn't place" rather than a silent empty list. Abuild-localcategory never offers the button — its data isn't published, by design. Live search stays category-only on purpose: a brand-wide fetch by QID has to hydrate every one of a brand's globally-scattered rows from the 3.9 GB layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6., and byte-range makes that pathological (even a 25-row brand costs ~13 s and 60 range requests; the big ones time out). That path is a server-side capability — the NodePOILookupdoes the same QID fetch in under a millisecond — so brand subjects here stay intent-only.
Why "hospital, 350 5th Ave, New York" doesn't become a POI query
Try that preset. The lexicon matches hospital as a subject, but the remainder — 350 5th Ave, New York — leads with a house numberhouse numberThe numeric or alphanumeric identifier of a building on a street. Mailwoman's house_number component; its position relative to the street name flips between locales.. That's the signature of a venuevenueA named, non-address place — a business, building, park, or stadium. Mailwoman's free-text point-of-interest component, added as a Tier 2 fine label.-led full address ("the hospital located at this specific address"), not a category search, so the classifier's structured_address score wins and the query falls through to the "parsesaddress parsingThe process of decomposing a free-text postal address string into structured components — house number, street name, locality, region, postcode, and country — so a geocoder can resolve them to coordinates. as an address" stateregionThe first-level administrative subdivision of a country — a US state, a French region, a province. The component between country and locality. instead of an Overpass export. This is the same guard the parser uses in production to keep full addresses from getting mis-routed into the POIpoint of interest (POI). A named place that is not strictly an address — landmark, transit stop, venue, amenity, or franchise. Mailwoman tags these as venue and resolves them through the gazetteer. branch just because they happen to start with a category word.
What isn't here yet
- Landmark subjects. The lexicon matches categories (
hospital,fire_hydrant,drinking_water, …) and chain brands (chevron,applebee's, from the QID-keyed brand table), but bare landmark names ("Eiffel Tower") aren't in the phrase table yet. See Landmark queries for the target shape; Franchise queries covers how the brand path works end to end. - Live brand search in the tester. Brand subjects resolve their QID here (intent-only), but the live "Search live" step stays category-only — a brand-wide byte-range fetch over the published layerlayerOne transformer block — attention plus a feed-forward network, with normalization and residual connections — applied to every position. Stacking layers lets the model build up richer representations; Mailwoman's encoder has 6. is pathological (see the Search-live bullet above). The CLI and the
mailwoman_poi_searchMCP tool do brand-exact lookups server-side against a builtpoi.dbin sub-millisecond time. - Free-text (FTS5FTS5SQLite's built-in full-text-search module (with BM25 ranking). Mailwoman uses it for prefix and name matching against the gazetteer.) name search. The CLI + MCP tool also expose FTS5FTS5SQLite's built-in full-text-search module (with BM25 ranking). Mailwoman uses it for prefix and name matching against the gazetteer. name search against
poi.db; this browser tester stays intent + category-k-ring, matching the runbook's multi-hop exclusion for the demo.