Reproducible file manifests
ferrule records what is in a directory — names, sizes, modes, hashes — into a single plain-text manifest, and tells you later exactly what changed.
$ ferrule seal ./build -o build.frl
sealed 1,284 files (412.6 MiB) in 3.1s
$ ferrule verify build.frl
modified lib/parser.so
missing share/locale/nb.mo
added .cache/tmp8812
3 differences, 1281 files unchanged
Manifests are line-oriented text, sorted, and free of timestamps that vary between runs. The same tree produces the same manifest byte-for-byte on any machine, which makes them easy to keep in version control and to diff with the tools you already have.
Why it exists
Release archives get rebuilt on different machines by different people. Backups get restored onto filesystems that quietly drop a permission bit or normalise a filename. In both cases the question is the same and boringly practical: is this the same tree as before, and if not, which files moved? ferrule answers that in one command and nothing else.
What it does
- Deterministic output
- Sorted by path, no locale dependence, no access times. Diffs stay readable.
- Records what actually matters
- BLAKE3 content hash, size, mode, symlink target, hardlink groups. Extended attributes and ownership are opt-in.
- Streams
- Constant memory regardless of tree size. Hashing runs across all cores; a cold 400 GiB tree is I/O-bound, not CPU-bound.
- Optional signatures
- Sign a manifest with an Ed25519 key so a restored backup can be checked against a key you keep elsewhere.
Install
Static binaries for Linux, macOS and Windows are on the download page. No runtime, no configuration file.
curl -LO https://ferrule.merzley.xyz/dl/ferrule-0.9.4-linux-x86_64.tar.gz
tar xzf ferrule-0.9.4-linux-x86_64.tar.gz
sudo install -m755 ferrule /usr/local/bin/
ferrule is a personal project, maintained in spare time. It is stable enough that I use it for my own backups, but the manifest format may still change before 1.0 — see the format notes.