-
You
What you're reading right now.
-
Cloudflare
In front of the domain: hides my home IP and filters.
-
Traefik
The public door. It's the only thing allowed to talk to the site's container.
-
My phone
Where the contact form messages reach me.
-
Repository on my Forgejo
Where the code starts, at home. The code is public on GitHub, but that copy only gets what's already deployed and has passed the leak check.
-
Continuous integration and deployment
On every push, on a runner with no secrets: formatting, clippy with no warnings, every test against a real PostgreSQL and gitleaks. On green, another runner deploys it.
- Forgejo · Actions
- GitLab CI · GitHub Actions
-
My Matrix server
The room where new-message notices arrive, with a bot of its own that can only write there.
-
Axum server
Gets the request, finds the already rendered page and answers. If the browser already has it, it answers 304 with no body.
-
Pre-rendered pages
Compiled templates filled in once at start-up, in both languages, each with its ETag.
-
Security headers
A strict CSP with nothing inline, HSTS and the rest. That's why JavaScript only enhances the page: everything works without it.
-
Content in TOML
Texts, projects, lab parts and these units live in TOML files validated at start-up. A key missing in one language stops the deploy.
-
Contact form
Validates the fields, has a honeypot field for bots, traps that recognise an AI and an optional captcha.
-
Sending limits
Per IP and global, worked out with a single indexed query. The IP is never stored: only a hash with a secret salt.
-
Outbox
The message is saved first and the notice is left pending. A job retries it until Matrix confirms with an event ID.
-
Matrix notice
Sends the notice to the room with the site's own bot. Several workers don't step on each other: each takes a different row.
-
PostgreSQL
Stores messages and pending notices. Queries are checked against the schema at compile time.
-
No network
PostgreSQL listens on no interface: only on the local socket with OS authentication, no password to steal.
-
Homelab status
Every 5 minutes the hypervisor drops a summary: services running, availability and the LED for each map part. Aggregates only.
-
Your browser
Keeps your achievements, where you were and whether you want sound. None of it leaves your browser.
-
Terraform
Creates the container with its resources, network and firewall: the only one with a «drop» inbound policy.
-
Ansible
Installs PostgreSQL, the binary and its service, with secrets encrypted in the vault.
-
Check before restarting
The role runs «landing check» with the new binary: if the content isn't valid, nothing is restarted.
-
Hardened service
Read-only file system, no capabilities, a syscall filter, capped memory. After restarting, it waits for /healthz to say «ok».