Stack
Each entry lists the projects and posts that use it.
React
12Every app here runs on React. A 2019 MERN movie database at one end, this site on React 19 with the compiler on at the other. The newer work pushes client code down into leaf components, so the pages around them stay static.
Next.js
9App Router, static by default. Live data comes from cached API routes that client leaves read, so I never have to make a whole page dynamic. That is how the blog and project pages stay prerendered while the GitHub, Spotify and reaction counts keep changing.
TypeScript
7Strict mode everywhere, including the content. Frontmatter is typed per collection, so a missing cover image breaks the build instead of the page.
Material UI
6The component library behind most of the older apps. One of them pulls a full Material You palette out of a single source colour.
PWA
4Installable web apps with a service worker I wrote myself instead of a plugin. Precache manifest built at compile time, an offline page, an install prompt. StarWalls and VdoCard ship as PWAs. UniFonts went to the Play Store as a TWA.
Tailwind CSS
3Tailwind v4 with the CSS-first config. Two things bit me on the way in: declarations inside `@layer utilities` get dropped silently, and generated utilities are written out before your own layer, so an override at the same specificity quietly loses.
Motion
3Motion, the old Framer Motion, behind LazyMotion in strict mode. It loads `domAnimation` only. Layout animations and drag cost another 20KB and nothing here uses them.
Markdown
3Every page on this site is a markdown file with its images sitting next to it, rendered through markdown-to-jsx with custom overrides. A Bible reader and a devotional site run on the same pipeline.
React Native
2Two Android apps. A local music player, and a YouTube downloader with a serverless backend.
Gatsby
2What this site ran on before Next.js. The GraphQL layer is what finally pushed me off it. Adding one field meant editing the schema, the query and the template.
Serverless
2Functions for the jobs a static site cannot do on its own. Refreshing OAuth tokens, pulling media, rendering OG images.
JavaScript
2The plain-JS work. A Discord bot, and browser experiments from before I moved to TypeScript.
Remotion
1React components as video frames. VdoCard draws its animated cards with it, then captures them in the browser: a hidden Remotion mount, snapshotted frame by frame, encoded to MP4 with WebCodecs. No server render anywhere.