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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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…
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.…
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…
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…
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 =…
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…
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…
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…
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…
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…
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.…
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…
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…
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…
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…
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.…
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…
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…
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…
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 ,…
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…
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…