Nine B&Bs, Three Months: What It Actually Took to Go Digital
In three months I built five websites covering nine Taiwanese B&Bs, deployed automated weekly reports and a Google Ads health check system. This is what that actually looked like.
In three months I built five websites covering nine Taiwanese B&Bs, deployed automated weekly reports and a Google Ads health check system. This is what that actually looked like.
Adding clickable service cards and public BBQ/birthday pages to my guesthouse site in zh/en. The interesting part wasn't the markup — it was an apostrophe killing the build, an orphan-class audit, and a watermark bleeding into the hero.
Two days of Core Web Vitals work on a hotel intro page: killing a watermark script that caused CLS 0.19, the AVIF-vs-WebP LCP tradeoff, grain texture as mask-image, and critical CSS to hit ~92 mobile.
Same stack, five different clients, recurring patterns and surprises. Notes on SSG vs SSR decisions, responsive images, and a shared admin panel built on the GitHub API.
How I split per-site config from shared engine logic for a multi-account Google Ads automation pipeline, added conversion-tracking route verification that runs in CI, and moved keyword cleanup into reviewable YAML diffs.
I wanted a place where local anglers help traveling fishermen — sharing gear, spots, and local knowledge. Here is how I thought through the product and the tech stack decisions that followed.
I read a lot of English developer content but wanted a Chinese-language aggregator. Adding DeepL API translation to the pipeline was straightforward — the tricky part was knowing when not to translate.
After learning the basics of Android development, StateFlow + ViewModel clicked as the right pattern. Here's how I think about unidirectional data flow in Compose and why it makes things easier.
I debugged OG preview failures across multiple B&B client sites. There are at least six independent cache layers that can each silently break your preview image.
I set up a multi-agent coding workflow where different Claude agents handle different phases of a feature. Here is what worked, what broke, and what I would change.
I built a multi-site engine that pulls GA4 data every Monday, runs it through Claude, and commits a Markdown report to the repo. Each site gets context-aware analysis without me touching anything.
I needed a way for non-technical clients to edit homepage banners on a static site. The solution: a web admin that commits changes directly to the deploy branch via the GitHub API.
Astro's built-in i18n is straightforward until it isn't. Notes on routing, content collections per locale, language detection, and the edge cases that took time to figure out.
I applied DDD to a personal project — bounded contexts, repository interfaces, Zod schemas as invariant enforcement. Here's what the layers actually look like and where the complexity is worth it.
An experiment in feeding weekly keyword data to Claude and letting it suggest bid adjustments and keyword changes — with a human review step before anything actually runs.
Instead of a database, I used Google Sheets as the source of truth for an ads automation system. Clients can see and edit the state directly — no admin panel needed.
I wrote Android apps for 14 years, stopped in 2022, and came back to find Kotlin + Compose had taken over. TackleBox is my first real app on the modern stack — here's what transferred and what didn't.
Using Zod schemas as runtime contracts in a TypeScript project. How DBC principles help catch data shape errors at build time rather than runtime.
I built a developer news aggregator and added full-text search with SQLite FTS5. No Elasticsearch, no Algolia, just the database I was already using.
Introducing Code & Cast: a personal site where deterministic software engineering meets the stochastic nature of fishing. An exploration of dual identity.
How I dropped four Railway containers and a self-hosted n8n setup in favor of a cron-triggered GitHub Actions workflow — and why I should have done it sooner.