by Brent Simmons

I Tried to Explain What I Do

I’ve known for decades that most of family and friends (except for family and friends in tech) have no idea what I do — they just think it’s math-heavy and mysterious.

Well. It’s definitely not math-heavy and it shouldn’t be mysterious. So I figured I’d write up What I Do.

Even if I never actually send this page around to everybody — because that would actually be kind of weird, like giving them homework to understand me, me who suddenly (suddenly?) seems like a complete narcissist — it was a good exercise for me to do anyway. Especially the part about explaining why I write NetNewsWire.

Seattle Xcoders Talks This Week Considered Unmissable

The title is a little over the top, but barely — we have two fantastic talks this Thursday (March 5) that you should go to. (I’ll be there!)

Laura Savino will present “Learn Out Loud”:

As devs today, we’re supposed to demonstrate immediate skills in tools whose configs change once a fortnight, while shipping cutting-edge features in long-standing apps (that may still have a legacy bug or two). Laura is a trained teacher and Photoshop engineer who brings humor and solidarity to today’s dev environment with concrete advice on the mechanics of real learning and change, including encouraging without proselytizing, being vulnerable about what you don’t know, and staying curious amidst existential dread.

If you’ve seen Laura talk before, then you know how good she is, and you know how you come away with insights and ways to be a better engineer and better human-who-works-with-people. Every single time.

This is one of those very rare chances to see Laura in a small setting before she does this talk at a conference keynote. Like seeing the Beatles in a small bar in Liverpool, only it’s Laura in Seattle. 🎸

Jake Savin will present a talk on using Claude to do a really big ambitious job — rebuilding UserLand Frontier as a modern app:

It’s a huge job and Jake’s made a ton of progress — and he’s learned a lot about how to use Claude to make these kinds of projects work. As we learn to use LLMs to do more and more ambitious things, we’ll be walking in Jake’s footsteps. Jake will provide a map of this new territory.

I’m not the only one to have a try — more than one try, actually, as recently as last year — at rebuilding Frontier. It took Jake and Claude together to make this work (and it’s not done yet, but far advanced from any previous try).

I’m so ready to have Frontier back in my toolbox — and ready to learn from Jake on how he’s making this happen.

What’s Frontier?

UserLand Frontier is Dave Winer’s app from the ’90s, and it was with that app that Dave invented and/or fleshed-out and popularized much of the open web that we take for granted today: blogs, RSS, podcasts, and web services, for starters. This is a historically important piece of software, and Jake is bringing it to the modern age.

Anyway — here’s the scoop on where and when to be:

Where
North Seattle College
9600 College Way N

Room LB 1106 in the library

When
Thursday, March 5, 2026
6:30 pm — gather and mingle
7:00 pm — watch Jake’s and Laura’s talks

For anyone who wants to hang out after — we go to the nearby Watershed Pub and Kitchen (all ages friendly).

Why Objective-C

In my previous post I talk about how I got rid of hundreds of thousands of lines of Objective-C code while at Audible and I explain why keeping Objective-C code around is a terrible idea. And I explain that…

I’m not stuck in the old ways; I’m not the guy insisting on the supremacy of Objective-C despite the obvious evidence against. I’m the guy who got rid of Objective-C — with glee and (oops, sorry Audible marketing team for the screwup) wild abandon!

Then of course I wrote some Objective-C code recently and really, really loved it.

Command line app

I wanted to replace my homegrown static website/blog generator because I no longer wanted to use the language it was written in, for reasons.

I took it as an opportunity to learn Python — but it turned out that my heart wasn’t in it (not Python’s fault; great language) and I ended up screwing it up. (See Blog Fuckup).

I thought about some alternatives: Swift, which I know well; Rust and Go, which would have the advantage of helping me branch out from the Apple ecosystem; and good old C, my happy-go-lucky friend who still sprints faster than every brash new language.

Of those I was leaning toward C because speed is an issue. I wanted to make rendering this blog, over 25 years old and with thousands of posts, to happen in under one second. The system I was replacing took a few seconds. But I wanted more speed (personality flaw).

And then I thought, I swear just for a split second, about how great it would be if C had something a little nicer than C structs for modeling my app’s data — and oh well too bad there’s nothing like that.

And then I remembered Objective-C, which is C plus some things a little nicer than C structs. 🎩🦖

Objective-C looks insane

Anyone new to Objective-C thinks it’s difficult and maybe a bit harsh because [[those squareBrackets] lookInsane:YES].

Once you get past that, which takes a day or two given a good-faith effort, you’ll realize how small a language it is, how easy to hold in your palm and turn around and understand all sides of it. And you’ll appreciate how easy it is to make good decisions when you don’t have a surplus of language features to choose from.

And you’d be reassured to know that Objective-C is probably never going to change, which means tech debt will accumulate much more slowly than with newer languages. (Unless, of course, you count Objective-C itself as tech debt. You don’t have to, though.)

It’s a cliché to call Objective-C a more elegant weapon for a more civilized age. It’s better thought of, these days, as a loaded footgun.

But I did absolutely love writing this code! So much fun. And now I’ve got another little thing brewing, also in Objective-C, coming soon-ish.

PS The website/blog generator app is called SalmonBay. I really don’t expect anyone else in the world to use it, and I expect no contributions, but it is available as open source. (I put it on Codeberg, for reasons.)

PPS SalmonBay does a clean build of this blog in under a second. 🎸

Why Not Objective-C

At my last job, at Audible (hi Audible folks, if you’re reading this!), I led the effort to port our remaining Objective-C to Swift. When I started that project, Objective-C was about 25% of the code; when I retired it was in the low single digits (and has gone even lower since, I’ve heard).

Why do this? It was working code! Don’t we all know not to rewrite working code?

Why get rid of Objective-C

Well, we knew a few things: one was that our Objective-C code was where a lot of our crashing bugs and future crashing bugs (and bugs of all kinds) lived.

So it was working code, yes, but we knew there were crashes hidden in there, and that some of those crashes were ambush hunters, playing the long game, waiting for years before pouncing. Best just to rewrite it all in Swift, the safer language.

A second thing we knew was that having to interoperate between Swift and Objective-C is a huge pain. It often means dumbing-down the Swift code and not using modern features, which limited our options for good Swift code.

And a third thing we knew was that very few of our engineers had a background writing Objective-C. Maintaining that code — fixing bugs, adding features — was more expensive than it was for Swift code. (Duh, right? When you have many engineers working on a project, it’s best if the language you use is one everybody knows well.)

Not that this went perfectly

This is still risky, by the way. Rewriting code is always risky.

At one point I was responsible for a bug where we sent an integer to some API and it should have been a boolean — because the original code was using NSNumber and it wasn’t obvious which it should be. This caused a partial outage of push notifications, which I estimated (very roughly) to have cost the company a few hundred thousand dollars.

(Really? A little bug like this? NS-fucking-Number cost all this money? Yes. Audible scale may not be Facebook scale, but it’s far beyond the scale of indie apps. Before Audible I always worked for smaller companies with smaller audiences — working on something with many millions of users was enlightening and terrifying.)

But here’s the thing: this proved my point. Someone trying to maintain that code as Objective-C might have easily made the same mistake and caused the same outage. The Swift code we replaced it with is type-safe: it’s unmistakably and clearly a boolean and not an integer (once we fixed it; other way around at first). Replacing Objective-C code with Swift is clearly a win.

Goodbye to all those square brackets

I didn’t count how many hundreds of thousands of lines of Objective-C my project was responsible for rewriting (and sometimes just deleting). It was a lot. Multiple entire apps could fit in those lines-of-code counts.

And if you look at NetNewsWire’s code, you see that it’s almost entirely Swift, with just a little Objective-C for the various parsers and FMDB. It’s not just a Swift app but a modern Swift app that uses async await and structured concurrency. (Mostly modern — there’s still some code to update to async await. Work continues.)

I say all of the above to show that I’m not stuck in the old ways; I’m not the guy insisting on the supremacy of Objective-C despite the obvious evidence against. I’m the guy who got rid of Objective-C — with glee and (oops, sorry Audible marketing team for the screwup) wild abandon!

I want you to know all the above in advance because in my next post I’m going to talk about how I wrote some new code in Objective-C and loved it.

Blog Fuckup

I’ve been working on my blog software (a static site generator) and I managed to screw things up enough that random old posts got published on the site and in the RSS feed.

As soon as I saw the issue I fixed it, but I’ve been getting email from folks about some of the posts, so I know they got picked up by some RSS readers.

Those posts are ancient! Sorry for the confusion.

Email from Family in Minnesota

Our family in Minnesota knows we worry about them, and so yesterday they sent a family-wide email.

This is surely one of many thousands like it. Maybe you’ve written one of these. Maybe you will write one of these.

Below is the email from Jen (with permission and with original formatting):

Update from MN

Hello family and friends outside of Minnesota,

Many of you have reached out to see how we are doing and Pete and I both thank you for that. We appreciate it. As middle-class White people, Pete and I are largely ok. Technically, speaking. And I cannot believe that is a sentence I just typed in the year 2026. But here we are. Our neighborhood is relatively quiet. For now. We are doing what we can to support those that we can. We are speaking out and calling our representatives. So far 20,000 people in this state have taken conscientious bystander training. As actors, Pete and I have created/rehearsed monologues or responses if we find ourselves witnessing the illegal doings of these "agents". The people here are subdued, but not hopeless. Defiant, but not violent. We are doing our best to protest peacefully as this is what our constitution allows.

Why do I write to you of these things?

For a few reasons: 1. Depending on what media you are seeing you may be getting no coverage on this or varying degrees of truth to outright propaganda. I thought it best you hear it from someone who is actually living in MN right now. 2. No matter where you fall on the political spectrum I believe we can all agree that we have rights in this country: free speech, the right to peacefully protest, the right to due process to name a few. 3. Any support we can get, even if it is simply trying to combat disinformation with truth, from within our country or around the world is helpful and important. 4. If you wish to do other things, this is a good website which compiles many places/groups that are trying to help combat this situation. https://www.standwithminnesota.com/.

Now to some things that are happening here:

In addition to Jonathon Ross murdering Renee Good, the very same day they went to a high school and attempted to arrest students and staff. One day after this, 6 men with guns kicked in the door of someone's home without a legal warrant and dragged the husband out in cuffs. He is an American citizen. Today local law enforcement in and around the Twin Cities held a press conference calling out these "agents" in breaking the law. They are now targeting and attempting to detain off-duty officers. Every single one of the officers they targeted are people of color. It is straight up racial profiling. They are smashing car windows and tear-gassing people including toddlers. People are carrying their passports and birth certificates around with them and often they are not even allowed to show these "agents" their paperwork before they are beaten and/or abducted.

I have a dear friend who passed her citizenship test 6 years ago and is now carrying her documentation with her wherever she goes. She did everything "the right way" yet she is worried. Frankly, because she doesn't look Hispanic or African she will probably be ok. Again, I can't believe I just typed this sentence. Our nephew's elementary school (in a very affluent, predominantly White suburb) canceled their school's International Night for fear it would draw Immigrant Enforcement to the school. Pete and I are witnessing field trips to the Science Museum cancel left and right because schools are afraid they will target the children.

These people are not targeting the "worst of the worst" as they claimed they would do. They are not following the law or allowing due process. Minnesota is under siege. They are now telling observers who are giving witness and recording these crimes that "they should learn a lesson or they will be next." Currently, these "agents" outnumber our local law enforcement 4 to 1. Donald Trump and Noem have particularly targeted Minnesota even though our state falls far behind other states in the amount of undocumented workers. Everyone is on edge. No one is untouched by this chaos.

I don't know what is going to happen. I don't know what has happened to empathy and humanity. I do know that I wouldn't be here if it weren't for my ancestors who immigrated here from Sweden, England, Ireland, and the Netherlands. But they did. So for their legacy and for the little kids who deserve to live without fear I will continue to show up and help where I can.

Thanks for taking the time to read this and feel free to share this with those who may be curious to what is actually happening in Minnesota.

Love to all of you. Take care of each other.
Jen and Pete

Why NetNewsWire Is Not a Web App

Tim Bray writes, on Mastodon, I think correctly:

The canceling of ICEBlock is more evidence, were any needed, that the Web is the platform of the future, the only platform without a controlling vendor. Anything controversial should be available through a pure browser interface.

This is not the first time I’ve had reason to think about this — I think about issues of tech freedom every day, and I still bristle, after all these years (now more than ever), at having to publish NetNewsWire for iOS through the App Store. (The Mac version has no such requirement — it’s available via the website, and I have no plans to ever offer it via the Mac App Store.)

But what if I wanted to do a web app, in addition to or instead of a native app?

I can picture a future, as I bet you can, where RSS readers aren’t allowed on any app store, and we’re essentially required to use billionaire-owned social media and platform-owned news apps.

But there are issues with making NetNewsWire a web app.

Money

I explain in this post that NetNewsWire has almost no expenses at all. The biggest expense is my Apple developer membership, and I pay just a little bit to host some websites. It adds up to a couple hundred bucks a year.

If it were a web app instead, I could drop the developer membership, but I’d have to pay way more money for web and database hosting. Probably need a CDN too, and who knows what else. (I don’t have recent web app experience, so I don’t even know what my requirements would be, but I’m sure they’d cost substantially more than a couple hundred bucks a year.)

I could charge for NetNewsWire, but that would go against my political goal of making sure there’s a good and free RSS reader available to everyone.

I could take donations instead, but that’s never going to add up to enough to cover the costs.

And in either case I’d have to create a way to take money and start up some kind of entity and then do bookkeeping and report money things to the right places — all stuff I don’t have to waste time on right now. I can just work on the app.

Alternately I could create a web app that people would self-host — but there’s no way I could handle the constant support requests for installation issues. There are free self-hosted RSS readers already anyway, and NetNewsWire would be just another one. This also wouldn’t further my goal of making a free RSS reader available to everyone, since only people with the skills and willingness to self-host would do it.

Protecting Users

Second issue. Right now, if law enforcement comes to me and demands I turn over a given user’s subscriptions list, I can’t. Literally can’t. I don’t have an encrypted version, even — I have nothing at all. The list lives on their machine (iOS or macOS). If they use a syncing system, it lives there too — but I don’t run a syncing system. I don’t have that info and can’t get it.

If that happened, I’d have to pay a lawyer to see if the demand is legit and possibly help me fight it. That’s yet more money and time.

(Could I encrypt the subscription lists on the server? Yes, but the server would have to be able to decrypt it, or else the app couldn’t possibly work. Which means I could decrypt the lists and turn them over.)

Another type of freedom

Not an issue, exactly, but a thing.

I was 12 years old when I got my first computer, an Apple II Plus, and I’ve never stopped loving the freedom of having my own computer and being able to run whatever the hell I want to.

My computer is not a terminal. It’s a world I get to control, and I can use — and, especially, make — whatever I want. I’m not stuck using just what’s provided to me on some other machines elsewhere: I’m not dialing into a mainframe or doing the modern equivalent of using only websites that other people control.

A world where everything is on the web and nothing is on the machines that we own is a sad world where we’ve lost a core freedom.

I want to preserve that freedom. I like making apps that show the value of that freedom.

What I want to see happen is for Apple to allow iPhone and iPad users to load — not sideload, a term I detest, because it assumes Apple’s side of things — whatever apps they want to. Because those devices are computers.

I get it. It’s not looking good. And even with the much greater freedom for Mac apps there is still always the possibility of being shut down by Apple (by revoking developer memberships, refusing to notarize, or other technical means).

Still, though, I keep at it, because this freedom matters.

But, again…

Apple keeps doing things that make us all feel sick. Removing ICEBlock is just the latest and it won’t be the last. So I am sympathetic to the idea of making web apps, and my brain goes there more often. And if I could solve the problems of money and of protecting users, I’d be way more inclined.