Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Geocode, POIs, routes, timezones via OpenStreetMap/OSRM.
.claude/skills/nousresearch-maps/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 116% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 22% | 0% |
Location intelligence using free, open data sources. 8 commands, 44 POI categories, zero dependencies (Python stdlib only), no API key required.
Data sources: OpenStreetMap/Nominatim, Overpass API, OSRM, TimeAPI.io.
This skill supersedes the old find-nearby skill — all of find-nearby's functionality is covered by the nearby command below, with the same --near "<place>" shortcut and multi-category support.
nearbysearchreversenearbydistancedirectionstimezonearea + bboxPython 3.8+ (stdlib only — no pip installs needed).
Script path: ~/.hermes/skills/maps/scripts/maps_client.py
bashMAPS=~/.hermes/skills/maps/scripts/maps_client.py
bashpython $MAPS search "Eiffel Tower" python $MAPS search "1600 Pennsylvania Ave, Washington DC"
Returns: lat, lon, display name, type, bounding box, importance score.
bashpython $MAPS reverse 48.8584 2.2945
Returns: full address breakdown (street, city, state, country, postcode).
bash# By coordinates (from a Telegram location pin, for example) python $MAPS nearby 48.8584 2.2945 restaurant --limit 10 python $MAPS nearby 40.7128 -74.0060 hospital --radius 2000 # By address / city / zip / landmark — --near auto-geocodes python $MAPS nearby --near "Times Square, New York" --category cafe python $MAPS nearby --near "90210" --category pharmacy # Multiple categories merged into one query python $MAPS nearby --near "downtown austin" --category restaurant --category bar --limit 10
46 categories: restaurant, cafe, bar, hospital, pharmacy, hotel, guest_house, camp_site, supermarket, atm, gas_station, parking, museum, park, school, university, bank, police, fire_station, library, airport, train_station, bus_stop, church, mosque, synagogue, dentist, doctor, cinema, theatre, gym, swimming_pool, post_office, convenience_store, bakery, bookshop, laundry, car_wash, car_rental, bicycle_rental, taxi, veterinary, zoo, playground, stadium, nightclub.
Each result includes: name, address, lat/lon, distance_m, maps_url (clickable Google Maps link), directions_url (Google Maps directions from the search point), and promoted tags when available — cuisine, hours (opening_hours), phone, website.
bashpython $MAPS distance "Paris" --to "Lyon" python $MAPS distance "New York" --to "Boston" --mode driving python $MAPS distance "Big Ben" --to "Tower Bridge" --mode walking
Modes: driving (default), walking, cycling. Returns road distance, duration, and straight-line distance for comparison.
bashpython $MAPS directions "Eiffel Tower" --to "Louvre Museum" --mode walking python $MAPS directions "JFK Airport" --to "Times Square" --mode driving
Returns numbered steps with instruction, distance, duration, road name, and maneuver type (turn, depart, arrive, etc.).
bashpython $MAPS timezone 48.8584 2.2945 python $MAPS timezone 35.6762 139.6503
Returns timezone name, UTC offset, and current local time.
bashpython $MAPS area "Manhattan, New York" python $MAPS area "London"
Returns bounding box coordinates, width/height in km, and approximate area. Useful as input for the bbox command.
bashpython $MAPS bbox 40.75 -74.00 40.77 -73.98 restaurant --limit 20
Finds POIs within a geographic rectangle. Use area first to get the bounding box coordinates for a named place.
When a user sends a location pin, the message contains latitude: and longitude: fields. Extract those and pass them straight to nearby:
bash# User sent a pin at 36.17, -115.14 and asked "find cafes nearby" python $MAPS nearby 36.17 -115.14 cafe --radius 1500
Present results as a numbered list with names, distances, and the maps_url field so the user gets a tap-to-open link in chat. For "open now?" questions, check the hours field; if missing or unclear, verify with web_search since OSM hours are community-maintained and not always current.
"Find Italian restaurants near the Colosseum":
nearby --near "Colosseum Rome" --category restaurant --radius 500— one command, auto-geocoded
"What's near this location pin they sent?":
nearby LAT LON cafe --radius 1500"How do I walk from hotel to conference center?":
directions "Hotel Name" --to "Conference Center" --mode walking"What restaurants are in downtown Seattle?":
area "Downtown Seattle" → get bounding boxbbox S W N E restaurant --limit 30nearby requires lat/lon OR --near "<address>" — one of the two is neededfalls back between mirrors (overpass-api.de → overpass.kumi.systems)
distance and directions use --to flag for the destination (not positional)bashpython ~/.hermes/skills/maps/scripts/maps_client.py search "Statue of Liberty" # Should return lat ~40.689, lon ~-74.044 python ~/.hermes/skills/maps/scripts/maps_client.py nearby --near "Times Square" --category restaurant --limit 3 # Should return a list of restaurants within ~500m of Times Square
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 17,285 | 8,056 | -53% | 1 | 1 | 0% | 2,070 | 2,269 | +10% | 0 | 0 | — |
case-01 | fail→fail | 16,494 | 14,159 | -14% | 1 | 1 | 0% | 1,973 | 1,988 | +1% | 0 | 0 | — |
case-02 | fail→fail | 12,006 | 15,550 | +30% | 1 | 1 | 0% | 1,176 | 2,116 | +80% | 0 | 0 | — |
case-03 | fail→pass | 14,165 | 7,958 | -44% | 1 | 1 | 0% | 1,673 | 2,364 | +41% | 0 | 0 | — |
case-04 | fail→pass | 17,616 | 10,975 | -38% | 1 | 1 | 0% | 2,375 | 3,050 | +28% | 0 | 0 | — |
case-06 | pass→pass | 15,649 | 8,455 | -46% | 1 | 1 | 0% | 1,645 | 2,334 | +42% | 0 | 0 | — |
case-07 | fail→pass | 11,766 | 7,608 | -35% | 1 | 1 | 0% | 1,013 | 2,184 | +116% | 0 | 0 | — |
case-08 | fail→pass | 15,732 | 8,477 | -46% | 1 | 1 | 0% | 1,986 | 2,413 | +22% | 0 | 0 | — |
case-09 | pass→fail | 18,826 | 8,461 | -55% | 1 | 1 | 0% | 2,530 | 2,391 | -5% | 0 | 0 | — |
case-10 | pass→fail | 13,847 | 8,207 | -41% | 1 | 1 | 0% | 1,548 | 2,207 | +43% | 0 | 0 | — |
case-11 | fail→pass | 15,078 | 7,488 | -50% | 1 | 1 | 0% | 1,969 | 2,235 | +14% | 0 | 0 | — |
case-12 | pass→pass | 11,736 | 7,336 | -37% | 1 | 1 | 0% | 1,372 | 2,212 | +61% | 0 | 0 | — |
case-13 | pass→pass | 14,048 | 15,759 | +12% | 1 | 1 | 0% | 1,709 | 2,395 | +40% | 0 | 0 | — |
case-14 | pass→pass | 20,044 | 11,971 | -40% | 1 | 1 | 0% | 2,737 | 3,090 | +13% | 0 | 0 | — |
case-15 | pass→pass | 16,773 | 16,258 | -3% | 1 | 1 | 0% | 2,046 | 2,269 | +11% | 0 | 0 | — |
case-16 | fail→pass | 17,231 | 6,939 | -60% | 1 | 1 | 0% | 2,171 | 2,088 | -4% | 0 | 0 | — |
case-17 | pass→pass | 18,971 | 8,801 | -54% | 1 | 1 | 0% | 2,287 | 2,416 | +6% | 0 | 0 | — |
case-18 | pass→pass | 17,338 | 11,970 | -31% | 1 | 1 | 0% | 2,015 | 2,878 | +43% | 0 | 0 | — |
case-19 | fail→pass | 20,795 | 9,693 | -53% | 1 | 1 | 0% | 2,400 | 2,538 | +6% | 0 | 0 | — |
case-20 | fail→pass | 20,114 | 10,186 | -49% | 1 | 1 | 0% | 2,414 | 2,633 | +9% | 0 | 0 | — |
case-21 | fail→pass | 17,501 | 10,736 | -39% | 1 | 1 | 0% | 2,188 | 2,738 | +25% | 0 | 0 | — |
case-22 | fail→pass | 19,502 | 17,648 | -10% | 1 | 1 | 0% | 2,643 | 4,089 | +55% | 0 | 0 | — |
case-23 | fail→pass | 16,122 | 7,736 | -52% | 1 | 1 | 0% | 1,897 | 2,231 | +18% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 21 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +43 percentage points is the difference between those two pass rates over the 21 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.