Every shadow on the ground points directly away from one sun. A generator has to fake that for every object in the frame. Try the slider, then switch on two suns.
Sun elevation
--
Azimuth
--
Shadow length
none
Local time
--:--
Place
--
Each light line runs from a shadow tip through the top of its object. Real light lines all meet at one sun.
Try it on a file we chose.
Each button sends a file through the same engine your upload would reach. Nothing here is a recording of an earlier run unless the row says so.
The files and their claims come from the engine. Eight marks, one for each check, report what it is doing as it does it.
Reaching the engine
An outdoor photo from a real camera
Image
SynthScan
PatternScan
ShadowProof
WeatherCheck
PulseCheck
EyeMirror
HumPrint
Provenance
A street scene made by an image generator
Image
SynthScan
PatternScan
ShadowProof
WeatherCheck
PulseCheck
EyeMirror
HumPrint
Provenance
An audio clip with a hidden cut
Audio
SynthScan
PatternScan
ShadowProof
WeatherCheck
PulseCheck
EyeMirror
HumPrint
Provenance
Six physics checks, from morning to the next dawn.
Each one measures something a generator has no reason to get right. Scroll, and the sun over your own city moves with you: this page runs on the same solar equations.
Morning
ShadowProof
Do the shadows match the sun?
A line from a shadow's tip through the top of its object points at the sun. In one photo, every such line meets at one point. TruthKit measures the sun's height from those lines using gravity and focal length, then compares it with where the sun stood at the claimed time and place.
Limit. Needs an upright object and its shadow on flat ground. No shadows means Inconclusive.
Noon
WeatherCheck
Was the sky like that?
It reads the scene for itself: clear or overcast, hard shadows, wet ground, day or night. Then it asks the Open-Meteo archive what the weather was at that hour and place, and sets the two side by side.
Limit. The archive describes a grid square and an hour, not your street, so this check counts for little alone.
Afternoon
PulseCheck
Is there a pulse in the face?
Each heartbeat changes skin colour very slightly. TruthKit follows that signal in the forehead and both cheeks and looks for one steady rhythm across all three. A pass reads: consistent with a live pulse.
Limit. Deepfakes can carry a pulse, and compression can erase a live one (Seibold et al., 2025). No stable pulse is Inconclusive, and this check never decides alone.
Dusk
EyeMirror
Do both eyes reflect the same light?
Two eyes looking at one scene mirror the same lights. TruthKit finds the highlight in each iris, aligns the two and measures their overlap as intersection over union, where 1 is identical.
Limit. Needs a sharp, front-facing face with clear reflections. Head angle and glasses change the reading, so it counts for little alone.
Night
HumPrint
Does the power-grid hum hold together?
Mains power hums near 50 or 60 Hz and drifts every second. Microphones pick it up, loudest at night when other noise drops. A cut leaves a sudden break in that hum, and in Great Britain the drift can be matched to the published grid record to date a recording.
Limit. Needs audible mains hum. Timestamps work for Great Britain only, the one grid with a usable open record here.
Dawn
Provenance
What does the file say about itself?
It reads Content Credentials (C2PA), camera metadata and known generator markers, then validates any signature it finds. A valid credential tells you who signed the file and what they say was done to it.
Limit. Metadata is easy to strip, so a missing credential says nothing either way. A valid one names a signer. It does not show the scene happened.
Place
Local time
--:--
Sun
--
“That video is fake.”Four words, and a truerecording stops counting.
Bobby Chesney and Danielle Citron named this the liar's dividend (California Law Review, 2019): the benefit a liar gets from everyone knowing fakes exist.
It proves real things too.
Someone films a flood. Someone else, with a reason to, waves it away as made up. The more people hear about fakes, the easier that gets, and it costs nothing to say.
So TruthKit works in that direction as well. When the shadows fit that day's sun and the hum runs without a break, the file has evidence on its side, signed, that anyone can check for themselves.
One result from this engine
Consistent Weak
The evidence is weakly consistent with this claim.
A real street market in strong sun, CC BY 4.0. Captured 31 October 2026.
Free, with 50 checks a month on the API. No prices, no sales call.
Banks
A customer sends a selfie video to open an account. PulseCheck and EyeMirror read it before a person does, and your system reads the signed result.
Insurers
A claim arrives with a photo of storm damage, said to be from last Tuesday afternoon. ShadowProof and WeatherCheck compare it with that afternoon's sun and sky.
{
"id": "d7ClCJdRwMA",
"status": "done",
"kind": "image",
"sha256": "d3f97376bae0399e22671796c85cbe1ca67af1cb5e989b6a5e2fee8dc7f73229",
"overall": {
"verdict": "verified",
"confidence": 0.45,
"weak": true,
"headline": "The evidence is weakly consistent with this claim.",
"reasons": [
"WeatherCheck (Consistent, 45% confidence): What the photo shows (a clear sky, hard shadows and daylight) is consistent with the weather record for 2026-01-14 05:00 UTC: 6% cloud cover and 0.0 mm of rain in that hour."
],
"text": "The result is Consistent, and it rests on little or low-weight evidence. The evidence is weakly consistent with this claim because WeatherCheck found that what the photo shows, a clear sky, hard shadows and daylight, is consistent with the weather record for 2026-01-14 05:00 UTC: 6% cloud cover and 0.0 mm of rain in that hour, with 9 of 9 runs agreed. PulseCheck, HumPrint and EyeMirror were not applicable. The measurements fit the claimed time and place, which cannot rule out a staged scene.",
"text_source": "gemini:gemini-3.5-flash-lite",
"checks_counted": [
"weathercheck"
]
},
"report_id": "09295f150a903595",
"checks": {
"eyemirror": {
"verdict": "not_applicable",
"confidence": 0,
"summary": "No face was found in this file, so there are no eyes to compare."
},
"humprint": {
"verdict": "not_applicable",
"confidence": 0,
"summary": "HumPrint reads mains hum in sound, and a photo has none."
},
"provenance": {
"verdict": "contradicted",
"confidence": 0.3,
"summary": "The file's metadata says it was made with an AI tool (an XMP metadata field (DigitalSourceType)). Metadata can be added or removed by anyone, so this is only a hint."
},
"pulsecheck": {
"verdict": "not_applicable",
"confidence": 0,
"summary": "PulseCheck measures colour changes over time, so it needs a video. A single photo has none."
},
"shadowproof": {
"verdict": "inconclusive",
"confidence": 0,
"summary": "The measured sun does not match the claim, but only automatic pairs support that. Confirm the shadows on the shadow screen before relying on it."
},
"weathercheck": {
"verdict": "verified",
"confidence": 0.44999999999999996,
"summary": "What the photo shows (a clear sky, hard shadows and daylight) is consistent with the weather record for 2026-01-14 05:00 UTC: 6% cloud cover and 0.0 mm of rain in that hour."
}
},
"finished_at": "2026-10-31T06:12:44.970747+00:00"
}
A real response, captured 31 October 2026. Per-check evidence and signed file links are left out here for length.
It does not analyse voices. A cloned voice on a clean recording passes through HumPrint untouched.
Files with nothing to measure
The checks need shadows, mains hum or a visible face. Without them they say Not applicable or Inconclusive, and they mean it.
Timestamps outside Great Britain
Dating a recording needs a grid record, and the only one here is GB. Elsewhere cut detection still runs, and the timestamp test returns Inconclusive.
A clean answer on every file
Many ordinary files come back Inconclusive. A wrong verdict would be far worse than an honest lack of signal.
Proof that something happened
Physics can say consistent or contradicted, nothing stronger. A staged scene under the right sun is still consistent with that sun.
Catching every deepfake
Deepfakes can carry a pulse from the person driving them. A fake that gets the light right will pass the light checks.
Measured so far
From our own benchmark, run 30 October 2026, across 356 openly licensed or scripted files. These describe this benchmark only, not your files.
Check
Rows run
Coverage
Recall
False alarms
WeatherCheck
77
84.4% 65/77
84.2% 32/38
0.0% 0/30
PulseCheck
20
0 of 17
--
--
EyeMirror
57
14.5% 8/55
0 of 7
2 of 6
HumPrint
138
18.1% 25/138
29.4% 20/68
0 of 5
Provenance
64
14.1% 9/64
7 of 15
--
Coverage is how often a check gave an answer at all. Recall counts an Inconclusive on a known fake as a miss. A percentage appears only with at least 20 rows behind it, otherwise the plain count.