This website
A personal site built from scratch with Astro, designed as a permanent home for everything I build next.
I wanted one place that I own where finished things go, instead of scattering them across folders, notes apps and half-finished repos. Not a portfolio in the job-hunting sense — a hub. Somewhere a project can be filed and then found again.
What it is
A static site built with Astro. Every project and post
is a Markdown file in src/content/. Adding something new means adding one
file; the index pages, the sitemap, the RSS feed and the machine-readable
summary at /llms.txt all update themselves.
What I learned building it
- Design tokens before components. Every colour, size and font on the site is a named variable in one file. Three completely different visual themes share the same components, and switching between them is one line.
- Content as data, not markup. Because each project has a validated schema, a typo in the frontmatter fails the build instead of quietly rendering something broken.
- Structured data is not optional any more. People increasingly ask an
assistant about a person before they open a search engine. The JSON-LD block
and
/llms.txtexist so the answer comes from me rather than from a guess.
What is next
Norwegian language version, a proper Open Graph image, and — the real test — actually publishing the next project here instead of letting it sit unfinished.
Build log
Added notes, a library and a quotes page. /writing had been live and empty for a week — which said the bar was wrong, not the idea.
Built four themes sharing one set of components, to pick by looking instead of imagining. The cyber one exists to find the limits of the token system; not sure yet whether it survives.
First deploy. Spent two hours on a site that loaded the registrar's parking page about half the time before realising I had added a second apex A record instead of editing the one that was already there.
GitHub rejected the first push with GH007 because my commits carried my real email. Rewrote the four commits to use the noreply address rather than switching the protection off.