Changes for version 0.18 - 2026-08-13

  • Abuse controls on a fork-shared arena: an IP denylist enforced at accept and fixed-window rate counters, both in one anonymous shared-memory region mapped before the workers fork, so a limit is exact across the pool rather than per worker. Everything fails open.
  • run() gains deny => [ips], deny_capacity and rate_capacity. A denylisted peer is dropped at accept, before a connection object is built or a byte is read; a new `denied` worker stat counts it.
  • hm_abi.h grows to ABI version 3 (append-only): deny_check, deny_add, deny_remove and ratelimit_hit, for consumers such as Punk's rate_limit. Older consumers are unaffected.
  • Rate-counter slots are reclaimed on demand: a slot whose window has rolled is reused by a new key before a live counter would be evicted, so the table drains when the keys that filled it go quiet rather than thrashing at capacity.

Modules

an event-loop PSGI server
epoll readiness backend for Hyperman::Loop
io_uring backend for Hyperman::Loop
kqueue readiness backend for Hyperman::Loop
portable poll(2) backend for Hyperman::Loop
a fast, native, Future-compatible async result
the per-worker event loop
Plack/PSGI adapter for the Hyperman server