A New Foundation for Progress

Episode 596 • Released July 16, 2024 • Speakers detected

Episode 596 artwork
00:00:00 Casey: Yesterday, we went to my parents' house.
00:00:04 Casey: A very small part of the impetus for that trip was to try to diagnose and, or at the very least, collect my busted sonology.
00:00:13 Casey: If you recall from last episode...
00:00:15 Casey: I had had a, or they had had, I guess I should say, a power strike.
00:00:20 Casey: And apparently my synology that was sitting over there that a friend had given to me had died.
00:00:25 Casey: And I was very sad about it.
00:00:26 Casey: And so we get to my parents and, you know, the thing is dead.
00:00:30 Casey: It is very dead.
00:00:32 Casey: And I open it up.
00:00:33 Casey: Everything looks fine.
00:00:35 Casey: So I think, well, unlike...
00:00:37 Casey: The bigger synologies that I've used, or I am using, this doesn't take one of those IEEE or IA, whatever, whatever.
00:00:46 Casey: We had the same conversation, Marco, last time.
00:00:48 Casey: I forget the name of the little connector.
00:00:49 Casey: But in this case, it has an actual brick in it, I guess because the synology is physically fairly small.
00:00:56 Casey: And so the power supply is external.
00:00:58 Casey: And I didn't remember this because the last time I'd really put any eyes on the Synology was like a year or two ago when I gave it to my parents and said, please hook this up and never look at it again.
00:01:07 Casey: So I thought to myself, self, what if it's just the power supply?
00:01:13 Casey: And I ordered a new power supply, which arrived an hour or so ago.
00:01:16 Casey: And I'll give you one guess what's back in better than ever, baby.
00:01:20 Casey: Yeah.
00:01:20 John: so it turns out not that that was it just power supply yep that was it yeah it's always the power supply those stupid bricks i don't can't went back when i used to have external hard drives so they would all come with those things and i think every single one i had quote unquote go bad it was the power supply every single one
00:01:36 Casey: So I'm very happy.
00:01:37 Casey: Now, the funny thing about this is the 1813, the original 8-bay, is sitting at my parents, and I am backing up to it at 24 megabytes a second as we speak because the backup never did finish.
00:01:49 Casey: And so I have, what is this, like 7-ish terabytes of, I think, the 10 to 11 that is the backup data set.
00:01:57 Casey: So it'll finish at some point.
00:01:59 Casey: But I want to try to update the backup on the...
00:02:04 Casey: one that I thought was fried.
00:02:06 Casey: And apparently the main Synology is refusing to do any backing up or multiple backups concurrently, which I kind of get to be honest with you.
00:02:14 Casey: But hopefully that means knocking on my, you know, relay block of wood.
00:02:19 Casey: Hopefully that means that everything is right as rain once again.
00:02:22 Casey: And that means my eight bay will either live at my parents forever, or maybe I'll bring that back to return to service doing its important job as my footrest.
00:02:33 Marco: We will see.
00:02:34 Marco: They do make good footrests, especially when they're full of hard drives.
00:02:37 Marco: They're pretty heavy, and it's a pretty good size.
00:02:39 Marco: It's like a big UPS.
00:02:43 Marco: The main role of UPSs for me is footrests.
00:02:45 Marco: They also may be backup power, but they're also really... UPSs and subwoofers, the best footrests.
00:02:53 Casey: Kuriko writes with regard to S tier, and Kuriko writes, some Japanese rhythm games don't think that one S is enough.
00:03:00 Casey: For Chunatham, by Sega, for example, Chunatham, I think that's right.
00:03:05 Casey: By Sega, for example, 97.5 and above is S, and 100% and above is double S, for 100.75% to 101% is triple S. I'm not entirely clear how we stop at like 101, 102%, but I'll go on faith on this one.
00:03:22 John: Yeah, I think we have to check the math on that.
00:03:24 John: Right.
00:03:24 John: Some people like to give 110%, as you know.
00:03:27 Casey: Yeah, yeah.
00:03:28 John: It's S inflation is what it is.
00:03:31 Casey: Right.
00:03:31 Casey: Something like that.
00:03:33 Casey: All right.
00:03:33 Casey: David Lynch writes, with regard to apples of the earth, David writes, the modern day word apple is used.
00:03:41 Casey: I've got to reboot it.
00:03:42 Casey: I threw an is in there.
00:03:44 Casey: What do you mean by the word is?
00:03:45 Casey: Is?
00:03:45 Casey: Yes, is.
00:03:46 John: um anyway was that a was that a bill clinton joke just i just got there that was a bill clinton joke thank you marco gets a reference mark write it down everyone in your diaries well you get you get three quarters credit because it's actually a lewis black joke talking about the events with bill clinton so you get three quarters well you can do a lewis black impression i mean you just did the bill clinton quote thing
00:04:08 Casey: even in my most angry days and there are some very angry days i don't think i can be near as angry as lewis black who i love for the record and i saw him at virginia tech when i was a student there and you know he did the standard grumpy old man thing and at that point he was quite a bit younger than he is now um but i went up to the stage after the show and he was shaking hands and he was the nicest gentlest man in the whole wide world he was so adorable i love that guy anyway
00:04:31 Casey: David Lynch writes, with regard to apples of the earth, the modern day word apple used to be a generic term for any sort of fruit.
00:04:39 Casey: This happened after the time period in which potatoes were brought to Europe.
00:04:42 Casey: So it's reasonable to read palm de terre as just fruit of the earth rather than specifically apple in the earth.
00:04:49 Casey: Today I learned.
00:04:50 Casey: Also, French is weird, but that's okay.
00:04:51 Marco: I mean, yeah, we knew that.
00:04:53 Casey: With that part, I knew.
00:04:54 Casey: Volene has some things to write with regard to HP iPods.
00:04:59 Casey: This was, I guess, the first one we saw.
00:05:01 Casey: I was a Mac genius in the HP iPod era when Carly Fiorina, who was what, CEO of HP, introduced the HP iPod.
00:05:07 Casey: She said that it would come in, quote, HP blue, quote.
00:05:10 Casey: But in fact, it only ever came in white.
00:05:13 Casey: See, it can just happen to you, Marco.
00:05:15 Casey: It can just happen.
00:05:16 Casey: The only way to tell if a fourth generation iPod was an HP and not Apple vended was HP was inscribed in the back.
00:05:24 Casey: There were also HP iPod minis, which only ever came in silver.
00:05:27 Casey: The internet tells me there were HP also sold as co-branded iPod shuffles, but I don't remember ever seeing one, though.
00:05:35 Casey: People would bring HP iPods to the Genius Bar, but we did not service them as HP had agreed to take on the responsibility for that.
00:05:40 Casey: This seemed to confuse a lot of people.
00:05:44 John: That's another reason not to buy an HP iPod.
00:05:46 John: You can't bring it to the Apple store.
00:05:47 John: They're like, no, sorry.
00:05:48 John: We take no responsibility for this abomination.
00:05:52 Casey: All right.
00:05:53 Casey: And then David Schaub writes with regard to – well, when did we bring this up?
00:05:58 Casey: The last episode.
00:06:00 Casey: It was the last episode.
00:06:01 Casey: Sorry.
00:06:01 Casey: We're in summertime, y'all, and my clock is all over the place.
00:06:05 Marco: It was so long ago, Casey.
00:06:06 Marco: It was almost three days ago.
00:06:08 Marco: You can always tell it's summer when Casey breaks out the y'all.
00:06:10 Casey: That's when you know.
00:06:13 Casey: No, it's hanging loose over here, getting groovy if I'm in California all of a sudden.
00:06:17 Casey: Anyways, so David Schaub writes, regarding the iMac clone case, you just got to power forward.
00:06:22 Casey: Regarding the iMac clone case, I think you're talking about the eMachines E1.
00:06:26 Casey: And in August of 1999, Apple sued eMachines, alleging that the computer's design infringed upon the protected trade dress of the iMac.
00:06:32 Casey: In March 2000, eMachines reached a settlement with Apple, under which it agreed to discontinue the infringing model.
00:06:39 Casey: Then moving right along, Yuri Malodstov writes, with regard to EU regulations and profits,
00:07:00 John: And by the way, I brought up this example the previous episode, but I didn't actually include all the details I thought it was worth going into here rather than me just vaguely alluding to it because I couldn't find a link.
00:07:09 Casey: Thank you for the clarification.
00:07:10 Casey: I appreciate it.
00:07:11 Casey: Visa and MasterCard are practically a duopoly globally.
00:07:14 Casey: Both are simple utility providers yet enjoy enormous profit margins because of what they're able to charge.
00:07:19 Casey: The EU thought it was impractical and in 2015 adopted Regulation EU 2015-751, which limited interchange fees for card-based payment to 0.2% of the transaction's value for debit cards and 0.3% for credit transactions.
00:07:34 Casey: Effectively, the EU told Visa and MasterCard, quote, look, you guys have won.
00:07:38 Casey: You can enjoy a profitable business with an extreme moat, but we want to limit the negative externalities.
00:07:43 Casey: And it worked.
00:07:44 Casey: Stores started accepting card payments for one euro purchases.
00:07:48 Casey: And yes, European cards don't have cash back like the American ones, but cash back is a wealth transfer from poor to rich.
00:07:54 Casey: So I can only endorse this approach that minimizes the prices themselves.
00:07:58 Casey: In a way, the EU could have just said app store fees should be limited to 5%.
00:08:01 Casey: They know how to require things directly.
00:08:04 Casey: The fact that they didn't but created a lot of risks with DMA's interoperability requirements is a problem.
00:08:09 Casey: Gary Havens writes, here in Indiana, and especially in my field, which is radio broadcasting, not only have non-competes been used to keep employees from leaving for a better job at a competitor, they've also been enforced even when the employer fires a worker.
00:08:22 Casey: So not only can a company fire you for any reason, but they can keep you out of your field until the term expires.
00:08:27 Casey: That is messed up.
00:08:29 John: And the one thing at one point I meant to make last episode and didn't about non-competes is
00:08:34 John: It's one of the rare cases where I don't think anyone has ever argued about this, but like where if someone argues to you that non-compete should be allowed, it's in the name.
00:08:45 John: Non-compete.
00:08:46 John: Like we want to allow competition.
00:08:47 John: Well, non-competes don't stop.
00:08:49 John: All right.
00:08:50 John: Okay, fine.
00:08:51 John: So they do stop competition, but they do it in a way that's okay.
00:08:53 John: it's allowed right it's totally like they this is a poor choice of naming it should have been named something by one of those like evil republican naming people to name it like the death tax or something to try to make it sound out of feeling but they're literally called non-compete so if you want to preserve competition in the market don't allow a thing called non-competes
00:09:11 Marco: We are brought to you this week by 1Password Extended Access Management.
00:09:15 Marco: Imagine your company's security like the quad of a college campus.
00:09:19 Marco: There's nice brick paths between the buildings.
00:09:22 Marco: Those are like the company-owned devices, IT-approved apps, and managed employee identities.
00:09:27 Marco: And then there are the paths that people actually use, those shortcuts through the grass.
00:09:32 Marco: Those represent unmanaged devices, shadow IT apps, and non-employee identities like contractors.
00:09:39 Marco: Most security tools only work on those happy brick paths, but a lot of security problems take place on those shortcuts.
00:09:47 Marco: 1Password Extended Access Management is the first security solution that brings all these unmanaged devices, apps, and identities under your control.
00:09:55 Marco: It ensures that every user credential is strong and protected, every device is known and healthy, and every app is visible.
00:10:03 Marco: 1Password Extended Access Management solves the problems that traditional IAM and MDM can't touch.
00:10:09 Marco: It's security for the way we work today.
00:10:11 Marco: And it's available now to companies with Okta and coming later this year to Google Workspace and Microsoft Entra.
00:10:17 Marco: Check it out at 1Password.com slash XAM.
00:10:21 Marco: That's 1Password.com slash XAM.
00:10:25 Marco: Thank you so much to 1Password Extended Access Management for sponsoring our show.
00:10:33 Casey: Yeah.
00:10:33 Casey: Yeah.
00:10:34 Casey: Yeah.
00:10:57 Casey: I basically agree with everything you said.
00:10:59 Casey: I want Taiwan to implement better labor laws, gender equality, and wealth equity.
00:11:03 Casey: But I also want to offer some context on the Taiwanese work ethic, which I felt was missing in your conversation.
00:11:09 Casey: Taiwan's work ethic is unique even among Asian standards, and it's related to the second half of your TSMC conversation.
00:11:15 Casey: It's hard to talk about Taiwan without mentioning geopolitics because it affects every aspect of our lives.
00:11:20 Casey: I'm coming from a pro-status quo perspective, which is the predominant geopolitical perspective in Taiwan.
00:11:26 Casey: It means we don't provoke war, but we believe in the right to defend ourselves if attacked.
00:11:30 Casey: What does geopolitics have to do with work ethic?
00:11:32 Casey: The answer is TSMC, but here's the context.
00:11:34 Casey: To be Taiwanese is to live with an existential threat for every aspect of your life.
00:11:40 Casey: This existential threat comes from the mainland China's current practices and future threats to diminish us.
00:11:46 Casey: China's been very successful in diminishing us.
00:11:47 Casey: They outpower us in population, size, economy, and military.
00:11:50 Casey: How does that oppression affect the national mood?
00:11:53 Casey: There were traditionally two popular perspectives.
00:11:55 Casey: The pro-China view is that China only allowed us to exist due to its graciousness.
00:11:58 Casey: The pro-US view is that China hasn't attacked us because the US will save us.
00:12:03 Casey: Ironically, both perspectives are self-diminutive.
00:12:06 Casey: But then TSMC changed everything.
00:12:09 Casey: Now there's a third perspective, one that is neither pro-China nor pro-US, but rather pro-Taiwanese.
00:12:15 Casey: TSMC becomes so integral to this third perspective that it even has a name, Hugo Shenshan.
00:12:21 Casey: It's roughly translated as war deterrence by economics.
00:12:24 Casey: The idea behind this is solidified by the 2020 chip supply chain crisis.
00:12:27 Casey: A war with Taiwan would cause a global economic crisis at such an unparalleled scale that Taiwan has made itself indispensable to American interests.
00:12:34 Casey: War with Taiwan would be too costly for any party.
00:12:37 Casey: So how does TSMC's success translate to Taiwanese work ethic?
00:12:39 Casey: TSMC's success is viewed as Taiwanese self-actualization.
00:12:43 Casey: Hugo Shenshan is part of a general narrative.
00:12:46 Casey: If you work hard, then you save your freedom and democracy.
00:12:50 Casey: Mind you, this is just a narrative you'll find in the media and family gatherings.
00:12:53 Casey: In reality, I know people who hate their jobs in media tech and other tech companies.
00:12:56 Casey: But the narrative persists and is a pervasive part of work culture.
00:13:00 Casey: My cousin who works at TSMC is viewed in the family as a national hero.
00:13:03 Casey: Where else can you replicate a work culture so motivated by an existential threat?
00:13:06 Casey: There's no equitable stakes in America.
00:13:09 Casey: So when TSMC announced their factory in Arizona, Taiwanese people knew it wasn't going to work out.
00:13:14 John: That was with this thing right up to the last bit where it's inevitable that it wasn't going to work out.
00:13:19 John: I think, you know, it's possible for it to work out, right?
00:13:21 John: Just everyone has to sort of, you know, find a way to overcome their preconceptions about the working world, both the Americans and the Taiwanese, because they're entering into a joint venture.
00:13:33 John: And the whole idea of using like a...
00:13:36 John: threat to your nation, a military threat to your nation is, is what's required to motivate your workers to do good work.
00:13:41 John: I mean, that's obviously not true.
00:13:42 John: Plenty of companies in the United States that where there is no imminent, uh, uh, military threat to, uh, our, uh, landmass, uh, also still somehow managed to do good work.
00:13:53 John: And by the same token, as I think Ryan points out, like the idea that, um, by working hard for TSMC, you're like, you're being patriotic and, uh, preserving your country is, uh,
00:14:05 John: you know surely uh earnestly felt and also partly true for the reasons outlined in this thing but it's also a tool that your bosses can use to make you work even harder right like in america we just pretend that the companies are families and that's how they get us to work harder because we value families and but if you value like national pride and unity your employer will also use that to try to make you sacrifice your health and life to uh work so
00:14:28 John: Yeah, it doesn't matter where you go in the world.
00:14:31 John: Bosses are always trying to get the workers to work harder and longer, often to the detriment of the company.
00:14:37 John: And I would suggest that bosses should try something different.
00:14:40 John: But it's, you know, that's the thing that unifies us all.
00:14:44 John: People will get away with what they can get away with.
00:14:47 John: Indeed.
00:14:48 Casey: All right.
00:14:49 Casey: So we are recording because of crazy summer schedules on 7-Eleven.
00:14:52 Casey: I didn't get my Slurpee today, my free Slurpee.
00:14:54 Casey: That's too bad.
00:14:54 Casey: But we are recording on 7-Eleven.
00:14:56 Casey: Is that a thing?
00:14:57 Casey: It is a thing.
00:14:58 Casey: All right.
00:14:59 Casey: So we're recording this on the 11th of July.
00:15:01 Casey: And coming up very soon is a, well, it's one of my favorite things, John Syracuse.
00:15:06 Casey: It's an anniversary.
00:15:08 Casey: And it's Overcast's 10th anniversary.
00:15:11 Casey: And so in light of that, Marco, you've been a little busy recently?
00:15:16 Marco: A little bit.
00:15:19 Marco: Oh boy.
00:15:20 Marco: So what's going on, bud?
00:15:21 Marco: So we are going to release this episode on July 16th.
00:15:25 Marco: And the reason we're releasing it on July 16th is because, well, it's pretty close anyway to when we would have otherwise released it.
00:15:30 Marco: It's probably the same day, actually.
00:15:32 Marco: But coincidentally, also July 16th is indeed Overcast's 10-year anniversary.
00:15:38 Marco: This is, first of all, the longest job I've ever had besides ATP itself.
00:15:42 Marco: This is the longest project I've ever worked on that was not a podcast.
00:15:46 Marco: As part of this 10-year anniversary, I've discussed briefly here and there, I've been working on the big Overcast rewrite.
00:15:54 Marco: Earlier this year, I was always thinking, man, wouldn't it be great if I could launch it on the 10-year anniversary?
00:15:59 Marco: That was my stretch goal.
00:16:01 Marco: It seemed aggressive.
00:16:03 Marco: But I made it.
00:16:05 Marco: It's not 100% complete, if I'm honest, but it is here enough in the way the software is never really complete.
00:16:14 John: This should give you some sympathy.
00:16:15 John: We're always talking about Apple doing the annual releases and like.
00:16:18 John: you don't have to release every year.
00:16:19 John: You can just release when it's done or whatever, but you see the temptation.
00:16:22 John: Now you've lived with the temptation to like, you know, as I've always said, it's possible to hit any date you want as long as you are willing to constrain other parts of the thing.
00:16:31 John: And that's essentially what you force yourself to do.
00:16:34 John: For whatever reason, obviously this is the luxury of having a single person company.
00:16:37 John: You can do whatever the hell you want and you wanted to hit 10 year.
00:16:40 John: And what did you have to do to hit that date?
00:16:42 John: You got to sacrifice stuff.
00:16:43 John: And so that's what you did.
00:16:44 John: You know, that's,
00:16:45 John: It can be done well or poorly, and you'll go on to tell us whether you think you did it well or poorly.
00:16:49 John: But that's always been my argument with the annual releases that Apple does.
00:16:52 John: It's like, I don't think we need them, but you should be able to make them and not have those annual releases be disastrous.
00:16:59 John: And to Apple's credit, I think they've done better in recent years with that, mostly by doing what they're doing, for example, with Apple Intelligence this year and what they do with features every year, which is like, oh, we'll announce them.
00:17:10 John: But they're not going to ship with the .0 because they're not done yet.
00:17:12 John: And we'll ship them when we're done.
00:17:13 John: But in the meantime, we'll ship what we have.
00:17:15 John: So yeah, you're going to ship what you have.
00:17:18 Marco: Thanks.
00:17:21 Marco: So yeah, that's pretty much right.
00:17:24 Marco: So here's what this is.
00:17:26 Marco: This is an almost complete rewrite of the Overcast iOS app.
00:17:33 Marco: Let me tell you first what it's not.
00:17:35 Marco: This is not a rewrite of the watch app.
00:17:39 Marco: This is not a rewrite of the audio engine.
00:17:42 Marco: And this is not honestly a major change in the general features available in the app.
00:17:48 Marco: Like for the most part, I'll get to a few exceptions, but for the most part, most of the features that I had before and the general way the app works, like in terms of like, you know, concept in the app, like how playlists and podcasts work and everything.
00:18:01 Marco: Most of that is the same.
00:18:04 Marco: Uh,
00:18:04 Marco: Chances are, if you are an Overcast user, you will probably only notice a few things.
00:18:11 Marco: Number one, you'll notice everything looks different a little bit because it's just like a modern take on the Overcast design.
00:18:16 Marco: The playback screen has the most changes, mainly because I have gotten rid of those horizontal swipe cards for the info and chapters.
00:18:23 Marco: And now the info is now a little kind of built-in mode on the main screen that you can tap the artwork or the little eye button to get to.
00:18:30 Marco: And the chapters are now a full slide up sheet because that way I can make room for things like long chapter titles.
00:18:37 Marco: So they actually fit instead of in the little tiny card.
00:18:41 Marco: And in the future, I want to add things like chapter preselection, which is a commonly requested feature from Castro.
00:18:47 Marco: So basically the now playing screen was designed, was redesigned pretty substantially.
00:18:51 Marco: The rest of the app really is going to look pretty familiar to you.
00:18:56 Marco: It's really just like an evolution of the original designs, not like a total revolutionary or massively changed thing.
00:19:03 Marco: And just getting back to the now playing screen for a second.
00:19:05 Marco: Because I think the now playing screen is going to be where people will feel the most difference and where I will get probably the most feedback saying, why'd you change anything?
00:19:14 Marco: Because, of course, you need to change anything.
00:19:16 Marco: People react poorly.
00:19:18 Marco: And the main goal, my major design goal with this redesign and rewrite, and I'll get to the tech stuff in a second, but my major design goal here was, first of all, just make it modern.
00:19:32 Marco: But also consider like I wanted to push controls as much as possible down the screen.
00:19:40 Marco: So I want the most frequently accessed things to be accessible when you're holding the phone in one hand and you just want to hit something with your thumb.
00:19:47 Marco: So that means low down on the screen, like, you know, the halfway point or below maybe, or at least like, you know, the third of the way down or below.
00:19:54 Marco: So a lot of the design is taking common actions and bringing them down lower on the screen.
00:20:01 Marco: Also, I wanted to simplify the playback screen.
00:20:05 Marco: So the now outgoing app, the playback screen has those five icons along the bottom.
00:20:12 Marco: You know, one, the airplane in the middle, and then you have like the star and the, you know, control, like the audio controls and the sleep timer.
00:20:20 Marco: You have all the stuff across the bottom and the info.
00:20:22 Marco: And the main reason why those were there was I tried to have these swiping cards in the middle.
00:20:26 Marco: and most people just never found the cards.
00:20:30 Marco: And so I had to add icons to the bottom to show people, oh, here's how you get to the info and the controls.
00:20:37 Marco: This had a number of problems.
00:20:38 Marco: Number one, it's kind of redundant, kind of cluttering.
00:20:42 Marco: But number two, I had done all this work to make those swiping cards in the middle, but the design required that they be square and that they have fairly wide margins so they would fit within that round rect that was the center thing.
00:20:56 Marco: And that doesn't really work that well for any kind of longer content.
00:21:01 Marco: So a chapter list, for instance, which is that's where the chapter was before chapter list.
00:21:05 Marco: You'd only be able to see a couple chapters at a time.
00:21:08 Marco: And I couldn't have the chapter titles wrapped to two lines, which they often are long enough.
00:21:12 Marco: They should probably do.
00:21:13 Marco: I couldn't fit things like checkboxes in there if I wanted to have pre-selection.
00:21:17 Marco: And so I was kind of bound in.
00:21:19 Marco: I had myself in a round rec corner, I guess.
00:21:22 Marco: I designed myself into a round rec corner.
00:21:23 Marco: There we go.
00:21:24 Marco: And then the info, like the show notes info pane also.
00:21:28 Marco: you were stuck looking at it in this little tiny square window.
00:21:32 Marco: That's also not a great experience.
00:21:34 Marco: If you have something with long show notes or a lot of links, it was just hard to browse that.
00:21:39 Marco: And again, it was hard for me to evolve that design, keeping those horizontal swipe cards in a way that would easily accommodate expanding content in the middle or different modes like that.
00:21:51 Marco: So with the new rewrite and the redesign,
00:21:54 Marco: i have made it so that now the info pane actually does rearrange that screen when you tap the info it actually drops down the playback controls by a decent amount uh basically as long as they can and still maintain their spacing and so it kind of expands the center area to be a tall version of itself to fit as much of the show notes and links in there as possible by the way that transition was really hard
00:22:18 Marco: But because it keeps the header and it's everything in there is all SwiftUI except the WebView content because WebViews aren't yet available in SwiftUI.
00:22:29 Marco: So integrating that in a way that preserved everything around it was quite the experience.
00:22:34 Marco: But anyway, the design of an outplaying screen is now evolved such that the center cards are no longer where everything has to go.
00:22:42 Marco: And as a result, we have room to do things like larger chapter lists, bigger show notes areas, and the audio controls also.
00:22:50 Marco: You know, the audio controls in the outgoing one, they were also stuck in that square.
00:22:54 Marco: And they did fit, but...
00:22:57 Marco: It was hard to add anything to it because if I added much to it, it wouldn't fit anymore.
00:23:02 Marco: And I've had all these requests for things like a mono down mix or other kind of audio features that would just be difficult to add to that UI.
00:23:12 Marco: So now audio controls, they're just a sheet that comes up from the bottom.
00:23:16 Marco: Like chapters, but it's not full screen because it doesn't need to be.
00:23:18 Marco: But just a sheet coming up from the bottom, like so much in iOS.
00:23:21 Marco: Because keep in mind also, that design is pretty old now.
00:23:25 Marco: The outgoing design has been there for something like five years, I think.
00:23:28 Marco: It's a pretty old design, and a lot about the way we interact with iOS has changed.
00:23:34 Marco: A lot of iOS stuff has now also moved down to the bottom half of the screen.
00:23:37 Marco: A lot of iOS stuff is now using little slide-up sheets and things like that.
00:23:42 Marco: And so...
00:23:42 Marco: The app, I think, really needed to reflect the way people expect apps to feel and work and look today.
00:23:49 Marco: So even though it is a change in muscle memory, and I fully appreciate this is going to prompt some disruption and some negative feedback.
00:24:00 Marco: Give it a minute.
00:24:01 Marco: Try to get used to it for like a few days before you yell at me too much, please.
00:24:04 Marco: And I'm happy to hear feedback, but just give it a few days.
00:24:08 Marco: Like give it a few days first and see how you like it.
00:24:10 Marco: I am honestly very nervous about this.
00:24:12 Marco: This is the biggest change I've done in a pretty long time.
00:24:16 Marco: And I know it's going to prompt a lot of negative feedback.
00:24:19 Marco: And if things are actually worse, I'm willing to change my mind.
00:24:22 Marco: But give it a sec.
00:24:23 Marco: Because I've personally been using this for myself for something like six months.
00:24:28 Marco: And I love it this way.
00:24:29 Marco: I think it feels way better.
00:24:30 Marco: It's way faster.
00:24:32 Marco: It's way more responsive.
00:24:33 Marco: A lot more things can just be dismissed now with a downward swipe.
00:24:36 Marco: A lot more things come up as an upward swipe.
00:24:38 Marco: It's a lot simpler and easier now.
00:24:41 Marco: And it is...
00:24:42 John: really really fast so that brings me to the tech part but before i get there do you guys have any nitpicks about my design you'd like to air on the show so the like the now playing screen with the you know being a sheet that you swipe to go down i remember you uh mentioned the making the being inspired by the like the now playing thing on the apple's music app on ios right correct um i think i'm launching music app to check when on on the music app
00:25:09 John: For its now playing thing that comes up from the bottom or whatever in a swipe down, it goes all the way to the top.
00:25:14 John: It leaves the little horizontal line grab handle as a hint that, hey, you can get rid of this by swiping.
00:25:20 John: But when you did an overcast, you left a little bit of space so you can kind of see, hey, behind here is the UI that you were seeing before.
00:25:28 John: Did you think about going all the way to the top?
00:25:30 John: Did you think that would be too confusing?
00:25:31 John: Did you think it's something only Apple can get away with?
00:25:33 John: Oh, John.
00:25:34 Marco: Can you tell John hasn't made a SwiftUI iOS app?
00:25:37 Marco: Yep, yep.
00:25:38 Casey: This is the thing with SwiftUI.
00:25:41 Casey: I genuinely do like SwiftUI.
00:25:43 Casey: And for me, I don't think CallSheet would look near as good if it wasn't for SwiftUI.
00:25:49 Casey: Because some of the things that are very easy in SwiftUI are very, very difficult in the UI kit.
00:25:53 Casey: And maybe that's my own failings.
00:25:54 Casey: I don't know.
00:25:55 Casey: But...
00:25:56 Casey: This is a really good case study in SwiftUI, because to get a sheet that comes up from the bottom of the screen, especially a few years ago, maybe it's different now in UIKit, but a few years ago, that was a real pain in the hindquarters in UIKit.
00:26:07 Casey: It was fraught with errors.
00:26:09 Casey: You're re-implementing half the damn world in order to do it, and it's just a pain.
00:26:13 Casey: It's just not fun work, because you just want a sheet that comes up from the bottom.
00:26:16 Casey: This is not fun to do something that you know Apple's doing all over the place.
00:26:20 Casey: You know they could have an API for it, but at least at the time I was looking, they didn't.
00:26:24 Casey: With SwiftUI, you can just do .sheet, and then you provide something.
00:26:29 Casey: I forget.
00:26:29 Casey: It's been a minute since I've done any of these.
00:26:30 Casey: But, you know, you provide whatever you need to provide.
00:26:32 Casey: And then it just happens magically.
00:26:34 Casey: It's cake.
00:26:34 Casey: It's easy.
00:26:35 Casey: It's just chef's kiss.
00:26:36 Casey: It's great.
00:26:37 Casey: Until you want to customize it, and then everything falls down.
00:26:39 Marco: This is generally the pattern with lots of SwiftUI.
00:26:43 Marco: It isn't that it's not customizable.
00:26:45 Marco: It's that if it doesn't provide a way to customize it, you're totally out of luck.
00:26:50 Marco: Whereas sometimes with UIKit, you could kind of hack your way in and do some craziness.
00:26:54 Marco: But for the most part with SwiftUI, if there's not a hook for it, you are just out of luck.
00:26:59 Marco: Unless you want to then wrap the UIKit version, which is a whole level of complexity.
00:27:03 Marco: So my goal here with SwiftUI and things like fine UI details like that or behavioral details...
00:27:15 Marco: My goal here or my thinking here is for years I have tried to maintain a code base of UIKit code that has a lot of those like complex polished interactions.
00:27:28 Marco: So an example is in the outgoing app when you bring up the mini player to bring up the now playing screen or you swipe the now playing screen back down to dismiss it.
00:27:38 Marco: it transitions some of the controls from the big screen down into the mini player.
00:27:42 Marco: It animates them down into their small size.
00:27:46 Marco: To do that is such a massive pain in the butt, and it is so complex.
00:27:54 Marco: And just having that alone, what that basically means is the small version of the player is the now playing screen.
00:28:02 Marco: It is just a small size of it.
00:28:04 Marco: And so what that does to the design and implementation of the now playing screen is it makes it really complicated and it makes it really hard to ever change or add to or tweak.
00:28:14 Marco: And that's part of the problem I had with the old code base was...
00:28:18 Marco: In order to mess with the now playing screen, I would have to deal with all of this complexity around it, like this massive wall of UIKit code to try to make that transition, then make it interactive and things like that.
00:28:29 Marco: It was a huge amount of complexity.
00:28:31 Marco: My goal with SwiftUI with this rewrite was...
00:28:34 Marco: I want to try to do a good job, the best job I can, with pure SwiftUI and not drop down to UIKit for anything that I don't need it for.
00:28:45 Marco: The web view is the only thing I'm using it for because, again, those aren't available in SwiftUI.
00:28:49 Marco: Other than that, there's no UIKit in this app.
00:28:52 Marco: I wanted the code to be simpler.
00:28:55 Marco: The whole benefit of SwiftUI, I think, is that...
00:28:59 Marco: as long as you are willing to take the 90% solution, and if you can give up that last 10% of customization that you used to have, it's way better, it's way simpler, it's way more reliable, there are way fewer bugs possible, and it is just a much nicer place to be development-wise.
00:29:15 Marco: And what that enables me to do is I can have far less code and far less complexity and far fewer bugs to do simple things in my app, like show and hide and outplaying screen.
00:29:26 Marco: which frees me up to do other stuff that's better.
00:29:30 Marco: My pattern that I have found while developing this app in SwiftUI is I'm able to iterate really quickly in a single afternoon.
00:29:40 Marco: I can go through different versions of a screen and play with different designs that are radically different from each other, but with SwiftUI you can do that very quickly.
00:29:48 Marco: You can really prototype.
00:29:50 Marco: I've never been one of those design tool users to make mock-ups.
00:29:54 Marco: I just build it.
00:29:55 Marco: The problem is if building it is complicated and time consuming, then the very first thing you build, you're probably going to want to stick with.
00:30:03 Marco: The problem I've had over time using UIKit and Objective-C is that even though they were great for the times I made a lot of this stuff, like literally almost 10 years ago for a lot of it or over 10 years ago for some of it.
00:30:13 Marco: Whatever I came up with first, I would stick with because it was so complicated.
00:30:16 Marco: It would be ludicrous to imagine, like, should I try five different designs for the screen?
00:30:21 Marco: Because that would take like five weeks or something.
00:30:24 Marco: Whereas with SwiftUI, it's so fast to iterate and to experiment with the design and to move things around and try different things and reuse different components in different ways.
00:30:35 Marco: It's so fast and easy once you get like your foundational knowledge developed for it and all your kind of supporting systems in the app.
00:30:42 Marco: I was able to iterate so quickly and move stuff around and try different designs.
00:30:48 Marco: And the result was I tried more things and I found better solutions.
00:30:53 Marco: So the design, I think, has greatly benefited in part because I have been able to try more experiments with the design.
00:31:01 Marco: And a lot of times the third or fourth version of what I would make would be the best version as opposed to the first or second.
00:31:07 Marco: So what I'm trying to do with this app and what I've largely succeeded in doing
00:31:12 Marco: is keep the UI code fairly simple.
00:31:16 Marco: Hide the complexity, if need be, in utility classes or modifiers that I can apply to anything.
00:31:23 Marco: Try to not have too much custom stuff on every single screen.
00:31:27 Marco: That allows me to keep the code light and to keep it nimble and be able to move it around, be able to try different things.
00:31:33 Marco: And ultimately, that's also needed now because 10 years ago, when this launched,
00:31:40 Marco: The kind of like surface area, the problem scope of make a podcast app for the iPhone was much smaller than it is now.
00:31:50 Marco: Now you look at like what are apps expected to have now that they weren't expected to have in 2014?
00:31:56 Marco: Well, you have obviously an Apple Watch app.
00:31:59 Marco: By the way, my Apple Watch app is totally unchanged.
00:32:02 Marco: I'm going to bring the rewrite to it.
00:32:04 Marco: I have not had time to do that yet.
00:32:06 Marco: So the Watch app that is going out with this update is the exact same.
00:32:10 Marco: It works the exact same way.
00:32:11 Marco: Nothing has changed.
00:32:13 Marco: I'll get to that.
00:32:14 Marco: Anyway, with putting this out there, like, I really wanted to make sure that I could address the breadth of what I'm supposed to be doing now as a podcast app author.
00:32:23 Marco: So again, you think about like, you need a watch app, of course, you need widgets, you need integration with Siri and shortcuts and shortly Apple intelligence, which is kind of built into that system, but it's just more of that.
00:32:35 Marco: You need your iOS app to also run on iPad and have an iPad layout.
00:32:39 Marco: You need the iPad app that is built from your iOS code base to also run on Mac OS and maybe even Vision OS.
00:32:46 Marco: And so you have this huge, broad thing.
00:32:48 Marco: You need – there's always more kinds of widgets, so you have to now build in –
00:32:52 Marco: The control center widget, you're going to need some kind of live activity maybe on the Apple Watch and maybe on the iPhone.
00:32:58 Marco: There's so much surface area that apps are expected to cover now, especially if they're used by power users, like people who tend to use third-party podcast apps on the iPhone.
00:33:08 Marco: So it's hard for one developer to keep up with all of that.
00:33:13 Marco: So for me, part of this rewrite was try to reduce the amount of time and complexity that I have to spend fiddling with really complicated UIKit code to achieve some effect.
00:33:27 Marco: If I can just get 90% of the way there of my ideal design with 5% of the code and just do it in pure SwiftUI, that's what I picked every single time.
00:33:38 Marco: The result is so much better.
00:33:40 John: So you're saying the sheet couldn't go to the top?
00:33:43 John: Oh, yeah.
00:33:44 Casey: SwiftUI.
00:33:45 Casey: Back to the question.
00:33:48 Casey: I sent you on a little bit of a quest.
00:33:49 Casey: That's my fault.
00:33:50 Marco: Sorry for the side quest.
00:33:51 Marco: All right.
00:33:51 Marco: So that's the question.
00:33:52 Marco: So the answer is you can have a SwiftUI sheet that goes all the way to the top.
00:33:58 Marco: And I tried that first because I would have preferred that.
00:34:01 Marco: The problem is, if you have interactive dismissal, when you pull that sheet down, the size of it jumps.
00:34:11 Marco: Because when the sheet gets near the top, it snaps to the top to skip the entire top safe area.
00:34:18 Marco: The top status bar area.
00:34:19 Marco: It snaps up to the top when it gets near the top.
00:34:21 Marco: And then you pull it down and it snaps back down to be below the safe area.
00:34:25 Marco: and there are ways around this but they are super hacky and super awful and i've tried all of them and they all had negative effects and when it's full screen it stops rendering the content below it so in an interactive dismissal scenario the sheet below it wouldn't show until you were done with the gesture so if you pulled it down
00:34:47 Marco: And like and like and didn't go all the way behind it would just be blackness.
00:34:51 Marco: So it's not usable really for that state unless you really modify it heavily.
00:34:57 Marco: And generally you'd have to drop down to UI kit and kind of maybe even restructure the entire presentation stack as UI kit.
00:35:06 Marco: And that's just I was not willing to do that many hacks for that.
00:35:08 Marco: So I tried I tried it this way where it goes most of the most of the way to the top like a full screen sheet or an almost full screen sheet.
00:35:14 Marco: And I was like you know what this is fine.
00:35:17 Marco: It doesn't look as good.
00:35:17 Marco: But actually, this was actually Overcast's design early on.
00:35:22 Marco: Like, there was, I think for about a year, and maybe like year three or four, there was an Overcast design that looked very similar to that on the top, where it did this kind of like, you know, most of the way to the top and then like, you know, backed off the sheet behind it.
00:35:35 Marco: kind of look but anyway so that's why it is this way i would have preferred if it could go full screen just like apple just like the apple music app but without a huge amount of hacks it can't and so i decided i will accept this trade-off for the massive simplicity of code and then everything else being able to be swift ui and all the niceness that brings
00:35:53 John: Yeah, one of the reasons I asked, well, is the Apple Music one.
00:35:57 John: I know it has the little grab handle up there, but I have found both I myself, when I first started using the Apple Music app and other people who I've seen use it, can have difficulty figuring out how to get to the rest of the app.
00:36:12 John: Right.
00:36:12 John: I mean, if you see the little handle, you might know you can grab it and swipe.
00:36:16 John: Or if you know that you got there by swiping up a little Apple Music, you can just tap on the thing to go up.
00:36:21 John: The overcast design that leaves a bit of the rest of the UI peeking out makes it way more obvious that that's where the rest of the stuff is and that you should pull down on the thing that's blocking it because you can see it poking up from above.
00:36:33 John: You know what I mean?
00:36:34 John: I thought it was a little bit weird that the gap was there.
00:36:37 John: I'm like, why are you giving up that screen space?
00:36:39 John: And it's interesting to hear that you did actually want it to go to the top.
00:36:41 John: But now that I've used it for a while, I do wonder if the thing that leaves stuff peeking out might actually be more discoverable for more people.
00:36:49 John: Again, once you know it, it's not a big deal, I suppose.
00:36:51 John: But
00:36:52 John: I still occasionally am looking at the Apple Music app and have to think for a second to remember how to get back to the rest of it, especially since depending on the color scheme, the little bar can be not particularly easy to see or, you know, you're using it outdoors and there's sun glaring out or whatever.
00:37:05 John: So keep that in mind.
00:37:06 John: It'll be interesting to hear from people with feedback about that once more than just your beta tester start using it, whether people are upset that you're not using those extra whatever, you know, 45 points at the top of the thing or other people like it because it's more discoverable.
00:37:21 Marco: Yeah, and by the way, it's not even that.
00:37:22 Marco: It's probably something like 20 points.
00:37:23 Marco: It's a very small amount of space.
00:37:26 Marco: And on today's phones, I've designed the now playing screen to have a pretty decent amount of spare vertical space.
00:37:33 Marco: I don't think having that extra few pixels would be that meaningful, honestly.
00:37:37 Marco: But I think you're right.
00:37:38 Marco: I think it is more discoverable.
00:37:39 Marco: And that's part of what I've learned over time by getting user feedback and stuff like that.
00:37:44 Marco: What I've learned is that
00:37:46 Marco: If something is not visually obvious, there's a lot of people who will just never find it or who it will confuse.
00:37:52 Marco: So by sticking with just standard things, doing their standard behavior most of the time and having things be visible on screen most of the time, like seeing the stuff behind the now playing screen, I found that just makes things a lot better usability wise.
00:38:07 Marco: I get way fewer emails from people saying, hey, how do I dismiss this thing or whatever?
00:38:12 Marco: It just causes way fewer problems.
00:38:13 John: the only possible downside and this is not you this is just apple the way they do with their standard ui like when you bring up the chapter list for example that's a thing that's long and vertical and scrolling and it is also a full you know almost full screen sheet where you've got a little thing at the top say you're scrolling through a show that has a huge number of chapters and you want to quickly go to the top
00:38:31 John: You know, you tap the whole tap to the top, tap status bar to scroll to the top.
00:38:35 John: That works, of course, because it's a standard type of thing.
00:38:38 John: But if you look at the screen and your brain takes over for a second and you say, oh, I better tap on the top of the chapter sheet thing.
00:38:46 John: Right.
00:38:46 John: it will dismiss it because if you tap the little grab handle, it dismisses the thing rather than scrolling to the top.
00:38:53 John: And it hadn't even occurred to me until I just tested that two seconds ago that that's what happens because I'm just so used to tapping the top of the screen to scroll, even though that's not the top of the view.
00:39:02 John: But that's I mean, that's kind of on Apple because that's how they decided to make this work.
00:39:06 John: And I'm assuming they're also the ones deciding that if you tap the little lozenge, it dismisses it like that's a standard behavior, right?
00:39:12 John: um yeah well i don't tapping the losses dismisses it yeah are you sure yeah you're i'm playing with it now you're right yeah i'm saying margo didn't you didn't implement that as custom so i'm pretty sure it's like you just do it in any app like if you go to music which i and to be clear music uses music i'm assuming is ui kit and it's entirely custom it doesn't have any of the limitations you just described presumably because it was written well before swift ui was released um
00:39:35 John: But same thing in music.
00:39:36 John: Yeah, you can just tap that lozenge and it dismisses it.
00:39:38 Marco: Today I learned.
00:39:39 Marco: I'm not playing with my own app learning all this about it, so thank you.
00:39:42 John: But I'm saying that's the standard control.
00:39:44 John: That's just the way iOS does.
00:39:45 John: So again, if you're in a long chapter list and you scroll to the bottom and you want to get to the top, do not tap on the lozenge.
00:39:50 John: Just tap on the top of your screen and it will scroll the view to the top.
00:39:53 John: Another thing that I assume you didn't have to implement yourself because it's part of a standard scroll view.
00:39:57 Marco: Correct.
00:39:57 Marco: And actually, and this is like one of the great things about using Swift UI is that it really does a very good job of integrating scroll views and swipes and things in ways that will feel natural and will match the rest of the system.
00:40:09 Marco: Like, for example, if you switch over to the info mode, the info mode has scrollable content in the center of the now playing screen.
00:40:18 Marco: How do you then dismiss the now playing screen by swipe?
00:40:20 Marco: You have to like, you know, drag down maybe when you're at the top.
00:40:23 Marco: Does that work?
00:40:24 Marco: Yes, it works flawlessly.
00:40:26 Marco: I didn't have to do anything like that with this.
00:40:28 Marco: In the UIKit version, where I've had this with UIKit before, you have to have the gesture recognizers, prioritize each other, and wait for the failure of this one, or allow simultaneous recognition with this one.
00:40:38 Marco: And it's a huge pain, and it's really hard to get right.
00:40:41 Marco: With this, I had to do nothing.
00:40:42 Marco: It just is right, because SwiftUI takes care of it all.
00:40:44 Marco: Having all of those little details in the app really make a big difference.
00:40:49 Marco: It just feels better and there's less potential for bugs and weirdness.
00:40:52 Marco: It's just so much better.
00:40:56 Casey: We are sponsored this week by Tailscale.
00:40:59 Casey: Tailscale is the easiest way to connect devices and services to each other wherever they are.
00:41:03 Casey: So, okay, what does that mean?
00:41:05 Casey: Here's the thing.
00:41:06 Casey: Imagine you have, I don't know, a Synology at home.
00:41:09 Casey: And maybe if you're a little bit crazy, you have a Synology at your parents' house.
00:41:13 Casey: And maybe you have an instance at Linode, and maybe you have an instance at DigitalOcean, and you want all these things to be able to talk to each other, and your phone, and your iPad, and your Vision Pro, or whatever the case may be.
00:41:23 Casey: TailScale makes it so that all of these devices are on your own private mesh network, and they can all talk to each other.
00:41:30 Casey: Well, wait, Casey, what if they're not geographically close together?
00:41:32 Casey: Doesn't matter.
00:41:33 Casey: Well, wait, Casey, what happens if they're on completely different network topologies?
00:41:36 Casey: Doesn't matter.
00:41:37 Casey: Tailscale is secure, it's fast, and it's private.
00:41:41 Casey: It's zero trust network access that every organization can use from an organization of just me to a big organization.
00:41:49 Casey: Tailscale is so freaking good.
00:41:51 Casey: I really mean it.
00:41:52 Casey: So you can build these really simple and flat networks across really complicated infrastructure.
00:41:59 Casey: My computing life has tremendous
00:42:01 Casey: truly and genuinely gotten so much better after I really embraced Tailscale.
00:42:05 Casey: It is so good.
00:42:06 Casey: And if you're thinking, oh, that's just another VPN ad.
00:42:08 Casey: No, no, no, no, no, no.
00:42:09 Casey: It is sort of kind of a VPN, but that's not really the point.
00:42:12 Casey: I actually wrote a blog post about this because I love Tailscale that much.
00:42:16 Casey: And I don't have time to tell you exactly why it is or isn't a VPN, but I can tell you it is freaking magic.
00:42:21 Casey: And the best part of all is their personal plan is
00:42:24 Casey: is free and will always be free.
00:42:26 Casey: So you can try it out for free today.
00:42:28 Casey: You get up to 100 devices and three users for, what's that?
00:42:31 Casey: Yes, free at tailscale.com.
00:42:34 Casey: T-A-I-L-S-C-A-L-E.com.
00:42:37 Casey: No credit card required.
00:42:38 Casey: They will never ask for one.
00:42:40 Casey: It is incredible.
00:42:41 Casey: I cannot stress enough.
00:42:43 Casey: You owe it to yourself.
00:42:44 Casey: You owe it to me to give this a try or at least take a look.
00:42:47 Casey: tailscale.com.
00:42:50 Casey: Thank you so much for sponsoring.
00:42:54 Marco: All right, let's talk tech on this show.
00:42:58 Casey: Yeah, I mentioned that.
00:42:59 Marco: Everything in this app, everything that I rewrote in the app, so not the audio engine, but everything else in this app is modern Swift with the Swift concurrency async model.
00:43:12 Marco: And actually converting over to Swift 6, I haven't started it fully yet, but I've done a little bit here and there.
00:43:18 Marco: It should not actually be too much work.
00:43:20 Marco: This entire app is built with Blackbird, my database layer that I launched, what, a year and a half ago or so.
00:43:27 Marco: The way Blackbird works is it accesses SQLite directly.
00:43:30 Marco: There's no kind of middle library there.
00:43:33 Marco: Direct SQLite calls, or SQLite, excuse me, that's the actual way to pronounce that.
00:43:37 Casey: Oh, the heck with that.
00:43:39 Casey: Uh-uh, it's SQLite.
00:43:40 Marco: Okay, so SQLite slash SQLite.
00:43:43 Marco: That is the core database here.
00:43:46 Marco: Blackbird does all database access with Swift async calls on its own actor.
00:43:53 Marco: What this means is that all calls from the UI into the database must be async.
00:44:01 Marco: So this means that the entire UI, anything that needs database data, has to have a loading state or an unpopulated state and then be able to pop in the data when it arrives through the async mechanism.
00:44:16 Marco: So this has a number of massive effects.
00:44:19 Marco: Now, number one, it's slightly a pain in the butt when you're writing that code because you do have to consider, like, what if this model isn't loaded yet?
00:44:28 Marco: And of course, I have lots of little utilities to make that better and easier.
00:44:32 Marco: It also means that
00:44:34 Marco: The responsiveness to the user's touch or to changes of state in the view is very, very fast because the main thread is never being blocked by the database ever, ever, ever.
00:44:47 Marco: Now, this is a huge change from the outgoing version of Overcast, which used my old, old, old Objective-C model layer called FC model.
00:44:54 Marco: With FC Model, I designed that system to put all database access on the main thread.
00:44:58 Marco: It's the total opposite.
00:44:59 Marco: Put it all on the main thread, all synchronous, with the idea back then that it made a whole lot of bugs less likely to be written because all the different change notifications and everything could never be posted on a thread that wasn't the main thread.
00:45:14 Marco: Because in...
00:45:15 Marco: Apple's platforms, if you ever update the UI from a different thread that's not the main thread, weird stuff happens.
00:45:22 Marco: It's considered a bug.
00:45:23 Marco: You can have corrupt UI and weird issues and things like that.
00:45:26 Marco: So if you're receiving notifications of changes or whatever from a background thread, it was very, very easy in the past to have that somehow trigger something to update the UI through some kind of notification mechanism, but it would still be on a background thread.
00:45:40 Marco: So anyway, so FC model, the old system was written to put all the database access on the main thread.
00:45:45 Marco: The new one, Blackbird, was written to have the main thread not even able to access the database directly.
00:45:52 Marco: Because now we have much better concurrency modeling.
00:45:56 Marco: We have much safer ways to achieve this kind of thing.
00:45:59 Marco: So it ended up being substantially a better design for the modern day.
00:46:04 Marco: So all database access is async.
00:46:06 Marco: And so, again, everything is fast.
00:46:08 Marco: Like if you scroll the big list of podcasts or episodes or whatever, it is super fast to scroll because the cells don't load their content until they're about to be shown on screen.
00:46:19 Marco: And then they load it async.
00:46:21 Marco: They load it in the background.
00:46:22 Marco: So and then it pops in.
00:46:24 Marco: So if you scroll fast enough, you can see empty cells, but you have to scroll pretty fast.
00:46:28 Marco: And so everything is just so much faster.
00:46:30 Marco: The main thread is hardly ever blockable by almost anything except weird audio delays because that's kind of out of my control.
00:46:36 Marco: What this also means is that because I am using Blackbird and the async stuff.
00:46:42 Marco: It was very easy to design all the UI components to basically watch for changes in the database that are relevant to them because they already had to have kind of like a loading process.
00:46:54 Marco: So I have all these different little utilities and classes throughout that are like, all right, watch this episode ID so you can show the title of that episode ID.
00:47:02 Marco: And then if a sync happens in the background and that episode title has been updated by the publisher and it gets a new title, that will update everywhere all over the app instantly because all the components were written to watch for database changes kind of live, not just the very first time they load.
00:47:20 Marco: This also has affected the way that I architect how controls work.
00:47:25 Marco: So when a control changes a setting that is stored in the database or changes state in the database,
00:47:32 Marco: The control does not notify anybody about this change.
00:47:36 Marco: The control just writes a new value to the database.
00:47:41 Marco: And every single other relevant thing in the app gets that change because all those things were written to watch that primary key value of that model in the database for changes.
00:47:54 Marco: Possibly even just for certain columns to change.
00:47:57 Marco: everything updates more reliably and you have to do so much less statement you literally just like have a control just write a new value to the database and it will update itself even having the control update its own value that it's displaying you can like everything is written to just have like the user taps the button it launches an async task it writes the data to the database that's it the value will change and the control will see this value that i am controlling has changed and it will pick up its own new value from the database
00:48:25 John: It's like model view controller.
00:48:27 John: I've never heard that before.
00:48:29 John: I know people are probably listening to this and saying, wait a second, he's just describing MVC.
00:48:32 John: That has been around for decades.
00:48:34 John: I mean, kind of, yeah, but I think the part you're not saying here is that the controller layer is you mostly don't have to write thanks to the way SwiftUI works, and that makes a big difference.
00:48:45 John: I mean,
00:48:46 John: the thing you're describing has always been the goal state of like, oh yeah, of course, I just write this value and then anything that cares about it reflects it because that's MVC.
00:48:52 John: But when you have to write all that plumbing yourself, it's a source of bugs and it's annoying to do and sometimes you just don't have everything in the UI, for example, watching for changes in this one thing or whatever because it's not all active and doing its thing at the same time.
00:49:06 John: But SwiftUI makes that
00:49:08 John: not a thing that you have to worry about as much anymore because it's declarative and because you just basically sort of plumb everything together and then you are no longer involved in you know that's why like doing it the quote unquote right way of like oh yeah you know if you've ever written any kind of app
00:49:24 John: you are probably sorely tempted when you change some setting to include some code that makes a change happen elsewhere.
00:49:31 John: And you know you shouldn't, even in the old style.
00:49:33 John: You know, like an Objective-C, you shouldn't do that.
00:49:35 John: You should just update the setting and everything else that cares about it should reflect it.
00:49:39 John: But because that doesn't happen sort of automatically as part of the way you're doing things, you're sometimes tempted, I just had this one line here and it would fix it.
00:49:47 John: And then, you know, fast forward 10 years and you have an app that's full of stuff like that.
00:49:50 Casey: I just love to hear you say the word publisher, because that means you're using Combine, baby.
00:49:54 Casey: And Combine and Async Await, they're quite a bit different, but they're both technologies and frameworks that once you put it somewhere, especially somewhere foundational, well, guess what?
00:50:10 Casey: Your whole app is using Async Await, or your whole app is using Combine.
00:50:13 Casey: And that can be frustrating, especially for someone who's not used to it or is new to it or whatever the case may be.
00:50:19 Casey: But
00:50:19 Casey: It really can, when done properly, and it certainly sounds like you've done a really good job.
00:50:25 Casey: And from using the app, it feels like you've done a really good job.
00:50:29 Casey: When done properly, this stuff, it really does help.
00:50:32 Casey: And it really does not only help the user experience, as you were saying, because everything is always...
00:50:37 Casey: the, the, the most true, it's always reflecting the most true data you can possibly have.
00:50:42 Casey: And beyond that, it's better for you because everything is just kind of wired up and magic happens.
00:50:47 Casey: You know, like you were saying, you write something to the database and then magic happens and everything is updated.
00:50:52 John: And so you're thinking of a swift data or core, you, uh, what is it called?
00:50:56 John: Swift data or core data, rather, where if you just use the observer thing, everything magically happens.
00:51:02 John: I think Marco's not going that far in, he can tell me if he's added an observability layer to Blackbird.
00:51:09 John: But publishers are like, okay, say you're not doing that.
00:51:12 John: It's like, no.
00:51:12 John: don't worry about it yeah it's it this came from a database but you don't need to know that it's magic it's just an object and you just observe it from swift ui and the changes are reflected and don't worry about how it syncs and that is not really the marco way to do things he's writing his own wrapper for sqlite uh and uh and threading things that way and in that case i would imagine using something more like traditional publishing of changes from the database layer elsewhere
00:51:33 Marco: Well, I'm using both.
00:51:34 Marco: So keep in mind, as I was writing the rewrite of Overcast, the Observation SwiftUI API came out like six months into it.
00:51:45 Marco: So I had already written a lot of it.
00:51:47 Marco: I'd already written most of Blackbird and a large amount of the data model for the rewrite.
00:51:52 Marco: I'd already written before Observation came out.
00:51:54 Marco: So I am using SwiftUI Observation heavily.
00:51:58 Marco: But it is not everywhere.
00:51:59 Marco: And I actually am still using a large number of combined publishers.
00:52:04 Marco: But a lot of it is for low-level components like network reachability.
00:52:09 Marco: When there's changes to the audio output device, I have publishers for that that come out of my utility classes.
00:52:15 Marco: Things that are not easily modeled by an object.
00:52:17 Marco: Well, I mean, I mean, you know, you have like network reachability manager, output device manager, like that kind of stuff.
00:52:22 Marco: So it is easily wrapped in an object, but it's more like I didn't like I wrote all those components before observation existed or was released.
00:52:29 Marco: So I might move some of that to observation later, but there's not really a massive need right now.
00:52:33 Marco: Because I actually, I like combine for certain contexts anyway.
00:52:38 Marco: Like for, you know, certain things like when you're combining different publishers, you're, you know, doing like the debounce and, you know, stuff like that.
00:52:45 Marco: Like there's all sorts of little niceties to it that I like.
00:52:47 Marco: And so I do use combine a lot of places.
00:52:49 Marco: But to answer your question, John, you know, so when I'm looking at database modeling, I do have observer wrappers for like, you know, if you want to have like one observable instance of a model, like, you know, give me episode ID one, two, three,
00:53:02 Marco: in an observable way so that whenever that changes, this model gets updated.
00:53:05 Marco: I have that.
00:53:06 Marco: I don't use it that much.
00:53:06 Marco: I'll get to why in a second.
00:53:08 Marco: But the way most changes are communicated throughout the app is something tells the database, give me the publisher for this model if these columns in it change.
00:53:20 Marco: And then it sends a change notification.
00:53:22 Marco: And then it will go update itself and query those columns or whatever.
00:53:25 Marco: What I'm largely doing here, like, so when I made the old version of Overcast and when I made FC Model, you know, keep in mind, again, this was 2014.
00:53:35 Marco: At that time, I was much closer to being a web developer than I am now.
00:53:42 Marco: And I was treating the database in the app
00:53:46 Marco: a lot like I would treat the database in a Ruby on Rails app or a PHP web app.
00:53:52 Marco: You had these ORMs that would have these abstracted models, and you would just say, give me post number 1, 2, 3, and it would select all columns and give you the entire post, everything fully saturated and decoded into all the variables of the model.
00:54:05 Marco: So that's how I wrote the old app.
00:54:07 Marco: The new app, I've learned to treat SQLite
00:54:11 Marco: not like a database server in a web app but like basically a file on disk because that's what it is you can get away first of all keep in mind like you're not communicating over a network to another server and you don't have to worry about the other server getting overloaded and being very gentle on it so first of all sqlite can handle way more queries than you think it can it's so fast and
00:54:34 Marco: And it is even faster if you only ask it what you need.
00:54:39 Marco: You don't have to say, just give me the full post because that way I don't have to make a second query to you in another few milliseconds.
00:54:46 Marco: You can just get the ID or whatever or get the column you need.
00:54:49 Marco: It's so fast.
00:54:51 Marco: I'm also doing very minimal usage of caching of database data.
00:54:56 Marco: Very, very minimal caching in this app.
00:54:59 Marco: For the most part, everything that has database data just asks for it every time.
00:55:02 Marco: And it is really, really fast because I am not passing around or usually even loading fully saturated models.
00:55:12 Marco: I'm not saying every time I need to look up the title of this episode, load episode one, two, three entirely into memory, all of its different fields.
00:55:19 Marco: It's, you know, it's HTML body, it's title, it's duration, like load all that into memory and then give me the title.
00:55:25 Marco: No, I'm just saying select just the title for this ID.
00:55:29 Marco: That kind of pattern is used all over the app.
00:55:33 Marco: I'm passing around IDs everywhere instead of passing around loaded models.
00:55:37 Marco: A lot of components never even load the models because they don't need that information.
00:55:41 Marco: They only need to take the ID and pass it to some other subcomponent.
00:55:44 Marco: All of that, I'm basically treating SQLite more like just a file and I'm reading certain bytes from here and there rather than treating it like a database server in a web app.
00:55:55 Marco: That has made a massive difference.
00:55:57 John: I miss out on all the fun of cache invalidation.
00:56:01 John: That's the best part of every app.
00:56:03 John: Why is this thing not up to date?
00:56:04 John: Oh, cache.
00:56:06 John: It's a cached version.
00:56:06 John: Why is it cached?
00:56:07 John: Why is it not being validated by this?
00:56:09 John: I'm invalidating it right here.
00:56:10 John: Why isn't it working?
00:56:11 John: You're missing all that fun.
00:56:12 Marco: Yes, it's super fun.
00:56:13 Marco: I'm telling you that.
00:56:15 Marco: All right.
00:56:15 Marco: And then finally, on the tech overview, one issue I always had with the old app
00:56:21 Marco: What would often be called a view controller bloat, you'd have some controller or manager class, like the audio manager, a good example.
00:56:29 Marco: This is the thing in the app that has the methods for play, pause, load new episodes, stop, seek forward, seek back.
00:56:38 Marco: And the audio manager also handles things that are kind of details of those things.
00:56:42 Marco: So for instance, the sleep timer, stop after a certain duration, or seek acceleration, where if you hit seek a bunch of times in a row, make those gaps longer and longer.
00:56:51 Marco: Or handling output device changes.
00:56:53 Marco: Like, oh, you change to the built-in speaker, apply the different voice boost profile for the built-in speaker.
00:56:59 Marco: And what would happen over time was a small number of these classes of managers would just have a huge amount of code.
00:57:05 Marco: Massive amounts of different, like, subfunctions, lots of member variables for, you know, storing local state for some of these subsystems.
00:57:13 Marco: Like, you know, when was the last time the seek happened before?
00:57:15 Marco: Was it a long time ago?
00:57:16 Marco: Then don't accelerate it.
00:57:17 Marco: If it's a short time ago, accelerate it and then set a delay, like all these different things.
00:57:20 Marco: And so what I've done with the new app is make a lot of sub objects on these.
00:57:26 Marco: So like the audio manager is not, does not have the logic in it for the sleep timer.
00:57:32 Marco: The audio manager contains a sleep timer object.
00:57:36 Marco: And the sleep timer object is a much smaller file with a few functions and a few variables that will observe the database and will observe the audio manager for relevant settings.
00:57:47 Marco: And it will do its own functionality contained within it.
00:57:51 Marco: Same thing for C acceleration, the skip intro and outro watcher, the chapter manager, like all of those things, they're all separate objects that the audio manager just contains instances of.
00:58:02 Marco: And those objects will all like observe things as they need to.
00:58:05 Marco: But the result is what was this multiple thousand line class of audio manager now is like seven different files that are each, you know, 60 lines or something much, much, much less.
00:58:17 Marco: That also has been just a huge win for me with just managing all this.
00:58:22 Marco: Because ultimately what coding is, the biggest challenge of programming is not cache invalidation or naming things off by one errors.
00:58:30 Marco: The biggest challenge in programming is complexity management.
00:58:34 Marco: Just trying to manage the massive amount of complexity that comes from doing almost anything for very long.
00:58:39 Marco: For me, that's what this entire tech decision-making tree and this entire way of developing this, it's all about managing complexity in better ways than I was doing it before.
00:58:52 Marco: I've really, I think, come a very long way in my own programming discipline in 10 years.
00:58:57 Marco: The tools and languages have come a long way in 10 years.
00:59:00 Marco: And so now this is a new foundation.
00:59:02 Marco: And
00:59:02 Marco: What this allows me to do is finally keep the app updated on a more regular basis than what I was doing before.
00:59:12 Marco: People who use Overcast have probably noticed for the last few years, the rate of new feature development has slowed to a crawl.
00:59:19 Marco: It's been almost nothing.
00:59:20 Marco: Even before I started the rewrite 18 months ago, there really have not been many new features since the COVID era.
00:59:28 Marco: There's been almost no major new features.
00:59:30 Marco: And that's now like, you know, four years.
00:59:33 Marco: And the reason why is because I was just crushed by the burden of trying to keep this giant code base going, trying to keep it maintained while trying to keep up with everything that iOS was releasing every year.
00:59:44 Marco: And so it's been very difficult for me to, first of all, feel good about what I'm doing because I feel like I was falling behind for so long.
00:59:53 Marco: But also, every time something new would come around, I would feel like I can't even address that because I'm too busy just trying to keep my head above water with this ancient massive code base.
01:00:06 Marco: What I can do now is iterate quickly.
01:00:09 Marco: And now when new stuff comes around, like Apple Intelligence, I can add that very easily and very quickly.
01:00:17 Marco: Because I know, because I've been doing it, because part of doing this whole app rewrite, when you replace the entire language and data layer of your app, you have to do a lot of component rewrites.
01:00:29 Marco: All of the different little feature components of this app, things like CarPlay.
01:00:34 Marco: Totally rewritten.
01:00:35 Marco: The intent system is not actually done yet, but that's being totally rewritten.
01:00:39 Marco: The widget handling, the handling of communication to the watch, all of those things, totally rewritten.
01:00:46 Marco: The handling of the now playing info where it controls what control center sees and takes the remote control commands...
01:00:52 Marco: All rewritten.
01:00:54 Marco: So I've had a chance to rewrite every single subsystem.
01:00:57 Marco: I can tell you it's way faster to write it this time than it was the first time.
01:01:03 Marco: It's way easier to make changes.
01:01:04 Marco: They're way more reliable.
01:01:06 Marco: They work way better.
01:01:08 Marco: They're way lighter.
01:01:09 Marco: They have way less memory usage and way longer battery life as a result of being more efficient.
01:01:14 Marco: All of this is because I went from a 10-year-old code base that was entirely in a different language using different paradigms because all the new things we do today didn't exist 10 years ago to now a much more modern code base that is way more productive for me and along with 10 years more wisdom of learning how to do things a little bit better and in a more maintainable way.
01:01:37 Marco: So what you should see from me over the following six months to a year is
01:01:43 Marco: Right now, this new app comes out, and it's not that different from what it's replacing in terms of functionality.
01:01:48 Marco: It's totally different under the hood, but what you see, if you made a feature checklist, it's going to look about the same.
01:01:55 Marco: But I can actually move now.
01:01:57 Marco: So now, there's all this new stuff coming around, things like transcription-based features and summarization, AI classification of sound, stuff like that.
01:02:06 Marco: I can start actually looking at these features now.
01:02:08 Marco: And yeah, I'm not going to do them all for lots of reasons, but I can actually try.
01:02:13 Marco: There's been features that people have wanted for years, that people have asked for, that I've wanted to do for years, that are just basic stuff, just with regular podcasts as we know them, just like different handling options.
01:02:24 Marco: Things like smarter management of downloads and smarter storage, auto-deletion, filtering episodes by keyword, out of feeds.
01:02:32 Marco: There are all sorts of things people have requested.
01:02:34 Marco: that I haven't been able to do because the old code base was so burdensome and it was so difficult to maintain it.
01:02:40 Marco: And now I can start doing those because I've seen from writing all the subsystems of this app again, I've seen like now that I have this new foundation with Swift and Async and Blackbird and Swift UI...
01:02:52 Marco: I can now move.
01:02:53 Marco: I'm faster.
01:02:54 Marco: I'm more effective.
01:02:56 Marco: I'm more productive.
01:02:57 Marco: And the app no longer feels dead because the old app felt like it was in maintenance mode.
01:03:02 Marco: Because honestly, it almost was because I just couldn't get anything more done.
01:03:06 Marco: The new app really feels like a new foundation for progress.
01:03:12 Marco: I know that sounds like a weird political speech, but it really does feel like I've dropped my shackles on the ground and I can run.
01:03:22 Marco: Maybe like that Forrest Gump scene, but that's different.
01:03:26 Marco: Sorry, Tom.
01:03:26 John: Hey, another pop culture reference.
01:03:28 Marco: From a movie from the 90s.
01:03:29 John: You're on fire.
01:03:29 John: Yeah.
01:03:30 John: I'll take it.
01:03:31 John: I'll take it.
01:03:31 John: Do you want to talk about streaming versus downloading?
01:03:34 Marco: Oh, yeah.
01:03:35 Marco: I removed streaming.
01:03:37 Marco: Sorry.
01:03:38 Marco: I forgot about that.
01:03:38 Marco: yeah one one major feature removal there are two feature removals one of which most people won't care about one of which so the first one is I had an old option called tap single tap to play or tap to play where before this was like overcast 1.0
01:03:57 Marco: um you would tap on episodes in a list and they would just start playing like youtube videos do like you tap it tap it starts playing because there i didn't have the little expanding cell with the row of buttons under it like you know tweet pot style which is where i stole it from um i didn't have that yet in version 1.0
01:04:13 Marco: Anyway, when I added that expanding cell thing, a bunch of people were like, I don't want it to work this way.
01:04:19 Marco: So I added an option called one tap play that allowed them to keep having that behavior of like you tap the cell.
01:04:25 Marco: It doesn't expand the buttons.
01:04:26 Marco: It just starts playing.
01:04:28 Marco: That option is now gone.
01:04:29 Marco: I don't know if I'll bring it back in the future.
01:04:31 Marco: It would just require me to have like two different versions of the way those cells work.
01:04:34 Marco: And I just it doesn't seem worth it to me, honestly.
01:04:37 Marco: It was not very well, very widely used.
01:04:39 Marco: If you are one of those people, I'm sorry.
01:04:41 Marco: Try the new way.
01:04:42 Marco: Give it a shot.
01:04:42 Marco: You know, let me know.
01:04:44 Marco: Streaming.
01:04:45 Marco: So Overcast never actually had true streaming, which would be like the file, like the episodes are never actually persisted to disk.
01:04:53 Marco: I called it streaming, but what it always meant was progressive downloading, where you could tap play on an episode, it would start buffering it from the website, and as soon as it had enough data to start playback, it would start playback, and it would just download it until the download completed, until the end of the file.
01:05:11 Marco: But hopefully by the time you got there, it wouldn't be like buffering or anything.
01:05:14 Marco: The complexity to do this is massive.
01:05:18 Marco: Because of the way my audio engine works, I had to write my own streamer.
01:05:22 Marco: I had to write my own like HTTP client class to like download chunks, use the HTTP range requests, all the different caching headers.
01:05:30 Marco: I had to write all of that because if you have an audio engine that operates on the raw audio sample data with iOS, you can't use AV player, which does that for you.
01:05:41 Marco: This is why other podcast apps tend not to offer streaming and silent skipping simultaneously.
01:05:47 Marco: So,
01:05:47 Marco: I decided to not offer streaming anymore because think about the additional states things can be in and the additional ways they can fail or go unexpected.
01:05:58 Marco: So one is if you start a streaming download, what happens if that download fails during playback?
01:06:06 Marco: Okay, well, you can maybe try to resume the download.
01:06:09 Marco: What if it can't resume?
01:06:11 Marco: What if it fails because you went into a tunnel and you're never coming out for whatever reason?
01:06:16 Marco: Maybe you're on a submarine.
01:06:17 Marco: It's going to be a while.
01:06:19 Marco: Well, do I just let it play to that point and then like...
01:06:23 Marco: buffer like spin buffer and just fail that's a terrible experience and do I like alert the user somehow what if their phone is in their pocket they're not going to see the alert do I like interrupt the pot like there were all these different problems with that approach and then what really made it difficult
01:06:38 Marco: was two major changes in the environment I'm operating in.
01:06:45 Marco: One is the rise of DNS and network-based or VPN-based ad blocking.
01:06:51 Marco: These products frequently interfere with podcast tracking hosts because a lot of podcasts will serve their episodes through ad tracking redirects.
01:07:00 Marco: And unlike a webpage ad blocker, you can't just block those trackers and have everything else load around them.
01:07:07 Marco: It's literally a redirect to get to the download file.
01:07:10 Marco: So if you don't follow that redirect, you don't know where the download file is.
01:07:13 Marco: So you can't block it.
01:07:15 Marco: If you do block access to that ad tracking host, the downloads will just fail.
01:07:19 Marco: Because they're literally being blocked on the way to the file.
01:07:23 Marco: So they'll just fail.
01:07:23 Marco: Well...
01:07:24 Marco: Again, if your phone's in your pocket and you tap that podcast to start and you happen to be behind, say, an Eero router that just blocked the Magellan.ai domain name, not that I'm mad, not that this has caused lots of support problems over the last few weeks, if you do that,
01:07:41 Marco: then what will happen is that download will just spin forever.
01:07:45 Marco: You'll have the buffering spinner forever, and you have no feedback as to why.
01:07:50 Marco: It just seems like the app is broken.
01:07:52 Marco: So that's caused a lot of problems.
01:07:54 Marco: And if I convert those to downloads, I can try the download, it can fail immediately, and I can show the user in the download list, this failed for this reason.
01:08:03 Marco: This domain is blocked.
01:08:04 Marco: And I have all that code in there.
01:08:05 Marco: The second thing that changed in the environment is dynamic ad insertion, D-A-I.
01:08:13 Marco: Oh, the bane of my existence as a podcast app developer and, frankly, a podcast listener.
01:08:17 Marco: But dynamic ad insertion, we've talked about it before.
01:08:21 Marco: Dynamic ad insertion is used by almost every major podcast publisher now.
01:08:25 Marco: This is how almost all podcast ads are wanting to be sold now and delivered.
01:08:30 Marco: They splice ads into each download of a file.
01:08:35 Marco: So every person listening to it can get a different set of ads.
01:08:39 Marco: They can be targeted to that person, which usually is just by IP address.
01:08:43 Marco: So this is how if you listen to a big podcast and you happen to travel to Spain, you start getting ads in Spanish and you're like, that's weird.
01:08:50 Marco: I never heard ads in Spanish on this show before.
01:08:52 Marco: That's why.
01:08:53 Marco: Or you hear an ad from your local car dealer or your local movie theater.
01:08:57 Marco: That's how that's happening.
01:08:58 Marco: They're splicing it in for your download because they're looking at your IP address and they're seeing, oh, this person is roughly in this region.
01:09:03 Marco: Let's give them these ads.
01:09:05 Marco: The problem with dynamic ad insertion is that the client app does not know whether any two downloads of an episode will get the same file or the same audio content.
01:09:18 Marco: So in a streaming situation, if I start the download and I download the first 25% of the file and then it fails or drops or whatever, if I go to download the rest of the file, the next 75%, that could be the latter 75% of a totally different splice of ads in that file.
01:09:37 Casey: Ugh.
01:09:37 Marco: And so what that means is when you hit that 25% boundary where the splice has to happen, sometimes you'll have an audio split where all of a sudden you're hearing the middle of a different commercial or you're hearing a different topic because the ads that they put in aren't all the same length.
01:09:52 Marco: So if I start a download and don't finish it, whatever I have downloaded is useless to me.
01:09:58 Marco: I have to not trust it and start the download from the beginning.
01:10:02 Marco: Otherwise, you can get a weird audio splice and miss content or have doubled content.
01:10:06 Marco: And so streaming really becomes problematic in this kind of environment because...
01:10:12 Marco: What if you're already playing the file?
01:10:15 Marco: What if during playback I need to re-download the entire file to be sure I have a consistent copy and you're literally listening to it as I do that?
01:10:24 Marco: So that you can see that the challenges this poses both in UI and experience and technical complexity are just massively challenging to make a good product.
01:10:33 Marco: The other thing that's different now is cell networks are way faster.
01:10:39 Marco: Home connections are way faster.
01:10:41 Marco: Data caps are way higher.
01:10:44 Marco: And podcasts really have not gotten much bigger.
01:10:47 Marco: They're still just MP3s.
01:10:50 Marco: They're really basically about the same.
01:10:53 Marco: Yeah, fewer people are using 64 kilobits per second, but...
01:10:57 Marco: We're not serving HD 8K video here.
01:11:00 Marco: We're still just serving MP3s at moderate bit rates.
01:11:03 Marco: And so downloading entire episodes before they start playback is not nearly as much of a burden as it was in 2014 because they just download so much more quickly now.
01:11:14 Marco: It's kind of no big deal.
01:11:15 Marco: I decided, let me try removing streaming because then think of everything I can remove.
01:11:22 Marco: Think of all the different states.
01:11:23 Marco: I can remove the buffering state.
01:11:25 Marco: I can remove certain failure modes.
01:11:27 Marco: I can remove all these retry states.
01:11:28 Marco: I can remove certain problematic behaviors that I have to deal with with this.
01:11:34 Marco: It just makes everything so much simpler.
01:11:37 Marco: So right now, there is no streaming support.
01:11:40 Marco: If you tap an episode that is not downloaded,
01:11:43 Marco: It loads the now playing screen.
01:11:45 Marco: It downloads it.
01:11:47 Marco: And then it starts playing.
01:11:48 Marco: And in practice, you will probably not notice this very much.
01:11:51 Marco: And it's not because, again, like things now, they're so fast for most people.
01:11:55 Marco: And podcasts are so small.
01:11:57 Marco: It's fine.
01:11:58 Marco: I recognize this is a risk.
01:12:00 Marco: And the reality is, too, my data shows that it's less than 10%, but it's not that much less.
01:12:08 Marco: It's like 8% or 9%, something like that, of my active users use streaming mode by default.
01:12:15 Marco: That's not a lot in terms of percentage, but that is a lot of people.
01:12:19 Marco: And I don't want to massively set them on fire.
01:12:22 Marco: So if you're a streaming person, again, it's similar to the design changes, I would ask, like, give it a shot, like, see how this goes for you.
01:12:28 Marco: And let me know.
01:12:30 Marco: If it's really terrible this way, I can try to figure out some better solutions.
01:12:35 Marco: But I think it's fine this way.
01:12:36 Marco: Like, you know, there's some of the details I want to work on.
01:12:38 Marco: Also, I want to add some features that are a little bit smarter about download management.
01:12:42 Marco: So things like, for instance, if you're listening to an episode and the next episode that follows it is not downloaded, download it.
01:12:49 Marco: That kind of thing, that's what I want to do next.
01:12:52 Marco: So look for features like that maybe soon down the road.
01:12:56 Marco: But give it a shot.
01:12:57 Marco: Let me know what you think.
01:12:58 John: I think one of the main things most people will miss, the only thing that I miss, I was never really a streamer, is the impatience of, I want to start listening to this episode as soon as there's enough downloaded for me to go, and that brings you back into the whole buffered state and so on and so forth.
01:13:10 John: But I think if you make the simplification that you will never support starting to play anywhere from the beginning in this state, it can maybe make it a little bit more tractable, because I think that's going to be the common case of like,
01:13:24 John: I am on a slow connection or I have a bad cell signal or whatever.
01:13:28 John: And I just want to start listening to the episode now and it's two hours long and it's going to take three minutes to download.
01:13:34 John: But can't you just start playing it now?
01:13:36 John: Because surely I'm downloading it at more than real time.
01:13:39 Marco: Well, that's what streaming was doing before.
01:13:41 John: I know, but you could start in the middle.
01:13:43 John: You could start in the middle of streaming before, right?
01:13:44 Marco: You could, yeah.
01:13:45 Marco: And that also, God, the amount of problems that caused.
01:13:48 John: I know.
01:13:49 John: So if you just say like this, this episode has never been downloaded.
01:13:52 John: You want to start playing ASAP.
01:13:54 John: You got to bring back the buffering state because now you're like, what if it hits the end before the data comes in?
01:13:58 John: So on and so forth.
01:13:59 John: But at least you remove all the other cases.
01:14:01 Marco: It doesn't remove all the other cases because the problem is like, well, again, like what if the download fails and it has to be resumed?
01:14:06 Marco: Like so there it doesn't solve as much of the complexity as you think.
01:14:10 John: um and so i just have to know like maybe maybe i should honestly maybe i should add some analytics of like how long do downloads take where the user's just waiting for them yeah that'd be a good idea because i know for our podcast in particular like for the members version um some people complain that they just have bad network connection between wherever they live on the globe and our uh you know the thing that serves our members episodes
01:14:31 Marco: Yeah, and look, this is the kind of thing where that is going to be something that I'm going to have to deal with.
01:14:38 Marco: I'll see if it matters.
01:14:40 Marco: I can tell you that I've been using this app this way for six months, and I don't miss it at all.
01:14:46 Marco: But obviously...
01:14:47 Marco: people use the app differently than I do.
01:14:49 Marco: So we'll see.
01:14:50 Marco: Rest assured that removing streaming was not a small consideration.
01:14:54 Marco: It was a big consideration.
01:14:55 Marco: And all of that complexity and all of those bugs and potentials for, you know, inconsistent states or bad audio splices or anything like...
01:15:04 Marco: That's why I did it because the reality of streaming is becoming quite bad and it's becoming quite a support burden, quite a technical burden, and it really creates a lot of bad experiences.
01:15:17 Marco: Whereas just waiting a few seconds for the download in most cases is much better.
01:15:22 John: yeah you should add some analytics on that because obviously resuming is is completely you can't do that but it's like for for dai reasons right you can't let's just don't even try um and having to start all over like say someone's 90 through listening to an episode and it turns out they went into a tunnel and now they want to ask this is the last 10 you're like sorry you got to redownload it and now you have one bar tough luck that's also not a great experience so obviously you prefer them download it up front but if someone has a terrible internet connection from from their house even
01:15:50 John: and downloading an episode takes 25 minutes and they want to listen to it ASAP, I'd throw in some timers and make a histogram and see if there are some outliers.
01:15:59 John: Maybe those outliers are the 8% that are currently using streaming, or maybe the people who are currently using streaming are just doing it because for some reason they thought it would be better and they never changed the setting.
01:16:07 Marco: So anecdotally, what I hear the most from people, I guess I don't have data on this, but what I hear the most from people about why they use streaming, number one is to save space on their phone so they don't download everything.
01:16:18 Marco: And that, honestly, that makes sense to me.
01:16:20 Marco: And again, I'm working on some features like smarter download management that I think will help with that.
01:16:26 Marco: Number two, a lot of people will subscribe to a whole bunch of shows, but they don't want to download every episode.
01:16:31 Marco: They kind of want to like cherry pick.
01:16:32 Marco: So I solved this in a couple of ways.
01:16:33 Marco: I mean, number one, you can customize your streaming or downloading behavior per podcast.
01:16:39 Marco: That's been there.
01:16:40 Marco: So that's still there in the new version.
01:16:41 Marco: But then I also want to maybe in an update very soon, I want to maybe add something like...
01:16:47 Marco: everything you add to playlist, whatever, like to a specified playlist, that gets auto downloaded.
01:16:52 Marco: That's a pretty commonly requested feature.
01:16:53 Marco: So that way people can have like a queue playlist.
01:16:56 Marco: And if they add anything to it, that gets downloaded automatically.
01:17:00 Marco: And again, you know, what I want is things like download the next episode after whatever I'm playing automatically, things like that.
01:17:06 Marco: Like that's the kind of thing I want to, I want to do to try to address this problem in different ways.
01:17:10 Marco: And I think for the most part, people who have very slow connections or, you
01:17:16 Marco: I think usually those people just download things like in the background while their phone's overnight or whatever.
01:17:22 Marco: So I'm not that worried about that case being like a fatal mistake here.
01:17:27 Marco: I think the better thing is figure out why people use streaming mode for things like download and data management and see if I can solve those needs in smarter ways that don't require streaming.
01:17:40 Casey: So what are you most proud of?
01:17:41 Marco: Hmm.
01:17:43 Marco: I think two things.
01:17:44 Marco: Number one, when, you know, during different parts of testing, I would have to go back to the old app here and there.
01:17:50 Marco: And when the, in the old app, when I would, when you'd launch the app, what happens and people with large collections, you're going to know this.
01:17:59 Marco: Um, when you launch the app, the old app, about a half second after you launch it, it performs a sync operation.
01:18:07 Marco: The sync operation in the old app is extremely heavy on the database, especially if you had a large collection because it would have to check for updates for all of the podcasts in your library, like all of the podcasts, all the episodes of all those podcasts all at once.
01:18:23 Marco: I did some work to break it up into multiple requests.
01:18:26 Marco: So over the years, it became only send what you know has changed or send each podcast in a different request.
01:18:36 Marco: But it was still a very heavy operation.
01:18:38 Marco: And so what would happen is...
01:18:40 Marco: you would open the app, and a half second in, the main thread would block for a little bit.
01:18:45 Marco: Now, if you had a small collection, you probably wouldn't notice this.
01:18:48 Marco: But if you had a big collection, you definitely did.
01:18:50 Marco: And so you would open the app and start scrolling to something, and it would lock up for a second as it loaded the data for the sync operation before the scroll would continue.
01:18:58 Marco: And that's just not great.
01:19:00 Marco: That's a bad user experience.
01:19:02 Marco: It's bad coding practice.
01:19:04 Marco: And
01:19:04 Marco: It's a huge spike in memory for the app.
01:19:07 Marco: It's a huge spike in power usage.
01:19:08 Marco: And so if you had a very big collection, sometimes that could even cause a crash because iOS would be like, oh, too much usage.
01:19:14 Marco: Shut it down.
01:19:16 Marco: So that whole design is now totally different.
01:19:19 Marco: The way it syncs is totally different.
01:19:21 Marco: What it syncs, the format it uses to sync, all of that is totally different.
01:19:26 Marco: Way, way more efficient on both ends, client and server.
01:19:30 Marco: So when this launches and when this becomes the dominant version of Overcast, first of all, I expect my server load to drop noticeably.
01:19:39 Marco: Everything becomes more reliable, servers become faster to respond, etc.
01:19:42 Marco: Also, when you open the new app, that little half-second delay is gone.
01:19:48 Marco: It is immediately responsive, and it stays responsive even during a sync.
01:19:53 Marco: Everything is way more efficient.
01:19:55 Marco: So that's the thing number one I'm very proud of.
01:19:58 Marco: Thing number two, I know this is a small, dumb thing.
01:20:01 Marco: I am very proud of some of the design details in the now playing screen.
01:20:08 Marco: I'll go with two of them.
01:20:10 Marco: When you toggle the info pane...
01:20:15 Marco: the header on top that shows the titles, the show title and episode title, that header gets replicated in the info pane.
01:20:24 Marco: If it's multiple lines, it will wrap.
01:20:26 Marco: If it's not multiple lines, it will stay the way it is.
01:20:29 Marco: And when you toggle that, that entire view hierarchy behind that is getting replaced.
01:20:35 Marco: but it doesn't flicker and it's exactly where the old one was.
01:20:38 Marco: So it looks like you're reusing the view and it just becomes scrollable and becomes multi-line when you toggle the info pane on and off, but it's not.
01:20:46 Marco: And it was a huge pain in the butt because that the new one is in the web view.
01:20:51 Marco: So it's this massive amount of complexity to put that into a SwiftUI WebView, and it's all SwiftUI being put into the WebView header.
01:21:01 Marco: All those buttons, like in the old app, all the buttons that were in the show notes info display, those were all HTML buttons that I was rendering in HTML and having them call back into the code.
01:21:11 Marco: That's not this.
01:21:12 Marco: Now those are all native SwiftUI controls.
01:21:15 Marco: So that's detail number one.
01:21:16 Marco: Detail number two, this is a little thing, but I'm very proud of it.
01:21:20 Marco: If you draw a line from the bottom corners of the artwork down diagonally along the edges of all those circular buttons, that's a straight line that lines up.
01:21:32 Marco: Nice.
01:21:33 Marco: It's just a little design detail.
01:21:34 Marco: I think it makes the screen look nicer, that these controls form a perfect diagonal down along them.
01:21:40 Marco: It's like when they have those logos of companies where they show all the different circles and lines.
01:21:44 Marco: Yeah.
01:21:45 Marco: the golden rule or the golden ratio yeah yeah it's like this cloud is just three circles yeah it's like that it's a little stuff like that i'm very proud of because ultimately what i really want honestly i know this is a stretch i would die to get an apple design award for this app
01:22:02 Marco: I don't think I'm there yet.
01:22:04 Marco: I think I need more work on it to get there.
01:22:07 Marco: But I think I can maybe get there by the spring when they would actually be deciding such things.
01:22:14 Marco: And I think this is the best chance I've ever had.
01:22:17 Marco: Again, I don't think it's a great chance because I'm still not a professional designer by most people's standards.
01:22:24 Marco: I certainly have no training in it, and I don't get paid to do other people's design work.
01:22:29 Marco: But I'm very proud that I have built design skills over time that are at least decent.
01:22:35 Marco: And to get an ADA would just be the greatest honor I could possibly get.
01:22:41 Marco: That would put me over the moon.
01:22:43 Marco: And that's kind of my goal here is like I want to keep iterating this app over the next six, seven months until they have to start deciding such things for next WBDC.
01:22:52 Marco: I want to get there.
01:22:55 Marco: And that's a pretty ambitious goal.
01:22:57 Marco: But I'm very proud of the fact that I think I can even do it.
01:23:00 Marco: I think it's even possible.
01:23:01 Casey: again i i still think it'd be a stretch goal this is not i don't think this is a a slam dunk by any means but man i would love that no i mean that would be amazing and i don't have a good feel for what what you need to do to get an ada other than be really good like really really good well there's much more to it than that these days
01:23:26 Marco: Of course, because it's, you know, the ADAs are multifaceted, like they give ADAs for all sorts of reasons.
01:23:32 Marco: Some of them are, you know, kind of more marketing based.
01:23:34 Marco: Some of them are like, you know, what is Apple trying to promote?
01:23:36 Marco: How are you using their new technologies?
01:23:38 Marco: Some of them are accessibility based, which honestly, I think I have I think I have a shot there because that's another thing I didn't talk about, but is pretty substantially different is.
01:23:47 Marco: The new app is way better at most accessibility things that I've tried so far.
01:23:55 Marco: I've always had pretty good voiceover support.
01:23:58 Marco: I do want to try to improve voiceover support more, but I'm going to need feedback from actual voiceover users to really get an idea of things like...
01:24:05 Marco: Does the arrangement of certain controls make sense?
01:24:09 Marco: Should certain things be in different sequences or should I move certain things into menus or modal screens instead of just being all in line in one big screen?
01:24:17 Marco: That kind of thing.
01:24:18 Marco: I need more voiceover users.
01:24:20 Marco: And I've had voiceover users as beta testers before, but I can't get that many in that context usually.
01:24:27 Marco: So it's much easier for me to get good voiceover feedback by just releasing an update.
01:24:31 Marco: And then I hear from many voiceover users that way.
01:24:34 Marco: So hopefully, you know, voiceover users, please bear with me and please let me know what you think.
01:24:39 Marco: But, you know, in other areas like my text sizing, support for dynamic type is way better in the new app.
01:24:46 Marco: The old one barely supported it.
01:24:48 Marco: The new app supports...
01:24:50 Marco: all the absolute biggest sizes in almost everything.
01:24:55 Marco: And it's, it's pretty, it's pretty, it remains pretty usable.
01:24:58 Marco: I have a lot of different, like, you know, certain controls can, can switch to different layouts and stack themselves in different ways and things like that.
01:25:05 Marco: So the accessibility I've, I've spent a lot of time on and I hope it's pretty good.
01:25:10 Marco: And, and there is an ADA for accessibility.
01:25:13 Marco: So I think that is a possible path as well.
01:25:15 Marco: Although that, that would also require more work.
01:25:18 Marco: But, you know, again, like it's a stretch goal.
01:25:21 Marco: I know it's – again, it's not a slam dunk.
01:25:23 Marco: I'm not saying this work today must deserve an ADA.
01:25:27 Marco: But I think I can get there in six months.
01:25:30 Casey: That would be amazing.
01:25:31 Casey: I would be very, very jealous.
01:25:33 Casey: But I hope it works.
01:25:35 Casey: I hope it does.
01:25:36 Casey: And, you know, just in general, congratulations.
01:25:38 Casey: I think –
01:25:40 Casey: You didn't ask me, but what I'm proud of for you is that you set a goal, which was an audacious goal.
01:25:48 Casey: And you talked either here under the radar or both that you've had a little bit of help, but I'm probably more than a little bit, but you set a goal and you executed on that goal.
01:25:56 Casey: And that is, that is really hard for everyone for different reasons, but for everyone.
01:26:04 Casey: Yeah.
01:26:04 Casey: When you're at work, it's hard – like a traditional job, it's hard because often politics or procedure or process stands in the way or you're reliant on people who just don't have any urgency behind them to get – Or you didn't get to set the goal yourself and someone else set the goal for you.
01:26:21 Marco: Yeah, or you don't believe in the goal or you think it's BS or you think it's bad.
01:26:25 Marco: Yeah, there's all sorts of ways I can go wrong.
01:26:27 Casey: There's a ton of different ways that in a traditional job it can be hard.
01:26:32 Casey: And then when you work for yourself, it's hard because the only person you're disappointing is the person in the mirror.
01:26:38 Casey: And we've laughed in the past at my curious choice of food that I'll eat.
01:26:43 Casey: And ultimately, the only person I'm disappointing when I put some really unhealthy stuff in my body is me, right?
01:26:50 John: Also me.
01:26:51 John: There I am.
01:26:52 Marco: Also, especially all the Europeans who listen, they're like, you eat that?
01:26:57 Marco: That's illegal in our country.
01:27:00 Casey: It's literally illegal.
01:27:00 Casey: What is Velveeta?
01:27:02 Casey: Oh, God, who knows?
01:27:03 Casey: It's a pasteurized cheese product.
01:27:04 John: We clean our cars with that.
01:27:05 John: Melted PVC.
01:27:07 Casey: Focus, people, focus.
01:27:09 Casey: But the thing is, when you work for yourself, it's really easy to just disappoint yourself and then move on, right?
01:27:16 Casey: Sometimes you know you shouldn't go to McDonald's for that dinner, but you know what?
01:27:19 Casey: Whatever.
01:27:20 Casey: I'm hungry.
01:27:21 Casey: It's right across the street, and it'll fix my current problem almost immediately, so why don't I just do it?
01:27:26 Casey: And it's easy to kick the can down the road when you work for yourself, or it's easy to change priorities when you work for yourself.
01:27:32 Casey: And I think one of the harder things when you work for yourself is
01:27:36 Casey: And I'm not trying to say it's like harder than a traditional job or anything like that.
01:27:40 Casey: It's just if I'm looking at what my world looks like and if I'm being completely selfish, what my world looks like is it is easy to get distracted.
01:27:49 Casey: It is hard sometimes to be motivated.
01:27:51 Casey: And it is especially hard to set a goal and then freaking execute on it.
01:27:57 Casey: It is hard.
01:27:58 Casey: And yes, if you have a traditional job, that might sound ridiculous.
01:28:01 Casey: Like, well, just do it, man.
01:28:03 Casey: believe me, it's hard.
01:28:05 Casey: It's harder than you think.
01:28:07 Casey: And I'm very lucky that this is my problem.
01:28:09 Casey: And I think I speak for you too in saying we're very lucky that that is your problems as well.
01:28:12 Casey: But it's still hard.
01:28:14 Casey: And for me, I think what I'm most proud of for Overcast, well, first of all, that you've lasted 10 years.
01:28:20 Casey: I mean, that is a heck of an accomplishment.
01:28:22 Casey: That is something to be extremely proud of.
01:28:24 Casey: But more than that, that you did this big
01:28:26 Casey: thing you did this big difficult thing while a lot of life was happening in your life and you executed you friggin executed and even if this were to bomb which it won't but even if it did i still think you should be very proud that you executed and that's that's something that i genuinely think should be congratulated and recognized and
01:28:50 Casey: To the degree that we are here to do it, I hope we are congratulating you and recognizing it to the degree your family can do it.
01:28:55 Casey: I hope you go out for a nice dinner or something like that.
01:28:58 Casey: But it's something to be proud of, and I hope you're proud of yourself.
01:29:01 Casey: I really mean that.
01:29:02 Marco: Thank you.
01:29:02 Marco: Honestly, I'm nervous about this launch.
01:29:06 Marco: I'm nervous about the reception.
01:29:07 Marco: I know I'm going to get a lot of negative feedback from both the streaming removal or certain feature difference or behavioral differences or just look and feel differences.
01:29:18 Marco: I know I'm going to get negative feedback.
01:29:20 Marco: And I know some of it's going to be valid.
01:29:21 Marco: And I'm going to have to scramble to fix certain things or to improve certain things.
01:29:27 Marco: And when criticism is valid, it kind of hurts the most.
01:29:30 Marco: You can't just disregard it.
01:29:31 Marco: When you know, ooh, they're right, that does suck, that's a little bit hard to take.
01:29:35 Marco: So I embraced for what might be a very rough release for me because this is the most I've ever changed at once.
01:29:44 Marco: But at the same time,
01:29:45 Marco: I've been using this this way for, again, six months.
01:29:50 Marco: And I'm confident this is way better than the outgoing app for my preferences and for my standards.
01:29:57 Marco: And so I know that I'm not going to bring everyone along.
01:30:00 Marco: That's the reality.
01:30:00 Marco: Whenever you change anything, you're not going to bring every single user along.
01:30:04 Marco: Some people are going to drop off.
01:30:05 Marco: They're going to get mad.
01:30:06 Marco: They're going to switch to something else.
01:30:08 Marco: And I have to just accept that because I am confident that...
01:30:12 Marco: If someone came to this app brand new today who didn't have, like, any muscle memory for the old ways or things like that, I think they would love it.
01:30:21 Marco: And I'm very proud of what this app is in a vacuum, not considering its past.
01:30:27 Marco: So the only question for me is, like, how do I try as reasonably as I can to bring the past into this, to migrate users in?
01:30:35 Marco: Oh, that's a whole thing.
01:30:37 Marco: I can talk about the migration, by the way.
01:30:39 Marco: Give me that in a second.
01:30:40 Marco: But...
01:30:41 Marco: How do I bring people in in a way that tries to respect the muscle memory and expectations and preferences they've built up over 10 years?
01:30:52 Marco: And that's very difficult when you do a redesign.
01:30:55 Marco: And it's never perfect.
01:30:56 Marco: You can't bring everybody in.
01:30:57 Marco: But I've tried to do a reasonable enough job of respecting the way people use the app and try to make it an easy transition.
01:31:04 Marco: But ultimately...
01:31:05 Marco: What I am proud of and what I can very confidently say is this app is better than what it replaces.
01:31:13 Marco: And it is going to enable me to keep making better versions.
01:31:16 Marco: And with the old app, I was in a bad place.
01:31:20 Marco: Because believe me, for all the last four years or whatever that I've been able to add almost no new features...
01:31:27 Marco: I felt it just as much, if not more than all my users did, because I was looking at myself saying, like, how am I going to get myself out of this hole?
01:31:37 Marco: Because the idea of facing a complete rewrite is daunting.
01:31:42 Marco: And it just never felt like I had enough time to do it.
01:31:48 Marco: And it never felt possible.
01:31:49 Marco: It always felt like it was just such a daunting task that I would never be able to achieve it.
01:31:53 Marco: And I was even questioning, not only should I even still work on the app, but I was even questioning, should I even still be a programmer?
01:32:01 Marco: Because I'm falling behind.
01:32:03 Marco: Am I even going to keep being like I'm going to have to like move everything to Swift and Swift UI.
01:32:09 Marco: But it was the way Overcast was written and implemented.
01:32:12 Marco: It was very difficult to do that piecemeal.
01:32:14 Marco: It was very discouraging of like is my career over basically.
01:32:17 Marco: Like am I willing and able to make the jump into the latest technologies and languages and frameworks and everything else.
01:32:23 Marco: Or should I just stop here and stop programming.
01:32:27 Marco: And that challenged me to my core of my identity and my profession.
01:32:32 Marco: That was a dark place, but it felt impossible.
01:32:35 Marco: For a decent length of time in the middle there, it really felt like this is over for me.
01:32:41 Marco: This is impossible.
01:32:43 Marco: And I'm finally at a point now where I'm very confident that, no, I compared it to starting in fifth gear.
01:32:51 Marco: It's like you start out very slowly rewriting an app from scratch.
01:32:55 Marco: That's a pretty big app.
01:32:57 Marco: Rewriting it from scratch in a new language with new frameworks, new programming paradigms, new data paradigms, rewriting all that is a massive undertaking that you have to do a lot of work before you see any progress.
01:33:09 Marco: But I plowed through and I did it.
01:33:13 Marco: And now I'm here and I feel better than ever.
01:33:16 Marco: I feel confident in myself, in my abilities.
01:33:19 Marco: I feel confident that what I've made is good.
01:33:22 Marco: And even though I'm going to have to face a lot of the music as everyone else finds it and maybe thinks differently at first, I'm confident that
01:33:33 Marco: This was not only a good path forward for me to take, and I'm proud of where I am.
01:33:38 Marco: I'm also confident that this was the only path forward.
01:33:40 Marco: It was either this, or I stopped writing Overcast.
01:33:44 Marco: I had to do what I felt was right, you know, my way, and just hope and trust that I can bring enough users with me, that it'll be okay.
01:33:53 Marco: But I feel great.
01:33:54 Marco: I'm very confident that this is pretty awesome, and it's only going to get more awesome over time.
01:33:58 John: The good news is it should be easier for you to do all those bug fixes.
01:34:01 Marco: Yes.
01:34:02 Marco: So much less code, so much easier to change.
01:34:05 Marco: Honestly, it is.
01:34:06 Marco: I mean, you know, look at how much has changed just during the beta.
01:34:08 Marco: It was a very short beta.
01:34:11 Marco: And it was only friends.
01:34:12 Marco: It was only about 30 people.
01:34:14 Marco: So it was a short, small, private beta.
01:34:16 Marco: But even during the beta, I was able to iterate pretty quickly.
01:34:20 Marco: And so it really has gone very well having this new foundation because I'm able to twist things around and try different things and iterate and change behaviors here and there without a ton of work, without a ton of breaking things.
01:34:34 Marco: So it's really been quite a journey, but I'm extremely satisfied with where I've landed.
01:34:41 Marco: Let me give a very quick rundown on the migration.
01:34:45 Marco: I don't think I've said this on the show yet, but I kind of pulled an APFS move here.
01:34:53 Marco: The version of Overcast that has been out there in the world in public for the last month or so
01:34:59 Marco: is already running the new rewrite sync engine in parallel with the old sync engine.
01:35:06 Marco: The new sync engine is all based on Blackbird and everything.
01:35:08 Marco: It's a whole new SQLite database, a whole new schema and everything, new data that's being downloaded from the server.
01:35:14 Marco: And so on first launch of the new app, if that database is not yet there, it has to re-sync everything.
01:35:21 Marco: It has to go to the server and sync copies of all the different podcast data that you have.
01:35:26 Marco: And you can imagine, first of all, this takes a minute or two, and it also hammers the servers.
01:35:33 Marco: But also, what if the app installs its auto-update when you're in the airport about to get on a flight?
01:35:39 Marco: And then you get on the flight, and you open your podcast app when you're at 40,000 feet, and it says...
01:35:45 Marco: updating and it can't reach the servers and you can't play anything or do anything that is a terrible experience i also have people who will do things like load up on podcast and then go on like a military base deployment or something where they're going to be out of reception for a while or something like that so i wanted to prevent that outcome so what i what i have done is for the last you know month or so the version that came out like a month ago it secretly included the sync engine for the new one and it started downloading things in the background and
01:36:14 Marco: And so now, when you install the new app, the database in the new schema is already there.
01:36:23 Marco: So not only are you saving my servers from all being hammered at once, but also if you happen to be on a plane or in the military base and you launch it for the first time after you're offline...
01:36:33 Marco: your app is usable because it will import all of your downloads and it'll just copy that database into the place it goes now.
01:36:40 Marco: And also, by the way, this entire time it's been running, there have been zero crashes of the new sync code.
01:36:48 Marco: Literally zero.
01:36:49 Marco: Like, there have been no crash reports coming from that sync code from the old app.
01:36:53 Marco: So that was also a pretty good thing to feel.
01:36:57 Marco: But anyway, so...
01:36:58 Marco: that's i think that's it for now um you know i'm sure you know we'll revisit this over time as i add new features but it's not going to be like obviously a regular segment of the show or anything uh but that's i think that's it that's my rewrite story what's the version number it's you know what that's a whole thing
01:37:16 Marco: Everything's a whole thing.
01:37:17 Marco: The version number is just 2024.7.
01:37:20 Marco: I wanted the version number to be like 10.something.
01:37:26 Marco: Then I have to deal with people saying overcast X. The way that App Store Connect works, you can never upload a version number that is when linguistically compared to the old one or mathematically compared to the old one, it can never be lower than what you've already had approved.
01:37:45 Marco: So when I switched to the year based numbering, 2027, 2024 dot one, 2024 dot two, et cetera.
01:37:52 Marco: Now, any version number I upload has to be greater than 2024.
01:37:57 Marco: So I could do like 10,000 dot one, which I played with how that looks.
01:38:04 Marco: I'm like, that looks stupid.
01:38:05 Marco: i can't do it too many zeros yeah exactly so that's the only way you can really do it so instead i'm like i'm just gonna keep the version numbers the same so this is version 2024.7 in the year 3000 hey well i am super excited for you john any last thoughts parting words etc
01:38:27 John: nope just uh looking forward to the official release version and looking forward to all those really fast bug fixes after yeah i hope you've cleared the decks for the next couple of weeks oh my god yeah i did add john syracuse of playlist priority mode though i know you keep saying that but i don't even remember i know you've described it before i don't even remember when i made this request
01:38:45 John: Oh, a while back.
01:38:46 John: Not that long, maybe like a year or two.
01:38:48 John: I have so many more requests about how to manage that screen.
01:38:51 John: But again, now that I know how easy it is to make changes, hopefully all these new things will be easy, like collapsing episodes from the same podcast together, adding some hierarchy, all that good stuff.
01:39:00 Marco: Oh, yeah.
01:39:01 Marco: I mean, because everything is so much faster, so much easier.
01:39:04 Marco: I used to have a limit on the number of episodes that a playlist would manually sort.
01:39:10 Marco: I think it was 1,000 or 1,500 before.
01:39:13 Marco: I still have to have a limit, but I think the limit is now like 100,000.
01:39:18 Marco: I made it way higher.
01:39:19 Marco: Challenge accepted.
01:39:20 Marco: Yeah.
01:39:21 Marco: because it's just like it's it's so it's so much more more efficient it's so much faster everything like all the different algorithms and everything for like sorting and you know ranking episodes and playlists like those are all faster and those all are just passing around ids and stuff like it's just it's so much faster so there's there's things like that like all over the app there's small things like that oh there's a new feature that i'm kind of proud of uh undo seek
01:39:44 Marco: this is something that i think all apps should have not all of them do um if you take a very large seek like for instance if you accidentally drag the playhead on your lock screen on control center uh or which happens all the time or if you like you know accidentally skip a chapter or something you want to go back it shows a little undo seek button open open the app look at the artwork in the now playing screen you'll have an undo seek button for like 30 seconds after you do it um so you can bounce back to where you were if you want to
01:40:09 Marco: Little stuff like that.
01:40:10 Marco: That's the kind of thing I'm trying to do more of now.
01:40:13 Marco: And again, there's not a ton of that in this version yet because I was busy rewriting every single component of the app.
01:40:19 Marco: But I can add stuff like that so much more easily now.
01:40:23 Marco: The sleep timer, you can now do sleep at chapter end.
01:40:26 Marco: There's all these little things around the app that are just a little bit nicer, a little bit better.
01:40:30 Marco: What I was saying with Syracuse of Playlist Sorting is what John wanted was...
01:40:34 Marco: The way playlist priorities worked, they were ranked.
01:40:38 Marco: So if you said, all right, these four podcasts are high priority playlists, they would actually have an order.
01:40:44 Marco: They would be like, all right, this is one, this is two, this is three, this is four.
01:40:46 Marco: But what John was saying was, I want to just have high priority be a grouping.
01:40:50 Marco: and have them not sorted within that grouping.
01:40:53 Marco: That's now an option.
01:40:55 Marco: I also have low-priority playlists that will now sort at the bottom of the list.
01:40:59 Marco: That's been requested for years.
01:41:01 Marco: Now I have that option.
01:41:03 Marco: There's little things like that all over the app that are a little bit nicer, a little bit better, a little bit different.
01:41:09 Marco: So peek around, have fun, and bear with me while I make the rest of it even better.
01:41:14 Casey: Well, congratulations and happy, happy anniversary.
01:41:18 Casey: Thank you.
01:41:19 Marco: All right.
01:41:20 Marco: Thank you so much to our sponsors this week.
01:41:22 Marco: Tailscale, 1Password, and probably Overcast.
01:41:28 Marco: Thank you to our members who support us directly.
01:41:30 Marco: You can join at atp.fm slash join.
01:41:33 Marco: Members have an extra topic every week called ATP Overtime.
01:41:36 Marco: This week, the ATP Overtime topic is some changes in macOS Sequoia with non-notarized apps.
01:41:42 Marco: This will be kind of interesting.
01:41:44 Marco: So tune in if you want to hear that.
01:41:47 Marco: You can join atp.fm slash join.
01:41:49 Marco: That is over time this week.
01:41:51 Marco: Thank you so much for listening, everybody.
01:41:53 Marco: And we'll talk to you next week.
01:41:57 Marco: Now the show is over.
01:42:00 Marco: They didn't even mean to begin.
01:42:02 Marco: Cause it was accidental.
01:42:05 Marco: Oh, it was accidental.
01:42:09 Marco: John didn't do any research.
01:42:11 Marco: Marco and Casey wouldn't let him.
01:42:14 Marco: Cause it was accidental.
01:42:16 Marco: Oh, it was accidental.
01:42:19 John: And you can find the show notes at ATP.FM.
01:42:24 Marco: And if you're into Mastodon, you can follow them at C-A-S-E-Y-L-I-S-S, so that's Casey Liss, M-A-R-C-O-A-R-M-A-R-C-O-A-R-M-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-R-C-O-A-
01:42:50 Casey: So, I was put in a position where I was offered an extremely robust discount on some Sonos gear.
01:43:10 Casey: And the three of us have found ourselves in this position from time to time.
01:43:15 Casey: And we are very lucky for that.
01:43:16 Casey: Because although...
01:43:18 Casey: although Sono stuff is expensive, like full stop, it's expensive.
01:43:22 Casey: I personally think it's worth it.
01:43:23 Casey: I think Marco has come around to a similar perspective, but it's expensive and there's no way around that.
01:43:28 Casey: And I bought some of the stuff that I have in the house at full price and it hurts a bit because it's expensive, but it's good.
01:43:36 Casey: And I think having access to money off has pulled forward purchases that I probably would have eventually made anyway, but it's much easier to justify when...
01:43:47 Casey: You know, you're getting a really, really robust discount.
01:43:50 Casey: And so my really good friend, Brian, had offered me a discount on some stuff.
01:43:56 Casey: And I was in this.
01:43:59 Casey: This is the first world.
01:44:00 Casey: It's the first world problems.
01:44:01 Casey: It's not even a problem at all.
01:44:02 Casey: But I was in a weird state.
01:44:03 Casey: So the state of the world, state of the world at the list household is I have I think it's a premium immersive set is what they call it, which is what I had gotten way back when and talked about on the show like a year and a half ago or something like that.
01:44:13 Casey: This is their Arc soundbar.
01:44:14 Casey: At the time, it is or was 1SL Surrounds.
01:44:18 Casey: So SL meaning like no voice support.
01:44:21 Casey: So they're speakers, but you can't talk to them.
01:44:23 Casey: 1SL Surrounds.
01:44:25 Casey: And then the SubGen3, which is their big subwoofer.
01:44:28 Casey: Loved it.
01:44:28 Casey: Absolutely loved it.
01:44:30 Casey: And I think at the same time, I got a Roam, which is their little baby like Jambox style portable speaker.
01:44:36 Casey: Love that.
01:44:37 Casey: And then a little while later, like a few months later, maybe a year later, I got the original Move.
01:44:41 Casey: There's now a Move 2.
01:44:43 Casey: This thing is heavy.
01:44:44 Casey: It's big.
01:44:46 Casey: But it's a really good, really high-fidelity portable speaker.
01:44:51 Casey: And you can play via Bluetooth or, you know, it's the same with the Roam.
01:44:56 Casey: Or it just becomes one of your Sonos speakers.
01:44:58 Casey: And that was the state of the world until literally today.
01:45:02 Casey: The arc and the home theater setup was obviously in the family room, living room.
01:45:07 Casey: I use those terms interchangeably, the TV room.
01:45:10 Casey: Then the Rome, the little portable speaker was up in our bedroom.
01:45:14 Casey: And the Move, the big portable speaker, was in the office because oftentimes I would use that to play music.
01:45:20 Casey: The studio display speakers are actually surprisingly good, but they're small and they don't really have a whole ton of bass.
01:45:26 Casey: And not that I listen to extremely bassy stuff, but I like more than zero bass.
01:45:31 Casey: And so the Move was in here and I, generally speaking, would play music through that.
01:45:37 Casey: Oftentimes I would AirPlay via the music app.
01:45:40 Casey: Sometimes I would use the desktop Sonos app and just have the speaker play everything on its own.
01:45:44 Casey: And that was the state of the world.
01:45:46 Casey: But I started thinking, gentlemen, surely there's a better setup for my desk.
01:45:53 Marco: If only someone had recently created a Sonos desk setup.
01:45:59 Casey: Yeah.
01:45:59 Casey: And then some jerk incepted me and said...
01:46:03 Casey: You could go bananas and get two era 300s, which I had neither the budget nor the space nor really the desire because my office, I can't recall how big it is.
01:46:12 Casey: I want to say it's like 12 feet by 14 feet, which is something like three, no, four meters by, I don't know, four and a half, five meters, something like that.
01:46:21 John: Do you have two other monitors on the side of your central one?
01:46:24 John: Yes, that's right.
01:46:24 John: That would be where the speakers would go?
01:46:26 John: I was going to say, I think it's about the size of my office.
01:46:28 Casey: Yeah, well, fair.
01:46:30 Casey: But I don't have the space on my desk for the ERA 300s.
01:46:35 Casey: They're also a little homely to look at.
01:46:37 Casey: I don't think they're actively bad, but they're not great.
01:46:41 Casey: And it's just they're too physically big for my desk.
01:46:43 Casey: They really are.
01:46:44 Casey: And even though I would love them, and they're also...
01:46:47 Casey: extremely expensive.
01:46:48 Casey: I mean, they're, again, phenomenal speakers.
01:46:50 Casey: I mean, Marco has attested to this, and I have heard Marco's exact Aero 300s, which I deeply regret because they sound so good, but that's neither here nor there.
01:47:01 Casey: But I reached a compromise with myself, and I decided to get a pair of Aero 100s
01:47:09 Casey: and because i so i put them on the the back corners of the desk and so they're pointed at like a 45 degree angle back towards me but they're in the two are they behind your monitors be honest yeah well yes but under them so they're they're under i'm sure acoustic engineers are crying now yes they are but you do the best with what you got also how high are your monitors how can they fit under them i think your monitors are on these amounts
01:47:34 Casey: Well, that's not fair.
01:47:36 Casey: Two of them are on a fully Jarvis.
01:47:39 Casey: Well, now it's what is it?
01:47:40 Casey: Herman Miller Jarvis.
01:47:42 Casey: Maybe not Jarvis, but there are two.
01:47:43 Casey: I think I talked about it on the show when I first got it.
01:47:45 Casey: There are two up visa mount arm is freaking phenomenal.
01:47:49 Casey: I love this thing.
01:47:50 Marco: I should also point out that speaker stands exist.
01:47:53 Casey: That's true, but I don't know that that would really do a whole lot better.
01:47:57 John: The audiophiles are like, make sure your speakers aren't pushed back on the edge of whatever shelf they're on because they'll affect the sound in case he's just putting his on the corner of a glass desk behind a monitor.
01:48:07 Casey: It's not glass anymore, remember?
01:48:08 Casey: I got rid of that.
01:48:10 Casey: Facebook Marketplace, that bad boy.
01:48:12 Casey: Thank you very much.
01:48:13 Casey: But anyways...
01:48:14 Casey: It is probably not, from an audio fidelity perspective, the ultimate best setup in the world.
01:48:19 Casey: I concede that.
01:48:20 Casey: Let's remember that I also have my TV in slash R slash TV too high.
01:48:25 Casey: My TV downstairs is effectively in the sky, if you were to believe what John tells you.
01:48:29 Marco: Yeah, it's on the ceiling.
01:48:30 Casey: It's on the ceiling, that's correct.
01:48:32 Casey: It's like being a division pro.
01:48:33 Casey: Just lay down, watch TV.
01:48:35 Casey: Exactly.
01:48:36 Casey: Oh, and I forgot to mention, I'm sorry, this is my own fault, but I forgot to mention that the move was on the opposite side of the room behind me, pointed at me, just because that was the most convenient place to put it, which obviously was not fun.
01:48:49 Casey: There's making choices that are perhaps not the best fidelity, and then there's just bad choices, and that full stop is a bad choice.
01:48:56 Casey: But I'm working with what I got here.
01:48:59 John: It's like you're at a concert, but you're turning your back on the concert the whole time.
01:49:02 Casey: Yeah, pretty much, pretty much.
01:49:04 Casey: So I put a pair of Arrow 100s, which is, the Arrow 100s kind of serve dual roles in the same way the 1SLs did, or excuse me, the 1s did, and they were the predecessors of the Arrow 100s.
01:49:19 Casey: The Sonos 1s and now the Arrow 100s,
01:49:22 Casey: are arguably trying or they really are trying to serve two different purposes one of them is being the rear surrounds in most people's setups some people will go full marco and go era 300s as their rear surrounds but they're physically large again they're probably going to be square in the middle of the room or not in the middle of the room i shouldn't say that but you know in a place that they're very conspicuous and not a lot of people have the physical space for them because they're big uh
01:49:47 Casey: So the 1s and now the 100s oftentimes are rear speakers.
01:49:51 Casey: They look vaguely like HomePods do.
01:49:55 Casey: They're roughly the same size as a full-size HomePod.
01:49:59 Casey: So they're much easier to put in smaller spaces.
01:50:02 Casey: They're cheaper.
01:50:03 Casey: And they're not huge, right?
01:50:06 Casey: So you wouldn't expect to get ridiculous amounts of bass or what have you out of these things.
01:50:11 Casey: But they also are supposed to serve as like, I would like a single speaker in a room, please.
01:50:16 Casey: And I'm never going to move it.
01:50:17 Casey: You know, I would...
01:50:19 Casey: I would probably be better served by having one or two of these in the bedroom as opposed to the Roam.
01:50:25 Casey: But I like having the two different size portable speakers because depending on what I'm doing, I will choose one or the other.
01:50:31 Casey: And so these speakers, in some cases, they're just rears, which aren't really doing that much.
01:50:36 Casey: But in other cases, they're what I have, which is doing the full-on stereo for my computer setup.
01:50:42 Casey: And what I've done is, you know, I put these two in a stereo pair and I got a line in for one of them.
01:50:48 Casey: So I've plugged directly from my CalDigit TS4 dock directly into the back.
01:50:53 Casey: Well, I shouldn't say directly, it's through a little dongle, but into the back of one of the two Arrow 100s.
01:50:58 Casey: And holy crap, my dudes, these things sound so freaking good.
01:51:04 Casey: Like, I don't even have a sub attached to them, and I think even the sub mini might be too much.
01:51:09 Casey: Like, the amount of bass that comes out of these, it isn't too much, but given how physically small these speakers are, it is stunning to me how much bass that comes out of them.
01:51:20 Casey: And I'm harping on bass just because, like, the Aero 100, excuse me, I'm sorry, the ones, when I've heard them as...
01:51:28 Casey: music speakers as opposed to like rear surround speakers, they always sounded kind of tinny to me.
01:51:34 Marco: Yeah.
01:51:34 Marco: The Sonos One was not a great speaker.
01:51:37 Casey: Exactly.
01:51:37 Casey: And again, I'm usually listening to like Dave Matthews or, you know, or maybe 21 Pilots or Mute Math or whatever.
01:51:43 Casey: Like I'm not listening to exceedingly bassy music, not to imply that there's a problem with that.
01:51:48 Casey: It's just not what I'm listening to.
01:51:49 Casey: But yet, even for Dave Matthews, if you listen to it, do it on a one,
01:51:53 Casey: It's kind of tinny and not great.
01:51:55 Casey: And these things, these sound so good and get more than loud enough for the small space that I'm in.
01:52:03 Casey: And I am so happy with this setup.
01:52:05 Casey: And so then what I did was I have relocated, I was going to say move, I have relocated the move into the bedroom and then I have relocated the roam downstairs in the dining room because the dining room, just because of the way our house is arranged, the dining room is kind of like a music dead zone.
01:52:22 Casey: Um,
01:52:23 Casey: Even when I was playing on the Arc, that is not physically very far from the dining room, but there's a couple of walls in the way and so on and so forth.
01:52:31 Casey: So now I have a really solid whole home setup.
01:52:35 Casey: There's a couple of dark spots, if you will, where the music isn't quite as loud as I would like.
01:52:41 Casey: But I mean, even the porch has a Sonos port connected to an amp, connected to outside speakers.
01:52:47 Casey: And then I got like a $12, I think it's like 3D printed...
01:52:50 Casey: little harness that you can hang the move off of, the bigger one off of.
01:52:55 Casey: And I mounted that to our fence in the backyard.
01:52:58 Casey: So then as you're walking from the screened in porch down the steps into the backyard, you've got a continuous flow of music into the backyard.
01:53:06 Casey: Gentlemen, it's a chef's kiss.
01:53:07 Casey: I am so freaking happy.
01:53:09 Casey: I understand that this entire show has been advertisements for various and sundry things.
01:53:13 Casey: it's just so it just so happened that marco's releasing overcast it just so happened that i literally today received these two speakers but they are so freaking good and i get that they are expensive and part of the reason why i have so much of this equipment is because i've been lucky enough to have several different friends that have offered me discounts but it's one of those things like apple stuff where yes it's expensive but you get what you pay for and oh my god it's so good and i'm so happy with this setup
01:53:35 Marco: That's awesome.
01:53:36 Marco: I'm really proud of you for now continuing the ATP pattern of using Sonos speakers as desk speakers, which they are obviously not made to do, but they sound so good.
01:53:48 Marco: You can just ignore that and just suck it up and do it.
01:53:51 Casey: I'm so very happy and I'm so excited with it.
01:53:54 Casey: And, you know, the good news is, John, when you finally get rid of that enormous boulder of a computer and get something more appropriate for your room, I don't know, like a studio, you know, a Mac studio, maybe you could get your own pair of Sonos speakers and put them in there.
01:54:08 John: That's not going to change the amount of room available for speakers.
01:54:10 John: You've seen my setup.
01:54:10 John: That thing doesn't change anything about my speaker setup.
01:54:13 John: I'm just giving a hard time.
01:54:14 John: I will once again remind you that my speakers are literally turned off.
01:54:17 John: That's how much audio coming from my computer that I use.
01:54:21 John: They're pretty much always turned off.
01:54:23 John: So not a big need in my life, but I will keep the Aero 100 in mind.
01:54:28 John: And I keep saying, oh, you keep saying they're so expensive.
01:54:30 John: This sounds like someone who has not done shopping for speakers that are not smart speakers.
01:54:36 John: The R100s are $250 for each speaker.
01:54:39 John: That is nothing in the world of standalone speakers.
01:54:44 John: It's a scary place.
01:54:45 John: Like, standalone, passive, no smarts, no nothing, no power, just plain old speakers.
01:54:51 Casey: Yeah, it's expensive and wild out there.
01:54:54 Casey: But man, I tell you what, these things are so great.
01:54:57 Casey: And yeah, I'm sure we'll get feedback that a couple of months ago, maybe, the Sonos people redid their app and it was real rocky.
01:55:06 Casey: And I think they even invoked the word courage at some point with regard to their changing the app, which of course, everyone was like, well, that's gross.
01:55:14 Casey: And then the Apple people were like, oh no, too soon, too soon, uh-uh.
01:55:18 Casey: And so...
01:55:19 Casey: uh it's been a little rocky in that regard but it's still i mean this stuff works really well and there there have been bumps here and there but generally speaking it works extremely well and they this fidelity is so good and i'm not trying to say that i can't get a better higher fidelity setup maybe even for less money but it is so magical for me anyway because i'm someone who just really needs to have music on all the time i'm and i know that john this would drive you
01:55:47 John: you have to have it you have to have in every part of your house even if your dining room doesn't have it you put in that tiny terrible speaker in there to listen to music because otherwise there would be no music right no you're making fun of me and i recognize you're making fun of me but that is 100 accurate it bothered in the movie paño casey no i have not okay well i can't make the reference then it's not even gonna ask marco of course not
01:56:08 Marco: I'll tell you what, though, Casey, speaking of the Sonos app rewrite, landing like a lead balloon, imagine what it's like to be an app developer about to launch a total rewrite of your app where certain features have actually been removed, but it's a much better foundation for a future thing.
01:56:23 Marco: They really heated up the room.
01:56:25 Marco: I was like, oh, no.
01:56:28 Casey: I feel for you.
01:56:29 Casey: I truly, truly do.
01:56:30 John: Well, you've got more excuses.
01:56:31 John: I think they have a few more developers than you do.
01:56:33 John: Yeah, maybe.
01:56:34 Casey: Also fair.
01:56:35 Casey: But yeah, I mean, I'm not trying to say that this is the best possible answer, but I genuinely believe it is the best answer for me.
01:56:43 Casey: And it really makes me unreasonably happy.
01:56:47 Casey: It really, truly makes me genuinely, extremely happy to walk from the backyard, through the screened-in porch, through the living room, up the steps, maybe bounce into the office, and then all the way to the bedroom.
01:56:58 Casey: Granted, my house is like 2,000 square feet.
01:56:59 Casey: It's not that big a house, but...
01:57:01 Casey: At every point in that journey, I have heard the same music.
01:57:04 Casey: And just like in Disney World, where it is all just perfectly in sync the whole time, it is perfectly in sync the entire time.
01:57:11 Casey: Even if I'm carrying around a speaker, it somehow, by freaking magic, stays perfectly in sync.
01:57:17 Casey: This stuff makes me so genuinely happy, and it really does improve my quality of life.
01:57:22 Casey: And I know that it would destroy John's quality of life, because you prefer silence, but...
01:57:25 John: It's going to destroy your quality of life, too, once that music starts to become your kid's music that you don't like.
01:57:30 Casey: Fair.
01:57:31 John: Surprisingly, I've actually... Then you're going to be like, why?
01:57:33 John: I can't escape their music no matter where I go in this house.
01:57:35 John: I have to hear it.
01:57:36 Casey: You're right.
01:57:37 Casey: It's funny you bring that up, because very briefly, Declan doesn't...
01:57:42 Casey: Declan doesn't seem to have a particular affinity for music.
01:57:45 Casey: And in fact, has often said to me, like, do you need to put music on right now, dad?
01:57:53 Casey: But I think, I think Michaela, like right now, she's all into Disney music and stuff like that.
01:57:58 Casey: But
01:57:59 Casey: I think of the two of them, she's going to be the music lover of the family.
01:58:03 Casey: And so I am very excited for her to start building her own tastes that are out.
01:58:07 Casey: So, I mean, the Disney stuff she likes is good.
01:58:09 Casey: Don't get me wrong, but I'm excited for her to build her own taste in popular music or maybe not popular music, you know, and just see where that goes.
01:58:16 Casey: So I'm really looking forward to that.
01:58:17 John: Are you excited to listen to that in every room in your house?
01:58:19 Casey: I mean, to a degree, yeah, because it's a way to I'm not trying to like shame you or anything.
01:58:25 Casey: But for me, I think it'd be a really fun way to bond with her and ask me again a few months after she's somehow taken over my entire whole home audio system.
01:58:32 Casey: And maybe I'll tell you, oh, my God, you were so right.
01:58:34 Casey: This is terrible.
01:58:35 Casey: But sitting here now where ignorance is less, it sounds very fun.
01:58:38 Marco: Oh, my God.

A New Foundation for Progress

00:00:00 / --:--:--