About
I'm a junior full-stack developer working mostly in React and Vue, with a growing habit of writing up whatever broke that week. I like small, well-scoped tools more than sprawling apps — most of what's on this site started because something annoyed me enough to fix it.
I spent six months as a frontend intern at a Series-A startup, where I shipped a shared Vue component library that's still in production. Since then I've picked up a couple of short freelance contracts and started contributing to a mid-size open-source npm package, mostly bug fixes and small DX improvements.
I'm currently looking for a full-time role or freelance work where I can keep working across the stack — I like backend just as much as frontend, I just happen to have shipped more of the latter so far.
Experience
-
2025-07 — Present
Freelance Full-Stack Developer
Self-employed · Remote
Two short client engagements: a booking-flow rebuild for a small studio site (React) and a dashboard redesign (Vue). Both delivered on fixed-scope, fixed-price contracts.
React Vue Freelance -
2024-09 — 2025-03
Frontend Engineering Intern
Northlight (Series A) · Remote
Built and shipped a shared Vue 3 component library adopted across the company's three internal dashboards, cutting duplicate UI code by roughly 40%. Paired closely with design on a token-based theming system.
Vue Design Systems TypeScript
Education
-
2023-09 — 2024-03
The Complete Web Developer Bootcamp
Independent / self-directed · Remote
Full-stack curriculum covering JavaScript fundamentals through React, Node, and PostgreSQL, followed by six months of self-directed project work to go deeper on Vue and TypeScript.
Full-Stack
Skills
Frontend
- React
- Vue 3
- TypeScript
- Tailwind CSS
Backend
- Node.js
- PostgreSQL
- Cloudflare Workers
Tools & Practices
- Git & GitHub
- Testing (Vitest)
- CI/CD
Writing
Recent posts
Shipping My First Cloudflare Worker
Notes from replacing a small Express endpoint with a Cloudflare Worker — what got simpler, what didn't.
Why My React useEffect Kept Re-Firing (and the Vue Equivalent)
A stale-closure bug in a useEffect dependency array, and how the same logic reads in Vue's watch.