This site runs on a web server I wrote
There's no nginx, WordPress or hosting platform here. Every request to archification.net is answered by webify, a web server I've been building in Rust since 2023. It handles TLS, sign-in, the blog, the forum, live video streaming and the tools in the Lab, all from one binary and one config file.
What happens to a request
Every request passes through the same steps, in this order. Each one can answer early and stop the request there.
-
TLS
Connections are encrypted with rustls. The certificate comes from Let's Encrypt through an ACME client built into the server, which renews it in the background before it expires. Plain HTTP only exists to redirect to HTTPS and answer certificate challenges.
-
Timing
Every request is counted and timed. Those numbers feed the status page and the tiles above. Only totals are kept, nothing about who sent the request.
-
Host check
The server only answers for domain names it's configured to serve. Anyone can point their own domain at this server's IP, and this check stops it from serving a copy of the site under their name.
unknown domain → 421 Misdirected Request -
IP allowlists
Each domain can be limited to a list of client IPs, which is handy for staging sites.
IP not on the list → 403 Forbidden -
Access control
People sign in with Google, and the session decides what they can reach. Paths can be restricted by email, email domain, role or subscription tier. Rules and roles are managed from an admin dashboard instead of being hardcoded, and some pages can instead be unlocked by uploading a key file.
not allowed → sign-in page or 403 -
Routing
One config file maps each domain's paths to what they do: a templated page, a media gallery, the blog, the forum, a slideshow, a live stream, a members-only area. Adding a page is a single line of config.
-
Response
Pages are rendered from templates, blog posts from markdown files, and video and audio are streamed with range requests so seeking works. Data lives in SQLite.
What's built in
Automatic HTTPS
Its own ACME client gets and renews Let's Encrypt certificates, then reloads them without a restart.
Blog
Posts are markdown files on disk. They can be written in the browser by anyone with the Writer role, or in a text editor and uploaded.
Forum
Categories, topics, replies and accounts, with search.
Live streaming
WebRTC ingest and playback (WHIP/WHEP), so a stream goes from OBS to viewers' browsers with low latency.
Admin dashboard
Access rules, user roles, key-file gates and invite-only accounts, all changed live without editing config or restarting.
The Lab
Public developer tools that run on the same server: a request inspector, a webhook catcher, a pastebin and a shared live canvas. Try them.
Stack
Deploying is copying one file and one config to the server and restarting it. Want something like this for your own site? Here's how I work with clients.