← all learnings

Building this site: particles, heatmaps, and keeping it minimal

July 3, 2026

Recruiters spend six to ten seconds on a profile, so this site had one design rule: everything important must be visible in two scrolls, and nothing should compete for attention with the work itself.

A few things I learned building it:

Canvas particles are cheaper than they look

The profile photo dissolves into ~1,600 particles on hover. The trick is doing the expensive work once: draw the image to an offscreen canvas, call getImageData, and sample a pixel every few px to build a particle array. After that, each frame is just a fillRect loop over a Float32Array — no allocations, and the requestAnimationFrame loop only runs while particles are actually moving.

The GitHub contributions graph has no official API

GitHub renders the green grid from a private endpoint. The practical options are scraping the SVG, using the GraphQL API (needs a token you can’t ship to a browser), or a public proxy like github-contributions-api.jogruber.de. I went with the proxy plus a graceful fallback link — never let a third-party API break your homepage.

Astro content collections make the blog free

Each post here is a Markdown file with three frontmatter fields. Astro type-checks the frontmatter with Zod at build time, so a typo in a date fails the build instead of silently rendering garbage.

More learnings soon — mostly about LLM agents, RAG, and whatever grad school throws at me next.