I'm super excited. I'm nervous though. I can't say why I'm nervous, but I'm nervous. I've gotta pass two background checks to get the job. It's with my college, which has a high school attached, and I've gotta pass a background check for both. I can't see a single reason I wouldn't pass (other than...
I've been working on a number of connection points between my site and the broader web. Part of that effort has been webmentions (which are a fairly small spec). You advertise an endpoint and someone posts a source and target and, from there, you do with the information as you please.
The human cost of conflict is immense. Global headlines document the devastating consequences in the Middle East and territories, Sudan, the eastern Democratic Republic of the Congo, the Sahel, and beyond. It is a significant cost in terms of both lives lost and harmed, particularly for children, and communities fragmented. In 2025 alone, at least...
I've been relearning arduino. I made an adding machine. The old one had disgusting code. The new one should be better. It follows proper abstraction principals as far as I can tell. Its cleaner too. The first variant was more of a GOTO soup.Unfortunately however, I dropped my brain out of my ass and the...
If you are a Tezos baker, you have probably heard quite a bit about tz4 addresses lately.
I have about 14 days to configure my laptop to be the idea coding machine for myself. As it stands, It currently is running Arch linux with MATE. I've got both "Code - OSS" on it and neovim/nvchad. I'd really like to build my own *nix distro following the suckless philosophy. If I was only...
Today, implementation is cheap. You are paid to make good decisions. To build software that will scale while managing complexity. [...] You need to contribute beyond what everyone already gets by giving an agent a prompt. AI is removing the middle class of software engineering
I've decided to retire Cadence, my iOS and macOS Navidrome client. This isn't a post I was planning to write and it wasn't the easiest decision. I originally created Cadence because there wasn't a Navidrome or Subsonic client I was happy with or enjoyed using. That is no longer the case.
How I stopped using LLM tools for everything and started writing code again.
Dissecting Linear as a local-first app.
I'm on a path to reclaim my sanity by taking a step back and exploring modern web architectures. Join me!
And things to look out for when contributing upstream
Due to my compulsive need to self-host whatever I possibly can, I decided to set up a self-hosted PDS. All that's on it so far is my Bluesky profile data, but it was a surprisingly painless process.
A picture is worth a thousand pads™
So I found the phone I was looking for, funny how as soon as I complain online it remembers it's supposed to exist and re-enters the physical plane. It was in a crate with some old documents, idk how it got there. I'd like to build a custom OS for it, specifically I wanna build...
It's in my apartment... somewhere. Because if it isn't I have to accept that the simplest other solution is that my friend stole it when we were jamming. I don't think he'd do that, just doesn't seem like him. I don't miss the phone. I've been using a Sunbeam F1 Horizon Wren. It meets every...
For a while now, my home page has shown whatever song I'm listening to (or, if idle, the last one I played). Initially, it was powered by last.fm. As I've built my own scrobbler, I populated the element from my own data. The static implementation is straightforward: I store each listen as a record. When a listen is inserted, the cache is cleared and warmed, and an update is displayed.
A few days ago I wrote about rolld, the little board game tracker I built on the AT Protocol. As I mentioned then, this is very much a learning experiment for me, a way to play with ATProto and learn about it. In this post, I'd like to come back to a few of my struggles and the things I learned while designing it.
How to pair blit's browser-based terminal streaming with moo's local-first agent workbench for remote development, 11ty site work, and accessible document and transcript conversion.
Libreopolis began as an attempt to understand an old game and became a compatible city of its own.
Why Minecraft turned out to be such an interesting home for radar, missiles, drones and all the systems between them.
I've had this long, long running relationship with bookmarking and read it later services. I'll commit to one, excited about whatever feature set it offers and then, without fail, my list grows and grows and grows and grows. I archive things to reset, repeat and then move to a different service. The only thing that's ever worked has been listening to articles as audio when I have a spare moment. Sometimes it's background noise but, generally, I absorb things better as audio.
This post provides the most straightforward and minimum way to animate the HTML detials element using only CSS.
For years my board game log lived in a little WordPress plugin I wrote. rolld is my next small experiment: the same log, rebuilt on the AT Protocol, where each play is a record on your own PDS. Give it a try!
Now that this site is written in Go, I've turned to restoring and adding more features connecting it to the open web. While I maintain a healthy skepticism of Bluesky the company, I'm enamored with open protocols and ATProto falls under that umbrella.
I'm in a file. I want to see it against main, or against yesterday's commit, or against the branch I'm rebasing. Not the whole repo in a web UI. Not a custom diff panel. The normal VS Code diff, the one that already feels right.
Introducing AT Mot, a small ATProto experiment, and a daily word game. Give it a try!
Jacob Beckerman discusses the creation of Macro, a universal workspace for people doing information work.
5 weeks since my bike crash. I would have thought I'd be putting this time to better use but no such luck. Time off the bike means more time to work on development projects. Problem is my brain's. been in a bit of a fog and my vision has made computer work less fun. So I've been avoiding the computer. But now a heat spell is upon us and I can't handle the outside work that has been keeping me busy. So here I am, my second blog post in a month. I'd like to update my atproto_standard_site Drupal module. This is the module that will publish this blog post as a atproto post using the site.standard lexicon. Leaflet will display these and I understand Bluesky will now display then also. However Bluesky is not displaying mine so I may have to change something about the format. So I'm hoping I can stay focused on the computer to get this done today or tomorrow. Also I'm reconsidering using ECA for publishing the new posts. Its very slow and I can't figure out why. Previously I just used my own custom hooks and it was much faster. Much to investigate.
What if your ATProto content was a WordPress block tree? I built a long-form editor where the standard.site "content" field is just Gutenberg blocks, no PHP anywhere. I'm playing with ATProto, even though I'm still not fully sold on it as a web old-timer. 🙂
My thoughts on the push-and-pull of AI usage.
Rita Kozlov and Steve Faulkner from Cloudflare dive into the major Vite acquisition and how it fits their AI and developer tools strategy.
Using Astro and the ATProtocol to make a "live" updating page
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.
Three patch releases in one evening — how using my own plugin on a real project surfaced a confusing schema field, an internally inconsistent verdict, and the case for state as a first-class concept.
Jeff Dickey discusses monetizing open source through his company en.dev and his suite of tools: Mise, HK, Fnox, and the new Aube package manager.
Sam Goodwin introduces Alchemy, a modern infrastructure-as-code tool built with Effect that challenges the tech debt of current solutions.
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.
Elio Struyf showcases Front Matter CMS for VS Code and Demo Time, his tool for creating flawless presentation demos and talks.
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.
Just testing. Still testing. Testing continues.
After creating my own ATproto suite [1] of modules for Drupal I was excited to see Affinity Bridge [2] had ported the Wordpress Atmosphere plugin to Drupal [3]. While there are some major differences they both achieve the same goal of publishing Drupal content as both Bluesky posts and Standard Site documents. Here are some of the key differences. ModuleATprotoAtmosphereStructureModular. Several modules with dedicated functions.One module does it allAuthenticationApp password. Drupal can re-authenticate in the backgroundOauth. Requires user to re-authenticateTrackingUses the Indieweb Syndications entityExtends the content types with additional fieldsBackfeedTracks posts for likes and replies. Uses Indieweb Webmentions.Not implemented in initial releaseExecutionDefines Plugin Actions for use with ECAUses hook_insert, hook_update, etc.FeaturesLimited support for facets and images in initial releaseGood support for facets and images. As my modules are somewhat tied to my custom Drupal installation, I see the Atmosphere module better positioned for general consumption on Drupal.org and I hope to be able to contribute to it. [1] https://github.com/lieb77/atproto [2] https://github.com/affinitybridge [3] https://github.com/affinitybridge/drupal-atmosphere/tree/main
After creating my own ATproto suite of modules for Drupal I was excited to see Affinity Bridge had ported the Wordpress Atmosphere plugin to Drupal. While there are some major differences they both achieve the same goal of publishing Drupal content as both Bluesky posts and Standard Site documents. Here are some of the key...
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.