Documentation
Everything you need to get pinemere running. Start with installation, then work through the quickstart.
What pinemere does
Pinemere is a file synchronization tool that uses content-addressed storage and Merkle-tree deduplication. Instead of comparing file paths and timestamps (like rsync), it hashes file contents into blocks and only transfers blocks that don't already exist at the destination.
The result: moving, renaming, or duplicating files costs almost nothing to sync. If two files share content (even partially), the shared blocks are stored and transferred once.
Core concepts
Pools
A pool is a directory that pinemere manages. When you run pinemere init ./photos, pinemere creates a hidden .pinemere/ directory inside ./photos containing the block index (a SQLite manifest) and configuration. The pool tracks every file's content hash and block map.
Targets
A target is a remote (or local) destination where pinemere sends data. Targets are defined in pinemere.toml at the pool root. Each target has its own retention policy and sync schedule. During sync, pinemere queries the target for its block inventory, computes the diff, and streams only missing blocks.
Blocks
Files are split into variable-size blocks using Rabin fingerprinting (target size: 64 KB, range: 32–128 KB). Each block is identified by its BLAKE3 hash. Blocks are the unit of deduplication — if two files share a 64 KB region, that region is one block referenced twice.
Quick example
$ pinemere init ./photos
Initialized pool (1,247 files indexed, 8.3 GB)
$ pinemere add-target nas --path /mnt/nas/photos-backup
Target 'nas' added
$ pinemere run --target nas
Resolving manifest ... done
Streaming changes ... 1,247/1,247
Verifying parity ... ok
✓ done in 4m12s peak 94.2 MB/s dedup ratio 1.00x
$ # Later, after adding 30 new photos and renaming a directory:
$ pinemere run --target nas
Resolving manifest ... done
Streaming changes ... 30/30 (1,217 skipped — already present)
Verifying parity ... ok
✓ done in 0.8s peak 38.1 MB/s dedup ratio 42.6x
The second sync transferred only the 30 new photos. The renamed directory was recognized by content hash — zero bytes transferred for those files.
Next steps
- Installation — get pinemere on your machine
- How Merkle-tree dedup works — deep dive into the chunking strategy
- Benchmarks — real-world sync performance numbers