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. 🙂
Rita Kozlov and Steve Faulkner from Cloudflare dive into the major Vite acquisition and how it fits their AI and developer tools strategy.
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.
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.
Three months ago I wrote about a feature-workflow plugin that added structure to how I work with Claude Code. Capture ideas, plan them, implement them, ship them. The structure helped — I stopped losing track of what I was building mid-session and started actually finishing things. But the review step was weak. The plugin had its own internal review skill, and Claude was reviewing its own code but it was too agreeable. The same blind spots persisted across features. I'd work on something and i
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 have been working on various ATproto integrations for Drupal over past few months, and have now combined them into a single suite. The code is available on Github [1]. Much of this is tailored to my custom Drupal content types and would only server as an example to others, however you should be able to use the atproto_client as is and write your own code on top of it. The individual modules provide Action Plugins for use with ECA. There are recipes for installing the ECA models. Some of the modules also depend on the Indieweb Webmention module which provides the entity types for Syndications and Webmentions. I set the Drupal core requirement to 11.3 because that is the environment I'm working in, but I'm sure most of it would work with earlier versions if you just changed that. This is Alpha level code - use at your own risk. [1] https://github.com/lieb77/atproto
I have been working on various ATproto integrations for Drupal over past few months, and have now combined them into a single suite. The code is available on Github [1]. Much of this is tailored to my custom Drupal content types and would only server as an example to others, however you should be able to use the atproto_client as is and write your own code on top of it. The individual modules provide Action Plugins for use with ECA. There are recipes for installing the ECA models. Some of the modules also depend on the Indieweb Webmention module which provides the entity types for Syndications and Webmentions. I set the Drupal core requirement to 11.3 because that is the environment I'm working in, but I'm sure most of it would work with earlier versions if you just changed that. This is Alpha level code - use at your own risk. [1] https://git@github.com:lieb77/atproto.git
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.
In my continued effort to syndicate my blog posts far and wide I have implement Standard Site [1]. This is an AT Protocol Lexicon for long form publishing. A Lexicon is a schema for structured data. Basically fields with strict definitions of what can go in these fields. Bluesky is also based on an AT Protocol Lexicon. The difference is that Bluesky's lexicon limits posts to 300 characters. Standard Site expands that to 3,000 characters allowing for longer essays. The problem with this is that Bluesky cannot display posts published with the Standard Site lexicon. There are however a number on new sites that do: leaflet.pub [2] and pckt.blog [3] among others. Simply publishing my posts with Standard Site lexicon syndicates them to these sites automatically, but if I want them to show up on Bluesky I also have to publish them in their lexicon (which I was already doing). The hope is that Site Standard does indeed become a standard and becomes widely implemented. Time will tell. So now my Blog posts are available over Indieweb, Bluesky, ActivityPub (Mastodon), and now Standard Site. Noticeably absent from this list is Facebook. Facebook as I'm sure you know, is not a team player and is not interested in participating in the Open Web. a.k.a. A walled garden. This is unfortunate, because that's where all my friends are. While I may have followers on these other platforms, very few of them are people I actually know. I hope this changes. I hope I can convince more of my friends to move off of Facebook [1] https://standard.site [2] https://leaflet.pub [3] https://pckt.blog/