Blog

18 August 2026

Using an AI Pair Programmer as a Design Partner, Not Just an Implementer

The most useful sessions were not the ones spent writing code. They were structured interviews that talked a vague feature idea into a decision — or into the trash.

14 August 2026

Commit Conventions That Scale Down to a Team of One

[Type] Brief description, no commit body, no Co-Authored-By. A format that looks like it is for other people's benefit turns out to help the one person reading it back.

11 August 2026

Auto-Merge on Green CI: How Much Do You Trust Your Own Pipeline?

Every PR to dev-hub merges and deploys automatically once checks pass, with no manual approval step. That only works because of what "green" is required to mean.

7 August 2026

What Changes When a Personal Site Moves to a €4 Hetzner Box

A CX23 in Helsinki instead of a managed platform. More control, more responsibility, and a monthly bill that stops scaling with traffic.

4 August 2026

One Postgres, Two Lives: Neon in Production, Docker in Local Dev

Neon's serverless Postgres backs the live site; Docker Compose backs local iteration. What that split buys, and where dev-hub actually deviates from it.

31 July 2026

DNS-Only vs. Proxied on Cloudflare: Why the Orange Cloud Is Still Off

The proxy toggle looks like a free upgrade — CDN, DDoS protection, hidden origin IP. Turning it on for a single-server personal site is not free.

28 July 2026

The Dollar Sign That Broke My Bcrypt Hash

A bcrypt hash stored in .env stopped matching after a routine restart. The cause was not the hash — it was Next.js expanding $ as a shell-style variable reference.

24 July 2026

A PT/EN Toggle Without a Second Content Pipeline

Portuguese visitors get translated site chrome, not a second copy of every post and project. Here is the line drawn between "translated" and "not."

21 July 2026

An RSS Feed in the Next.js App Router, in About Twenty Lines

A /rss.xml route handler over the same published-posts query the blog already uses. Cheap to add now, easy to regret skipping later.

17 July 2026

SPEC.md as the Source of Truth on a One-Person Project

A living spec file with a dated changelog of decisions replaces the alignment meeting when the whole team is one person plus an AI agent.

14 July 2026

I Killed an AI Feature Before Writing a Line of Code

A "video digest with AI" idea, reframed twice under a structured interview, collapsed into "this is just a Post with extra steps." Here is how the interview got there.

10 July 2026

Why My Blog API Requires Login Even to Read

Unlike /api/projects, GET /api/posts is auth-gated. The reasoning is about what a draft is allowed to leak, not about performance or caching.

7 July 2026

One Field, Two States: Modeling Draft and Published with a Single Nullable Date

Why the Post model uses a single nullable publishedAt instead of a published boolean plus a date field, and what it saves at query time.