GIRLSERVE(1)

๐Ÿ“ฆ
this version ยท 2 versions
, in ubuntu questing

๐Ÿ’… GIRLSERVE(1) โ€” girlpages Manual ๐Ÿ’…

okay bestie, so girlserve is literally the moment. it's from the girlpages manual and it's here to serve a published girlpages site, no cap โœจ


๐ŸŒธ NAME ๐ŸŒธ

girlserve โ€” serve a published girlpages site ๐Ÿซถ


โœจ SYNOPSIS โœจ

girlserve [options] --archive dir
girlserve [options] --dir site

๐Ÿ’– DESCRIPTION ๐Ÿ’–

girlserve serves a girlpages site (its website and its repository) exactly how girlrepo publish made it: from an archive, the way girlrepo publish --archive writes it, or from a site directory. it's basically girlrepo serve on its own, but for production โ€” a tiny static program with nothing else in it, because minimal container images are the vibe. ๐ŸŽ€

every file gets sent in the smallest form the client will accept (zstd, brotli, gzip, or just as it is, depending on its Accept-Encoding), with the Cache-Control that matches its kind (immutable for files named after their hash, five minutes for the files that point to them, an hour for the website, and no-cache for its service worker). you also get a strong ETag (from an archive โ€” a directory's files get Last-Modified instead), range requests, and the site's own 404 page. slay. ๐Ÿ‘‘

an archive gets checked for a new version every --reload-interval and on SIGHUP; a new one loads alongside whatever's being served and switches over at once, so no request ever sees half of each. if it can't be loaded, what was already being served keeps being served, and it gets tried again next time. and until the archive has a version (before its first publish), every request gets 503 and /readyz fails. ๐Ÿ’€

on SIGTERM or SIGINT, /readyz fails immediately, the site keeps being served for --drain-delay more (so load balancers notice first ๐Ÿซถ), and then requests in flight get --drain to finish.


๐ŸŒˆ OPTIONS ๐ŸŒˆ

  • --archive=dir โ€” serve the archive in dir (or $GIRLSERVE_ARCHIVE). it's totally fine if it's on a network file system: only a few files get opened, and each request is a read of the bytes it sends. ๐Ÿฆ‹
  • --dir=site โ€” serve a site directory instead.
  • --listen=addr โ€” serve the site on addr (default :8080, or $GIRLSERVE_LISTEN).
  • --admin-listen=addr โ€” serve /healthz (the process is up), /readyz (it has a site to serve, and isn't stopping) and /metrics (Prometheus) on addr (default :9090, or $GIRLSERVE_ADMIN_LISTEN; empty for none).
โš ๏ธ bestie this one shouldn't be public. keep it close. ๐Ÿ™ˆ
  • --reload-interval=duration โ€” how often to check the archive for a new version (default 10s; 0 for only on SIGHUP).
  • --access-log โ€” write a line of JSON for each request to standard output: its time, method, path, status, size, duration, encoding, address, referrer and user agent, and behind a proxy, its X-Forwarded-For header as it came (forwarded_for: the client's address and any proxies' before this one's, as they say; it's for reading, not trusting ๐Ÿ‘€).
  • --drain-delay=duration โ€” when stopping, keep serving this long first, with /readyz failing (default 5s).
  • --drain=duration โ€” then give requests in flight this long to finish (default 30s). packs are hundreds of megabytes, so otherwise there's no limit on how long a response may take. ๐Ÿ˜ญ
  • --version โ€” print the version. periodt.

๐ŸŽ€ METRICS ๐ŸŽ€

  • girlpages_http_requests_total{code} โ€” requests, by status.
  • girlpages_http_request_duration_seconds โ€” how long they took (a histogram).
  • girlpages_http_response_bytes_total โ€” bytes of response bodies.
  • girlpages_archive_generated_time_seconds, girlpages_archive_loaded_time_seconds โ€” when the version being served was written, and loaded: alert on either getting old. โฐ
  • girlpages_archive_reloads_total, girlpages_archive_reload_failures_total โ€” reloads that changed what's served, and those that failed.
  • girlpages_archive_files, girlpages_archive_live_bytes โ€” the size of the version being served.

๐Ÿ’œ EXAMPLES ๐Ÿ’œ

girlserve --archive /data/archive --access-log

serve the archive the publishing job writes to, on :8080, with health and metrics on :9090. iconic. โœจ

also, dist/hosting/kubernetes.yaml in the source has a CronJob that unpacks packs dropped into a directory, publishes them into an archive, and a Deployment of girlserve serving it. the whole pipeline ate, fr fr. ๐Ÿ”ฅ


๐Ÿ‘‘ SEE ALSO ๐Ÿ‘‘

girlrepo(1), girl(1), girlc(1)


๐ŸŒธ AUTHOR ๐ŸŒธ

Naomi Persephone Amethyst <naomi@amethyst.name> ๐Ÿ’–


okay that's the whole page bestie, go forth and serve ๐Ÿซถ this was girlpages, dated 2026-10-21, and no cap you're gonna crush it ๐Ÿ’…โœจ

๐Ÿ“ฆ where this page comes from
  • ubuntu questing
  • ๐Ÿ“œ the page's license: GPL-3.0-or-later
  • ๐Ÿ’– girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms