Developer headaches meet real-world applications.
During Automattic's Radical Speed Month, Matthias and I built Reader Everywhere: a new way to follow Bluesky, Mastodon, and the Fediverse from the WordPress.com Reader. 90-second demo below. :)
I'm a reluctant Bluesky user and a new Bluesky user. I expanded my site's syndication implementation to support Bluesky and updated my links implementation to support tagging authors on Bluesky. Why join now? I'm not totally sure. Indigo launching was a factor. It looked like (and is) a lovely app.
I built a native iOS client for linkding and launched it, as I usually do, with a sarcastic-ish Mastodon post. I'd been using my instance as a PWA (inasmuch as PWAs are supported on iOS) and found it to be ok but not terribly satisfying. I appreciated the existing clients, but didn't love them. I'd tried them all, but ended up generally using a Safari extension and the web app in Safari.
Thoughts on the wonderful Web Origami project, which can be used as a static site generator but is also capable of very much more. It can be used in the shell to handle all sorts of data transformations and interactions, making it a valuable part of any developer's toolbox.
That I even need and have made a diagram of the infrastructure for this site speaks to how over-engineered it is. Yet, while it is ostensibly a personal site, it's a personal site that's replaced many services that I previously used.
I've already blocked entire countries to combat scrapers , I update my robots.txt for well-behaved bots (and 403 any included in the list that access anything other than my robots.txt ). In addition to these steps, I've started blocking traffic from IPs contained in Spamhaus ' DROP and DROPv6 lists.
Accessibility overlays are poor solutions to accessibility issues and in the majority of cases, inflict more problems than they solve. They don't provide legal protection and overall harm the usability of websites. They should not be used and must be avoided, with focus instead being placed on addressing the core problems.
I've spent a while recently migrating my personal infrastructure off Coolify . Coolify 's an excellent tool and one that helped manage the initial learning curve of managing and deploying things when I started to self host things. As I got more comfortable with the process, issues and details I found myself wanting to remove it as an abstraction on top of what I had become comfortable managing.
Overview of thoughful and protective design of tooling for moderating user-generated content, placing emphasis on minimising the psychological effects of exposure to heinous content, while balancing efficiency, accuracy, and the long-term wellbeing of trust and safety teams. Covering techniques for the mitigation of impact where applicable.
Navidrome released plugin support a few weeks ago and I've been working on implementing a plugin that scrobbles my listens to my own API endpoint. This has replaced my previous approach of regularly polling a private endpoint that sat unused in Navidrome 's UI. It works better and uses a properly supported mechanism to meet my needs.
Owning your own data is hard . I've been trying to own as much as I can, and my site has become a reflection of that process, both in what I display and discuss. As difficult as it is, there's a freedom in owning as much as you can.
Lab-grown brain circuits reveal who's really in charge. Nagoya University researchers fused thalamic and cortical organoids derived from human iPS cells, watching axons extend bidirectionally to form synapses. Neural activity propagates from thalamus to cortex in wave-like patterns, selectively synchronizing pyramidal tract (PT) and corticothalamic (CT) neurons while intratelencephalic (IT) neurons remain unaffected. The thalamus plays a decisive role in cortical maturation — connected organoids show greater development than isolated ones.
Infants organize the world into categories months before they can describe it. The gap between having structure and reporting it is older than language.
You learn something new every day. I've been using Homebrew for over a decade and, up until a few weeks ago, hadn't hit a case where I would not want to update something.
A guide to handling names in web applications with respect to people.
I use Goatcounter for analytics primarily to see where things I post might get mentioned. I don't get a ton of traffic, nor should I expect to.
Three projects, parallel sessions, and the rhythm of AI-assisted development.
Custom plugins, hooks, and quality gates that keep AI-generated code honest.
Building a sophisticated Claude Code configuration system with smart wrappers, mixin architecture, and orchestrator-only discipline.
Most habits don't fall apart because people quit. They fall apart because they aren't sticky.
An in-depth look at the philosophy, architecture, and journey of building an autonomous AI thought partner.
A rant of frustration about accessibility being a undervalued yet critically important part of building digital experiences. Complaining about the industry's apathy and the true human cost of neglecting accessibility.
The US government is run by petty morons that are threatened by a font. But because the web is the web, you can at least force .gov sites to render all text using Calibri.
The last app I bought through Apple's app store was a client for my Audiobookshelf instance and this reminded me why I'd built a Navidrome client . I wanted to use the web application as a PWA, but Apple doesn't support continuous audio playback in PWAs or Safari on iOS. Audio plays, but it never advances to the next track.
linkding is one of my favorite applications that I self-host and the place where I save everything I want to read later. The catch being that what little time I can dedicate to actually reading is spent on books. What I do have is time where I can listen to things while doing chores around the house, out on walks or otherwise engaged in an activity that doesn't demand my full, undivided attention.
All of my projects are now stored on my Forgejo instance rather than GitHub as the latter continues to speed run the enshittification curve. I've implemented a manual deploy button in my site's admin but for other, lighter-weight projects, I prefer to deploy changes whenever I push them up.
The Ship of Theseus, also known as Theseus's Paradox, is a paradox and common thought experiment about whether an object (in the most common stating of the paradox, a ship) is the same object after having all of its original components replaced with others over time. I'm playing around with ThemeSwitcher Pro from WebDevStudios. It's...
I've tracked my reading progress on my site for a bit now. I'd originally done this by fetching my progress from external APIs and sources on platforms like Oku , fetching and parsing the DOM on the StoryGraph and eventually importing and managing my own data. For years I've been reading and listening to audiobooks in Apple's Books app. Much like Apple's other media apps (music and TV, namely), Books has slowly moved in a direction that makes impor
I've moved all of my personal, private projects over to my own forgejo instance . It's been reliable and an altogether simple transition — I even have it mirroring the ai.robots.txt repo.
One of my ongoing efforts in building this site has been to embrace progressive enhancement and make it every bit as functional without JavaScript as it is with JavaScript. This has become much easier now that I've rebuilt the site using Laravel .
If you've ever wondered what domains the US federal government has registered, there's a rather exhaustive list over in the dotgov-data repository on GitHub, which is maintained by CISA . You can see the raw CSV here . They don't include the registration date, but you can derive that from public WHOIS records or by examining the repository's git histor
I've made a ton of changes to this site that I haven't yet written about. I likely will write about at least some of the changes given enough time, but I wanted to spit out a rough changelog in the meantime.
Since adopting Navidrome to stream my own music I've been tracking my listening activity from my instance and have recently added pages for all of the albums in my collection, with a record for each track and the track list and track duration displayed on the album page.
GitHub's now former CEO went in for some bold absolutes on software development as a career last week: Either you have to embrace the Al, or you get out of your career. And, this week, resigned. : GitHub and its leadership team will continue its mission as part of Microsoft’s CoreAI organization, with more details shared soon. Terrifying stuff!
As I've continued to over-engineer this site, there's been a mounting tension between what is and isn't dynamic. What should be dynamic, what needs to be dynamic, how often a given page or element is updated.
I've been using Navidrome to stream music for a bit now. It's lightweight, snappy, stable and does everything I need. It lets me stream my own music, mark things as favorites and track my listening habits . It's decidedly nerdy — you need to self-host it (or pay someone to manage it — I assume that's an option somewhere) and I sync new music up to it using rclone .
A full breakdown of my Neovim configuration, including documentation of all my base settings, plugins, and keybinds, as well as why I've configured them as such.
If the future is AI writing code (or writing much of it) — who writes the documentation? Is it the developers reviewing the code?
While digging around for AI crawler (read: scraper) user agents to block I found another company, platform, tool — whatever — that's using an altogether generic user agent.
Copilot in Edge. Gemini in Chrome. AI chatbots in Firefox. Opera becomes an 'AI agentic browser'. The Browser Company announces Dia and declares that 'traditional browsers' will die. Perplexity is building an 'agentic' search browser.
I've spent the better part of a year tracking the music I listen to day in and day out. The implementation has changed and the players have changed but the data collection, storage and display has been reliable throughout.
I've been moving more and more of the infrastructure I run and host on to my own servers. One thing led to another and nearly all of what I used was there: analytics, photo storage, music, RSS, saved links and on and on. I got the itch to try this with email.
My clarified stance on blocking AI crawlers is this: block all of them . I won't speak for everyone on the matter (I can't), but feel ok walling them all off .
For reasons that elude me I cannot get Open Graph tags to work when anything from this site is posted on Mastodon. I've fiddled with server configs, my aggressive robots.txt and still — nothing. They work everywhere else . So I built an oEmbed endpoint.
I've been listening to my music via Navidrome for a bit now and it's working quite well. To manage my music, I use rclone locally and on my host machine.
Now that I have several sections of this site served dynamically using PHP I've finally put together a single command to work on the site locally.