When and where could this photo have been taken? Sun position, shadow-based time solving, EXIF consistency checks, perceptual hashing and Content Credentials detection. Python 3.10+ with Pillow, MIT licence. 10 tests.
Chronolocation, working out when an image was taken from the light in it, is a standard open-source verification technique. Most people do it by hand on a website. This tool makes it scriptable and repeatable:
| Command | What it answers |
|---|---|
sun |
Where was the sun at this place and time, which way do shadows point and how long are they? (NOAA solar position algorithm, refraction-corrected) |
solve |
I measured a shadow pointing N° from true north: at what times that day is that possible? Add the shadow/height ratio and the answer usually narrows to one window. |
inspect |
EXIF camera, time, UTC offset and GPS; Content Credentials (C2PA) presence; brightness. If time and place are known, it checks that the sun agrees: a bright photo stamped at night gets flagged. |
compare |
Perceptual hash (dHash) distance: is this the same picture recompressed, a light edit, or something else? |
pip install Pillow
python -m chrono sun --lat 51.9851 --lon 5.8987 --time 2026-09-27T09:00+02:00
python -m chrono solve --lat 51.969 --lon 5.918 --date 2016-01-10 --shadow-bearing 25 --utc-offset +01:00
python -m chrono inspect photo.jpg --utc-offset +01:00
python -m chrono compare original.jpg repost.jpgPhoto: Arnhem rijn.JPG by Maxxiwe on Wikimedia Commons (CC BY-SA 4.0; not redistributed here).
camera: Apple iPhone 5 · taken (EXIF): 2016:01:10 14:31:00 · GPS: 51.96904, 5.91837
sun at that time and place: azimuth 205.5°, elevation 12.4°, shadows point 25°
Reverse check with solve for a shadow bearing of 25° on that date: 14:16–14:42 CET, best 14:29, which matches the EXIF time. The same bearing in July gives 14:37 CEST, but with the sun at 58.5° instead of 12.5°. A shadow about 4.5× the height of the object that casts it (January) versus 0.6× (July) separates the seasons immediately.
Perceptual hash: a one-third-size, heavily compressed copy of the same photo scored 2/64 (same image). A copy with a sixth cropped off the top and left scored 22/64: dHash is not crop-robust, and the tool says so instead of claiming the images differ.
- Solar position accuracy is about ±0.5° in elevation for latitudes below ±70°.
- Shadow bearings must be measured against true north (map or satellite image), not a compass.
- EXIF is easy to edit or strip. It is a lead, not proof. C2PA detection checks presence only, not signature validity.
Cronolocalización de fotos: posición del sol y dirección de las sombras para un lugar y hora, cálculo inverso de la hora a partir de la sombra medida, coherencia entre EXIF, GPS y luz de la imagen, huella perceptual para detectar reutilizaciones y detección de Content Credentials (C2PA).