kait.dev

note Posts

Oh, sure, when you do it you win the Pulitzer Prize, but when I say the grapes are angry, they call me “the crazy farmer running around screaming about the emotional lives of plants.”

Voters in Missouri, Arizona, New York, Colorado, Nevada, Nebraska and Montana voted to enshrine protections in their states for women to decide their own healthcare

Sarah McBride, D-Delaware, is the first openly transgender person elected to Congress.

Colorado repealed its 2006 same-sex marriage ban. California repealed its 2008 law that banned same-sex marriage.

In (at least) Kansas, New Hampshire, Wisconsin, Minnesota, California, Washington, Illinois, Montana and Texas (!), the people voted to send out LGBT people to Congress.

Dozens of LGBT folks won their races in state-level contests across the country

In every state in the union, millions of people voted for hope and progress and forward momentum. They might not have been the majority of those voting in every case, but they came out to say it.

We are here. We are queer. We are stronger together.

The inverse of “this meeting could have been an email” isn’t exactly “people keep sending emails about the meeting replying to the email that contains all the information they’re seeking” but it feels related, nonetheless

Hot take: Your build folder should not be completely excluded from your source control. There are very few good reasons why npm run build should run on production.

iOS updates’ 5+-year streak of the keyboard getting even worse at guessing what I’m trying to say (and completely divorcing suggestions from context) continues unbroken 💩 👑

If a person looks at all the art and tries to make their own copies and pass them off as art, we call them a forger. If a computer looks at all the art and tries to make its own copies and pass them off as art, we call that “AI” and clock its worth at north of $150 billion.

I understand golf lingo. I understand businesses often give money to charities with golf events because businesscritters like the work-sponsored opportunity to play golf.

But I still don’t know that I would have touted on social media that I “sponsored a hole”

I never thought about it as a kid, but the stores featured in movies date them just as much (if not more) than fashion, haircuts, cars, etc. Meatballs starts with the kids in a Kmart parking lot, which, outside of Australia? Might as well stop by a Woolworth’s or a Ben Franklin.

In my experience, when a doddering, elderly, clearly overwhelmed candidate flounders at a debate, he stops running for president.

I don’t know that we as a society are prepared for celebrity deaths at the rate they’ll soon come. The explosion of pop culture in the 80s/90s (literally cable TV at least doubled the number of people we consider “famous”) + the boomer cohort aging could mean multiple “names” a week.

Why don’t we have a JS frontend framework that focuses on what devs want, not what Google or Facebook think are important, funded indefinitely with $30 million of a random unicorn’s windfall?

Like many, I get annoyed by subscription pricing that doesn’t accurately reflect my needs. I don’t want to spend $5 a month for a color picker app. I don’t really want to spend $4/month on ControlD for ad-blocking and custom internal DNS hosting, and NextDNS is worth $20/year until I hit the five or six times a month it’s completely unresponsive and kills all my internet connectivity.

(I recognize I departed from the mainstream on the specifics there, but my point is still valid.)

I’ve self-hosted this blog and several other websites for more than a decade now; not only is it a way to keep up my Linux/sysadmin chops, it’s also freeing on a personal level to know I have control and important to me on a philosophical level to not be dependent on corporations where possible, as I’ve grown increasingly wary of any company’s motivations the older I get.

So I started looking at options that might take care of it, and over the last few months I’ve really started to replace things that would have previously been a couple bucks a month with a VPS running four such services for $40 a year.

Quick aside: I use RackNerd for all my hosting now, and they have been rock-solid and steady in the time I’ve been with them (coming up on a year now). Their New Year’s Deals are still valid, so you can pay $37.88 for a VPS with 4GB of RAM for a year. Neither of those links are affiliate links, by the way - they’re just a good company with good deals, and I have no problem promoting them.

AdGuard Home - Ad-blocking, custom DNS. I run a bunch of stuff on my homelab that I don’t want exposed to the internet, but I still want HTTPS certificates for. I have a script that grabs a wildcard SSL certificate for the domain that I automatically push to my non-public servers. I use Tailscale to keep all my devices (servers, phones, tablets, computers) on the same VPN. Tailscale’s DNS is set to my AdGuard IP, and AdGuard manages my custom DNS with DNS rewrites.

This has the advantages of a) not requiring to me to set the DNS manually for every wireless network on iOS (which is absolutely a bonkers way to set DNS, Apple), b) keeping all my machines accessible as long as I have internet, and c) allowing me to use the internal Tailscale IP addresses as the AdGuard DNS whitelist so I can keep out all the random inquiries from Chinese and Russian IPs.

The one downside is it requires Tailscale for infrastructure, but Tailscale has been consistently good and generous with its free tier, and if it ever changes, there are free (open-source, self-hosted) alternatives.

MachForm - Not free, not open-source, but the most reliable form self-hosting I’ve found that doesn’t require an absurd number of hoops. I tried both HeyForm and FormBricks before going back to the classic goodness. If I ever care enough, I’ll write a modern-looking frontend theme for it, but as of now it does everything I ask of it. (If I ever get FU money, I’ll rewrite it completely, but I don’t see that happening.)

Soketi - A drop-in Pusher replacement. Holy hell was it annoying to get set up with multiple apps in the same instance, but now I have a much more scalable WebSockets server without arbitrary message/concurrent user limits.

Nitter - I don’t like Twitter, I don’t use Twitter, but some people do and I get links that I probably need to see (usually related to work/dev, but sometimes politics and news). Instead of giving a dime to Elon, Nitter acts as a proxy to display it (especially useful with threads, of which you only see one tweet at a time on Twitter without logging in). You do need to create a Twitter account to use it, but I’m not giving him any pageviews/advertising and I’m only using it when I have to. When Nitter stops working, I’ll probably just block Twitter altogether.

Freescout - My wife and I used Helpscout to run our consulting business for years until they decided to up their subscription pricing by nearly double what we used to pay. Helpscout was useful, but not that useful. We tried to going to regular Gmail and some third-party plugins, but eventually just went with a shared email account until we found Freescout. It works wonderfully, and we paid for some of the extensions mostly just to support them. My only annoyance is the mobile app is just this side of unusable, but hard to complain about free (and we do most of our support work on desktop, anyway).

Sendy - Also not free, but does exactly what’s described on the box and was a breeze to set up. Its UI is a little dated, and you’re best served by creating your templates somewhere else and pasting the HTML in to the editor, but it’s a nice little workhorse for a perfectly reasonable price.

Calibre-web - I used to use the desktop version of Calibre, but it was a huge pain to keep running all the time on my main computer and too much of a hassle to manage when it was running on desktop on one of the homelab machines. Calibre web puts all of the stuff I care about from Calibre available in the browser. I actually run 3-4 instances, sorted by genre.

Tube Archivist - I pay for YouTube premium, but I don’t trust that everything will always be available. I selectively add videos to a certain playlist, then have Tube Archivist download them if I ever want to check them out later.

Plex - I have an extensive downloaded music archive that I listen to using PlexAmp, both on mobile devices and various computers. I don’t love Plex’s overall model, but I’ve yet to find an alternative that allows for good management of mobile downloads (I don’t want to stream everything all the time, Roon).

Tech has created more billionaires and centi-millionaires than ever existed. They all spend their money on sports teams, yachts … but never drop a couple million on open source, even the projects they relied on! At best, it’s corporate money.

Ernest Goes to Camp is the only movie I can recall that ends with a dramaric (frantic?) waving of a temporary injunction. After the Home Alone-esque fight betwist kids and construction workers, of course.

I have been playing around with Soketi as a self-hosted Pusher alternative and, while the software is great, boy is its documentation and error messaging lacking. If you’re trying to run it and get the error

There was an error while parsing the JSON in your config file. It has not been loaded.

This is, as near as I can tell, the minimum required set of keys to get an app working:

{ "debug": true, "port": 6001, "appManager.array.apps": [ { "id": "id", "key": "key", "secret": "secret", "webhooks" : [] } ] }

Without the empty webhooks array, it kept failing on me.

I still have not gotten a pm2 instance to accept a config file 😭️. I gave up on the Docker instance because it doesn’t allow more than one app per instance and I want something more flexible.

I’m sure it’s great and super easy if you’re just spinning up a single app, though!

Right as I was getting out of newspapers I was talking with our circulation manager, who had just heard of a revolutionary new idea that was going to save the industry. As a baseline, let’s say the paper cost 75¢ per issue (I worked at a moderate-sized daily). You buy it from one of the little metal newspaper houses, 75¢. Grocery store, 75¢. Buy a subscription, you get a little discount, but there’s one flat rate you pay.

Then, one day, some economic geniuses from high atop the mount gazed into their scrying balls and noted, “Hey, rich people have more money.” From this fact, they extrapolated a theory that rich people would be more likely to spend more money than non-rich folks. Thus was born our new Model for Journalism™: income-based pricing.

As you might have guessed by even a passing knowledge of the current state of the journalism industry, this did not solve the problem. Now, they rolled this out with a modicum of sense. They didn’t just suddenly jack up the rates on everybody; when subscription renewals came up, they just modified the increase so it was higher for some people than others. Because they lacked detailed demographic information on individual customers (I shudder to think what they would have done had this initiative been launched in 2024), they based it loosely on Zip codes. (This had the added benefit of making sure that neighbors wouldn’t be discussing the price of the newspaper and find out they were paying vastly different rates.)

It worked, kinda? For a little bit, anyway. Some people were willing to pay more, and the sales people were instructed that if customers put up too much of a fight, they could resub at the new standard rate. But there are two crucial flaws to this approach; I won’t name them yet, because first I want to talk about how this idea has absolutely exploded across the entire American marketplace.

Anyone who’s been to the grocery store knows that prices have gotten significantly higher since COVID. As have fast food prices, concert ticket prices, and streaming service subscription fees.

Some will point to the laws of supply and demand, which is a) facile, b) not relevant in industries like streaming, and c) not nearly enough to account for the rate of increases we’ve been seeing in consumables. The real reason, of course, is greed: Those selling think they can make more money by raising prices and enough consumers will continue to fork over the money to offset those who don’t.

Here’s where we get to the issue: This economic model ignores how people actually work.

In our newspaper example, raising rates did two things: First, it made people reconsider their model of what a newspaper is. For a long time, getting the newspaper was just what you did: it’s how you stayed informed and, as a teacher of mine once put it, “It’s what cultured people do.”

But by significantly raising the price, you force people to think of the thing they’re purchasing’s overall utility to their lives. What was once an automatic, “Yes, of course we pay for the paper,” now gets framed, internally, as “Does the paper provide $x amount of value to me?”

The second thing that raising prices does is increase awareness of the competition. In newspapers' case, this was pretty broadly known, but there was a significant percentage of people even in the early 2010s for whom getting the news via a single source delivered to their house every morning was more convenient than seeking out online or TV news sources.

But once that price goes up? Suddenly the hassle of trying to sift through information on the internet doesn’t seem so daunting. You’re more willing to experiment, because you’re saving so much money. And now the newspaper has to stand on its own as a value proposition, which isn’t a good strategy for a medium that is objectively and definitively slower, more expensive and less adaptable than its direct competition.

And we’re seeing the same thing happen now in real-time, in a variety of industries. Subway jacked up its prices 39% 2014-2024; a week ago, they had to hold a corporate emergency meeting because sales are so low. McDonalds announced its first quarter-to-quarter sales drop since 2020. These and other companies assumed they could jack up the price and enough people would cover at the new high to offset those who bailed. And, worst-case scenario, if it’s too high, they can always drop the prices back down.

But that’s not how people work. When people feel like they’re being screwed, they get bitter and hold a grudge. When people are forced to confront and try new alternatives, sometimes it turns out they liked the new option better than the old one, anyway. And any brand loyalty they may have once held is completely obliterated, so you’re not only starting from scratch, you’re actually digging yourself out of a hole.

Such is life when you’re focused solely, maniacally on the short-term. You might find yourself with no long-term options back to success.

Man, isn't it amazing how every company's image is doing sooo much better now, increasing prices for the same or lower quality?

I feel like society doesn’t give the average person enough opportunities to formally and vehemently object to things. The fun is always reserved for lawyers and people who have dumb friends that make bad decisions about marriage.

Seriously, imagine being able to object at some idiot ordering a well-done steak.

Note: This content, by Anne Gibson, was originally published at the Pastry Box Project, under a Creative Commons (CC BY-NC-ND 4.0) license. I am reposting it here so that it might remain accessible to the wider web at large.

A is blind, and has been since birth. He’s always used a screen reader, and always used a computer. He’s a programmer, and he’s better prepared to use the web than most of the others on this list.

B fell down a hill while running to close his car windows in the rain, and fractured multiple fingers. He’s trying to surf the web with his left hand and the keyboard.

C has a blood cancer. She’s been on chemo for a few months and, despite being an MD, is finding it harder and harder to remember things, read, or have a conversation. It’s called chemo brain. She’s frustrated because she’s becoming more and more reliant on her smart phone for taking notes and keeping track of things at the same time that it’s getting harder and harder for her to use.

D is color blind. Most websites think of him, but most people making PowerPoint presentations or charts and graphs at work do not.

E has Cystic Fibrosis, which causes him to spend two to three hours a day wrapped in respiratory therapy equipment that vibrates his chest and makes him cough. As an extension, it makes his arms and legs shake, so he sometimes prefers to use the keyboard or wait to do tasks that require a steady touch with a mouse. He also prefers his tablet over his laptop because he can take it anywhere more conveniently, and it’s easier to clean germs off of.

F has been a programmer since junior high. She just had surgery for gamer’s thumb in her non-dominant hand, and will have it in her dominant hand in a few weeks. She’s not sure yet how it will affect her typing or using a touchpad on her laptop.

G was diagnosed with dyslexia at an early age. Because of his early and ongoing treatment, most people don’t know how much work it takes for him to read. He prefers books to the Internet, because books tend to have better text and spacing for reading.

H is a fluent English speaker but hasn’t been in America long. She’s frequently tripped up by American cultural idioms and phrases. She needs websites to be simple and readable, even when the concept is complex.

I has epilepsy, which is sometimes triggered by stark contrasts in colors, or bright colors (not just flashing lights). I has to be careful when visiting brightly-colored pages or pages aimed for younger people.

J doesn’t know that he’s developed an astigmatism in his right eye. He does know that by the end of the day he has a lot of trouble reading the screen, so he zooms in the web browser to 150% after 7pm.

K served in the coast guard in the 60s on a lightship in the North Atlantic. Like many lightship sailors, he lost much of his hearing in one ear. He turns his head toward the sound on his computer, but that tends to make seeing the screen at the same time harder.

L has lazy-eye. Her brain ignores a lot of the signal she gets from the bad eye. She can see just fine, except for visual effects that require depth perception such as 3-D movies.

M can’t consistently tell her left from her right. Neither can 15% of adults, according to some reports. Directions on the web that tell her to go to the top left corner of the screen don’t harm her, they just momentarily make her feel stupid.

N has poor hearing in both ears, and hearing aids. Functionally, she’s deaf. When she’s home by herself she sometimes turns the sound all the way up on her computer speakers so she can hear videos and audio recordings on the web, but most of the time she just skips them.

O has age-related macular degeneration. It’s a lot like having the center of everything she looks at removed. She can see, but her ability to function is impacted. She uses magnifiers and screen readers to try to compensate.

P has Multiple Sclerosis, which affects both her vision and her ability to control a mouse. She often gets tingling in her hands that makes using a standard computer mouse for a long period of time painful and difficult.

Q is ninety-nine. You name the body part, and it doesn’t work as well as it used to.

R was struck by a car crossing a busy street. It’s been six months since the accident, and his doctors think his current headaches, cognitive issues, and sensitivity to sound are post-concussion syndrome, or possibly something worse. He needs simplicity in design to understand what he’s reading.

S has Raynaud’s Disease, where in times of high stress, repetitive motion, or cold temperatures her hands and feet go extremely cold, numb, and sometimes turn blue. She tries to stay warm at her office desk but even in August has been known to drink tea to keep warm, or wear gloves.

T has a learning disability that causes problems with her reading comprehension. She does better when sentences are short, terms are simple, or she can listen to an article or email instead of reading it.

U was born premature 38 years ago — so premature that her vision was permanently affected. She has low vision in one eye and none in the other. She tends to hold small screens and books close to her face, and lean in to her computer screen.

V is sleep-deprived. She gets about five hours of bad sleep a night, has high blood pressure, and her doctor wants to test her for sleep apnea. She doesn’t want to go to the test because they might “put her on a machine” so instead she muddles through her workday thinking poorly and having trouble concentrating on her work.

W had a stroke in his early forties. Now he’s re-learning everything from using his primary arm to reading again.

X just had her cancerous thyroid removed. She’s about to be put on radioactive iodine, so right now she’s on a strict diet, has extremely low energy, and a lot of trouble concentrating. She likes things broken up into very short steps so she can’t lose her place.

Y was in a car accident that left her with vertigo so severe that for a few weeks she couldn’t get out of bed. The symptoms have lessened significantly now, but that new parallax scrolling craze makes her nauseous to the point that she shuts scripting off on her computer.

Z doesn’t have what you would consider a disability. He has twins under the age of one. He’s a stay-at-home dad who has a grabby child in one arm and if he’s lucky one or two fingers free on the other hand to navigate his iPad or turn Siri on.

=====

This alphabet soup of accessibility is not a collection of personas. These are friends and family I love. Sometimes I’m describing a group. (One can only describe chemo brain so many times.) Some people are more than one letter. (Yay genetic lottery.) Some represent stages people were in 10 years ago and some stages we know they will hit — we just don’t know when.

Robin Christopherson (@usa2day) points out that many of us are only temporarily able-bodied. I’ve seen this to be true. At any given moment, we could be juggling multiple tasks that take an eye or an ear or a finger away. We could be exhausted or sick or stressed. Our need for an accessible web might last a minute, an hour, a day, or the rest of our lives. We never know.

We never know who. We never know when.

We just know that when it’s our turn to be one of the twenty-six, we will want the web to work. So today, we need to make simple, readable, effective content. Today, we make sure all our auditory content has a transcript, or makes sense without one. Today, we need to make our shopping carts and logins and checkouts friendly to everyone. Today, we need to design with one thought to the color blind, one thought to the photosensitive epileptic, and one thought to those who will magnify our screens. Today we need to write semantic HTML and make pages that can be navigated by voice, touch, mouse, keyboard, and stylus.

Tomorrow, it’s a new alphabet.

Forgive the lack of posts recently, a back injury has mostly confined me to bed, and I get a little sick of staring at computer screens.

But while I’ve been out of it I caught up on Aaron Sorkin’s The Newsroom, which I had never seen. As a fan of The West Wing and yes, even Studio 60, I thought, as a former journalismo myself, this would be right up my alley.

And it definitely inspired me … to get back into writing code. It was so bad. I was surprised at how bad it was. It made me question my own taste and wonder whether I’d misjudged Sorkin’s talent.

Don’t get me wrong, he has some good scripts, and some of his meaty monologues and dialogues in various things he’s written are an absolute delight.

But he’s also written the same show at least three times now? Including similar (in some cases, identical) plot points, themes, specific jokes, even a reference to using too much back medicine as an excuse for why a white man said something dumb.

In case you couldn’t tell from my recipe intro up top there, this is a post about how I reworked Newslurp, a little app I coded four years ago (right before the Big Newsletter Boom thanks to Covid!). I switched RSS services at one point and was using a “subscribe to the newsletter from the service’s email” feature, but the lack of polish in the app (and severe degradation of basic feed-reading) means I’m back on the market.

And rather than tying all my content to another proprietary app, I decided revive Newslurp so I could keep better control of everything. The app had a significant overhaul, with most of the email heavy lifting now being done in Google Apps Script (thus removing the need for Google API integration and the PECL mailparse extension, which is not readily available on shared hosts).

I also switched from MySQL to SQLite (because this is not really an application that needs a whole MySQL DB), and updated the code/dependencies to run on PHP 8.2

My biggest takeaway from the whole thing is that while I really love types, PHP does not make it easy to use them properly with collections or array-like objects. Yikes.

As always, I hope this is in some way helpful to others, but mostly it’s helpful to me! Enjoy.

If only I could have made it a slideshow spread out over 50 page loads ...

An image promoting my improv for developers workshop at Beer City CodeI'm headed back to the Midwest to do some speakerizing again in August 2024.

Beer City Code 24**** is in Grand Rapids, MI, on Aug 2-3. I'm super excited to present a workshop, Improv for Developers, which is where we'll do actual improv training and then talk about how those skills translate to software development. It's 6 hours (!!), but it should be a lot of fun!

I'll also talk about greenfield development: specifically, that it doesn't really exist anymore. There are always preexisting considerations you're going to have to take into account, so I'll give some hard-won tips on sussing them out.

DevUp will be held in St. Louis on Aug. 14-16. I'll be talking about greenfields again, as well as reasons scrum-based development tends to fail, and how we can measure developer productivity.

Hope to see you this summer!

YES, AND you also have to write documentation or no one will know what the hell you were thinking when you wrote it.