Physics-based authenticity clues for sky videos. No ML. No dependencies.
AI video generators can now produce photorealistic "UFO sightings" in seconds. Trained classifiers try to catch them — and age with every new model generation, failing with confidence on footage from generators they have never seen.
Physics does not age. A video that went through a real lens and a real sensor
carries physical signatures that generators imitate poorly, because they were
never part of the training objective. sky-proof measures three of them:
| Clue | Real camera | Generated / heavily processed |
|---|---|---|
| Photon shot noise | Noise grows with brightness (variance ∝ signal — a law of the sensor) | Flat, uniform or absent grain |
| Hand-held micro-shake | 1–8 Hz muscular tremor, impossible to suppress voluntarily | Sweeping pans of unreal, glassy smoothness |
| Frame cadence | Every frame is unique | Duplicated / interpolated frames to fake the advertised fps |
Every check is a few dozen lines of arithmetic you can read and audit — no model weights, no black box, no network calls.
No clue is proof. Heavy compression (WhatsApp re-shares) crushes sensor
noise. Software stabilization smooths shake. A tripod removes it legitimately.
sky-proof reports each clue as consistent, atypical or not_measurable
(a tripod video gets "clue unusable", not a strike against it), and its
summary vocabulary is deliberately cautious:
2 atypical clues out of 3 measurable — profile compatible with AI-generated or heavily processed footage. No clue is proof: ask for the original file.
If a tool in this space sounds more confident than that, distrust the tool.
Requires ffmpeg in PATH (decoding only — analysis is
pure Rust).
$ cargo install --path .
$ sky-proof sighting.mp4
sky-proof report — 512 frames, 17.1s
------------------------------------------------------------------------
[ ok ] Sensor noise (photon shot noise)
noise level σ ≈ 1.91, noise/luminance correlation 1.00 — a real
camera is noisier in bright areas
[ ok ] Hand-held micro-shake
shake amplitude 0.63 px (downscaled) — hand-held footage always
trembles; sweeping yet perfectly smooth motion is unusual
[ ok ] Frame cadence
0% near-identical frames
------------------------------------------------------------------------
3/3 clues consistent with a real camera. No synthesis anomaly found — this
is not proof of authenticity, but nothing is off.--json for machine-readable output. Exit code 1 when ≥ 2 clues are
atypical (useful in pipelines).
use sky_proof::Analyzer;
let mut an = Analyzer::new(width, height);
for (gray_frame, t_ms) in frames {
an.push_frame(&gray_frame, t_ms)?;
}
let report = an.finalize();
println!("{}", report.summary);Zero dependencies. The whole analysis is streaming: constant memory, ~1 ms/frame on a laptop for 1080p.
cargo test generates two synthetic videos from scratch — a "real camera"
one (luminance-dependent noise, hand tremor, clean cadence) and an "AI-like"
one (flat faint grain, glassy pan, 50% duplicated frames) — and asserts the
first passes while the second is flagged. No fixtures, no downloads.
drakkB/skyengine— a dependency-free 3D planetarium engine in native canvas 2D (5,044 real stars, ~28 KB).sky-proof(this repo) — physics-based authenticity clues for sky videos.
Same house rule for both: zero dependencies, readable source, no black box.
sky-proof is the authenticity engine of
VigiSky Sentinel, a free desktop station for
methodical sky-observation review (astronomy-grade photo analysis, video
motion tracking, cautious verdicts — never "UFO detected"). The method is
explained for humans at
vigi-sky.com/verify-ai-video.
Roadmap: sub-pixel optical-flow registration to measure texture boil (temporal morphing) rigorously — the current version deliberately ships without it rather than shipping a clue that false-flags real hand-held footage.
MIT