My Portfolio Website

How I Built My Portfolio Website with Wasm, Astro, and Docker

When I set out to build my personal portfolio website, I didn’t just want a flashy homepage. My main goal was to create a simple static website that can be hosted anywhere.

Why static? Because static websites are:

  • Easier to host – you have more options, from GitHub Pages to any cheap web host.
  • More secure – no backend to maintain, no server-side security issues to worry about.
  • Future-proof – I can migrate providers any time without worrying about compatibility.

Even though I consider myself more of a backend developer, I found that static sites don’t have to be “simple pages.” With WebAssembly (WASM), I can bring complex logic directly to the browser, without needing a backend. This way, recruiters and future employers can try out my projects immediately—no need to download or compile anything.

Why I Built My Own Build Tool (Jonah)

I work on many different projects: compilers, hardware description languages, web apps, and more. Each uses a different programming language and toolchain. Setting up the right environment every time I wanted to rebuild something quickly became frustrating.

So, I created Jonah, my own build tool.

Jonah is Docker-based. Each project defines:

  • a Dockerfile – describing how to build the project,
  • a jonah.toml – telling Jonah which build artifacts to extract.

Jonah builds the container, copies the outputs (like WebAssembly binaries or HTML files), and injects them into the final website build.

All I need is Docker installed—Jonah handles the complexity.

Building the Website with Astro

For the frontend of my portfolio, I chose Astro. It’s fast, lightweight, and perfect for static content.

The design is heavily inspired by Tailwind UI Spotlight. I liked its modern and clean look, and Astro made it easy to adapt.

All the content—projects, experience, and personal details—is stored in a JSON file. During build time, Astro automatically loads this data and inserts it into the right places. Updating my website is as easy as editing JSON.

Keeping It Platform-Independent

One design choice I made was not to rely on GitHub’s CI/CD.

Instead, Jonah makes the build process platform-independent: it works anywhere Docker runs. Whether I use my laptop, a CI server, or another hosting provider, the process is the same.

Right now, I deploy to GitHub Pages, but migrating would be trivial.

How Everything Fits Together

Here’s how the pieces connect:

  • astro-spotlight – my Astro-based website template.

  • my-website – contains the website’s content and deployment setup. This is where Jonah orchestrates builds.

  • Project Repositories – for example:

    • oberon0c – an Oberon-0 compiler.
    • open-gal – a hardware description language.
  • Jonah builds these projects inside Docker, extracts their outputs, and passes them into the website.

  • Finally, I just push to elias-2001-de.github.io, and the site goes live.


Conclusion

My portfolio is more than just a resume page. It’s a static, secure, and portable website that showcases my projects—and lets people try them instantly, thanks to WebAssembly.

By combining Astro, Docker, and my custom tool Jonah, I built a workflow that’s future-proof and platform-independent.

If you want to take a look under the hood, check out the repos: