LENSMAP-AI

A city guide that can’t put a made-up place on the map.

OPENSTREETMAPGROUNDED IDSNAME MATCHING RU · UZ · ENEVENT EXTRACTIONNODE.JS · TYPESCRIPT · LEAFLET
SHOHFARM
SET APTEK +03
DORI-DARMON №2
CITY PHARM
+03 · RECOVERED
HOTEL IMAGINARY · NO CARD
RECORDED ANSWER
“NEAREST PHARMACY THAT IS OPEN NOW” · 23:30 · COLD CITED 4 · RECOVERED 1 · REJECTED 0
MAP DATA © OPENSTREETMAP CONTRIBUTORS · PINS ARE SCHEMATIC
CHECK TABLEONE ROW PER ID
CITED IDHANDED OUT?RESULT
osm:node/1780600186YESKEPT
osm:node/4539623908YESKEPT
osm:node/4272968892YESKEPT
osm:node/12977821749YESKEPT
osm:node/10199390796NAMED, NO IDRECOVERED
osm:node/999 INJECTEDNOREJECTED

THE LAST ROW IS WHAT THE DEMO’S “INJECT A MADE-UP ID” SWITCH ADDS. NO RECORDED ANSWER HAS INVENTED AN ID — YET.

EVENT EXTRACTIONPOSTS → PINS
SATPremiere at Ilkhom! … Saturday, 10 October, 19:00SAT 19:00 · ILKHOM THEATRE• PIN
SUNThis Sunday at 11:00 there’s an origami workshop for kids in the Japanese Garden!SUN 11:00 · JAPANESE GARDEN• PIN
FRIJazz night this Friday… The Silk Road Trio plays two sets at Bootlegger from 8 pmFRI 20:00 · BOOTLEGGER• PIN
FRIBoard game night this Friday from 19:00! We’ll confirm the venue closer to the dateNO VENUE NAMED · CITY CENTRE? APPROX
—We’re looking for volunteers for the autumn festival team!NO EVENT IN THIS POST— NONE

THE PROBLEM

Ask a model for a quiet café nearby and it will happily recommend one that doesn’t exist, or closed years ago. In a map app every made-up place is a broken promise to the user.

WHAT I BUILT

The demo grew out of LensMap, my own city app.

  • An advisor for central Tashkent on an OpenStreetMap snapshot: 3,036 named places, opening hours, a demo clock and the weather.
  • Event extraction: Telegram-style posts become map pins with a date, a time and a venue.
  • An inspector under every answer: the check table, the prompt and the raw model output.

HOW IT’S CHECKED

  • The server hands the model a short list of real places and events near you, each with an id, and works out distances, opening hours and the weather itself.
  • Cards come only from ids the server handed out. A place named without an id is matched back by name, in Russian, Uzbek or English spelling; anything else is rejected and gets no card.
  • Extraction can’t invent a date or a place: the weekday written in the post beats a wrong date, past and far-off events are dropped, and coordinates come from the venue list, never from the model.
  • You can watch it work: an “Inject a made-up id” switch adds a fake place to the model’s answer before the check runs.

WHAT THE DEMO SHOWS

Ten recorded advisor answers and nine extraction runs replay without an API key. In all ten answers the model cited only real places — the rejected row on this page comes from the inject switch.

3,036Named places from OpenStreetMap, 1,089 with opening hours
RU · UZ · ENPlace names matched in three spellings
11 EVENTSFrom 10 posts: 10 exact pins, 1 approximate
31 TESTSId checks, name matching, dates, geocoding
The demo: four recommendations for a rainy evening check out, and the injected Hotel Imaginary is rejected in the check table
REAL SCREENSHOT · RAIN AT 18:30, WITH THE INJECT SWITCH ON
RUN ITNODE 22 · NO API KEY NEEDED
$ git clone https://github.com/nrmnprm/lensmap-ai
$ cd lensmap-ai && npm install
$ npm start # http://127.0.0.1:4310
→ without a key: replays the recorded answers
→ with a key in .env: live answers