Back to Software Engineering projects

This site
theoerickson.com, moved off Wix and rebuilt from scratch
- Framework
- Astro 7, TypeScript strict, Vite
- Content
- Markdown and YAML collections, checked by Zod schemas
- Editing
- Sveltia CMS, local only, plus a dev toolbar settings panel
- Media
- sharp: AVIF with WebP fallback, MP4 video tabs
- Hosting
- Firebase Hosting, preview channels, generated 301s
- Domain
- DNS moved from Wix to Firebase, HTTPS with HSTS
My portfolio used to live on Wix. This is the replacement: a site I own end to end, from the content files to the domain. It is split into three tracks, Game Design, Software Engineering and Makerspace and Teaching, and each one has its own skin: a cartridge rack for games, an IDE for software, and laser cut birch for maker.
It is a static site built with Astro and TypeScript on Vite. Every project, resume and overview is a plain Markdown or YAML file, and Zod schemas check them at build time, so a missing field fails the build instead of the page. Pages are generated per track from that one content model, and a project can sit in more than one track with its own summary in each.
Content is edited through Sveltia CMS, which runs only on my machine and writes straight into the repo’s files, with a draft flag that keeps unfinished entries out of the build. A dev toolbar panel tries fonts and layout settings live. The build turns images into AVIF with a WebP fallback and writes a 301 redirect for every old Wix URL from the content itself, and a small script draws the link preview card from the site settings.
It is hosted on Firebase Hosting, with preview channels for checking a build before it goes live. Moving off Wix meant extracting the old pages and images with a script, then moving the domain’s DNS to Firebase while keeping the registration at Wix: www serves the site, the bare domain redirects to it, and everything is HTTPS with HSTS.
I planned the site with Claude in chat and built it with Claude Code, using a shared notebook in the repo to hand specs and status between the two.




