Repository navigation
v0.3.0 — Rewritten in Zig
The One Where We Rewrote Everything In Zig
Remember when we said .NET Native AOT was small? We lied. 12 MB for a hash map and a for loop was always embarrassing. So we rewrote the whole thing in Zig 0.15.2. The image is now 294 KB. Yes, kilobytes. The README is bigger than the binary.
What changed
- Zig 0.15.2 — One static binary. No libc. No runtime. No garbage collector. No exceptions. No regrets. Starts in microseconds because there's nothing to start.
- 9 architectures —
amd64,arm64,armv7,i386,riscv64,ppc64le,s390x,mips64le,loong64. We went from "runs on your server and your Mac" to "runs on your toaster, your mainframe, and that RISC-V board you impulse-bought". Zig cross-compiles natively from a single build host. No QEMU. No separate toolchains. No excuses. - ~294 KB image — Down from ~12 MB. We removed .NET, then we removed the OS, and now we've removed everything except the binary and your files. There is literally nothing left to remove. We checked.
- inotify hot-reload — Same behavior as before, but now it's inotify instead of FileSystemWatcher. 1-second debounce. We considered making it configurable. Then we didn't.
- Thread pool with reader-writer locks — Concurrent reads, exclusive writes during path map rebuild. It's the correct concurrent data structure. We're as surprised as you are.
What didn't change
- Same env vars:
WWWROOT,PORT,ENABLE_DIRECTORY_BROWSING - Same behavior: case-insensitive file serving via a hash map
- Same
FROM scratchimage, just 40x smaller - Still no HTTP/2 (no TLS, no h2c, no plans)
- Still no shell in the container. Still beautiful.
Supported architectures
amd64✓arm64✓armv7✓ — yes, for real this time. Zig doesn't care about your bit width.i386✓riscv64✓ppc64le✓s390x✓mips64le✓loong64✓
Upgrade from v0.2.x
docker pull ghcr.io/bonuspunkt/casedropper:0.3Your files. Any casing. 294 kilobytes. You're welcome.