04 / blog

Writing in public.

Notes on what I'm building, learning, and figuring out.

ยท4 min read

Day 24 โ€” Three Modes, One Picker, and Some Honest Limitations

Adds driving (with traffic) as a third mode, turns the compare view into a picker so you can match any two modes against each other, and explicitly punts on public transit for a reason worth explaining.

#day-24#react#maps#mapbox#ors#isochrones
ยท4 min read

Day 23 โ€” Walksheds, Bikesheds, and the Hill Problem

Day 22 ignored elevation. Today's project fixes that by switching the routing engine to OpenRouteService and adding biking as a second transit mode. Plus a side-by-side compare view and a debugging story about an Overpass mirror returning silent zeros.

#day-23#react#maps#ors#isochrones#cycling
ยท3 min read

Day 22 โ€” Walking Isochrones, Concentric Bands, and the Elevation Problem

Drop a pin anywhere on the globe and see how far you can walk in 5, 10, 20, 30, 45, or 60 minutes. Mapbox Isochrone API, turf.js polygon subtraction, and a Spectral palette.

#day-22#react#maps#mapbox#isochrones#turf
ยท4 min read

Day 21 โ€” MagicLink 2.0: From Email Gate to One-Click Demos

The first version of MagicLink asked recruiters to enter their email before they could try any of my AI projects. That was friction in the wrong place. The rebuild swaps the email gate for a three-tier system: visitor, recruiter, personal.

#day-21#cloudflare#hono#ai#redesign
ยท3 min read

Day 19 โ€” Comparing Neighborhoods the Way I Wish I Could When I Moved to LA

A side-by-side neighborhood comparison tool with custom walkability scoring, Census rent data, school info, air quality, and draggable map markers. Built from a real need.

#day-19#react#maps#google-places#census
ยท1 min read

Day 18 โ€” Rosetta: Learning a Language Through Translation

A code translator that explains every difference line by line. The goal isn't just to convert your code, it's to teach you why the target language does things differently.

#day-18#ai#claude#react#education
ยท2 min read

Day 17 โ€” From Dinky Generator to Interactive Playground

On Friday I was at a total loss for project ideas, so I made a basic haiku generator. Over the weekend I almost scrapped it. On Monday I decided to build on top of it instead.

#day-17#ai#claude#react#dnd-kit
ยท4 min read

Day 15 โ€” MagicLink: Demo Access Without Giving Away Your API Keys

Several of my portfolio projects need API keys to run. I didn't want to put my keys in the code and I didn't want to ask recruiters to bring their own. So I built a token system that gives them up to 5 free uses per project.

#day-15#cloudflare#hono#chrome-extension#ai
ยท3 min read

Day 14 โ€” Cleanup Day

The grid is filling up. Which is exciting. But I clicked through several of my own projects today and realized an outsider couldn't tell what half of them did from the title alone.

#day-14#meta#portfolio#housekeeping
ยท3 min read

Day 13 โ€” Building the Tool I Needed to Build the Tools

I needed a way to brainstorm ideas for the remaining 37 projects in my 50-day challenge. So I built one: a spatial concept map powered by Claude that lets you drill from a vague topic all the way down to a specific, actionable idea.

#day-13#ai#claude#react#visualization
ยท4 min read

Day 12 โ€” Can You Remember Where You've Been?

I built a web game that turns your iPhone camera roll into a geography quiz. The biggest challenge wasn't the quiz itself, it was convincing browsers to read GPS data from photos.

#day-12#ai#gemini#geolocation#react
ยท2 min read

Day 11 โ€” Searching a Video with Plain English

Upload a video once, then run as many plain-English queries as you want to find specific moments. Built on the Gemini Files API.

#day-11#ai#gemini#video
ยท1 min read

Day 09 โ€” Building a Typing Speed Test

A no-backend typing test with live WPM, accuracy, and error tracking. A good exercise in state management without reaching for AI.

#day-09#react#typescript
ยท2 min read

Day 08 โ€” Turning a Wall of Text into a Schedule

A three-phase app that takes your free-form brain dump and hands back an organized task list with dates, durations, and priority buckets. The interesting part was the prompt design.

#day-08#ai#claude#productivity
ยท2 min read

Day 07 โ€” Building a Memory Layer for AI Agents

A Chrome extension that captures page context and shares it with AI agents via REST or MCP. The interesting part wasn't the extension itself, it was building an MCP server into the same Cloudflare Worker.

#day-07#ai#mcp#cloudflare#chrome-extension
ยท4 min read

Day 02 โ€” Portfolio Skins, or: Teaching an AI to Have Taste

Building a theme switcher with AI-generated styles taught me something unexpected: Claude can write perfect code for a visual effect it has never actually seen.

#day-02#ai#design#cloudflare#css
ยท1 min read

Hello, World โ€” Starting the 50 Projects Challenge

Why I decided to build one small project every weekday for 50 days, what I hope to learn, and how I'm going to track it all on this site.

#meta#challenge#next.js