Case study
Self-Hosted Portfolio Website
This website: Astro pages and a Rust/WebAssembly demo, served by Axum and deployed to my Kubernetes cluster through Argo CD.

Overview
I built this site to keep my projects, papers, and demos in one place. Each project has a page with implementation details and links to its source. Research entries have their own metadata, PDFs, and related project links.
The redesign moves the page content into Astro collections and replaces the older HTML pages with shared layouts. Markdown holds the project descriptions; Astro components provide the interactive demo and sections that need a more specific layout.
Architecture
Astro generates the HTML at build time. The home page, project index, and individual project pages read from the same collection, so titles, summaries, status, and repository links have one source. Research entries use a separate schema for authors, publication dates, and downloadable artifacts.
Axum serves the generated site and WebAssembly files. The backend also handles compression, response headers, request logging, and health and readiness endpoints. The readiness check verifies that the built site’s index file exists.
Typography, spacing, and color tokens are shared across pages. A small browser script applies the saved light or dark theme, while the project layout supplies navigation for longer articles.
Browser demo
The Game of Life playground uses a Rust engine compiled to WebAssembly. JavaScript connects the engine to a canvas and controls for editing cells, stepping the simulation, importing patterns, and recording GIFs. Simulation runs in the browser.
The reverse solver and proof tools live in the separate Game of Life repository. The demo here runs forward evolution; the project page links to the solver, paper, and verification artifacts.
Deployment
A multi-stage Docker build generates the Astro site, compiles the WebAssembly package, and builds the Rust server. The runtime image contains the server binary and generated assets and runs as a non-root user.
The staging workflow checks the frontend, builds the site, runs browser and accessibility tests, and validates the Rust components. After validation, a push to the redesign branch publishes an immutable image to Harbor. Publishing the image and deploying it are separate steps: the staging manifest must be updated to the resulting digest before Argo CD reconciles it.
Staging and production are separate deployments on my Kubernetes homelab. This lets me review the site through the same ingress and runtime setup used in production before promoting a release.