Start-up comes first
Files an application opens while starting go to the front of the image. Background workers decode them and hand the bytes to the kernel page cache before anything asks.
read-only · compressed · deduplicating
stipplefs is a filesystem image format and FUSE mount for Linux. It packs a directory into a single compressed, deduplicated, checksummed file, then mounts it so an application starts almost as fast as it would from disk.
Blender 5.2, a 1.4 GiB application tree, packed with the defaults and a hot list, then launched in the background on a 16-thread machine. The build took 86 seconds. How the defaults were chosen
Files an application opens while starting go to the front of the image. Background workers decode them and hand the bytes to the kernel page cache before anything asks.
Content-defined chunking finds shared runs of bytes between files that differ, so near-copies cost almost nothing.
Every block is also tried through an x86 branch filter, and the smaller encoding wins. Native code gives the compressor far more to work with.
The superblock, every metadata section and every block carry an XXH3 digest. Nothing is returned before it is verified.
Every offset is relative to the image, so an image can sit at any position inside a launcher, an executable or an archive.
A normative spec, checked by an independent reader in the test suite, with a canonical encoding that makes builds reproducible.
The superblock and metadata are verified, then the mount answers lookups at once.
Workers decode the hot region, one block each, in parallel.
Decoded file bytes go straight into the kernel's page cache.
The application reads from memory. Blocks it never asks for are never decoded.
Build an image from a directory, verify every byte of it, and mount it. The same image can be extracted back to a directory or read straight from Rust.
Walk through the quick start →$ mkstipple /usr/lib/python3.14 python.stipple
building python.stipple from /usr/lib/python3.14: block size 33554432, level 19, 16 threads
[ 0.7s] placing 3595/3595 files, 69.2 MiB read
[ 18.1s] compressing 2/2 blocks, 53.8 -> 12.3 MiB (22.9%), 3.1 MiB/s
wrote python.stipple (12959744 bytes) from /usr/lib/python3.14
$ stipple check python.stipple | tail -1
verified 72555234 bytes read and checksummed in 0.084 s (827.8 MB/s)
$ stipple mount python.stipple ~/mnt
mounted on /home/you/mnt, interrupt to unmountOne Rust crate, two command-line tools, and a specification precise enough to write your own reader.