inessential by Brent Simmons

Looking for Work

Yesterday, along with about ten people (I’m not sure exactly), I was laid off from my job at the Omni Group, and now I’m looking for new work.

But first things first. You’re curious about Omni.

* * *

Omni’s been around for almost 30 years, and I hope it’s around for another 30. It’s one of the great Mac and iOS shops — they will sing songs about Omni, at maximum volume, in the great halls.

But businesses go up and down, and Omni’s had a bit of a down period. Normally that would be fine, but the current economic circumstances turn “a bit of a down period” into something more serious — and, in order to get things going the right way again, the company had to lay off some people. Including me.

This is, notably, the first time Omni has ever had to lay off people. And I bet that the company wouldn’t have had to this time, either — but, well, (gestures at everything) there’s all this.

It’s been my pleasure and my honor to be a part, for over five years, of the journey of this wonderful Mac and iOS app-making business.

While the company has some challenges ahead of it, I take heart in knowing it has been around for decades, and that it has calm, cool leadership and, especially, a great group of inspired people working hard to get back to the point where the company is thriving.

Omni deserves your love. I was just there, and I was just laid off — which is a hard thing — but I’m telling you it deserves your love.

* * *

Enough about Omni. Here’s me! I’m looking for work. I’m not sure if I prefer a full-time job or contracting positions — I think the actual work and the people matter more to me than how it’s structured.

If you read my blog, you know me: I ship great apps. I also design apps, write, host a podcast, do marketing, do community relations, project-manage things. Lots of skills right here. 🐣

If you might be interested and want to talk, email me at brent@ranchero.com.

* * *

The hard part of all this: normally everyone would get together for a happy hour for a few drops of encouragement and friendship. These rituals are nice, and they matter to me.

But — (gesturing again at this fallen world) — nope.

The iOS and Mac Markets Are the Same Size

That headline is a bit provocative, I realize, and it doesn’t capture all the truth. So I’ll elaborate.

Download numbers for NetNewsWire 5.0 for iOS just passed the total for NetNewsWire 5.0.3 for Mac: 37,618 for iOS, 36,774 for Mac.

Yes, the iOS app has more downloads, and it got there in only a few weeks. But if the iOS market were so much larger than the Mac market, you’d have expected this to happen within a day or two of launch day.

This particular app makes for an interesting experiment for a few reasons:

  • It’s free (very little friction, in other words)
  • Both versions have had about the same amount of notice in the press and on blogs and Twitter
  • News reading is probably more of an iOS thing than a Mac thing in general
  • The iOS app is highly-rated (4.9 worldwide) and reviews are quite favorable

Based on the above, and knowing that way more people use iOS than macOS, you’d expect the iOS app to be way more popular. But it’s not. It’s a little more popular.

I find this super-fascinating, because it’s some data — admittedly just one app — that confirms what I’ve thought for a long time, which is that, for some types of apps, a Mac app would do as well as an iOS app.

And, given that Mac apps are less complex to write than iOS apps these days, a Mac app could be more profitable than an iOS app.

On Building NetNewsWire

On the NetNewsWire blog, I wrote about how it’s easier to build NetNewsWire now — and you don’t even need a paid developer account (just a free one).

Also: we welcome contributors! Of all skills levels and experience. Especially people new to app development. (NetNewsWire is my vehicle for giving back to the community, and one of the best to do that is to help new people get settled into the app development world.)

Slack Group for Socializing

I’ve seen a few people on Twitter asking if there’s a Slack group they could join for the purpose of socializing.

So I’ve set up a #socializing channel on the NetNewsWire Slack group. You’re welcome to join — you don’t have to be a NetNewsWire user.

Everybody on the Slack group is super-nice, and there is a Code of Conduct.

I’m not going to try to convince you to use NetNewsWire. 🐯 I’m just using the tool I have to help in this very small way.

Proxyman

Our lead iOS developer Maurice Parker found an app called Proxyman that looks pretty cool.

It’s like Wireshark or Charles, except that it‘s a Mac-assed Mac app (which I love).

Update a little later: a few people have asked me, “What’s a Mac-assed Mac app?”

Answer: it’s a phrase I stole from my friend Collin Donnell to describe Mac apps that are unapologetically Mac apps. They’re platform-specific and they’re not trying to wow us with all their custom not-Mac-like UI (which often isn’t very accessible).

I consider NetNewsWire to be a Mac-assed Mac app, and it’s a point of pride.

Slack, on the other hand, is most definitely not — though it’s not only Electron apps that miss the mark of Mac-assed-Mac-app-ness.

Two Weeks at Home

Monday is the 14th day my wife and I will spend in self-isolation. We’re getting groceries once a week, but anything optional is just not done, and everything else is optional.

We skipped the small dinner party we were invited to on the weekend. We haven’t been to a bar or a restaurant or even to a coffee shop. I’m not getting my hair cut tomorrow.

Even with this, we’re still washing our hands frequently and not touching our faces — because the mail still comes and a couple packages have come. Because groceries are things from outside our bubble.

We’re lucky — I know we’re lucky. Incredibly lucky. But, if you’re similarly lucky, I beg you to do this too.

Yes, the economic cost is terrible. But that doesn’t compare to the loss in lives that’s coming.

Maybe you really, really want to go do this one thing, and everyone’s careful, and you’re young and healthy and don’t know any old people. Don’t do it. Don’t.

This may go on for months. Fine. Staying home to save lives is really not hard.

NetNewsWire Download Numbers

Common wisdom is, I think, that the iOS market is so much larger than the Mac market that an equivalent iOS app would be downloaded five or ten times more than a Mac app.

I kind of accept that wisdom, but I also kind of think the iOS App Store has so many more apps that it may erase that difference. An equivalent iOS app might get downloaded about the same number of times, or even fewer times.

Who knows?

Well, anyone with a Mac and an iOS app has some idea. Like me.

Here’s our situation. NetNewsWire for Mac is direct-download-only, and NetNewsWire for iOS is on the App Store. Both are completely free and have no IAP. NetNewsWire for iOS is, worldwide, a 4.9-star app. Both apps have been reviewed well by places like MacStories.

Numbers

Downloads for NetNewsWire 5.0.3 for Mac, released Oct. 22, 2019: 32,223

Downloads for NetNewsWire 5.0 for iOS, released March 9, 2020: 26,089

My guess is that the iOS app will surpass the Mac app in downloads in about a week.

But there’s an important thing to remember: the majority of downloads happen in the first couple of days after release.

So I don’t expect the iOS app to be ten or even five times more popular than the Mac app. Maybe twice as popular? It’s early enough that it’s hard to say.

One thing that could really change these numbers is, of course, being featured by Apple. Another thing that could possibly change things, but in the other direction, is if we release the Mac app on the Mac App Store.

Conclusion

Every app is unique, and the situation will be different for each app. But just thinking that the iOS market is so much larger, and your app will do better by that proportion, is probably naive. It’s not nearly as straightforward as that.

On Alternate App Icons for NetNewsWire for iOS

Releasing an app always comes with surprises. No matter how many beta testers you have, there’s nothing like an app actually going out to the public.

We’ve had, for NetNewsWire for iOS, a startling number of requests for the ability to choose from a list of alternate app icons.

This is a thing that some people really like these days. Even if it’s the exact same icon just with different color treatments. (A dark icon seems to be most commonly wished-for.)

This was not a thing the last time I released an iOS app. (Vesper, back in 2013.) My guess is that, in the intervening years, we got API for this, and some developers have done this because, well, it’s fun. 🍕

And now it’s a thing people expect.

Given that including additional app icons can’t slow down the app, why not just do it? What could possibly be the downsides?

Here Are All the Downsides

The first one is kind of obvious. It’s easy to think that this is something you could do in a couple hours. But remember that it’s not just a case of loading the app icon up in Photoshop and doing some quick versions with different colors.

The colors have to be chosen and tested. Each version has to be created in all the various different sizes. It’s quite a bit of work!

And our app icon maker Brad Ellis is a father. Like everyone else on the team, he’s donating his time. Do I ask him to spend a few nights on this?

A second downside is that this takes time away from fixing bugs and doing things like bringing Feedly syncing to the Mac. (This feature requires layout, code, and testing — it’s not just Photoshop work.)

The third downside is that each option we add takes NetNewsWire one step further away from the simple RSS reader that people love. We will have to add options in the future — but, knowing that, we need to be super-careful about what we add so it doesn’t balloon. (You probably don’t remember NetNewsWire 3.3.2’s preferences window. It was extensive.)

The fourth downside is related to the third, and might be the most important. My previous decade of experience with NetNewsWire tells me that there is a sizable set of users who get kind of stuck on things like this. The more customization there is, the more time they spend on it. Any time we add something like this, we’re adding to their anxiety.

To be clear: I’m not disdainful of these people, not in the least tiny bit. I recognize it in myself, even. I want the ability to make things just-so, and it never, ever is, quite, but I keep trying. And maybe I ask the developer to add just one more option, but with this particular shade of blue or orange — and they do, but it’s still not quite right, so I go back to tweaking some more, maybe going another route… and…

This just isn’t good.

What We’re Doing

These are still very early days for the app — and so we’re going with a couple simple policies.

Add options when needed for accessibility. We support Dark Mode, for instance, which is for many people an accessibility issue. (We use Apple’s colors for this, on the grounds that they’ve done more research and design for this than we ever could.)

Add options that reduce anxiety. An example of this is the option to not show the unread count in the Dock on Macs. (There’s a similar setting in Notifications settings in iOS.)

Alternate app icons won’t help with accessibility, and they certainly won’t help with anxiety.

That’s not to say we wouldn’t ever do this. Or we might just add a dark version. But not right now.

I know this will disappoint some people. My pledge is that, even when I’m disappointing you, I will tell you honestly why.

(We’ll probably do themes for the article view way before we would do something like this, because 1) that’s fun too!, and 2) it’s an accessibility/readability issue.)

NetNewsWire 5.0 for iOS Shipping

Go get it on the App Store! Also see the announcement on the NetNewsWire blog and see the NetNewsWire home page for details.

It’s free and open source. Even though it’s labeled as 5.0, it’s a brand-new app, a fresh start for an app that originally appeared on the App Store on day one.

The big difference is not the price tag — there have been free versions of NetNewsWire before — and it’s not just that it’s open source. It’s that there’s a great team of volunteers behind it now.

Many are coders, for sure — and one of them, Maurice Parker, is the lead developer for the iOS version. We also have Kiel Gillard on Feedly syncing, Nate Weaver on under-the-hood goodness and CSS magic, and many more.

There are also designers, writers, and testers. Brad Ellis made the app icon, which I love. Ryan Dotson wrote the excellent help book.

Our friends at Feedbin generously run the web service that provides the Reader view, and they’ve helped with a number of technical issues.

And, at this writing, we have 8,211 people testing via TestFlight — and they’ve been great reporting crashes and bugs, making feature requests, and providing all kinds of feedback. Having that kind of huge community support has meant everything to the quality of the app. This release is dedicated to them.

I love saying that NetNewsWire is a team. Yes, sure, I wrote the bones and I manage the project and I put my name on it — but this team and what they’ve accomplished makes me so very, very proud and happy. 🎸🐯💥

Adam Klobuchar

Like all of us, I’ll remember forever that image of Adam Klobuchar announcing his candidacy during a storm, with snow falling on his hair. He looked so tough and heroic and yet just plain real.

(By now we’ve all seen the poster a million times.)

I love his Midwestern credibility. His ability to win in even the reddest of districts. His common sense and his care and empathy. His record as a prosecutor and his record of introducing and passing bills in Senate.

It wasn’t inevitable that we’d have a universally-loved unifier at the top of the ticket this year, but I’m sure glad we do. Definitely the right choice to begin putting this torn country back together.

(Maybe he’ll pick Edward Warren as running mate? He ran a great race, and his many, many progressive plans quite rightly excite a generation of young people.)

More Life in Seattle

Our state is vote-by-mail — but there are also official ballot drop-off locations, and traditionally we like to walk down and drop off our ballots manually. We like the ritual.

We talked about whether or not we’d have to touch anything. It’s just a slot, right? Not like a mailbox? We think so. We can go the whole mile and back without touching anything in the world.

* * *

We’re mapping out meals to stretch the protein. Think stews and chili. Think beans. Eggs for variety.

We’re constantly surprised when we hear of people planning things that involve other people.

People on TV — they should be home, too, I keep thinking.

And I keep thinking that the air itself has added weight and slowed down.

I feel weird for enjoying, as an extreme introvert, the time at home, with a clear social calendar, with every reason not to go anywhere or see anybody.

I also feel supremely fortunate to have a home, good health, and the means to stock up. I constantly worry about the people who don’t have all three.

I worry that we’re going to run out of hospital beds in Seattle some time in April.

Washington State Primary Next Week

I’m very curious to see what happens in the Washington State primary next week.

In 2016, Sanders won the caucuses overwhelmingly. I caucused, and I can say that the state results were pretty close to the results in my particular caucus.

Weirdly, we also held a primary that didn’t count. In that vote, Clinton won narrowly. That was about two months after the caucus.

This year we’re back to a primary vote, with no caucus. All our voting is by mail, and many people cast their votes while Warren, Klobuchar, Bloomberg, and Buttigieg were still in the race and before Biden’s wins in South Carolina and on Super Tuesday.

I’m confident that my neighborhood will vote for Sanders. You could easily argue that Sanders is likely to win the state, given his landslide victory last time.

But this is also a different year, and caucuses tended to favor Sanders, and we’re running a primary.

But, then, lots of people voted early, so… and now there’s this virus.

I have no idea what’s going to happen, but I’m super-curious.

PS For me personally, the remaining candidates in the race are something like my sixth and seventh choices. That’s how it goes sometimes. The people I really wanted are out. But I will of course vote in the general election for the Democrat — always have, always will.

Life in Seattle

We’re avoiding other humans.

I’m home and Sheila’s home. Omni asked, earlier this week, that employees not come into the office unless necessary for a task, and I don’t miss jamming myself into the overcrowded and sneezy bus route 40 three days a week.

We’ve stocked-up on food and supplies, at least for a while. I do leave the house to go running, but I figure that’s safe.

Xcoders and NSCoder Night have been canceled. The Quilt Show has been canceled.

I don’t really know what the rest of the city feels like right now, since I’m just home or running on my usual jog path.

Trees and flowers are starting to bloom, so I have the sniffles, like every year in March. Birds are chirping and scrambling outside my office window.

This could be my life for a while. Your life might look something like this pretty soon. Hopefully not.

I miss going to restaurants.

We have a family member in Seattle, who we see twice a month, usually, who’s in the vulnerable class, and I don’t know when we’ll see him next.

A black rooster just walked through my backyard, which is a first. The sun comes and goes during the day.

How We Fixed the Dreaded 0xdead10cc Crash

NetNewsWire for iOS, currently in TestFlight beta, was getting a lot of crashes related to background refreshing.

They would happen when the user wasn’t actually using NetNewsWire — it happened when the app would download feeds and sync in the background.

The crash logs were not identical, but they had this same thing:

Namespace RUNNINGBOARD, Code 0xdead10cc

This meant that the system was killing the app because, after the background task was complete, the app still had references to a SQLite database (or sometimes another file).

We did everything we could to fix this over a course of several months, including various forms of major surgery — and the best we could do was make it worse.

I did a lot of research — including reading this blog post from The Iconfactory several times — and we still came up with nothing.

Finally I asked around.

Advice

Marco Arment writes Overcast, a podcast player, which is in some important ways similar to NetNewsWire: it downloads data from the web while in the background.

Marco had already been through all this with Overcast, and he gave me this advice:

Don’t keep the SQLite database in the shared container. You’ll never get rid of all of those crashes. Instead, communicate with extensions via other means than having them read/write the DB directly, such as Darwin notifications or writing plist files in the shared container.

iOS will always terminate the app and generate that crashlog whenever your app or extension has an open file handle to a file in a shared container at suspension time.

And there are some cases where your app gets forcibly suspended without calling background-task completion handlers. (Especially in extensions, where they don’t exist.)

I tried wrapping every SQLite query in a background task once to avoid this. A standard Overcast session may issue hundreds or thousands of database queries. I later found that apparently each one generates a process power assertion, the OS wasn’t made for that level of usage, and after some time, Springboard would crash.

There’s also the NSProcessInfo background-task thing that allegedly works in extensions, except that it doesn’t.

The moral of the story ended up being: just don’t keep your SQLite database in the shared group container. There’s no way to avoid these crashes 100% of the time.

We were sharing our SQLite database with one of our extensions! Marco’s advice is, basically, don’t do that.

So we stopped doing that. We un-shared the databases and switched to a super-low-tech thing for communicating between the extension and the app (the extension writes to a plist file which the app later reads).

And — as of last night’s build — the dreaded 0xdead10cc crashes are gone!

Continuing On

That was the last big challenge on our list for shipping. We still have work to do, but we’re getting close — the milestone says we have just four bugs left. Good deal.

PS I’ve since heard from other developers: don’t-share-the-database appears to be the common wisdom, which it just took me longer to learn. 🐥

Knock It the Fuck Off

Every day on Twitter I see smart people who I respect dumping on one or another of the Democratic candidates.

Sanders for being cozy with left-wing dictators; Warren for being insufficiently socialist; Klobuchar for having prosecuted drug crimes; Buttigieg for taking money from rich people and for his lecturing; Biden for the stains on his record and for being weird; Steyer for being super-rich; Bloomberg for being even richer and for stop-and-frisk; Yang for… something, probably. (I forget).

I have a favorite, and a second and third choice. And so do you, and ours might not match.

Odds are that your favorite is not going to be the nominee. And that nominee, whoever it is, needs to not have been already labeled a garbage candidate by you and by everyone who’s favorite he or she isn’t.

Here’s the thing: we’re fighting to stop the spread of right-wing extremism. It will get so much worse if we reelect the president. It has to be stopped now. No other issue matters, because nothing else can be done without doing this.

Things I Don’t Care About

I don’t care about Medicare for All or beefing up the ACA. I don’t care about free college. I don‘t care about legalizing marijuana. I don’t care about immigration reform. I don’t care about rolling back the corporate tax cuts.

I don‘t care about any of the wonderful liberal and progressive policies our candidates propose — because they’re not going to get through.

(Well, I do care about them, deeply, but the point stands.)

It’s not that it would take 60 Democratic senators — it would take more like 65 or even more, and that’s not going to happen. We can elect the most wonderful progressive person ever and they’ll just beat their head against the wall.

There’s no magic coming. There’s no amount of will-of-the-people that will move Republican senators. All of the policy we talk about is just fantasy.

I also don’t care where the candidates’ money comes from. In fact, I want it to come from everywhere and I want to see enormous fucking rivers of it — because we’re going to need it to beat that corrupt asshole, our current president.

The Only Thing I Care About

Our job is to stop fascism here in America.

And then we can deal with it in the rest of the world.

I have plenty of doubt about what’s the best way. Will we turn out people who don’t usually vote? Maybe. But, the thing is, those people are people who don’t vote. And there’s no guarantee that, if they did, they’d vote our way.

But maybe there is an untapped well who can be energized and inspired?

Or… instead, will we be able to persuade people in the suburbs who normally vote Republican? In this polarized country, can anyone anywhere be persuaded? I don’t know. But maybe?

If you think you know the answer, I’ll tell you you’re full of shit, because you don’t know and I don’t know.

Here’s what I do know, though: we all need to be prepared for one of these candidates becoming the Democratic nominee, and we need to not have half of us hating that person already.

Because none of them are right-wing extremists. They’re all good people who will do their best to get good things done (and fail, but still).

This is the only thing that matters — they would all, every one of them, turn us away sharply and swiftly from the abyss we’re looking at right now. Even the ones who are not your favorite.

So cut it out.

NetNewsWire Sitrep

Alex — @tales on Twitter, blogger at 418 Teapot — ran Sitrep on NetNewsWire, on the branch we’re currently working on (iOS-candidate).

Here’s what Sitrep reports:

SITREP
------
Overview
   Files scanned: 424
   Structs: 145
   Classes: 283
   Enums: 33
   Protocols: 69
   Extensions: 300
Sizes
   Total lines of code: 56254
   Source lines of code: 50125
   Longest file: SceneCoordinator.swift (2038 source lines)
   Longest type: SceneCoordinator (1080 source lines)
Structure
   Imports: Foundation (218), RSCore (146), Account (129), Articles (104), UIKit (91), AppKit (79), RSWeb (53), RSParser (42), XCTest (41), os.log (37), RSTree (20), RSDatabase (18), ArticlesDatabase (13), SyncDatabase (12), WebKit (9), SafariServices (6), UserNotifications (5), CoreServices (4), Intents (3), NetNewsWire (2), MobileCoreServices (2), Social (1), CoreSpotlight (1), SystemConfiguration (1), WatchKit (1), BackgroundTasks (1), Sparkle (1), Darwin (1), AuthenticationServices (1)
   UIKit View Controllers: 7
   UIKit Views: 5
   SwiftUI Views: 0

I would have guessed around 35,000 lines of code, but we’re past 50,000 lines.

Archive