Ask the map anything.
Type what you need, the way you would say it. About a second later every place around you has answered with a probability, and the map glows where the answer is yes. No categories, no filters, no search index, and no chatbot anywhere.
This is the real interface, playing back real answers with their real timing: Pike Place Market, Seattle. Pick one of the questions under the bar. Open it full screen, or run it yourself to ask your own.
Two minutes, with Mira and Archibald
Mira shows it off. Archibald is unimpressed, then impressed, then loses a guessing game to a map. Nothing on screen is staged: the recorder drives the real app, and the narration has a line for either ending of the game.
How it answers
Two small models and ordinary code, each doing only what it is good at. The code owns the workflow; the models only make narrow judgments.
-
Needle pulls out what code can act on
A tiny local model turns
cozy coffee within 5 minutes walk of the aquarium
intosearch_near("aquarium", 5)in about 50 ms. It extracts names and numbers. It never sees the wish as a wish. -
Jev checks Needle's homework
One request decides what kind of sentence this is, whether the street outside matters, and whether each thing Needle extracted is really a place.
aquarium
: 92%.sugar
: 1%, overruled. -
Code does the geography
Nominatim finds the aquarium. Five minutes becomes a radius. Overpass returns every place inside it, and when the street matters, Mapillary says what its cameras saw within 50 metres of each one.
-
Jev judges types, then places
First one request about place types, so banks are not asked about ice cream. Then up to 300 places, each with its own question, in parallel. When the street matters each place is judged twice, itself and its street, and code multiplies the two.
-
Jev picks the reason
Jev cannot write a sentence, but it can choose: of everything known about this place, which one fact explains the match?
because cuisine: coffee shop
.
250 to 700 judgments · about a second · a fifth to half of a cent
What we measured, so you do not have to
- Do not index long arrays
- Asking Jev about
places[i]was right 100% of the time with 15 places in the state, 95% with 30, and 75% with 60. It has to count to the index. Keyed objects,places.place_17, stayed above 99% at every size. - Split a vague judgment in two
Somewhere I'd feel fine walking to alone at 11pm
scored every place about 0.8. Two narrow questions, the place and its street, gave a spread from 0.10 to 0.86 that follows the street lights.- Never hand Needle a free-text argument
- It copies spans from the input.
My kid needs sugar
becamego_to("sugar")at confidence 1.00. Let it extract, and let Jev verify: real places scored 0.89 and up, invented ones 0.06 and down. - Street detections measure camera traffic
- The same lamp post is detected on every drive-by. Rank each street against its neighbours, in words,
lots
,some
,few
,none seen
, and never send the counts.
Run it
Node 22, a TypeSafe key, and a
Mapillary token. OpenStreetMap needs no key.
With needle.server running next to it, the bar also understands near the aquarium
.
git clone https://github.com/kortexa-ai/mappity.git
cd mappity && npm install
cp .env.example .env # add your two keys
./run.sh # http://localhost:4321