Building a self-hosted CV with Astro, SQLite and a local LLM
This site replaced a WordPress install with something leaner and fully under my control: a single Astro (SSR) container, SQLite as the only source of truth, and no third-party services in the request path.
The moving parts
- Astro + Node adapter render every public page on the server, with the whole CV driven from SQLite. Light/dark themes, three languages (EN/RU/UK), and a print stylesheet that doubles as the downloadable PDF.
- Passkey-only admin. No passwords — WebAuthn with multiple credentials and an emergency CLI to register a new key if all are lost.
- A daily pipeline. A cron job lists my private GitHub repositories, and for the ones that changed it asks a local Gemma model (Ollama) to draft a short, factual blurb. New repos land as unpublished drafts — nothing private goes live until I publish it by hand.
- First-party analytics. Visits are geolocated and ASN-resolved with a local MaxMind database (no external calls), with a GDPR consent banner gating GA and the client beacon.
Why it matters
The LLM and the GitHub sync are entirely in an offline batch path — if the model is down, the site doesn't notice, it just keeps serving from SQLite and retries the enrichment the next day. That separation is the whole point: the interesting automation never sits between a visitor and a page.
More posts on the infrastructure behind this — BGP, transport, monitoring — to follow.
Transparency: most posts here are drafted with AI assistance, and the non-English versions are machine-translated by a local LLM and then reviewed. Spotted an error? Please let me know.