ferrule

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.