npx skills add ...
npx skills add useosint/skills --skill where-was-this-taken
End-to-end workflow to establish where and when a photo or video was captured and whether it is authentic — evidentiary handling, metadata extraction, reverse image search for provenance, visual geolocation, chronolocation from shadows, and manipulation checks, ending in a location finding with a stated confidence radius. Use when asked to verify where an image was taken, confirm or refute a claimed location or date, or authenticate media before relying on it. Applies to insurance claims, litigation evidence, disinformation analysis, and conflict and human-rights documentation. Reference at useosint.com/skills/where-was-this-taken.
npx skills add useosint/skills --skill where-was-this-taken
Input: an image or video file, or a URL to one. Output: a location with a confidence radius, a time window, an authenticity assessment, and the evidence chain for each.
This workflow orchestrates. The technique detail lives in secrets-in-file-metadata,
find-the-original-image, geolocate-from-pixels and is-this-photo-real — run
those, don't reimplement them here.
The order matters more than anything else in this file. Metadata before analysis, because analysis destroys metadata. Provenance before geolocation, because the original's caption often is the location. Authenticity checks before you commit, because geolocating a composite gives you a confident answer to the wrong question.
Read ../../ETHICS.md. Then state, in writing, before you open the file:
Done when subject, objective, bounds, jurisdiction and publication floor are written down in the case file.
Everything downstream is worthless if you contaminate the original.
yt-dlp and keep the sidecar JSON.sha256sum evidence.jpg. A second
algorithm costs nothing and pre-empts an argument.evidence_crop-sign.png,
evidence_flop.jpg.Done when the original is hashed, read-only, and its acquisition path recorded, and every subsequent step is operating on a named copy.
Run secrets-in-file-metadata before any transformation. Cropping, rotating,
upscaling or even opening the file in some editors rewrites tags.
Prioritise: GPS coordinates and GPSHPositioningError; GPSImgDirection, which
gives you the camera's bearing and lets you reproduce the exact view;
GPSDateStamp/GPSTimeStamp in UTC as the only timezone-anchored clock; the
timestamp triplet; device make, model and serial; the software chain; and the
embedded thumbnail for comparison against the main image.
If GPS is present you have a lead, not an answer. It is a writable field. Continue to step 5 and verify it visually; a metadata coordinate that a visual check confirms is a far stronger finding than either alone.
Done when metadata is extracted and recorded, or confirmed absent — and you have written "no EXIF present" rather than "EXIF removed".
Run find-the-original-image. For video, extract keyframes first and search several
of them.
You are looking for an earlier appearance, a different caption, a photographer
credit, and a date you can corroborate independently through read-deleted-pages.
Open the match pages and read them — the caption on the earliest copy frequently
names the place outright, which collapses steps 5 and 6 into a verification exercise
instead of a search.
If the media is older than the claim, or from a different country than the claim, you have your answer and it is a stronger answer than a coordinate.
Done when you have either an earliest-known publication with its date and caption, or a documented null across at least three engines including crops and a mirrored search.
Run geolocate-from-pixels. Inventory clues before searching, rank them by
geographic specificity, fix the country from language, plates, driving side and road
markings, then narrow to a site and confirm in satellite and street-level imagery.
If step 3 gave you coordinates, do this anyway as an independent test rather than
navigating straight to the coordinate and confirming what you were told. Use
GPSImgDirection to reproduce the camera bearing and check that the view matches
what a camera at that position pointing that way would see. A bearing that points at
a blank wall means the coordinate is wrong.
Done when you have a candidate location with a stated radius and a written list of the specific features you matched — or a documented region-only result with the reason you could not narrow further.
Still in geolocate-from-pixels, using its chronolocation reference. Shadow azimuth
for the sun's bearing, shadow-length ratio for its elevation, then solve against a
sun-position calculator for the confirmed location. Expect two date bands, not one,
and break the tie with foliage, snow, crop stage, or a dated object in frame.
Corroborate against a weather archive and note which station you used and how far
away it is.
Reconcile the result against the metadata timestamps from step 3. Agreement between an unanchored EXIF datetime and an independently derived sun position is one of the strongest corroborations available in this whole workflow, because the two have no common failure mode.
Done when you have a time-of-day range and a date band, each graded, with the discriminator you used named — or an explicit statement that the date remains two-banded.
Run is-this-photo-real. At minimum: the physical-consistency checks — shadow
convergence across multiple objects, reflection geometry, perspective and scale — and
the internal-consistency sweep against your own step 5 findings.
The specific failure this step is here to catch: you have just geolocated a scene that was assembled from two photographs, or generated. A composite geolocates beautifully and means nothing. If shadow convergence fails or an element carries no optical signature, your location finding applies to the background plate only, and you must say so.
Done when manipulation and synthesis are assessed, each graded, with signal-level tests either run or explicitly marked invalid for the copy you hold.
Lay the independent lines of evidence side by side and ask what agrees.
The standard: three mutually independent non-transient features matching reference imagery makes a location. Independence is the requirement people fudge. Three photographs of the same sign is one feature. A building footprint, a utility pole line and a ridgeline profile are three. Metadata GPS plus a visual match plus a sun-position-consistent shadow are three, and they are independent because forging all three coherently is hard.
Then run the falsification test you should have written in step 5: name the single observation that would kill your candidate, go look for it, and record that you did. A finding nobody tried to break is not a finding.
Grade the composite honestly:
Done when each of location, time and authenticity carries a grade and the evidence it rests on, and any contradiction between lines of evidence is stated rather than reconciled away.
GPSHPositioningError if the finding rests on metadata, the resolution
of the reference imagery if it rests on a satellite match, the size of the area
consistent with your matched features if it rests on visual work.Done when the finding is written with a radius, a grade, its matched features and its assumptions, at the precision step 1 authorised.
Run write-the-intel-brief with the graded findings, the evidence chain, the hashes
from step 2, and the archived reference links.
New selectors this workflow produces, and where they go: business names and municipal
bodies to x-ray-a-company; phone numbers from signage to whose-number-is-this;
domains on signs or vehicles to who-owns-this-domain; named or credited individuals
to find-anyone; posting accounts to hunt-a-handle and
pattern-of-life-from-socials; aircraft or vessels in frame to
track-planes-and-ships; several related locations to graph-the-network.
Done when the brief is delivered, the case file retains the original hash and the derivative chain, and data you no longer need for the stated objective is deleted.