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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
I saw another inexpensive ESP32 device on Aliexpress and decided to see if it would work well as a smart home controller like Tessera.
The ESP32 display has wifi and Bluetooth, is about 1 3/4 inches in diameter, and has a roughly 240×240 screen.
The code conversion was fairly simple, mainly focused on the display and putting in swipe functionality. Claude did the heavy lifting.
Didn’t turn out as useful as the square panel Tessera I built previously.
The round form factor made designing a stand for it more difficult. When I did get something to work, it just didn’t have a good tactile feel and felt like a chore to use. Also, getting a stand design that allowed me to plug in and route a USB-C cable for power was a bit of a headache.