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