Skip to content

v0.3.0 — Rewritten in Zig

Choose a tag to compare

@Bonuspunkt Bonuspunkt released this 28 Feb 20:39
· 5 commits to misstress since this release

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 scratch image, 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.3

Your files. Any casing. 294 kilobytes. You're welcome.