Skip to content

Blog

Generating Social Preview Images Without a Single Font File

20 September 2026

Generating Social Preview Images Without a Single Font File

Every post now gets a real social-preview card, generated on request from a JSX template — and the whole thing works without shipping or loading a single custom font.

nextjs
A Tag Filter With Nothing Yet to Filter

16 September 2026

A Tag Filter With Nothing Yet to Filter

The filter bar only renders when at least one published post has a tag. Right now, zero do — which makes this the first feature on the site that shipped invisible on purpose.

nextjs
Trending Posts From Data That Was Already There

12 September 2026

Trending Posts From Data That Was Already There

A "popular this month" widget sounds like a new tracking system. It turned out to be a JOIN against pageviews the site had been recording for another reason the whole time.

databasesnextjs
The Default Value That Passed tsc and Failed the Build

31 August 2026

The Default Value That Passed tsc and Failed the Build

A page component with `= {}` on its props typechecked cleanly and broke `next build` anyway — a class of error the type checker alone will never catch.

nextjsdebugging
An RSS Feed Nobody Could Find

27 August 2026

An RSS Feed Nobody Could Find

The feed had existed since the blog's first version. What was missing wasn't the feature — it was a single link tag, and the habit of checking before building.

nextjsprocess
A PT/EN Toggle Without a Second Content Pipeline

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."

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

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.

nextjs