RSSAmplifier

Blog

Matt Steele

The personal blog of Matt Steele

steele.blueRSS feed ↗80 posts

Latest posts

My house alerts me when my cat climbs into the ceiling

We have an orange cat who loves to climb into our basement's drop ceiling and wander around. It's especially adorable when she hangs out in an alcove and surveys her domain. This does not happen on any predictable schedule, as per the whims of a cat. But I didn't want to miss out on any chances to see her perched up there. So, I wired some cheap IoT devices together to notify us when she hops into…

The Year Of The Linux Desktop (for fitness games)

A tale told in memes I'm joining the bandwagon and declaring that 2026 will be the Year of the Linux Desktop. Specifically for the subset of fitness gaming apps, it's no longer necessary (or preferred) to be tethered to Windows. Two long-term trends have led to this moment. Windows has been on a "slowly, then all at once" descent in quality that really started ramping up last year . Working with…

Hacking custom GIFs onto an LED Mask with mitmproxy

This Halloween I went as Rorschach, the Watchmen 'hero'. I don't have much of a connection to the character; it was mostly an excuse to play with an LCD face mask I bought a few weeks earlier. Since I was on a time crunch to implement the face mask in time for a Halloween party I was attending, I decided to go for the simplest approach: use the official Android app to upload my custom GIF onto the…

Keep Your Running Cadence With a Garmin Music Playlist

I've been running more this year, and one of the aspects I've been working on is running at a consistently higher cadence. Most experts recommend running at a pace of 170-180 strides per minute , but it can be rough maintaining that over time! And while some fitness devices have metronomes that can help you keep pace, I've found that listening to music with a matching tempo. Christopher McDougall…

Thank Java for Better JavaScript Dates

I gave a lightning talk at NebraskaJS about the complex, decades-long relationship between JavaScript and Java's Date APIs: The first half was a bit of a troll; I used a Java REPL (anonymized to look like Node) to demonstrate some of the more famously unexpected behavior in the Date class: var date = new Date ( "March 20 2025" ); date . getMonth (); // returns 2 date . getDay (); // returns 3 date…

This blog's comments are powered by Webmentions

Webmentions are a cool, standards-compliant mechanism to let your corner of the Web interact with other sites. What better way to add a comments system to my new Eleventy-powered blog ? At its core, Webmentions are just a means for one site to notify another that it's been mentioned. That said, webmentions aren't the most intuitive concept to grasp, and implementing them requires additional…

From Gatsby to Eleventy

I try not to rebuild my site too frequently, as it's one of the classic blunders, alongside getting involved in a land war in Asia. But the Six-Year Itch is real, and it was time for a change. The (Not So Great) Gatsby My site has been powered by Gatsby since Dustin Schau (former coworker and Gatsby emeritus) ported it over as an early Christmas gift in 2018. I'm not a React guy, but it was easy…

Side projects should be fun

Connell McCarthy's post about "overengineering everything at his wedding" was a fun read: https://connellmccarthy.com/article/wedding/ I can relate to “this wedding would be a great opportunity to build everything bespoke”, as I: live-streamed our wedding on an alpha build of Owncast built a custom photo booth from a Raspberry Pi built our website and RSVP system with a Firebase and Airtable…

Mutation Testing with StrykerJS

Jessica Codr and I gave a talk at NebraskaJS about StrykerJS : Stryker is a mutation testing tool - it makes a change to your code, then runs your tests. If everything passes, then your tests aren't catching bugs you could be introducing over time. Think of it as code coverage, with specific areas to focus on. In some ways it's similar to fuzzing: by making large number of pseudo-random changes to…

My favorite water bottles

Inspired by "my favorite mugs" posts from Cassey and Benji , here's a few of my favorite drinkware. While I do have a set of mugs I love, I probably get more use out of my water bottles. They pull double-duty as a convenient vessel for daily drinking, and for any activities on a bike. I've raced Gravel Worlds a half dozen times, and get a new bottle every year. It's both functional (at 24oz, it's…

Web Push is almost usable with iOS 17

Apple got a lot of positive sentiment earlier this year when they launched betas of iOS 16.4 and announced support for Web Push, along with other features. At WWDC they declared "As long as you've coded to the standards and use feature detection, so you don't unwittingly exclude Safari, your users will already get the benefit of Web Push". Having attempted to implement Web Push in a recent project…

I wired up my bike's GPS to order me pizza during a gravel race 🍕

As harvest season begins here in the Midwest, I once again celebrate by grinding Nebraska gravel at the Gravel Worlds Long Voyage bike race. As in previous years ( 2021 ) ( 2022 ), I spent more time writing code for a marginally-useful project than I did training. But hey, I finished! Fueled by Pizza My goal this year involved optimizing my food choices during the race: pizza from Casey's General…

Running a Playwright script on AWS Lambda

I had a hell of a time getting a Playwright script to successfully run in an AWS Lambda. There's a few guides on various ways to handle this, but none of them worked out of the box. For posterity, here's what worked for me. Use a Docker Container The two primary ways I've seen Playwright and Puppeteer implemented are: Using the default Node runtime, with the Chromium browser installed as a…

Overly Complicate Starting Your Vehicle, Using Home Assistant, an ESP8266, and a Spare Car Fob

I recently bought a new vehicle (the now-discontinued Chevy Bolt), it's great! Coming from a 14 year old car, everything about it feels space-age. This is the first vehicle I've owned that has a remote start button on the keyfob, which I'm fascinated by. It also integrated with a mobile app, which enabled locking & remote start from a phone, but requires a monthly subscription. I wanted to see if…

Generating Custom OpenGraph Cards with Gatsby and the 11ty Screenshot Service

I made the sharable OpenGraph images on this site better by generating custom cards contextual to each post: The core concept is to create a sidecar page for each post that looks like an OpenGraph card, then take a snapshot of the page, and set it as the og:image meta tag on the original post. There are a few Gatsby plugins that attempt to help, but they rely on Puppeteer to generate screenshots…

Keeping your Fediverse followers when moving Owncast servers

So you've got an Owncast server running, and it's part of the Fediverse , so your Mastodon friends can be notified when you start a stream. Neat! If you want to switch hosting providers, or install from scratch, you'll want to make sure your followers continue to receive notifications. This could be easy, or a bit of a challenge. Either way, here's what to do! The easy way - Copy over the database…

Running Owncast with Hardware Acceleration on a Raspberry Pi 4

Owncast is a self-hosted platform for streaming video, which I've been using for sharing all kinds of events, from Zwift racing to my wedding . It's been really pleasant to use as a Twitch alternative. Historically, I've run my instance (https://stream.steele.blue) on a virtual server in The Cloud (specifically, a $6/month DigitalOcean instance), but wanted to explore moving it on-prem, using my…

Vite is Neat

I spoke at NebraskaJS about Vite : Aside from a scratchy voice initially (and having to present remotely due to a Covid recovery), it went well! I was excited to share my excitement for ES Module-centric toolchains, and the speed they afford day-to-day development. As an example of a Vite-driven website, I showcased the GPS bike tracking website , which used Vite on its frontend. The UI isn't…

Serverless Bike Tracking with a SPOT Tracker, AWS Location + Friends

I recently participated in the Gravel Worlds Long Voyage bike race. Last year I tried, and failed , to finish the 300 mile course, and built a pacing calculator along the way . This year, I felt better prepared, rode smarter, and actually finished! My intent was to simply complete the race within the time limit, with a stretch goal of finishing before sundown. I ended up making it with about an…

ACEing Ocarina of Time

The Summer Games Done Quick event recently ended, and I'm still thinking about an Ocarina of Time run: It's best if you go in without too much knowledge of the run, but if you grew up playing and reading rumors on Geocities about what was possible, you'll love the process. The team did a great job explaining the run , which relies on Arbitrary Code Execution and other tricks. The summary video is…

Advent of Code as Soulcraft

As we close out another Advent of Code season, this year the Meta Discourse is less around any of the puzzles, and more around whether you should feel pressured to participate . Especially if you see your GitHub activity feed filling up with others starting advent-of-code repos every December, it can feel like you're missing out if you don't want to, or aren't able to participate. In general I'm…

Gravel Worlds - Long Voyage

I participated in the inaugural Gravel Worlds Long Voyage bike race last weekend. It was my fifth year racing a Gravel Worlds event, and I'm not planning on stopping any time soon. Corey, Craig, and the other organizers do a great job to make everyone welcome and accepted. I applied for the 300-mile event partially for personal redemption. In 2018 I raced Trans Iowa , but only made it about…

Making a Raspberry Pi Photo Booth with Pibooth, NeoPixels, and Giant Buttons

I put a homemade photo booth together for a wedding reception we postponed for a year, on account of, gestures everywhere : It was a fun project that let me play with new hardware and software. Here's a few photos of the project, and some of the things I learned. The guts of the project were driven by a Raspberry Pi 4 running pibooth . It's a great project that works well out of the box, and has a…

3 Things I Learned Trying out the JavaScript Temporal API

I've been preparing for a 303-mile endurance gravel bike race . Not by training or improving fitness, of course, but by building a PWA to estimate and track checkpoint ETAs . By adjusting the sliders for my day and evening paces, the app estimates when I'll be able to take breaks, reach hazards, etc. It's been a while since I built something on the front-end that did lots of date manipulation, but…

Vaccinated

I got vaccinated today, and my primary side effect was feeling conflicted about it. By my standards, I should still be waiting for months to get immunized. I’m healthy, in my 30s, and have been working remote for virtually the whole last year. But I work for a railroad, which are classified by the state as essential employees in the transportation sector. I was really torn about this. There are…

Green Screen Zwifting with retroreflective fabric

As group bike rides are doubly out this pandemic-laden winter, I've been doing more bike racing on Zwift, and playing with livestreaming races. Zwift streams in-world aren't especially exciting. It's way more fun when you can watch a video of the person riding and suffering along. And if you're going to be suffering, you want to increase the production value. I've been having a great time adding…

Getting the PPPoE Credentials from your C4000XG without calling CenturyLink

If you've switched to CenturyLink recently, you might want to hook up your own router directly to the ONT, and bypass the router they provide/rent to you. This is pretty easy to do! See this Reddit post for more details . One thing you'll need to get from your ISP is the PPPoE userid and password the router uses to connect up to CenturyLink. Normally this requires a phone call, but if they…

Setting up a Livestream with Owncast

So you've decided you want to livestream your event and run the server yourself instead of relying on Twitch? Neat! Here's the recipe I used for my wedding. This is a single-camera setup, streaming through OBS to your server and a Zoom room. Photo credit: Justin Duster Hardware To run the livestream, you'll need: Digital camera - We used a Canon DSLR, connected to a computer via USB. You can also…

Indieweb Livestreaming your Wedding with Owncast

I got married! It looked a little different than we originally planned, due to it being, um, 2020. Venue restrictions due to the global pandemic reduced the number of guests we could invite by 90%. And we had no desire to put our friends and family in harm's way. But hey, it's 2020! With new tools like Owncast , you can run a livestream for all the guests who can't make it to your event in person.…

Maybe mashups in 2020 are just Jamstack sites

Millhouse voice Remember mashups? They're back, in Jamstack form. Recommended listening for this post: A decade ago the Big Idea in front-end development was the mashup ; taking disparate data sources and combining them via JavaScript trickery to create something novel. Want to pull down the current weather and compare it to the climates on Star Wars planets? Hell yeah, dawg . Did you know there…

Secret Strava

I built a thing that I'm not sure anyone else will find useful, but it was fun and I learned a few things. Strava needs better privacy controls As a social network for athletes, Strava's pretty good. It might be the only good one around these days! But their privacy controls are lacking. You can set each activity to be visible to everyone, only your followers, or just yourself, but it's a manual…

<bt-device> and Renderless Web Components

I keep buying dumb Bluetooth devices and hooking them up to websites, but there's just enough boilerplate to make integrating them a hassle. So, I made a little Custom Element to help automate some of the boilerplate. You'd use <bt-device> like any other HTML element: <!-- Connects to a Thermos Smart Lid water bottle --> < bt-device service = "40fc0000-8a8d-4a32-a455-c1148e24a9f1" characteristic =…

Going Dark (Mode)

Inspired by Jeremy Keith's post on implementing Dark Mode on the web , I set it up on my blog. It's really easy! The diff nearly fits on one screen ; most of which is converting colors over to CSS custom properties. Once that's configured, Dark Mode is easy as pi: @media (prefers-color-scheme: dark) { :root { --primary-color : #efefef ; --secondary-color : #1a1a21 ; --link-color : #1f8dba ; } I'm…

Building Fast, Tiny GitHub Actions with Go and Docker

GitHub Actions are sweet! It's still in beta but it's a great way to automate tasks after things happen like code pushes, comments on Issues, pull requests, etc. As an author of a GitHub Action, I'm really enamored by the architecture: each "build" is run on a virtual machine in Azure, with each action running inside a Docker container that GitHub executes. As Kyle Daigle mentions on a Changelog…

Why I Built Blumhouse to Purge My Twitter History

Or: why would I delete gold like this? I've been on Twitter for eleven years and in that time amassed a trail of thousands of tweets. I couldn't tell you what 99% of them are about, because Twitter is meant to be ephemeral. Unless you're Milkshake Duck . Every week or two someone's old Twitter history gets weaponized against them. Sometimes it's Ken Bone or Josh Hader 's history cropping up after…

Toolchainless

I have a complicated relationship with build tools. I like TypeScript , Gulp, and the like. I think that compilers are the new frameworks . Heck, even this static site is built with Gatsby; an overcomplicated toolchain to generate HTML files if there ever was one. But build tools are a Roach Motel in your stack: once you add them in, you're unlikely to ever abandon 'em. And it's never been easier…

Web Components Aren&#39;t Weird Anymore

I gave a talk at Barcamp Omaha on Web Components: In it, I tried to first answer the question: why aren't Web Components as popular as React? They both offer reusable components; building blocks which let you assemble sites easily and without rework. But React (and Vue, Angular, etc) took off, and Web Components never did. Why aren't we Using The Platform (tm)? There are a number of factors, but…

Rube Goldberg Machines

Lately, 80% of my YouTube usage has been watching Rube Goldberg machines. Here's a few of my favorite: The Blue Marble - This entire channel is so well done. The Cake Server - I love the mechanics as metaphor here. The food theme is infused throughout, and never ceases to delight. Wintergatan Marble Machine - Not a Rube Goldberg machine per se , but I think it embodies the essence of the concept.…

Welcome to RSS Club

RSS is the most exciting technology of 2018. I don't it's that much hyperbole. A decade after its heydey, RSS embodies some of the best parts of the Web. Dave Rupert coined the idea, and is collecting sites with RSS-exclusive content here . You should join. It's fun. I presume you've already got an RSS setup you like. I recommend NewsBlur . I'm happy to pay for it. Why RSS Can Save The World From…

JavaScript Gardening with the Particle Photon

The last few years I've been trying my hand at starting a vegetable garden from seed. Previous years have left a lot to be desired; normally I end forgetting to water my anemic-looking seedlings, feeling sad, and harvesting a single ear of corn at the end of the season. 🌽 This year, I want to have some data when things go wrong. And I wanted to see what's new in the new Geocities . So, time to…

The Neverending Side Project

I love side projects. I keep track of what I'd like to work on in a GitHub repo . Most side projects don't need much oversight. That's kind of the idea: you spend a few hours building something fun, blog about it, and move onto something else. But I think there's space for another kind of project: one that spans years. The formula's simple: Build a site/app/whatever Let it sit on a shelf for a…

Light Up Your Bike with Web Bluetooth and StencilJS

Every year the Omaha cycling community puts on the Bike De'Lights ride: an opportunity to illuminates your bike and tour the city's Christmas lights. And every year I try to find a new way to drive a five meter RGB light strip. This year I've been most excited about Web Bluetooth, and Web Components. Each technology has the opportunity to open previously closed ecosystems, and make them broadly…

Every Java Developer Should Learn TypeScript

I gave a talk to the Omaha Java Users Group about TypeScript : I think there's a lot of things TypeScript has to offer Java developers, namely: Static Typing - This one's obvious; if you're used to a compiler providing thousands of tiny continuously-running unit tests, you're going to miss that on the front-end. But what's even cooler is TypeScript's features of incremental and inferred typing.…

Marginal Revolutions

Weekend illnesses are a great opportunity to work through an Instapaper queue. I'll blame the head cold, but I see connective tissue across several articles. First, Scott Alexander makes a compelling case that Trump supporters aren't immune to logic and truth . One presumes they are, because when's the last time you debated a Trumpist and changed their minds? But that's because these debates…

Web Bluetooth Is Your New Squeeze

One of the side-effects to living that Internet-Of-Things lifestyle is that you end up with a lot of pseudo-smart devices, mostly collecting dust. I wanted to see if Web Bluetooth could breathe new life into them. Turns out, hacking Bluetooth Low Energy toys is way more fun than actually using them. I spoke at NebraskaJS about what I learned, and why I'm excited about hooking Bluetooth up to the…

Building Custom Elements That Work With AngularJS 1.x and Angular

So Web Components! They've recently gotten a lot of love , and a lot of hate . Let's talk about Custom Elements in particular. This is the technology that lets you drop <relative-time> on a page, and it renders into something usable and pretty. No framework required. The Web Components proponents propose composing Web Components into existing frameworks, particularly as leaf nodes. So you'd write…

How to Run a Board Game Library At Your Conference After-Party

We just wrapped up another sold-out NEJS CONF . It was pretty great, and we learned a lot our second year around. One of the changes we made this year was to offer board games at the conference after-party, rather than just setting attendees loose with dinner and drinks. I thought it worked pretty well, but I haven't seen many other tech conferences run with this concept. Here's how we set it up ,…

The Languages Which Almost Became CSS (Recap)

NebraskaJS recently held a lightning talk night, entitled "Present a Blog Post". Cool gimmmick, bro. And you didn't even need to write the post you were presenting on! Fortunately, I read a fascinating article by Zack Bloom on The Languages Which Almost Became CSS : a rip-roaring tour through the process by which we got to the styling language we all know and love (for various definitions of…

Upgrading to Angular 2 using ngUpgrade

I spoke at ng-nebraska on how the ngUpgrade module can help bridge the gap between Angulars 1 and 2. Demo App (upgraded to ng2) Code on GitHub Slides

Reacting to Heart Rate and Bike Sensors With RxJS

Recently I hooked up a Raspberry Pi to my bike and made an LED light strip synchronize with my heart rate and pedal speed. I got some great feedback on the project, including "overly complex", "Rube Goldberg wannabe", and "you need another hobby". One challenge with this project was how to effectively manage sensor data from multiple sources (a heart rate monitor and a bicycle speed/cadence…