A personal portfolio site generated with custom Python build scripts from structured TOML data, featuring twelve interactive HTML5 canvas background simulations.
I built this website using a lightweight custom static generator in Python that compiles structured content from a TOML configuration file into clean HTML pages. The visual background is powered by a custom JavaScript canvas engine that provides twelve interactive particle and physics simulations with adjustable settings.
Building a personal site with a simple file-driven static generator makes content maintenance easy while keeping page load speeds fast and avoiding runtime framework dependencies.
When designing this portfolio, I wanted a site that loaded quickly, was simple to host on GitHub Pages, and could be updated easily without the overhead of heavy web frameworks or database-driven content management systems. I wrote a small static site generator in Python that reads all portfolio content, project writeups, and experience details from a single TOML configuration file, rendering them into clean static HTML files through reusable page templates.
Featured projects receive both a concise overview card on the main page and a detailed project page with technical writeups and architecture diagrams, allowing readers to explore the background and implementation details of each build.
Behind the text content runs a standalone HTML5 canvas engine that renders twelve different mathematical and physics simulations, including particle fields, orbital mechanics, cellular automata, and wave interference patterns. Visitors can interact directly with the simulations using their mouse or touchscreen, open a control panel in the header to adjust simulation parameters in real time, or switch between visual presets.
A key focus during implementation was ensuring that the canvas renders efficiently without consuming excessive processor cycles or blocking user interaction with the page. The animation loop adjusts its resolution for high-density screens, pauses when the browser tab is hidden, respects user preferences for reduced motion, and sits behind transparent content layers without capturing clicks or scrolling gestures meant for the text.