Blog
Smart home write-ups, Apollo notes, and the occasional opinion. Browse by tag.
No posts match.
-
Debloating My NVIDIA Shields Freed Up RAM and Got the Ads Off the Home Screen
Four Shields across three hardware generations, 148 system packages disabled, every one reversible. The stock launcher was the largest process on all four, and replacing it cut that between 61% and 80%. Getting to that number took three wrong measurements first. The other win came from somewhere I wasn't looking: a TV tuner running 2016 firmware.
-
A HUB75 Football Scoreboard That Only Needs WiFi
Yesterday's scoreboard needed Home Assistant, a HACS integration, and a blueprint. A day later there's a version where you flash the M-1 from a browser, join it to WiFi, tap your team on the device's own page, and that's the whole setup. The ESP32 talks to ESPN itself. This is what it took, including the bug that made every button on my fancy new page silently do nothing.
-
Turning a HUB75 Matrix into a Gameday Scoreboard
NFL kickoff week seemed like the right time to make my HUB75 matrix show live scores. One Saturday, 21 blueprint versions, and a lot of standing in the living room saying "run it again" later, my wall shows the game, my lights celebrate touchdowns, and switching teams is a dropdown instead of a reflash.
-
Reverse engineering a PixMob RF LED wristband to work with ESPHome
PixMob wristbands are the LED bands they hand out at concerts and games. I got the RF version working from ESPHome, packaged it as an external component, and documented it properly. The band now shows up in Home Assistant as a normal RGB light, and setting one up takes three blocks of YAML.
-
Upgrading the RTTTL play_buzzer action on my day off
A customer asked why our MTR-1 didn't have a nice RTTTL action like SMLIGHT's coordinators. We had the action all along, but the form for it in Home Assistant was a blank box, because the ESPHome API can't send a description. Two days later there are six PRs across three repos and the buzzer plays melodies from prefilled fields.
-
Improving the sen6x component in ESPHome
I redid a stalled ESPHome PR as six smaller ones, ran three rounds of adversarial review agents over the code, and then flashed it onto real hardware anyway. The hardware found two bugs the reviews never would have. Also my sensor was unpowered for half an hour and I blamed everything except the actual cause.
-
What I learned letting Claude edit a YouTube Short
I wanted a 37 second video of my doorbell playing the Pink Panther theme, and I didn't want to edit it. So I had Claude cut the whole thing in ffmpeg. It got there, eventually, after being confidently wrong about the same problem four times in a row and me refusing to accept it.
-
Simplifying the use of hidden networks in ESPHome
If your Wi-Fi network is hidden, the wifi config every ESPHome guide hands you won't connect, and nothing in the logs says why. The option that fixes it existed, it just wasn't accepted in the short form. It turned out there was no reason for that, so I sent a patch.
-
Getting the CAST-1 wiki ready before launch
The CAST-1 plugs into the line-in on speakers you already own and turns them into a Music Assistant player. It launches in about a month, so I spent a day finishing its wiki. Along the way I found a sensor listed in our own docs that no firmware has ever exposed.
-
Turning four panels into one 128x128 display, then fixing the WLED docs
I connected four 64x64 panels to my WLED matrix to make one 128x128 display. Getting WLED to drive it as a single square took some figuring out, since the docs hadn't caught up with the grid feature yet. Here's the actual setup, why the 180 degree flip of the bottom row needs no software setting, and the docs update I sent back.
-
Improving the ESPHome captive portal
The screen that gets an ESPHome device onto WiFi lists the same network once per access point, so a mesh shows up three or four times at different signal strengths. Tapping the strong one does nothing the weak one doesn't, because the device only ever gets the network name, not the access point you picked. I checked the source, then sent a 220-byte fix upstream to collapse the list to one row per network.
-
Sometimes a sensor lies about what model it is: the SEN55 that said SEN54
Some AIR-1 units report themselves as a SEN54 over I2C even though the module inside is a SEN55, so ESPHome shut their NOx sensor off. It turned out NOx had never worked on those units at all. A small override option settled whether the hardware or the register was lying, and it ships in ESPHome 2026.7.2.
-
I stopped leaving the TV on for an empty house
My leaving-the-house automation used to only lock the door and arm the alarm, so anything playing kept playing to an empty room. Now it powers off the TVs, pauses the speakers, and offers a one-tap resume when I get back. Getting Plex to come back where I left off is where most of the wrong turns were.
-
How a non-coder uses Claude Code
I'm not a developer, but I use Claude Code every day for firmware, docs, and Home Assistant. The trick is writing down how I work so I stop re-explaining it. I just made my whole setup public: the skills and the memory pattern, cleaned of anything private, free on GitHub.
-
Animating my YouTube intro without a video editor
I wanted an animated logo intro for YouTube and I don't own After Effects. My logo was already an SVG, so I animated it with the browser's own animation API, screenshotted it 378 times, and let ffmpeg turn the pile of PNGs into a 1080p60 video. Total output: 6.3 seconds, about 180KB.
-
I built gifify to simplify making GIFs
My screen recorder produces 53 MB GIFs and the wiki needs 2 MB ones. I wrapped my ffmpeg scripts in a local web app with visual trimming, presets, and a file size readout, and now clips for the wiki and Discord take about a minute. It's free on GitHub if you want it.
-
Cooling the rooms my central air can't keep up with
Comfort Masters quoted me $24,000 to fix the way my house cools. I passed for now, kept my central air, and added three Midea portable units, around $400 each, to pick up the slack in the rooms it can't keep cold. Home Assistant runs them: a fan-speed deadband, a 20-amp breaker interlock, on-demand network-closet cooling, and a Mr. Freeze button for movie nights.
-
Building an air quality LED indicator for the AIR-1
The AIR-1 has three onboard RGB LEDs, so I made them show air quality at a glance. The feature itself is small. Getting there took longer than it should have, because I kept fixing things that weren't the problem. These are the dead ends and where it ended up.
-
Two days of ceiling dust, measured in eight rooms
I spent two days cutting sheetrock, disturbing old insulation, and scraping popcorn ceiling in the upstairs bathroom, with eight Apollo AIR-1 sensors watching the whole house. The two rooms off the bathroom spiked 20 to 30 times over, and the return air lifted every other room too. The room-by-room data, and why I wore a P100 the whole time.
-
The CAST-1 got a new DAC component and WizMote support
ESPHome 2026.6.0 added a built-in PCM5122 component, so we moved the Apollo CAST-1 off the community one we'd been using and added WizMote remote control in the same update. The move wasn't optional, the old component stopped loading on 2026.6.0, and the swap shipped with a silent-audio bug I had to chase down.
-
Dehumidifier tank-full notifications with a Zooz ZEN15
My dehumidifier is a completely dumb appliance, but it sends me a notification the moment its tank fills up. No smart features, no app, no subscription. Just a heavy-duty Z-Wave plug that watches power draw and one Home Assistant automation that fires when the power falls off a cliff.
-
Two Home Assistant UI tweaks for power users
A recent r/homeassistant thread asked how to get the UI closer to the more advanced, power-user feel it used to have. The comments had a pile of ideas. Two of them stuck with me, and both take about ten seconds to flip on.
-
IKEA KAJPLATS: Matter was a mess, so mine run Zigbee
IKEA replaced the TRÅDFRI line with KAJPLATS, and the new bulbs ship with Matter over Thread. I gave that a real shot and it was a mess. I ended up adding mine to my existing Zigbee2MQTT mesh instead, using the hidden 12-power-cycle sequence that switches the bulb into Zigbee pairing mode.
-
I cut my Home Assistant backups in half
My backups had ballooned, and the recorder database was the reason. I'd had exclude filters in my config for ages and they did basically nothing, because excludes only stop new data, they don't touch what's already there. Here's the cleanup that actually shrank the database, and the backups along with it.
-
I made a free smart home class. Steal it.
My beginner Home Assistant class is now at classes.smarthomesellout.com. If you teach too, the repo is set up so you can fork it, swap in your own gear and stories, and use it for your own class.
-
My first blog post - better late than never!
This is the first post on my new blog. The plan is to get more content out and share what I'm doing with the world. I work at a smart home startup and spend most of my free time on FOSS smart home projects. Follow along to see more!