"Source media is immutable from the player. Every code path, including screenshots and subtitle handling, writes outside the source directory."
A Promise Is Only as Real as Its Proof
"The player never modifies your files" is easy to say and easy to violate by accident. A screenshot saved next to the video. A subtitle cache written into the source folder. An 'optimize' pass that rewrites a container. A metadata tag helpfully added. None of these feel like vandalism while you're coding them — and every one of them breaks the single promise a player over someone's irreplaceable archive must keep.
Ashen Reel makes the promise concrete: every write path goes outside the source directory. Screenshots land in a destination the user chose. Caches live in the app's own Caches folder. Local state lives in Application Support. The source folder is a place the player reads from and never, ever writes to.
Prove It With a Before-and-After Audit
The way you keep a read-only promise honest is to test it like an attacker would: hash the source, put the player through its most write-tempting paces — open, seek, screenshot, load external subtitles, crash and recover — then hash again and demand they match. This runs on every corpus item, silently, as the most important test in the suite.
The audit is a handful of shell lines, and it's the difference between hoping and knowing:
.DS_Store or sidecar dropped in the folder, a 'last opened' timestamp written back. The audit checks hash AND metadata AND the directory contents precisely because the dangerous mutations hide in the details.Even Screenshots Respect It
Screenshots are the tempting exception — surely a screenshot is a new file, not a mutation? Yes, and Ashen Reel still routes it outside the source directory, to a destination the user picks and can reveal. It preserves the source's high bit depth with lossless PNG rather than quietly downsampling, and it bypasses subtitle compositing when no subtitle is showing. A screenshot creates something new somewhere safe; it never leaves a footprint next to the original. The read-only promise has no exceptions, not even the convenient ones.