Controlled Atmosphere – a WordPress plug-in for creating standard.site records for Bluesky posting

I’ve been reading about neat ideas people are trying with the AT protocol, the tech behind Bluesky.

For a bit of clarity, AT Protocol is the set of rules for how identities, repos, and records work. The ATmosphere is what people call the ecosystem on top of it. Bluesky is one app on the ATmosphere, and there are many others.

ATmosphere is not a blockchain. There’s no ledger. It’s more like a GitHub repo that you can control and move. In fact, on the ATmosphere, your data is referred to as your Repo. The funky DID string is your identity on the ATmosphere, which can point to your personal repo of data. The key idea behind this is that you can move your data around without having to ask any permission of anyone.

A diagram showing three components of the Bluesky ecosystem: "AT Protocol" (the rules covering identities, repos, and records), "the ATmosphere" (the ecosystem of everything built with those rules), and "Bluesky" (one app of many, alongside Leaflet, Tangled, and more), displayed as labeled boxes from left to right.

With that context in mind, in the past I’ve seen posts with View Publication on them and wondered what it was all about and if links to my weblog posts could appear this way.

A dark-themed social media post showing a publication card for "Cruftbox" by @cruftbox.com with a "View publication" button, accompanied by standard engagement icons (reply, repost, like, bookmark, share) along the bottom.


I looked into the existing WordPress -> Bluesky plug-ins, but they are all focused on auto-magically posting to Bluesky when you Publish a WordPress post. Good for a news or newsletter site, but not what I want at all. Typically I publish first, and then post on social media later with the blurb and link at a time I choose.

The View Publication badging works on Bluesky by using standard.site.

standard.site is a protocol for an AT record you can publish about your site and about individual documents on your site. Kinda like registering a book with the Library of Congress.

There are a few hoops to jump through to get this working. First is making a site.standard.publication record that allows you to prove you control your domain. Second is creating a site.standard.document record of the weblog post to your repo.

Since nothing I could find did what I wanted, I worked with Claude to build a WordPress plug-in to do the setup and make it so when I posted a link to my weblog on Bluesky, it would display with the View Publication framing.

I call the plug-in Controlled Atmosphere.

A social media post by Michael Pusateri showing a Goodreads 2026 Reading Challenge completion badge, with a congratulatory message stating he read 30 out of 30 books, achieving 100% of his goal with a View Publication badge.
 A test post of my Goodreads 2026 challenge post wrapped as a publication.
What matters is the “View Publication” button at the bottom,
showing the standard.site framing working.


The plug-in setup is fairly simple, the most difficult aspect is getting an App Password for the plug-in to use. Currently you can set one up under Settings -> Privacy and Security -> App passwords.

WordPress admin settings page for the "Controlled Atmosphere" plugin, showing configuration fields for a Bluesky account including handle (cruftbox.com), app password, PDS host URL, and publication details for a blog called "Cruftbox."


There are a few changes the plug-in makes, adding two verification files to allow Bluesky to verify you control your site using /.well-known/. This shouldn’t be an issue for most, but if you run into an issue, consult your favorite LLM to get some help.

Once the plug-in is running, when you publish a new post, a record of the post is created auto-magically, so that Bluesky can match it up and display the View Publication framing. Your post will have a tag that points to the ATmosphere record.

This plug-in is for people who DON’T want WordPress auto-posting to Bluesky. If that’s what you are looking for, Automattic’s Atmosphere plug-in is what you want.

Code is on GitHub at https://github.com/cruftbox/controlled-atmosphere

Even with a simple project like this, I learned a tremendous amount about how Bluesky and the wider ATmosphere ecosystem works. The details can be complex, but the concepts aren’t once you pull back the curtain.

My 2026 Reading Challenge

I track my reading on Goodreads. The site has various challenges that you can track toward different goals.

The one I use is setting a goal for how many books I read over the year. For 2026, I set my goal at 30 books, which felt ambitious.

Today, I reached that goal.

A completed 2026 Goodreads Reading Challenge badge showing 30/30 books read (100%), with a congratulatory message confirming the goal has been met.


With my spine issues, I’m on my back a lot, and found myself having more time to read than I expected, so the yearly challenge was completed quite early in the year.

Another goal was reading all the Hugo and Nebula nominated novels so I’d have an opinion on the winners. There are 11 different novels due to the overlap.

I made a short video about my thoughts on the nominees.

2025 Hugo & Nebula novel finalists #booktok #hugo #nebula

Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on YouTube.

After finishing the Hugo & Nebula nominees, I’m now reading through the Locus Science Fiction and Fantasy novel choices. That’s 14 additional novels beyond the books on the Hugo and Nebula lists. I have 8 more to go on that challenge.

After hitting the 30 book Goodreads milestone, I decided to run my goodread-tools script to create a graphic of the 30 books I read so far in the challenge.

Infographic titled 'Michael's Year in Books, January 2026 – August 2026' on a cream background with dark brown and rust-red accents. Top section, 'By the Numbers' (4 highlights): Peak Month — Apr '26, 6 books, the year's most prolific stretch. Books Read — 30, finished cover-to-cover this year. Longest Read — The Raven Scholar by Antonia Hodgson, 656 pages. Average Length — 412 pages per book, across 30 finished. Middle section, 'Books Read by Month' (peak: 6 in Apr '26): a bar chart for Jan–Aug 2026. Approximate values — Jan: 5, Feb: near 0, Mar: 2, Apr: 6 (highlighted in rust-red), May: 6 (highlighted in rust-red), Jun: 4, Jul: 4, Aug: 5 (partial/in progress, marked with an asterisk). Bottom section, 'What You Read' (all 30, listed chronologically, numbered 1–30 in two columns): Kingdom of Trash — Robert Macrae Flybot — Dennis E. Taylor Slow Gods — Claire North When the Moon Hits Your Eye — John Scalzi A Little Hatred — Joe Abercrombie The Golden Compass — Philip Pullman Stuck in Space: An Astronaut's Hope Th... — Barry "Butch" Wilmore When We Were Real — Daryl Gregory The Mote in God's Eye — Larry Niven Sunward — William Alexander The Incandescent — Emily Tesh A Drop of Corruption — Robert Jackson Bennett Death of the Author — Nnedi Okorafor Shroud — Adrian Tchaikovsky The Raven Scholar — Antonia Hodgson The Everlasting — Alix E. Harrow Katabasis — R.F. Kuang Wearing the Lion — John Wiswell The Buffalo Hunter Hunter — Stephen Graham Jones Sour Cherry — Natalia Theodoridou Picks and Shovels — Cory Doctorow Ancestral Night — Elizabeth Bear There Be Dragons Here — S.L. Rowland The Shattering Peace — John Scalzi Hemlock & Silver — T. Kingfisher This Vast Enterprise: A New History of ... — Craig Fehrman Nine Goblins: A Tale of Low Fantasy an... — T. Kingfisher Pride and Prejudice in Space — Alexis Lampley 36 Streets — T.R. Napper The Spellshop — Sarah Beth Durst


As you can see, I did fit in some books that aren’t award contenders, sometimes you need a little cozy fantasy to clear your head.

Some of the award winners aren’t what I would have chosen, mainly due to my tastes being developed on sci-fi/fantasy books from the 60s & 70s. My parents were big readers and I grew up with a large book collection at home.

Still, I’ve only read a few frustrating books this year that I really didn’t like.

Overall, I’ve enjoyed focusing on the nominees with a dash of booktok recommendations tossed in.

SportsCrawl.app

This post is for people on Bluesky, if you’re not on Bluesky, keep scrolling.

I built an app that sends you a daily DM with final scores and today’s game schedule for teams you follow.

Looks like this:

Sports scores widget for Thursday, August 6, showing final scores of Dodgers 6–Cubs 7 and Sparks 88–Sky 95, with an upcoming game of Sparks at Lynx at 6:00 PM.


MLB, NBA, WNBA, NFL, NHL, MLS, NWSL, Premier League, and tournaments.

Silence on days your teams don’t play.

No login, no app to install. Text only.

DM @sportscrawl.app on Bluesky to start.

SportsCrawl logo featuring a dark navy circle with colorful horizontal bar lines on the left, alongside the brand name with "Sports" in navy and "Crawl" in orange bold text.

Honey Gate Wrench

When harvesting honey I use several five gallon buckets. The buckets I use have small gates in them to allow honey to pour out.

The internal nut is hexagonal and can be a headache to tighten or loosen by hand. I remove them for cleaning and storage.

So I designed a simple 55mm honey gate wrench that I 3D printed.

The files are on Thingiverse.

ashlight – air quality monitor gadget

We have had a PurpleAir PA-II on our back porch for years. It works fine. The problem is that checking it requires going online to look at a map to find ours.

PurpleAir air quality map of the Los Angeles metropolitan area showing US EPA PM2.5 AQI 10-minute readings, with most sensors displaying yellow circles (moderate air quality, AQI 51-100) and one red circle near downtown LA showing a hazardous reading of 123.


What I wanted was a small device that is green when the air is fine and turns other colors when it’s worse. Here in LA between smog, wildfires, structure fires, and fireworks, the air quality is all over the place.

No specific numbers needed, just a color that gives us a good sense of what’s in the air.

So I built one. I called it Ashlight.

The details

The device is about as simple as it gets, a 16-LED WS2812B ring driven by an ESP32-C3 SuperMini, running ESPHome. It polls the PurpleAir over the home network every few minutes, computes the AQI, and shows the result as a color.

Nothing leaves the house. No cloud service, no API key. The PurpleAir has a local JSON endpoint that’s simple to query.

If the internet goes down, the light keeps working, good for a device whose job is to tell you about a wildfire.

Building it seemed pretty straightforward: Get parts, write a little code, test it, make an enclosure.

The parts are crazy cheap. The ESP32 was ~$4 and the LED ring was ~$5. A capacitor and resistor for the minimum of circuit board protection.

Wiring diagram showing an ESP32-C3 SuperMini connected to a 16x WS2812B LED ring, with 5V and GND power lines, a 1000μF capacitor across the ring's power supply, and GPIO3 connected to the ring's DI (data input) through a 330Ω resistor placed at the ring end.


My soldering is an abomination, mainly because I didn’t want to build it on a breadboard. The resistor and capacitor are just kind of floating in the air.

A small microcontroller PCB held in helping-hand clips with red, green, and black wires soldered to it, positioned in front of an X-Tronic 3020-XTS soldering iron controller displaying 417°C.


I leaned on Claude for the coding. After flashing the ESP32 with ESPHome, Home Assistant was able to see it easily.

We made the color a gradient, shifting into the next color as the AQI increased instead of six distinct steps: green -> yellow -> orange -> red -> purple -> maroon. I set it to shift to lowest brightness at night to avoid lighting up the room.

I did learn that the PurpleAir sensor is also running a tiny processor and doesn’t always respond to the HTTP request for JSON. Evidently, when it’s uploading every two minutes to the PurpleAir map, it ignores everything else. The code is set to be OK with this and retry as needed.

After getting it up and running, I found that the ESP32-C3 SuperMini’s onboard wifi antenna is bad. Not marginally bad, bad bad.

The signal strength was so bad the device was unusable when in the dining room.

I was pretty frustrated, but found Peter Neufeld’s blog on adding a small antenna.

The fix is a sweet hack: solder a 31 mm piece of wire to the existing antenna endpoints. 31 mm is a quarter wavelength of the 2.4 GHz wifi signal.

I tinned a wire, bent it into shape, and soldered it onto the ESP32.

Amazingly, it worked with the Ashlight residing in the dining room.

A small microcontroller PCB held in helping-hand clips with red, green, and black wires soldered to it, with a makeshift wifi antenna soldered to it.


If I were doing this over, I’d get an ESP32 with the U.FL connector for an external antenna and a small flexible patch antenna. Lesson learned.

For the enclosure, I couldn’t find something online that fit the bill, so I built something in Tinkercad.

A Tinkercad 3D design workspace displaying several orange cylindrical containers, a pink small box, two red rectangular shapes, and an orange torus (donut-shaped) object arranged on a blue grid workplane.


I wanted to use a translucent PLA, but the closest I had on hand was some glow-in-the-dark PLA. A little more finicky to print with, but it ended up working out. It’s a super simple enclosure with a hole for the USB-C cable to bring in power. Here are the STLs I designed.

The lid is just a friction fit, but holds together nicely.

A glowing green 3D-printed cylindrical object with a hollow toroidal top containing LED lights, sitting on a striped fabric surface in a dimly lit room beside a smart speaker.


Ashlight is in the dining room, glowing a pale yellow-green. In the morning, Michele and I read the paper and drink coffee there, so it tells us what to expect at a glance.

Here’s a short video about the process.

ashlight – air quality monitor gadget

An ambient lamp that shows outdoor air quality as a color. It polls a PurpleAir PA-II on the local network, computes AQI, and renders the result on a 16-LED ring. Code is on GitHub at github.com/cruftbox/ashlight.

Code is on GitHub at github.com/cruftbox/ashlight.

The README has the full wiring, AQI math, and considerably more detail than anyone needs but that Claude feels is essential.