inessential by Brent Simmons

While working on show notes for an upcoming episode of The Omni Show, I found this classic blog post about Objective-C Memory Management & Garbage Collection.

I had completely forgotten about the finalize method.

In the latest episode of The Omni Show, I am the guest. How does this even work? Do I interview myself? What’s going on here?

PS I like being on podcasts, and I’d be happy to be on yours, to talk about Omni stuff or my own stuff or both. I could probably even convince Ken Case to be a guest on your show if you want to talk about Omni apps and developing for Mac and iOS in 2019.

(My email address is no secret, and every spammer everywhere already has it, so I’ll just post it here: it’s

NetNewsWire Status: February 19, 2019

There are three big things that remain before the first feature-complete build (which will be 5.0a1): searching, the app icon, and syncing with FeedBin.

Brad Ellis is working on the app icon, so that leaves searching and syncing (and a few miscellaneous bugs) for me.

I’ve been working on searching — I want to get that done next, and then do syncing as the last thing before hitting alpha 1.

How search is implemented

The UI for searching is pretty straightforward: you type into the search field, and then the timeline shows your search results. Click on an article to show it in the detail web view. Exactly as expected.

But there are two ways I can think of to implement this UI.

  1. When a search starts, do the search and show the results in the timeline. When the user ends searching, restore the previous timeline and detail view states.
  2. When a search starts, swap in a separate timeline and detail view, do the search, and then show the results in these swapped-in views. When the user ends searching, swap those views out, and swap back in the regular timeline and detail views.

Ideally the user can’t tell the difference between the two methods. But if you go with solution #1 — use the existing timeline and detail views — then you have the challenge of restoring state, including selection and scroll positions, when searching ends.

If you use solution #2 — swapping views in and out — then you don’t have that challenge. State is restored exactly as it was, because you saved the non-search views and swapped them back in.

(If you look at other apps — Mail, for example — it appears they use solution #1, and state restoration is not always instant. I want it to be instant.)

So, for the past week, I’ve been re-jiggering so that I can have multiple timeline and detail views and swap them in and out.

(This is not that different from how searching in iOS apps is supposed to work.)

And then, last night, as I finished the re-jiggering, I did the actual search-in-the-database implementation, which took about an hour.

This still leaves me to handle changes to the search field, so that the search is actually run at the right time, and so that searching ends properly. I expect that to take a few hours to get all right. (I’ve done this before, and it’s always slightly more complex than it seems.)

Why do I make this point?

If you’re not a programmer — or you’re new to programming, or haven’t written apps with a user interface — it’s easy to think that the actual under-the-hood implementation of a feature is what takes the most time.

It’s not. In the case of the search feature, I spent more time just thinking about how I want to do the UI than on the actual search-in-the-database implementation. And then there’s the UI work itself, which absolutely dwarfs the database work.

Another case: you might imagine that the bulk of the work in NetNewsWire was writing an RSS parser, for instance. But no. While that code is critical, obviously, it’s very, very small compared to the user interface.

And, similarly, the part of syncing that’s just making API calls and updating the database will be the easy part. The part that takes longest will be user interface. A factor of ten would not be surprising.

Jonathan T explains how to activate Apple ID 2fa when you have two accounts.

Short version: temp user on your Mac, SMS as backup, delete temp user, SMS keeps working.

Two-Factor Authentication and Developer Accounts

I just got an email from Apple that two-factor authentication will be required for my Apple Developer account.

I have two accounts — one for personal use, one for development use — and so do lots of developers.

I don’t know how to make this work. None of my devices are ever signed in to my developer account. That account exists purely for building and distributing apps.

Brett Terpstra writes about blogging, ethics, and thin skin.

I’ve been reading Brett’s blog for years — I trust him, and he’s a good writer. I also use his app Marked pretty much every day.

Daniel Jalkut has bad news for Blogger users — Google is shutting down an images API.

Colin Devroe reminds us not to rely on mega-corporations keeping our beloved services alive. They won’t.

There’s still snow everywhere — but the sun just came out, and I heard some birdsong, and I looked outside and saw a couple robins.

Cliff Mass, Seattle’s favorite weather blogger, writes that the end of all this snow mess is in sight.

Cheri Baker writes about Spotify in Dear Podcasters…:

I fear we’ve seen this scenario before. A biggish company decides that they’ll aggregate an immense amount of creative work and monetize it. They’ll offer you tools to make “sharing” easy, and at first the terms of service will be reasonable. But once they’ve eaten a big enough chunk of content, they’ll lock the gates tighter, change the terms of service, and monetize the audience. By that point, customers would feel locked into Spotify, and podcasters would be afraid to leave.

NetNewsWire Roadmap 2019

Let’s look back at last year first.

2018: Evergreen to NetNewsWire

As 2018 started, the app was called Evergreen, which I still think is a pretty great name for an RSS reader. I’d been working on it for about four years, on weekends and at nights.

It was usable-by-me a year ago, and a few other people were using it, even though it was missing all kinds of important features.

And then, some time in the spring of 2018, I thought to contact the folks at Black Pixel about getting NetNewsWire back. Seemed like a total longshot. But why not try?

And they surprised me by being interested! In fact, they mentioned that they’d already been talking about it.

I was clear that I wanted just the name — not the code, not the then-current users, not the sync service. The app named Evergreen would be renamed as NetNewsWire, but would be, in every other way, the same app I was going to write. It would still be free and open source.

They agreed. And then, of course, discussions, mostly internal to Black Pixel, happened for a few months, because that’s how these things go — and we managed to make it official on August 31, 2018. (See NetNewsWire Comes Home.) Black Pixel gave it to me for free (we never haggled over price; that was their plan all along), and their generosity remains one of the things I’m most thankful for in my entire career.

Soon after that I renamed Evergreen to NetNewsWire — and memorialized the name Evergreen in the app’s bundle id: com.ranchero.NetNewsWire-Evergreen. (NetNewsWire will always be Evergreen.)

And so it turned out that I had been working on NetNewsWire 5.0 for four years already! I just didn’t know it for most of that time. :)

The rest of the year saw more work on the app, with code contributions from Maurice Parker, Olof Hellman, and Daniel Jalkut, with bug reports on GitHub, with the help of the folks on the NetNewsWire Slack group. (Which you can join too: just email me.)

That was 2018.

2019: Let’s Ship This Thing

At this writing we’re down to seven bugs in the 5.0 Alpha milestone. There are three main things: syncing with Feedbin, searching, and the app icon.

I want to ship 5.0 by WWDC, which is (most likely) the first full week of June. So here’s what I’m planning:

  • Finish those last bugs, and ship 5.0a1.
  • During the alpha period: write the Help book and document at least some of the code. Test, most importantly. Fix any bugs that get reported. Once there are no known defects, after a suitable period of testing, then ship 5.0b1.
  • During the beta period, continue testing. The code will be touched only with great reluctance. (Every beta is a shipping candidate.) Continue documenting the code.
  • Once there are no known defects, ship 5.0.

As you can see, the 5.0 Alpha milestone represents five years of work, and the alpha and beta periods ought to be relatively short, possibly just a couple weeks each.

But how quickly we get to alpha is mainly a function of how quickly I can get Feedbin syncing working and bug-free.

I think I can get it done by WWDC, but I could be wrong! No promises, of course. For NetNewsWire, app quality is everything, and hitting a date means very little.

Beyond 5.0: More Sync

There’s every chance that WWDC will bring changes and new technology from Apple that I’ll have to deal with. That’s expected — every app developer (hopefully) budgets for this. Assuming 5.0 is out before WWDC, then I can deal with this stuff in an update in the summer, in time for the next macOS.

There’s a huge list of features I could work on after that — there’s so much room for growth — but I think the big one has to be adding support for more syncing systems. I’m likely to do Feedly next, since it appears to the the most popular.

So my hope is to get Feedly support shipping by the end of 2019. And, if I do, then it will have been a very good year.

National Weather Service Seattle lets us know what’s coming up. More snow!

Thursday is the Last Dry Day.

Michael Zornek writes (and this is the entirety of his post):

It is not a podcast unless there is a RSS feed.


I love it when companies or products publish a roadmap. Omni publishes one every year — here’s the latest.

Today I ran across the Fiery Feeds Roadmap 2019. I’ve heard of Fiery Feeds, but I haven’t checked it out yet. Now I will, because the developer Lukas Burgstaller is a blogger and I enjoyed reading the roadmap.

Now, of course, I have to consider writing a NetNewsWire roadmap for 2019. The big thing on the list would be shipping 5.0. (I’ve been working on the app for five years! Time to ship.)

There should be a Roger Stone emoji.

Seattle Xcoders special fifth Thursday unofficial meeting is tonight at 6:30 pm at the Waterwheel in Ballard.

Note: not Cyclops. Waterwheel.

And it’s not really a meeting. We just hang out. Join us!