The learning log
Notes
Short pieces written the same day a thing broke or a thing worked. A few hundred words, dated, unedited, occasionally wrong in public. This is the cheap tier on purpose: if publishing one ever costs more than writing one, it has failed.
- 12notes so far
- latest Aug 2026
- RSS
Recurring
- rebuild4
- cloudflare3
- dns3
- astro2
- design2
- migration2
- systems2
- tunnels2
+ 14 used once
August 20262
You can copy the layout, you cannot copy the fuel
Two reference sites, same visual language, different engine. One runs on proof of person, this one runs on proof of archive.
#design#positioning#rebuild
The schema is the contract
content.config.ts is the one file every page builds against. Making the notes tier cheap meant deciding what it is allowed to require.
#astro#content#systems
July 20266
The accent colour I liked fails AA at 4.19:1
#9E642E on #050505 measures 4.19:1. It looks fine and it is not usable as text. The token now says so in a comment.
#accessibility#design#color
The guide everyone was scared of was 39 lines of JavaScript
The interactive guide was assumed to be the hard migration. Measured, it was trivial. The real cost was 13,000 lines of bespoke HTML nobody had counted.
#rebuild#measurement
9, then 2, then 1
Three months of publishing, in order. A curve that shape is a format cost problem, not a discipline problem.
#publishing#systems
Astro serves public/ verbatim, which is the entire migration plan
Old hand-built guides drop into public/ untouched, keep their URLs, and get replaced one at a time. Nothing 404s at any point.
#astro#migration#rebuild
Proxying Cloudflare in front of Vercel breaks the certificate about 60 days later
Vercel renews via an HTTP-01 challenge that has to reach Vercel. Orange-cloud the record and renewal fails silently while the site keeps working.
#vercel#cloudflare#tls
dnsowl publishes a 48-hour NS TTL, so a nameserver rollback takes 48 hours
The child-side NS records carry a 172800 second TTL. That is the real worst case for undoing a nameserver change, and it is not propagation.
#dns#risk#migration
June 20264
A Cloudflare tunnel can only serve a hostname Cloudflare controls
Pointing a CNAME at <uuid>.cfargotunnel.com from an outside DNS provider fails, because that name has no public A record.
#cloudflare#dns#tunnels
cloudflared takes the zone from cert.pem, not from the hostname you typed
tunnel route dns printed success and created the record in the wrong zone, because the zone comes from the cert, not the argument.
#cloudflare#dns#tunnels
15 pages, 15 style blocks, 8 font stacks
Counted the CSS across the old guides before touching the design. 252 of 391 class names appeared in exactly one file.
#css#audit#rebuild
The site was blocked from Google twice, and fixing one did nothing
robots.txt had Disallow: / and vercel.json set X-Robots-Tag: noindex on every route. Removing either one on its own changes nothing.
#seo#deployment#debugging
Next
Unwritten
The next one lands whenever the next thing breaks. 12 are up. There is no schedule and no backlog, which is the point.