Blog

Welcome to my blog, a place where I write about the things I’m building, learning, and figuring out along the way.

Most posts revolve around frontend development, design, creative side projects, and the occasional technical rabbit hole that feels too interesting not to document.

Some entries are practical write-ups, others are more like project journals, notes from experiments, or things I wish I had found in one place when I started.

If any of it helps, inspires, or simply makes you curious to try something yourself, even better.

A desk setup with VS Code and a Philips Hue lamp flashing as a status indicator for Codex.

Using Philips Hue as a Status Light for VS Code AI Tasks

I connected the Codex notify hook in VS Code to my Philips Hue desk lamps using a simple PowerShell script. Now, my lights flash whenever a long-running AI task is complete, giving me a subtle ambient signal to return to my terminal.

A screenshot of my frontend developer portfolio homepage built with Astro.

How I Built My Frontend Portfolio with Astro, Tailwind, and GSAP

A walkthrough of the tech stack and design decisions behind this website. I explain why I chose Astro for its speed and content-first approach, and how I used GSAP and a bento-grid layout to make the site feel tactile and unique.

Training gear and post-workout snapshot from the 75 Hard challenge.

75 Days of Discipline: What I Learned from Finishing the 75 Hard Challenge

An honest reflection on 75 days of strict, non-negotiable rules. I break down the physical results—like running 611km—and the mental shift that happens when you stop bargaining with yourself and start keeping your internal promises.

Illustration of PasiLunch fetching and displaying restaurant menus in Slack and on a web dashboard.

Rebuilding PasiLunch: Using Gemini AI to Normalize Messy Menu Data

Traditional web scraping is fragile and inconsistent. I rebuilt my lunch bot into a full web service that uses Gemini AI to translate and structure messy restaurant menus into a clean, unified JSON feed that works every time.

A sleek, modern NAS setup in a white Jonsbo N2 case.

My Home NAS Build: 16TB of Storage with Unraid and Docker

A deep dive into the hardware and software behind my personal home server. I used the ASRock N100DC-ITX and Unraid to create a low-power, high-capacity vault for 4K media streaming, photo backups, and self-hosted Docker services.

Illustration of a lunch table with various dishes, representing LunchBot project.

Building a Slack Lunch Bot with Node.js and Cheerio

Stop the daily "where are we eating?" Slack spiral. I built a custom Node.js scraper that aggregates local restaurant menus into a single Slack command, saving the team from opening dozens of browser tabs every morning.

A collection of book covers displayed on a digital screen.

Connecting the Google Books API to Astro with Local Image Caching

Don’t let slow third-party APIs ruin your site’s performance. I developed a workflow to fetch book metadata via ISBN and sync covers to my local assets folder, ensuring my digital bookshelf loads instantly with optimized Astro images.

Pixoo display showing a chess rating.

Displaying My Real-Time Chess.com Rating on a Pixoo Pixel Display

I wanted a physical way to track my chess progress without checking my phone. Using Python and the Chess.com API, I built a bridge that pushes my live rating to a Pixoo display on my shelf, creating a custom low-fi data dashboard.

Spotify top tracks section displayed on a website

Building a Smarter Spotify Top 10 Component with Unique Artist Logic

Standard "Top Tracks" lists are often full of duplicate artists from a single album. I wrote a custom Node.js filter that curates my listening habits into a visually diverse showcase, ensuring every slot in the grid represents a unique artist.

Garmin watch face inspired by the VS Code editor interface.

Designing a VS Code-Inspired Watch Face for Garmin (Monkey C)

I combined my love for coding and running by building a custom watch face for my Garmin Forerunner. It displays my fitness metrics as properties of a JavaScript object, complete with monospaced typography and editor-style syntax highlighting.