What changed for people who run xenia, newest first. Each release’s notes, with the details, are its tag message and its page on the releases repo.
The first public release; 0.15.0 was not published.
Distribution: a Docker image, signed releases, and a license for the binaries.
ofkindness/xenia for amd64 and arm64, from the same static binary as the archives: no shell, runs as uid 65532 on 8080/8443, config in /etc/xenia, a healthcheck through the admin socket, the access log on stdout. See docs/docker.md.--access-log - writes the access log to standard output.SHA256SUMS are signed with Sigstore (cosign, keyless), and each release has an SPDX SBOM of xenia and every library in it.Operability: running as a service.
--user USER[:GROUP]: started as root, xenia binds its ports, then becomes that user for good, before anything else runs.NOTIFY_SOCKET (Type=notify-reload), and contrib/systemd/xenia.service is a unit to start from.server.trustedProxies name is the X-Forwarded-For sent upstream and the access log’s client, with the proxy in peer.x-content-type-options: nosniff on everything xenia makes itself; file ETags include the inode.Hardening: every high and medium finding of a full review.
X-Forwarded-*, Forwarded and X-Real-IP never go upstream; cache keys include the scheme; verified client certificates bypass the cache; strict chunk sizes.Project configs.
xenia.conf.js, found where xenia starts, and imports the project’s own ./ and ../ modules.xenia types writes xenia.d.ts for editors to check configs with; xenia check validates one.Serving stale (RFC 5861).
stale-while-revalidate: stale entries are served at once while one background refresh renews them.stale-if-error: a kept entry answers when the upstream fails.staleWhileRevalidate and staleIfError where responses say nothing.Upstream hostnames.
host:port; every address a name resolves to is a server of its own, refreshed every resolveInterval.xenia ctl resolve and drains by name.Response caching for proxy routes.
Vary, revalidation, request coalescing across workers, gzip copies and purging (xenia ctl cache purge).Rate limits.
rate, burst) per client, shared by routes that name them, exact across workers; 429 with retry-after; clients behind server.trustedProxies taken from X-Forwarded-For.Compression.
vary: accept-encoding.HTTP/2 for clients.
Observability.
--metrics), request IDs (x-request-id), and the admin interface over TCP with a token.HTTP caching for files.
Last-Modified, conditional requests (304, 412) and single ranges (206, 416).Static files.
root, index, listing, precompressed, followSymlinks, contentTypes, with safe paths and a small-file cache.The first release.
SIGHUP.