PodSearch

Under the Radar

258: A Less-Cloudy Outlook

 

00:00:00 ◼   ► Welcome to Under the Radar, a show about independent iOS app development.

00:00:04 ◼   ► I'm Marco Arment.

00:00:05 ◼   ► And I'm David Smith.

00:00:06 ◼   ► Under the Radar is usually not longer than 30 minutes, so let's get started.

00:00:10 ◼   ► I think my plans were all wrong, and I'm going to change them.

00:00:15 ◼   ► Oh no.

00:00:18 ◼   ► So often the way isn't it?

00:00:20 ◼   ► Yeah.

00:00:21 ◼   ► So, you know, over the last few months I've talked about, you know, how I've been – I've

00:00:26 ◼   ► had a bunch of server challenges the past year just trying to get things scaled and

00:00:30 ◼   ► cost managed in reasonable ways and was basically getting nowhere with a lot of it.

00:00:35 ◼   ► I tried a bunch of different things that ended up being either no benefit or minimal benefit

00:00:40 ◼   ► for tons of work and tons of cost.

00:00:42 ◼   ► And so anyway, so you know, server stuff wasn't going great.

00:00:45 ◼   ► And my plan has been – as I've discussed on this show and on ATP, my plan has been

00:00:49 ◼   ► to – basically to move user data to CloudKit in Overcast and keep, you know, keep like

00:00:58 ◼   ► the servers around in a smaller state for all the feed crawling and stuff like that

00:01:02 ◼   ► and notifications and everything, but basically to move the user data part of it.

00:01:06 ◼   ► You know, your list of subscriptions, your progress within each episode, you know, that's

00:01:10 ◼   ► the bulk of the data.

00:01:13 ◼   ► And each episode state, like whether it's deleted or played or – like that's – those

00:01:17 ◼   ► things, that's pretty much all my user data.

00:01:19 ◼   ► So – but it's just a huge volume of very tiny flags and stuff on these rows.

00:01:26 ◼   ► So anyway, so my plan was move all that to CloudKit and then keep the servers as a much

00:01:31 ◼   ► smaller thing.

00:01:33 ◼   ► And that's why about a month ago I posted a notice on the Overcast web interface saying

00:01:38 ◼   ► I was going to discontinue the web interface sometime in 2023.

00:01:42 ◼   ► Because while there are ways to access CloudKit from servers, they are terrible and unreliable.

00:01:49 ◼   ► I know because I tried using them for my login system for a few years.

00:01:53 ◼   ► And it's still there, but I've been backing away from it because it's terrible and unreliable.

00:01:57 ◼   ► [Laughter]

00:01:58 ◼   ► That's not good for something like login.

00:02:00 ◼   ► That's a pretty fundamental thing.

00:02:01 ◼   ► Yeah, like I had to build this whole QR code thing instead because the CloudKit thing was

00:02:05 ◼   ► so unreliable and so limited.

00:02:07 ◼   ► And it feels like – you know, you don't really want ever to be in an area of Apple's

00:02:13 ◼   ► stuff that they barely seem to notice or care about.

00:02:18 ◼   ► And I think CloudKit on the web is clearly one of those areas where like, yes, it technically

00:02:25 ◼   ► exists but you don't want to build a product on that.

00:02:29 ◼   ► Sure.

00:02:30 ◼   ► It remains a service in their lineup or whatever you might say.

00:02:32 ◼   ► Right, exactly.

00:02:33 ◼   ► CloudKit on the web remains a service in their lineup.

00:02:36 ◼   ► Exactly.

00:02:37 ◼   ► So basically I decided, you know what, not a lot of people use the web interface.

00:02:42 ◼   ► I hate working on it.

00:02:43 ◼   ► It's ugly and hideous because I'm not a very good web designer.

00:02:47 ◼   ► I just haven't had the motivation or talent or time to work on it.

00:02:51 ◼   ► So I was just going to let it die.

00:02:53 ◼   ► And so I posted this note saying, "No more web interface.

00:02:55 ◼   ► Sometime in 2023 I'm going to take it down.

00:02:58 ◼   ► Sorry everyone.

00:02:59 ◼   ► I'll figure out some way to make file uploads work but otherwise that will be it."

00:03:03 ◼   ► Over the last week or so I released a build of Overcast to the App Store that is still

00:03:09 ◼   ► in phased rollout.

00:03:10 ◼   ► So not everybody has it yet.

00:03:12 ◼   ► But it has a new analytic stat that I'm measuring which is how many people have an iCloud account

00:03:20 ◼   ► logged in?

00:03:22 ◼   ► Because in order to use CloudKit, at least to use any kind of private user specific data,

00:03:27 ◼   ► that user on that device has to have an iCloud account logged in.

00:03:31 ◼   ► I have since also learned that for that to work for apps they also need to have iCloud

00:03:35 ◼   ► Drive enabled which is a little detail I didn't know until a few days ago.

00:03:39 ◼   ► Sure.

00:03:40 ◼   ► So I posted on Mastodon.

00:03:42 ◼   ► By the way, I'm all on Mastodon now.

00:03:43 ◼   ► No more Twitter.

00:03:44 ◼   ► So I posted on Mastodon.

00:03:45 ◼   ► By the way, it's great.

00:03:46 ◼   ► I highly recommend it.

00:03:47 ◼   ► Anybody out there, if you want to follow all of us nerds talking about nerd stuff in a

00:03:52 ◼   ► more peaceful way without all the stuff around Twitter, come to Mastodon.

00:03:56 ◼   ► It's great.

00:03:57 ◼   ► Anyway, so I posted on there asking basically like, "Hey, my early data on this stat is

00:04:04 ◼   ► suggesting that more people than I expected don't have an iCloud account logged in."

00:04:10 ◼   ► And I asked, "Hey, other iOS devs, what do your numbers look like for this?

00:04:13 ◼   ► What do I need to know here?"

00:04:16 ◼   ► And it turns out I learned a whole bunch from the replies for that.

00:04:19 ◼   ► I'm very thankful to all the people who replied.

00:04:22 ◼   ► Key takeaways are, again, that iCloud Drive thing where if iCloud Drive is disabled on

00:04:26 ◼   ► the device, apps can't use CloudKit.

00:04:29 ◼   ► That's it.

00:04:30 ◼   ► And I don't think that's an obvious thing to the users.

00:04:35 ◼   ► So a lot of people will go and fiddle with settings to achieve some goal like we've

00:04:41 ◼   ► all seen in our apps that people will "force quit" our apps in order to do whatever they

00:04:46 ◼   ► think that's going to do.

00:04:48 ◼   ► And that can cause, in the past, it has caused problems with things like receiving background

00:04:53 ◼   ► updates or notifications or being able to refresh.

00:04:57 ◼   ► And so anyway, people tweak settings and they mess with things and then things break, but

00:05:03 ◼   ► they don't necessarily know why things broke.

00:05:05 ◼   ► They might blame us or email us or whatever else.

00:05:08 ◼   ► And this is one of those things where having iCloud Drive disabled just kills CloudKit,

00:05:12 ◼   ► and I don't think anyone knows that.

00:05:13 ◼   ► I didn't know that as a user.

00:05:15 ◼   ► And so that's one thing.

00:05:18 ◼   ► Also, the big factor that I think I was, I think, under-considering or not considering

00:05:24 ◼   ► was that I learned from all these responses that most business-deployed devices, like

00:05:31 ◼   ► if you have a phone from work that's MDM-managed, in many cases, either iCloud itself will be

00:05:38 ◼   ► prohibited or at least iCloud Drive will be prohibited, which kills CloudKit.

00:05:46 ◼   ► And so anyway, so this is combining with over the last few weeks since I announced that

00:05:52 ◼   ► I was going to kill the web interface.

00:05:53 ◼   ► I mean, look, my numbers on actual usage of the web interface are very low.

00:05:59 ◼   ► It's like, you know, I think it's like less than 1%.

00:06:01 ◼   ► I think it's well less than 1% of active users actually use the website every day.

00:06:07 ◼   ► It's a pretty low percentage.

00:06:10 ◼   ► The absolute number is not nothing, but it's not a huge number.

00:06:14 ◼   ► But it's kind of, you know, you just made a Remains of Product Center lineup joke.

00:06:18 ◼   ► It is kind of the Mac Mini of Overcast in the sense that while its actual numbers of

00:06:25 ◼   ► usage are low, a lot of people use it here and there for kind of edge case or unusual

00:06:33 ◼   ► uses that are not well solved just by having an iOS app.

00:06:40 ◼   ► And that turned out to be, people kept bringing up over and over again different use cases,

00:06:46 ◼   ► and one of them was, hey, I listen on my work PC.

00:06:50 ◼   ► And we're not allowed to install anything, but I can go on your web interface and listen

00:06:54 ◼   ► on my work PC.

00:06:56 ◼   ► And you know, again, usually I don't do that much to cater to like, you know, Windows PC

00:07:03 ◼   ► users or anything.

00:07:04 ◼   ► It's just that's not my world and I don't have the resources and everything else.

00:07:07 ◼   ► But I heard from so many people who said, oh, yeah, you know, I really am sad to hear

00:07:15 ◼   ► this because I use the web interface for XYZ.

00:07:19 ◼   ► And I think I should keep it and I think I should bail on CloudKit because the combination

00:07:26 ◼   ► of the web interface being more used and more useful to people than my stats would have

00:07:34 ◼   ► suggested as well as my surprisingly high stat of people who don't have iCloud account.

00:07:43 ◼   ► So right now, and I'll tell you, you know, right now I'm still in like day three or four

00:07:47 ◼   ► of phased rollout of this version, but my no account percentage started out at almost

00:07:55 ◼   ► nine percent on the first day.

00:07:58 ◼   ► And as the days goes on, it's slowly climbing up.

00:08:01 ◼   ► I'm now like 10 and a half percent.

00:08:05 ◼   ► And so I think it's probably going to stay somewhere in this range, I think, you know,

00:08:08 ◼   ► around 10 percent.

00:08:10 ◼   ► And that's a lot.

00:08:11 ◼   ► And so when I look at how many people would not be able to use CloudKit in Overcast, if

00:08:18 ◼   ► it's going to be 10 percent, that's a very high percent.

00:08:23 ◼   ► That is too much for me because I'm not at the point in my career where I'm willing to

00:08:29 ◼   ► just throw away 10 percent of my users for easily avoidable reasons.

00:08:35 ◼   ► And the thing is, this is not, you know, the plan to change to CloudKit was not going to

00:08:41 ◼   ► be without other downsides.

00:08:43 ◼   ► I just had decided that they were probably going to be worth it.

00:08:46 ◼   ► But it would involve a large amount of work, like a huge amount of work.

00:08:53 ◼   ► And of course there's direct cost to that.

00:08:55 ◼   ► There's also opportunity cost to that.

00:08:56 ◼   ► You know, I could be building other features during that time.

00:08:59 ◼   ► So you know, that's a huge amount of work there.

00:09:02 ◼   ► And then I would be taking on risks that I don't currently know about.

00:09:07 ◼   ► So for instance, if I hadn't issued this build with this analytic stat, I would have just

00:09:11 ◼   ► plowed forward and not even realized that I would be killing 10 percent of my users.

00:09:16 ◼   ► And you know, good thing I learned that now instead of after I built it and switched everything

00:09:20 ◼   ► over.

00:09:21 ◼   ► >> Yeah, for sure.

00:09:22 ◼   ► >> And also, you know, again, like dealing with areas of Apple that are not as high of

00:09:29 ◼   ► a priority as things like, you know, the iPhone.

00:09:32 ◼   ► You know, and I think CloudKit, I've heard overall pretty good things about it.

00:09:37 ◼   ► But it does seem like it suffers a little bit from this problem of not being a super

00:09:42 ◼   ► high priority.

00:09:43 ◼   ► Not as bad as like, you know, CloudKit for the web.

00:09:45 ◼   ► That's a whole different degree of low priority.

00:09:49 ◼   ► But just CloudKit itself and iCloud in general, it seems like it's pretty good most of the

00:09:53 ◼   ► time.

00:09:55 ◼   ► But am I willing to like bet all of my data on pretty good most of the time?

00:10:00 ◼   ► And especially since I already have this whole system in place that doesn't use it at all

00:10:05 ◼   ► and doesn't need it.

00:10:07 ◼   ► So I think that's a major factor there.

00:10:12 ◼   ► And I think I'm learning that, you know, the assumptions I make or the things that I hear

00:10:19 ◼   ► or, you know, various, you know, various little data points I can pick up here and there might

00:10:25 ◼   ► suggest, you know, because the responses I got when I asked people like what their numbers

00:10:30 ◼   ► were for, you know, how many people didn't have iCloud accounts.

00:10:33 ◼   ► Most of their numbers were way lower than mine.

00:10:35 ◼   ► I did have some that were a little higher, especially things that targeted business users

00:10:39 ◼   ► in particular.

00:10:40 ◼   ► But most of their numbers were way lower than 10%.

00:10:45 ◼   ► But mine aren't.

00:10:47 ◼   ► And you know, there is no substitute for having your own numbers from your own user base because

00:10:52 ◼   ► those can vary.

00:10:53 ◼   ► They can vary wildly and what I'm seeing here is this whole assumption I made that, you

00:11:01 ◼   ► know, how many people are really using an iOS device without an Apple ID logged in,

00:11:08 ◼   ► you know?

00:11:09 ◼   ► That whole assumption was not only incomplete in the sense that I didn't realize things

00:11:14 ◼   ► like the iCloud Drive thing, stuff like that, but it just didn't reflect my user base.

00:11:20 ◼   ► And my actual user base, you know, people listen to podcasts at work.

00:11:23 ◼   ► Like that's a common thing.

00:11:25 ◼   ► Or you know, a lot of people, their only iPhone is their work iPhone.

00:11:29 ◼   ► That's a very common thing.

00:11:31 ◼   ► And so there are all these conditions that, you know, the plan I had made, it just, it

00:11:38 ◼   ► didn't take into account all these things or I didn't know all these things.

00:11:41 ◼   ► And now that I have more information and more knowledge, now I can see, you know what, this

00:11:46 ◼   ► is a bad idea.

00:11:48 ◼   ► It also helps that in the meantime, over the last couple of months, I also actually finally

00:11:55 ◼   ► was able to do a few server changes that actually helped.

00:11:59 ◼   ► That actually worked.

00:12:00 ◼   ► >> Wonderful.

00:12:01 ◼   ► >> After a whole spring and summer of doing things that didn't work and didn't help in

00:12:05 ◼   ► the fall, I actually, you know, I cleaned up a couple database index sets and things

00:12:10 ◼   ► like that and, you know, made a few things more efficient and, you know, dropped some

00:12:14 ◼   ► unused indexes and columns off some major high traffic tables.

00:12:18 ◼   ► And it just worked better.

00:12:20 ◼   ► Like and I think I bought myself a lot of headroom.

00:12:23 ◼   ► So I think I'm just going to keep going with the plan I already was, with the structure

00:12:30 ◼   ► I've already had.

00:12:32 ◼   ► Just keep going on that and, you know, try to make little improvements where I can, you

00:12:36 ◼   ► know, probably stop trying to make massive improvements that, you know, might involve

00:12:40 ◼   ► other services and backend stuff that I don't have any experience with.

00:12:44 ◼   ► Just keep going with the really simple, you know, MySQL setup that I have now and just

00:12:49 ◼   ► get back to working on user features.

00:12:51 ◼   ► Because that's what people actually want from me.

00:12:55 ◼   ► That's what both my app and my business actually need.

00:12:59 ◼   ► And you know, the server stuff, if I can improve server stuff over time, that's great.

00:13:04 ◼   ► But I think this has shown me like that whole plan turned out to be wrong.

00:13:11 ◼   ► And I'm not afraid to admit it now.

00:13:13 ◼   ► And I'm going to now take down the notice on the website that I'm going to shut down

00:13:17 ◼   ► in 2023 because I think now I'm not going to.

00:13:20 ◼   ► This episode of Under the Radar is brought to you by POW, P-O-W, the SwiftUI effects

00:13:24 ◼   ► and transitions library by Moving Parts.

00:13:26 ◼   ► POW is the perfect tool for adding some excitement to your app's user interface.

00:13:30 ◼   ► POW was created by experienced designers and developers to easily integrate even into existing

00:13:34 ◼   ► SwiftUI apps.

00:13:35 ◼   ► And with its simple one-time purchase of $99, you can add professional level effects and

00:13:40 ◼   ► transitions to your app without breaking the bank.

00:13:42 ◼   ► I've actually been following the creation of POW myself.

00:13:45 ◼   ► As I've been getting more and more into SwiftUI, I've been finding it really helpful to see

00:13:48 ◼   ► them make this and to get a sense of what's possible and to get ideas for little touches

00:13:52 ◼   ► and things that I can add to my apps.

00:13:54 ◼   ► And then if I do, would increase the just that level of polish that it would have.

00:13:59 ◼   ► I especially like their change effects, which give UI a really lively feeling.

00:14:03 ◼   ► These are visual touches that you can kick off in response to user action, which I feel

00:14:07 ◼   ► like really elevate the sense of interaction and the pizzazz your app ends with.

00:14:12 ◼   ► But you can see it for yourself.

00:14:14 ◼   ► You don't have to take my word for it.

00:14:15 ◼   ► If you-- POW has created an example app on GitHub where you can download and see all

00:14:20 ◼   ► these effects and actions so you can know what you're getting before you do.

00:14:24 ◼   ► If you'd like to check it out, head to movingparts.io/radar to learn more about POW and to try it out for

00:14:29 ◼   ► yourself.

00:14:30 ◼   ► And when you're there, you can use code RADAR at checkout for 10% off on your purchase.

00:14:35 ◼   ► That's movingparts.io/radar and code RADAR for 10% off.

00:14:39 ◼   ► Thanks to POW for moving parts, for supporting this show, providing developers with a great

00:14:42 ◼   ► tool to make stunning user interfaces in SwiftUI, and for their support of all of Relay FM.

00:14:46 ◼   ► Yeah, I mean, I think that makes a ton of sense to what you're saying about-- and I

00:14:52 ◼   ► feel like in some ways this is a good endpoint for one of the things that I've been learning

00:14:57 ◼   ► about this in 2022 is this reality of having ideas, but then verifying them or exploring

00:15:07 ◼   ► them with numbers before you act on them or before you go too far down a road.

00:15:12 ◼   ► And I feel like this is that perfect example where it's so easy, I think, to make assumptions

00:15:17 ◼   ► about our users, about their preferences, about their setups, assume that they're similar

00:15:25 ◼   ► to us, that they have setups and preferences that are similar to ours, whatever that might

00:15:29 ◼   ► be, and to end up shoehorning ourselves into directions, places, features that in reality

00:15:38 ◼   ► aren't as in practice going to be that impactful.

00:15:42 ◼   ► And obviously, I feel earlier in my career or earlier in this year, if I'm being honest,

00:15:48 ◼   ► I think I would look at a lot of these kind of things and say, oh, I don't want to be

00:15:53 ◼   ► driven by numbers.

00:15:54 ◼   ► I don't want to be one of those sort of businessy analytics persons that's all just Mr. Spreadsheet

00:16:00 ◼   ► running around, and that's how I run my business.

00:16:02 ◼   ► And I think, as is so often the case, viewing that as an absolute position that you're

00:16:08 ◼   ► either the artisanally crafted, deep, thoughtful, sort of deep designing things with a great

00:16:16 ◼   ► amount of opinion and thoughtfulness.

00:16:18 ◼   ► You're either that or you're the other, I don't know, like the mustache twirling spreadsheet

00:16:23 ◼   ► man.

00:16:24 ◼   ► And it's like-

00:16:25 ◼   ► Do they have mustaches?

00:16:26 ◼   ► I don't know.

00:16:27 ◼   ► Maybe they have mustaches.

00:16:28 ◼   ► Maybe I'm just conflating things.

00:16:29 ◼   ► They probably did in the '70s.

00:16:33 ◼   ► Before they had spreadsheets.

00:16:34 ◼   ► Right.

00:16:35 ◼   ► But anyway, but I suppose the reality is that this is one of these things of like, there's

00:16:40 ◼   ► so much information that is available to us that we can use to improve our choices and

00:16:46 ◼   ► decisions and not availing ourselves of that is sort of just foolish at a certain point.

00:16:53 ◼   ► And it's just so many things in my products and it sounds like in Overcast where it's

00:17:00 ◼   ► by gathering the right amount of the right data at the right time in the right way, you

00:17:04 ◼   ► can really improve your decision making process.

00:17:07 ◼   ► And the way you're talking this through, I think it makes a ton of sense.

00:17:09 ◼   ► And I think, especially the thing that I look forward to in some ways is you've already

00:17:14 ◼   ► built the Overcast backend.

00:17:17 ◼   ► It exists.

00:17:18 ◼   ► It works.

00:17:19 ◼   ► It's been working for a decade, basically.

00:17:22 ◼   ► Like it's there.

00:17:24 ◼   ► And I would love for you to just be able to turn your focus from that to other things.

00:17:31 ◼   ► And would I like the end result of Ammarco completely divorced from a lot of server maintenance

00:17:39 ◼   ► and a lot of scaling issues and things and instead relying on CloudKit for that?

00:17:44 ◼   ► I like that that end result sounds great, but the next six months to get there, I don't

00:17:50 ◼   ► like as much.

00:17:51 ◼   ► And I think has always been like, well, if in the end, the end result is so much better,

00:17:56 ◼   ► it's worth that now.

00:17:57 ◼   ► But the thought of instead, if you got things stable in the servers to instead be like,

00:18:02 ◼   ► you know, 2023 is the year of new features in Overcast, like how awesome would that be?

00:18:06 ◼   ► Or being freed up in that way because you're just taking advantage of the thing that already

00:18:10 ◼   ► exists rather than having to kind of reinvent it a second time.

00:18:15 ◼   ► So I think in that sense, it sounds like a big win.

00:18:17 ◼   ► And certainly it's nice to not have to turn things off.

00:18:21 ◼   ► And you know, it's like, it's I mean, it's all these things.

00:18:24 ◼   ► There's always tensions and trade offs is the reality.

00:18:26 ◼   ► Like I, I am not going to lie that it was a part of me that's like, I really wish you

00:18:30 ◼   ► could have, you know, as I look forward to in March, I'm turning off feed Wrangler.

00:18:36 ◼   ► And getting out of essentially the server business, like I am so looking forward to

00:18:40 ◼   ► that part of the year.

00:18:41 ◼   ► And obviously, you're never getting out of the server business, you run something that,

00:18:45 ◼   ► you know, has to scrape hundreds of thousands of RSS feeds constantly throughout the day,

00:18:49 ◼   ► 24 hours a day, all day, like, okay, whatever.

00:18:54 ◼   ► There's a lot of internet happening there.

00:18:57 ◼   ► And I, you can't get out of that internet business in that sense.

00:19:00 ◼   ► But it's like, wouldn't it have been nice to be able to reduce that slightly?

00:19:04 ◼   ► Sure.

00:19:05 ◼   ► And what sounds pretty nice is having this kind of data to be like, you know, this isn't

00:19:09 ◼   ► the path it has the downsides have now crossed over that threshold.

00:19:13 ◼   ► And now, you can just focus on other things.

00:19:16 ◼   ► And hopefully, the servers stay happy and just kind of keep trucking away as they have

00:19:19 ◼   ► been.

00:19:20 ◼   ► And you know, it's not something that you're going to sort of regret in the future, but

00:19:24 ◼   ► more likely or not, you know, you're not because it's been working pretty well up

00:19:29 ◼   ► until now.

00:19:30 ◼   ► Yeah, and the times that it has worked less well were mostly because I was trying to add

00:19:36 ◼   ► levels of caching and things like that, you know, different, you know, data denormalization

00:19:41 ◼   ► steps to make things faster, that ended up resulting in possible failures and bugs.

00:19:45 ◼   ► Like, you know, like one of the big shifts I did over the summer that I've now partially,

00:19:51 ◼   ► if not, I've almost completely gotten rid of was, you know, I was moving a lot of the

00:19:57 ◼   ► feed contents data, like, you know, what basically my like my JSON normalized version of what's

00:20:02 ◼   ► in an RSS feed for podcasts, you know, split by episodes and everything else.

00:20:06 ◼   ► I was moving that from just database reads that were cached on a couple levels to actually

00:20:11 ◼   ► like static files that were that were stuck onto Amazon S3 or linear object storage, and

00:20:18 ◼   ► then proxied by Cloudflare in front of them as a CDN.

00:20:22 ◼   ► So the idea was take a whole bunch of traffic and load off of my servers and put it on CDNs

00:20:27 ◼   ► where it would not only be not served by my servers, but it would be faster and download

00:20:32 ◼   ► faster to everyone's devices, especially especially people who don't live near Texas.

00:20:37 ◼   ► And it turns out like that whole thing that introduced, you know, three different layers

00:20:42 ◼   ► of possible failures and cache invalidation bugs and things like that, that, you know,

00:20:49 ◼   ► it just made everything worse.

00:20:50 ◼   ► And it and like it didn't actually save a ton of resources like it saved some, but

00:20:57 ◼   ► didn't save a ton.

00:20:58 ◼   ► My server still to do a bunch of work.

00:21:00 ◼   ► And now you had more bugs and more costs.

00:21:03 ◼   ► It's like it actually backfired completely.

00:21:05 ◼   ► And so, you know, getting away from, you know, all that kind of stuff as much as I can and

00:21:09 ◼   ► keeping things simpler and everything is letting me do more work like, you know, over the last

00:21:15 ◼   ► couple of weeks, I actually started developing the back end for a feature.

00:21:20 ◼   ► I know.

00:21:21 ◼   ► >> Trevor Burrus Like what?

00:21:22 ◼   ► >> Mike Stowe Yeah, like, you know, so everyone always gets

00:21:25 ◼   ► these like Spotify wrapped, you know, year end wrap up kind of things in December.

00:21:30 ◼   ► And there's always this like this one or two week period in December that's just unbearable

00:21:36 ◼   ► for me because all of my emails and social network responses are all about like, hey,

00:21:42 ◼   ► when can we get this for Overcast?

00:21:44 ◼   ► And the answer before has been I don't have the data to do that.

00:21:48 ◼   ► And doing that would require collecting way more data than I want to and currently can

00:21:53 ◼   ► collect.

00:21:54 ◼   ► Well, this build that I just released collects that data.

00:21:58 ◼   ► I had to get it out before January 1st so that your data for 2023 will be complete.

00:22:03 ◼   ► But now I will have the data to say, all right, you listen to, you know, podcast number one,

00:22:08 ◼   ► two, three for six minutes today.

00:22:11 ◼   ► And then, you know, at the end of the year, I can show you, you know, pretty graphs or

00:22:14 ◼   ► whatever and hopefully in the meantime, hopefully you don't have to wait till the end of the

00:22:18 ◼   ► year.

00:22:19 ◼   ► Like hopefully in the meantime, I will build a feature that will actually display the ongoing

00:22:22 ◼   ► data or you can select, you know, certain time periods.

00:22:25 ◼   ► I have it down to granularity by day on the back end.

00:22:29 ◼   ► So we'll see, you know, and just, you know, it's like user four, five, six, listen to

00:22:33 ◼   ► podcast one, two, three for six minutes on this date.

00:22:35 ◼   ► It's that level of granularity.

00:22:38 ◼   ► So you know, that's hopefully small enough.

00:22:39 ◼   ► The servers won't totally collapse under all that.

00:22:42 ◼   ► They haven't yet.

00:22:43 ◼   ► So anyway, there's that.

00:22:46 ◼   ► And that's also using Blackbird by the way.

00:22:47 ◼   ► So Blackbird is now shipping in Overcast.

00:22:51 ◼   ► Nothing else in Overcast using Blackbird yet, but what you're telling me is it's production

00:22:55 ◼   ► ready.

00:22:56 ◼   ► That's what I'm hearing you say right there is Blackbird is now production ready.

00:23:00 ◼   ► Everyone should just go forth, use it in all their products.

00:23:03 ◼   ► It is out there in the wild.

00:23:04 ◼   ► Oh my God.

00:23:05 ◼   ► Yeah, please.

00:23:06 ◼   ► Not quite.

00:23:07 ◼   ► Please don't.

00:23:08 ◼   ► Don't do that.

00:23:09 ◼   ► That was sarcasm.

00:23:10 ◼   ► Just in case that was not clear.

00:23:11 ◼   ► That is 100% sarcasm.

00:23:12 ◼   ► Do not use it.

00:23:14 ◼   ► Marco is the wild man doing it himself and he should be the only one who does that.

00:23:17 ◼   ► Exactly.

00:23:18 ◼   ► Give me a little while to tame this wild beast.

00:23:21 ◼   ► But anyway, yeah, and it felt good to actually work on a feature and to actually do something

00:23:29 ◼   ► that's going to move the app forward even though there's nothing visibly there yet

00:23:32 ◼   ► to users.

00:23:33 ◼   ► Like I know I'm moving the app forward in a useful way that will hopefully soon result

00:23:38 ◼   ► in something that people actually want.

00:23:41 ◼   ► And so just doing that, just like you know what, screw it.

00:23:45 ◼   ► I'm just going to hit create table on MySQL that I already have, make a new table, start

00:23:49 ◼   ► collecting new data and just hope it continues to work with the systems I already have.

00:23:54 ◼   ► And I just did it and it worked and I was able to move on and ship something quickly

00:23:59 ◼   ► and I hope to do more of that.

00:24:01 ◼   ► There's so many features or changes or improvements that I want to make that I haven't really

00:24:08 ◼   ► been able to make for a year.

00:24:12 ◼   ► And I still want to do the whole redesign of the now playing screen.

00:24:15 ◼   ► I still want to rewrite the whole app in SwiftUI.

00:24:17 ◼   ► I still want to redo the whole bottom end of the app using Blackbird and Swift.

00:24:22 ◼   ► There's so much I want to do and I've done almost none of it for almost a year and that's

00:24:29 ◼   ► very frustrating.

00:24:30 ◼   ► So now to be able to get this big roadmap that I had about server stuff that was going

00:24:36 ◼   ► to result in pretty much no visible benefit to users to now say, "You know what, never

00:24:42 ◼   ► mind.

00:24:43 ◼   ► I'm not going to do that anymore."

00:24:44 ◼   ► That's actually very freeing and I think it's very good news for users and it's very good

00:24:51 ◼   ► news for me if I can keep the server stuff under control.

00:24:53 ◼   ► And I think if I'm careful enough and assuming that all of a sudden podcasts don't become

00:25:01 ◼   ► the next Twitter, which I don't think will happen, I think I'll be okay server-load-wise.

00:25:06 ◼   ► I'll be paying a little more for it but I'll be much more sane and I'll take that trade

00:25:11 ◼   ► off.

00:25:12 ◼   ► Yeah, and I think there is something, I mean, you and I have known each other a long time

00:25:18 ◼   ► and you are always happiest when you're building features in apps, like when you're properly

00:25:23 ◼   ► coding, when you're in Xcode making things.

00:25:26 ◼   ► That is 100% Marco's happy place.

00:25:28 ◼   ► It is my happy place too.

00:25:31 ◼   ► That's why we do what we do.

00:25:32 ◼   ► That's why we got into this industry.

00:25:33 ◼   ► That's why we are indies because we don't want to spend a lot of time in a boardroom,

00:25:39 ◼   ► go doing design reviews and working through stuff.

00:25:41 ◼   ► We want to be building stuff.

00:25:43 ◼   ► And I think any plan that increases the likelihood that your next six months are going to be

00:25:50 ◼   ► very much in Xcode making stuff, sign me up.

00:25:53 ◼   ► That sounds great.

00:25:54 ◼   ► And I think who knows what the future holds.

00:25:56 ◼   ► Hopefully your servers hold up.

00:25:58 ◼   ► Hopefully everything's fine.

00:26:00 ◼   ► But I think overall that's going to be a much better place to be.

00:26:03 ◼   ► That's going to be a place that is much more sort of, I don't know, like defensible.

00:26:07 ◼   ► That's a position that it's unlikely that it's going to be like, it may not be the optimal

00:26:13 ◼   ► path, but it is definitely going to be a good path.

00:26:15 ◼   ► I think is the reality.

00:26:16 ◼   ► And who knows what optimal even means, but like in five years, if you look back, maybe

00:26:19 ◼   ► you'll be like, Ooh, I wish I had done the thing, but like there's a very good chance

00:26:23 ◼   ► that isn't going to be the case.

00:26:24 ◼   ► And it's going to be much better off if you've built a bunch of stuff and the app has moved

00:26:27 ◼   ► forward and is modernized and as someone who's been going through that recently myself, like

00:26:32 ◼   ► I'm essentially rebuilding pedometer plus plus and Swift UI.

00:26:34 ◼   ► It is amazing how transformative it's been to my experience at work where I feel so much

00:26:42 ◼   ► more free and excited and able to make progress on this app that I feel like had been stuck

00:26:49 ◼   ► for so long in Objective-C and UIKit just because that's what it was.

00:26:53 ◼   ► And I didn't feel like I had the bandwidth to work on it.

00:26:56 ◼   ► And now that I have, it's like, it's amazing and I'm adding features and moving it forward

00:27:00 ◼   ► and the velocity and sort of both in terms of the app as well as like my personal, I

00:27:05 ◼   ► don't know, like development for a lot of velocity.

00:27:07 ◼   ► Like I feel like I'm running downhill rather than uphill which is just a lovely feeling.

00:27:13 ◼   ► And I hope that's, you know, this seems like a good point in the year to be able to just

00:27:16 ◼   ► make this decision, put it behind you, you know, for six months between now and W and

00:27:21 ◼   ► to be able to see, put your head down and just focus on making stuff.

00:27:25 ◼   ► And if in six months it turns out it wasn't a great idea, it's like, okay, well, you

00:27:28 ◼   ► can work on it then.

00:27:29 ◼   ► But between now and then you can really build some cool stuff and that sounds awesome.

00:27:33 ◼   ► Yeah, that's the thing.

00:27:34 ◼   ► Like that's a very good distinction because, you know, it's not that I, if I decide not

00:27:39 ◼   ► to do this now, it's not that I can never do it.

00:27:41 ◼   ► Like I can, if I decide in the future that I actually do want to go back and do CloudKit,

00:27:46 ◼   ► I can do that at any time.

00:27:48 ◼   ► Like it's not, there's no difference whether I do it now or in five years or never.

00:27:53 ◼   ► Like there's no, like it's not a plan that expires.

00:27:56 ◼   ► So if that proves to have been the right path, then someday I can pull that lever.

00:28:02 ◼   ► Well, you know, someday I can spend the year it'll take to pull that lever.

00:28:08 ◼   ► But you know, right now I'm just not going to do it.

00:28:10 ◼   ► And I currently have no plan to go that direction because, you know, what I've learned as you

00:28:14 ◼   ► said earlier is like, you know, this app by nature is going to have a bunch of servers

00:28:20 ◼   ► to run.

00:28:21 ◼   ► Like that's it.

00:28:22 ◼   ► If I'm crawling millions of podcast feeds every few minutes, that's going to take a

00:28:25 ◼   ► bunch of servers.

00:28:26 ◼   ► Like it's simple as that, you know, keeping track of everything, you know, and sending

00:28:30 ◼   ► updates to mobile clients, no matter what they're doing for user data, this is going

00:28:34 ◼   ► to be a server intensive task.

00:28:37 ◼   ► And you know, so if I want to get out of the business of running servers, I can't do it

00:28:43 ◼   ► with this app and I don't want to work on anything else.

00:28:46 ◼   ► So I'm going to be in the business of running servers no matter what.

00:28:49 ◼   ► So I might as well make a great app in the process.

00:28:52 ◼   ► Yeah, no, I think that makes a ton of sense.

00:28:54 ◼   ► And I think the biggest thing is probably just to draw a line on it and say, you know,

00:28:58 ◼   ► it's like, you know, sometimes in my to do list where I'll have an item that I want to

00:29:02 ◼   ► do and there's something powerful about just deferring it and being like, I'm not going

00:29:05 ◼   ► to, I'm not going to think about this for another, you know, for six months and it'll

00:29:09 ◼   ► come back to come back to you at an appropriate time.

00:29:11 ◼   ► But between now and then, put it behind you, don't think about it and just dive forward

00:29:15 ◼   ► into the new year with, you know, new creativity and hopefully, you know, energy and ideas.

00:29:20 ◼   ► Yeah.

00:29:21 ◼   ► Thanks everybody for listening and we'll talk to you in two weeks.

00:29:25 ◼   ► Bye.

00:29:25 ◼   ► [BLANK_AUDIO]