Spooky
Changelog
Release notes for every version of Spooky. Versions follow semantic versioning — breaking config or API changes increment the major version.
May 28, 2026
v0.1.1-beta↗Added
upstream_tls.verify_certificates: false— new config option to disable upstream TLS certificate verification for backends with self-signed certs in development or trusted internal environments. Matches the opt-out behavior of NGINX (proxy_ssl_verify off) and Envoy (ACCEPT_UNTRUSTED). A warning is logged at startup when disabled.
Fixed
- Upstream send errors now log the full error cause chain instead of the opaque
client error (Connect), making TLS failures — missing SAN, untrusted root, cert/SNI mismatch — immediately diagnosable from logs without a packet trace. - Validator no longer hard-rejects
upstream_tls.verify_certificates=false; it now emits a warning and allows startup to continue. - Debian package and systemd unit: TLS certificate files must be owned
root:spookywith mode640so thespookyservice user can read them. Documentation and installation examples corrected accordingly.
Changed
- Packaging layout: Debian assets moved under
packaging/deb/—make-deb.sh, systemd unit, and default config. - Installation and Docker docs updated to match current packaging paths and runtime behavior.
- Debian package version bumped to
0.1.1-beta.
Protocol Support
- HTTP/3 termination using quiche (RFC 9114) and QUIC transport (RFC 9000).
- HTTP/2 backend connectivity (RFC 9113).
- TLS 1.3 with certificate chain loading (RFC 8446).
- TLS bootstrap ingress for HTTP/1.1 and HTTP/2 compatibility with Alt-Svc upgrade flow.
Routing and Load Balancing
- Upstream pool architecture with per-upstream configuration.
- Route matching on path prefix and host headers with longest-match selection.
- Method-aware route matching via
route.method. - Six load balancing algorithms: random, round-robin, consistent hashing (64 replicas), least-connections, latency-aware, and sticky-cid.
- Configurable load-balancing key sourcing (
load_balancing.key) and per-backend weight configuration.
Health Management
- Active health checking with HTTP probes.
- Configurable interval, timeout, failure/success thresholds, and cooldown.
- Automatic backend removal and recovery on threshold transitions.
Resilience and Ingress
- Sharded ingress dispatch — per-worker UDP sockets for parallel packet processing.
- Global route-queue cap with
503 + Retry-Aftershedding under overload. - LB fallback, health probe, and streaming timeout semantics.
- Panic handling hardened for worker and control-plane tasks.
- Per-backend concurrency limiting (64 max in-flight requests). 10,000+ concurrent connections tested.
Bootstrap Path (HTTP/1.1 + HTTP/2 TCP)
- Dual ingress: QUIC/HTTP3 and TCP/TLS bootstrap for browser compatibility.
- Bootstrap path enforces LB strategy and health-aware backend resolution — parity with the QUIC path.
- Bootstrap path enforces downstream mTLS policy and QUIC request policy pipeline.
- Header sanitization and RFC 7239-compliant IPv6 normalization in
Forwarded. - Connection limiter, per-connection timeout guard, and deterministic WebSocket upgrade handling.
Configuration
- YAML-based configuration with comprehensive semantic validation at startup.
- Per-upstream load balancing strategy and embedded routing rules.
- Upstream TLS verification enforced by default; cleartext backends require explicit opt-in.
- Downstream mTLS support via
listen.tls.client_auth.*. performance.control_plane_threadsapplied to startup runtime configuration.
Observability
- Structured JSON logging with standard and Spooky-themed log levels.
- Request/response metrics: total requests, successes, failures, and timeouts.
- Backend selection and health transition logging.
- QUIC connection error classification and deduplication.
Control API
- Bearer token authentication with constant-time comparison.
- Metrics endpoint (
/metrics), health probe (/health), and readiness probe (/readiness). - TLS-enabled control-plane listener path support and startup hardening.
Operational
- Debian package with systemd unit, system user/group, and config at
/etc/spooky/config.yaml. - Docker packaging with compose bootstrap and operator smoke-test scripts.
- CLI with
--configflag. - Streaming request/response handling with bounded queues and hard body caps.
- Deterministic cap-breach behavior via
413and503under pressure.
Known Limitations
- No dynamic backend discovery — static config-driven only.
- No configuration hot reload — restart-based config apply model.
- Pre-GA: requires extended soak and failure-mode hardening before broad production rollout.