projects
things I build outside of work
WXT · React · TypeScript · Vercel Functions · Upstash Redis · Vitest
A Chrome extension, published as Should I Apply?, that reads the job posting on the current page and scores your resume against it: one encouraging overall match, then a level each for skills, tasks, experience, industry, and education, judged by TypeSafe's Jev model. The resume lives only in Chrome's local storage and is sent only when you press Assess, with your name, emails, phone numbers, and links stripped first. A small Vercel Function holds the API key, enforces per-install and per-IP daily limits in Upstash Redis, and stores none of the text.
live·source
Next.js · TypeScript · PWA · Vitest · Playwright
A habit tracker that borrows the shape of the GitHub contribution graph - a year of small squares, filled in one tap at a time, so progress is something you can see at a glance. Mark today or yesterday and the record settles behind you, which means the year you are looking at is one you actually earned. Everything stays on the device: no account, no backend, no analytics.
live·source
pnpm · TypeScript · Hono · Vite · React
A pnpm workspace scaffold I keep reaching for: a Hono API, a Vite + React web app, and shared TypeScript packages consumed directly as source, so there is no build step sitting between a package and the apps that use it.
source
Next.js · TypeScript · Tailwind · MDX · Cloudflare Pages
This site. Next.js App Router compiled to a static export, blog posts authored in MDX, Tailwind and shadcn/ui for the front end, shipped to Cloudflare Pages by GitHub Actions on every push to main.
live·source
React · TypeScript · Vite · .NET · MongoDB · Docker · Azure
A link shortener with a dashboard behind a login. A .NET API over MongoDB handles the links, with scope-based JWT authorization and xUnit tests, and a React + Vite front end talks to it through React Query. Containerised and shipped to Azure by GitHub Actions.
source