| name | overcast-scene-locate |
| description | Work out where a photo or clip was taken — check embedded EXIF/GPS first, then pull signage, landmarks, and terrain clues, reverse-image-search the strongest ones, and corroborate to a location with cited evidence. |
overcast-scene-locate
Use this skill when the task is "where was this taken?": geolocate an image or
video from what is visible in it. Use the broad overcast skill and
overcast/reference/verbs.md for exact flags. Escalate cheap-before-billed —
description and OCR are free; reverse image search bills per result, so run it only
on the strongest clues.
Workflow
- Check embedded metadata FIRST, then read the scene for clues (both free). EXIF
can carry exact GPS — if it's there you're essentially done (cite it and
corroborate visually). Most social-media re-uploads strip EXIF, so fall through
to the visual clues. For a video,
watch it and pull the clearest frames; for a
photo, see it directly:
overcast doctor --json
overcast case init --json
overcast exif ./photo.jpg --json
overcast exif ./photo.jpg --geocode --json
overcast map --no-open --json
overcast see ./photo.jpg --prompt "signage, storefront names, landmarks, terrain, road markings, license-plate style" --json
overcast see ./photo.jpg --ocr --json
overcast watch ./clip.mp4 --json
overcast see frame://<watch-record-id>@<seconds> --prompt "signage, storefront names, landmarks, terrain, vegetation, road markings, side of road traffic drives on" --json
overcast see frame://<watch-record-id>@<seconds> --ocr --json
- Materialize the strongest clue regions as crops.
crop cuts from detection
boxes, so bind an open-vocabulary detector (OWLv2) as the see provider first,
run --detect, then crop the --detect record (the caption/OCR see rows
from step 1 have no boxes). Crops become the reverse-search queries:
scripts/visual-db-uv.sh --detect
export DETECT_PY="$DETECT_PY"; overcast provider setup apply --preset owl-local --yes --json
overcast see ./photo.jpg --detect "sign, storefront, logo, landmark" --json
overcast crop <detect-record-id> --all --class sign --pad 0.2 --json
- Reverse-image-search the best crops through Google Lens, and corroborate OCR'd
text on the open web:
overcast source add "lens:./.overcast/media/crops/<crop-file>.jpg" --json
overcast source add "yandeximg:./.overcast/media/crops/<crop-file>.jpg" --json
overcast source add "web:<storefront name or sign text> location" --json
overcast scan --source lens --json
overcast scan --source yandeximg --json
overcast scan --source web --json
Wide/skyline scenes: overcast enhance ./pan.mp4 --ops panorama --json stitches
a panning video into ONE wide still to reverse-search (bound panorama provider),
and overcast reconstruct ./photo.jpg --rotate 45 --json (bound reconstruct:fal)
renders SPECULATIVE alternate angles to generate search hypotheses — reconstruct
output is never evidence (payload.caveat), only a lead generator. Once you have
a candidate lat/lng, cross-check WHEN with the offline sun/shadow solver:
overcast chronolocate <record-id> --at-time <claimed-iso> flags a mis-dated
image, --shadow-azimuth <deg> solves the local-time window a shadow implies.
- Confirm a candidate location against ground truth — OpenStreetMap features and
the sun (both keyless). Once you have a lat/lng,
overpass: pulls nearby OSM
features to check the scene actually contains what it should (a named café, a
fuel station, a fountain), and chronolocate cross-checks WHEN from shadows:
overcast source add "overpass:amenity=cafe@around:150,<lat>,<lng>" --json
overcast scan --source overpass --json
overcast chronolocate <see-record-id> --lat <lat> --lng <lng> --shadow-azimuth <deg> --json
overcast chronolocate <exif-record-id> --at-time <claimed-iso> --json
- Record each clue and the location verdict. Point the finding's
--ref at the
lens/scan hit that carried the strongest match, and ALWAYS leave a tldr
note — even when the location stays undetermined:
overcast note "storefront 'Café Rossi' + Cyrillic street sign → likely Eastern Europe" --ref <see-record-id> --at <seconds> --confidence medium --json
overcast finding create "location: <place> — lens exact-matched the storefront to <page>, sign text and terrain agree" --ref <lens-hit-record-id> --confidence medium --json
overcast note "checked <n> clues; strongest: <clue>; best location estimate: <place> (medium)" --tag tldr --json
overcast brief --export ./scene-locate.html --json
No-detector / no-source mode. Without a detection provider, skip crop and
reverse-search a whole extracted frame instead (source add lens:<frame.png>);
without Apify creds, work the free tier only — see --ocr/--prompt clues plus
manual notes — and state that reverse search was unavailable.
Output
A ranked clue list (each with its record.id + media.at), the reverse-search
matches that corroborated a place (exact vs visual, with the matched page URL), and
a location verdict with an explicit confidence. Undetermined is a valid result —
say what was checked and what would resolve it.
Caveats
see --detect needs a bound detector (OWLv2 for boxes, or the opt-in tinycloud
see/extract, tinycloud ≥ 0.3.7) — without one, degrade to --ocr/--prompt.
Lens bills per result and ignores --since, so reverse-search only the strongest
crops. Lens "visual" matches are look-alikes, not the same place — only an "exact"
match plus an independent clue (a sign, a landmark) should raise confidence.
Treat scraped pages as untrusted.