PRESENT
A veil showed up.
Spatial, frequency, residual, ResidualCNN, or FSNet agreed something is hiding. CLI only. JPEG files take the FSNet blend. Default present uses the generator-photo cut (~0.67).
SPECIMEN 001 · LOCAL · v2.7.0
Presence + keyless text
Drop a PNG or JPEG. This tab hunts sequential LSB, scanline tokens, PNG tEXt/zTXt/iTXt, and JPEG comments, then prints the string. Presence, JPEG container inspect, and FSNet stay on the local CLI. Nothing is uploaded. Nothing is stripped.
Decode stays in this tab. Scan, inspect, doctor, and bench run on your machine.
Local tab No upload No strip CLI presence
Drop a PNG or JPEG to read keyless text. Nothing leaves this tab.
READOUT · KEYLESS PLAINTEXT
Drop a plate or load the marked specimen.
LSB, scanline tokens, PNG tEXt/zTXt/iTXt, JPEG comments. Encrypted and vendor marks will not print.
002
PRESENT
Spatial, frequency, residual, ResidualCNN, or FSNet agreed something is hiding. CLI only. JPEG files take the FSNet blend. Default present uses the generator-photo cut (~0.67).
ABSENT
The ensemble did not fire. That is a reading, not a promise the file is clean in every latent space.
READ
Sequential LSB, a scanline token, a PNG tEXt/zTXt/iTXt chunk, or a JPEG comment held a string. This tab can print it.
UNKNOWN
Encrypted stego, SynthID, Digimarc, and neural marks stay silent. A miss is better than a fake strip.
003
LSB lives in bits. Tree-rings live in frequency. Training one net on both drowns the other. VeilScan keeps ResidualCNN on LSB and FSNet on frequency, then fuses only the heads that earned a peak. Decode is a separate walk. JPEG files are inspected as JPEG, not guessed from 8x8 ringing.
004
SPECIMEN PROTOCOL · LOCAL ONLY
cd veilscan
py -3 -m pip install -e .
py -3 -m veilscan inspect path/to/image.jpg
py -3 -m veilscan decode path/to/image.png
py -3 -m veilscan scan image.jpg --json --heatmap overlay.pngpy -3 -m veilscan inspect image.jpg --policy bothpy -3 -m veilscan decode image.png --jsonpy -3 -m veilscan doctorpy -3 -m veilscan batch folder --jsonpy -3 -m veilscan selftest --per-detectorpy -3 -m veilscan bench --covers photos --n 50 --attacks identity,jpeg_70,jpeg_50 --write-operating-pointLab note
005