Changelog

46 entries · newest first

How this site has changed over time. Only the stuff that matters to readers – new pages, themes, feeds, search, and the bigger infrastructure moves. For how the site is built, see the colophon.

GitHub stats now render as terminal output

The contribution chart on /about was a third-party image with one fixed colour and no dark mode. It is now built at build time from my own data and printed as terminal output, with totals, active days, streaks, busiest day, and a Unicode sparkline of the last 52 weeks. No external request, no layout shift, and it keeps working from a cached snapshot if the upstream API goes down.

New page: Personal websites

A new /personal-websites page collects personal websites I like as screenshot cards. Each card links to the site and shows a snapshot of its homepage, captured, optimized to WebP, and stored on R2 by a pnpm addsite command.

Videos can now be embedded in posts

Notes can embed self-hosted videos through a custom Plyr player with automatic poster frames. Nothing loads until you press play, and everything is served from our own storage with no third-party dependencies.

Lighter pages and a cleaner stylesheet

Moved the site stylesheet into one cached file, cutting a typical page from about 100KB to 38KB. Images now load lazily and reserve their space, and /raw no longer scrolls sideways on narrow screens.

Smarter Keep reading suggestions

Rebuilt related-entry matching to weight rare tags over common ones and factor in title/description similarity plus existing internal links, instead of counting shared tags alone. Every post and note now gets five suggestions, and entries that never surfaced before dropped from 289 to 36.

Consistent navigation menu hit targets

Standardized link click areas and hit targets across header and footer navigation menus with uniform padding, negative margins, and rounded focus boundaries across all device sizes.

Standardized listing templates & archive metadata

Unified post list rendering across the homepage, /blog, /tags, and /archive pages. Added clickable status badge links, tag pills, and updated date indicators while keeping listing metadata clean without reading times.

Removed webmentions

Removed the full webmentions stack (webmention.io fetch, display UI, discovery links). Posts and notes keep Comment via Email and Comment on Mastodon.

Post footer share actions & metadata enhancements

Added Copy Link and Copy Markdown action buttons at the end of post/note articles, updated header metadata to hybrid reading time & word count, and enlarged navigation tap targets.

Streamlined post and note date headers

Grouped published timestamp and updated date under a single icon with parenthetical updated date styling across all themes.

Interactive tags page search and sorting

Redesigned /tags page with live search, multi-sort controls (Popularity, Recency, A-Z), and URL state sync.

Sitemap noindex accuracy & performance optimizations

Improved sitemap noindex filtering to handle string/array variants, added Netlify static asset caching & security headers, and parallelized image optimization builds.

Comprehensive external link audit & migration

Audited external broken links, migrated twitter.com URLs to x.com, updated stale reference links, and removed dead external links across blog posts and raw notes.

Sitemap cleanup

The XML sitemap no longer lists the three Atom feed files (/feed/feed.xml, /feed/raw.xml, /feed/archive.xml), which are meant for feed readers, not search engines.

Blogroll OPML download

The blogroll page now has a Download OPML link so you can import the listed feeds into your favorite RSS reader. Entries without a public feed are omitted from the export.

Correct publish dates and feed updates

Publish dates and bylines use IST; feeds respect updated; dead /updates/ URLs redirect home. README matches the Turnstile + Netlify newsletter flow.

Structured data and SEO polish

JSON-LD for posts, notes, home, and About; notes use article Open Graph tags. Also homepage h1, meme alts + noindex, and small a11y polish.

Smarter Keep reading ranking

Related lists soft-cap weak matches, prefer newer posts when scores tie, and put the AI tools page last.

Keep reading and small UX polish

Keep reading mixes posts and notes with kind chips; dropped older/newer nav. Also Now page links, theme-aware project chips, and bookmarks without JS.

Post ends: related over prev/next

Removed prev/next at post ends; related shows up to five links. Also hardened the favicon.

Site changelog

Added this page to track meaningful site changes – not every commit, just the ones that change how the site feels or works.

Paper theme and header polish

Third reading theme: warm paper with quieter monochrome links. Theme button cycles light → paper → dark. Also refreshed the header avatar (clickable preview) and switched the project to pnpm.

Friends page

New /friends page – people I like on the internet, separate from the blogroll.

Privacy page

Short plain-language privacy page covering analytics, newsletter, and theme preference.

Faster search

Split blog and notes search indexes, deferred Fuse.js until needed, and stopped shipping the search index in the global JS bundle.

Bookmarks

New /bookmarks page for links worth keeping, with notes.

AI stack page

Public page for the AI tools and models I actually use day to day.

Search UX upgrade

Live search, keyboard shortcuts, 404 search, prefetch, and a redesigned results UI that matches the rest of the site.

First newsletter issue

Sent the first issue from the self-hosted Listmonk setup. Subscribe on the list page.

Images on Cloudflare R2

Moved blog and note images to R2 (free egress) after Netlify bandwidth got heavy. Local optimize → WebP → upload via the ready script.

Dark mode

Light/dark themes with system preference by default, plus a header toggle to switch.

Blended home feed

Homepage now shows a single feed of recent blog posts and raw notes together.

Combined archive

One archive of posts and notes, with year pages for browsing back through everything.

Colophon

Documented how the site is built, the stack, and the principles behind it.

Dynamic OG images

Per-post and per-page social images generated with Satori at build time – no more one shared default for everything.

Webmentions

Receive and display likes, replies, and reposts from Mastodon and the wider indie web via webmention.io. (Later removed — see changelog entry for 2026-08-07.)

Blogroll

A list of blogs and sites I read, with feed URLs where available.

Local image pipeline

Dropped runtime @11ty/eleventy-img in favor of pre-optimizing with Sharp before deploy.

Umami analytics

Switched to self-hosted Umami – privacy-friendly page views, no cookies.

Now page

A /now page for what I'm focused on, reading, and writing lately.

Travel diary

Simple record of trips and kilometers traveled, plus a small bucket list.

Client-side search

Fuzzy search over posts and notes with Fuse.js – index built at compile time, no server.

Raw notes

Shorter notes with their own layout, archive, and feed – separate from longer blog posts.

Books page

Reading, completed, and planned books in one place.

Migrated from WordPress to 11ty

Moved the personal site (and years of posts) from WordPress to Eleventy. Still the foundation of everything here.

Fresh 11ty start

Initialized this Eleventy site on Netlify – Markdown in Git, static HTML out.