Under the Radar

281: The Weirdest Parties


00:00:00   Welcome to Under the Radar, a show about independent iOS app development. I'm Marco Arment.

00:00:05   And I'm David Smith. Under the Radar is usually not longer than 30 minutes, so let's get started.

00:00:10   So sit back, relax. We're gonna start off this week's episode with a bit of a story time.

00:00:16   Yes. So just, you know, make yourself comfortable. I love Dave's Storytime. You know, Dave's Storytime is great. It's unfortunately, sometimes, it's because something's, you know,

00:00:23   sometimes it could be because something awesome happened.

00:00:26   Unfortunately, this time it's not because something awesome happened. It, in some ways, is the opposite of that.

00:00:31   But I will, you know, just, just, don't get too worried. There is a happy ending.

00:00:35   So just, you know, enjoy the ride, but know that at the end, everything's okay.

00:00:40   As I think we've talked about a couple times in the last few episodes, it was a tricky summer for me.

00:00:45   I did a lot of, it's just like the work, the way it stacked up, the amount of things to do, the kind of just the

00:00:50   surface area of the updates I was trying to accomplish was difficult. It was tiring.

00:00:54   You know, I got to the end of it. I think I did a reasonable job for the summer.

00:00:57   I did, you know, did an episode, I think it was two ago, where I talked about the importance of then taking a rest,

00:01:02   which I did, and it was super helpful. And I kind of was, okay, I need to now get back into work again.

00:01:08   So I started to get back into that. I always find it a little difficult,

00:01:11   just kind of getting back into the flow of regular work without the external pressure of like a, you know,

00:01:17   an iOS deadline pushing me to do it.

00:01:19   And so I used lots of little nudges and strategies to get me back into that kind of coding flow.

00:01:23   You know, I would sit down at the beginning of a work day, and I would write in my sidekick notepad,

00:01:27   like these are the things I want to do, and then I'd sort of check them off as I go.

00:01:30   And I'd structure my work so that I would do the kind of fun, exciting tasks earlier in the development process,

00:01:37   which I tend to, you know, be more excited about and gets going.

00:01:41   And the great news about that process is that it worked. Like all my little nudges on my strategies

00:01:46   kind of tricked me back into getting into a groove with work, and I was solving really interesting problems.

00:01:52   I was cranking away each day, and that was awesome.

00:01:54   Like I think it was a really productive, the last maybe like three weeks of my development cycle has been super productive.

00:02:00   It's been really fun. Like I enjoy it. And all that it sounds great.

00:02:04   Except the reality of that is that because I'm cranking away and working on these cool development problems,

00:02:11   I tend to stop paying attention to other inputs into some degrees intentionally.

00:02:18   Like I try not to pay as much attention to email or social media or the variety even support desk,

00:02:24   and my apps store reviews for my apps, all those kinds of inputs because they're a distraction. They're difficult.

00:02:29   They're the kind of thing that can kind of throw your day in a weird way,

00:02:34   where if I look at them at the wrong time and someone says something unkind to me about one of my apps or things,

00:02:38   or I've disappointed someone or they've lost data, like it can really legitimately

00:02:43   kind of knock me off kilter for the rest of the day, and that's tough.

00:02:47   Like I don't want that and so I tend to ignore those kinds of things.

00:02:53   And that's where I was. I was cranking away on the code, doing a great job. It was really awesome.

00:02:57   I wasn't looking at anything else. And that was fine until this last weekend where,

00:03:02   and so my daughter came and said, "Oh, there's a, I've noticed a little bug in Widgetsmith."

00:03:07   And my family is very well trained at this point that if they see a bug, like if a bug happens in one of my apps,

00:03:16   they must sort of immediately drop everything and bring it to me.

00:03:19   Because we all know the old adage, "A bug in the hand is worth two in the report."

00:03:23   And so it is vital that...

00:03:26   I've never heard that before. That's great.

00:03:28   I may have made that up. But anyway, my daughter comes and she brings me her phone.

00:03:35   She is my number one Widgetsmith user in the family.

00:03:40   Do you require her to supply you with a cyst diagnosed before you will look at it?

00:03:44   I do not. I just want her to hand it to me. This is the EdiQ model where it just gets driven over to your house.

00:03:49   I just bring me the device and then it's on me.

00:03:52   And she says, "Some of my photo widgets aren't working."

00:03:55   And so I grab them, connect it to Xcode, and just see if I can reproduce it.

00:04:00   Because especially with these kind of bugs, sometimes I've had them where they are just these transient things that

00:04:07   if I can catch it at just the right moment, I will capture a stack trace, capture something, and it will be super helpful.

00:04:13   So I just want to, as soon as everything, I drop everything, plug it into Xcode, and I build and run in Widgetsmith.

00:04:18   And I see the good news is that there's an error message that immediately pops up.

00:04:23   And it says, "Widget archival failed due to image being too large. Total area 1,648,000, which is greater than the limit of 951,000."

00:04:35   Hmm.

00:04:36   Okay. I've never seen this error before.

00:04:39   I've never seen errors similar to this before, but I've never seen a particular one where it's like there's a limit on the number of megapixels, it seems,

00:04:46   that's attached to the image that's shown in the widgets, but it's like, "Okay, that's interesting.

00:04:53   I wonder if she's using some kind of image that is causing this to happen."

00:04:58   Because I've run into issues like this before, specifically I know for panoramas and raw images, specifically,

00:05:05   I can do all kinds of weird stuff in WidgetKit, and so I've just had to do some coding around to work around that over the years.

00:05:12   I was expecting it to be something like this, like just some image she was using in one of her widgets was going to have some weird encoding

00:05:19   or something going funny with it that I needed to deal with it.

00:05:22   And so I start systematically disabling all of her widgets that she has to kind of see if I can isolate which one was causing it,

00:05:32   so then I can look at the source image and hopefully go from there and work it through.

00:05:38   And then it was at this point that I had the thought that when you're debugging something, you never really want to have this thought.

00:05:45   And it's just a simple thought, it's just three words.

00:05:47   But it's, "Huh, that's weird."

00:05:50   Because that is the sound your brain makes when its assumptions have been proven incorrect.

00:05:57   And that is what happened to me, because I discovered that I was making an assumption that it was an image problem,

00:06:03   but it was happening in every single one of her photo widgets, all of them, many of which she's had for months, if not years at this point.

00:06:12   So, "Huh, that's weird. That's not good. Let's look a little deeper."

00:06:17   And so I start digging around and see what's going on here, and I start asking my daughter to come and talk to me,

00:06:23   like, "Did you do anything differently? Has anything happened?" And she says, "Oh, I installed iOS 17.1,

00:06:29   and I noticed this started happening fairly soon thereafter."

00:06:33   "Huh. Well, that's interesting. Okay, so maybe this is related to iOS 17.1."

00:06:38   I do a bit more further explanations, I run it on my phone, I run it on a different phone,

00:06:42   and I discover something that is unfortunate.

00:06:46   And that is that in iOS 17.1, it seems like Apple introduced a new limit on image sizes in widgets.

00:06:55   I was completely unaware of this. As far as I can tell, it just started in 17.1. Like, 17.0, .- anything, it was great.

00:07:03   17.1, you get this error. And as a result of that, 100% of the small photo widgets in Widgetsmith, when run on iOS 17.1, are completely broken.

00:07:15   Oh my god. That's-- and just-- and to be clear, so 17.1 is out to the public now. Did this show up in the beta cycles at all?

00:07:24   Well, we can-- so it probably did. I didn't see it, because on my phone, which I've been studiously installing betas on,

00:07:34   as they come out, I only have medium and large widgets. Which, it seems like the limit for those is different in this way,

00:07:42   and so I never caught it. So, yes, maybe, but--

00:07:45   Also, I mean, look, you won't toot your own horn here, but I will. How-- if Apple was making changes to the widget system limits,

00:07:53   how did they not test your app?

00:07:56   Or maybe they only used medium and large widgets too. Like, I don't know. And the reality is, at a certain point, it's like, it doesn't matter.

00:08:04   Because now I find myself-- it was Saturday afternoon when I discovered this, and according to my stats, iOS 17.1,

00:08:12   which has now been out for a week, is running on 5.5% of the users who have Widgetsmith. And that is only increasing.

00:08:21   So essentially, now I'm in a race, because-- I don't have great stats on this, but small photo widgets are the most popular widgets in Widgetsmith,

00:08:32   and just as a vague ballpark, there's probably something like 50 million of them on home screens somewhere in the world.

00:08:40   Oh my god.

00:08:41   Which is terrifying. Like, this is, you know, like the screaming face emoji, like that person. That is me in this moment. This is the, like, "Oh no."

00:08:51   This is like-- you know, we often have talked about how we are fairly happy with the path we've chosen where, like, if we mess up, nobody gets hurt or dies.

00:09:01   Like, you know, we're not writing mission-critical software, you know, but as the scale goes up, I feel like that feeling can come back.

00:09:09   Like, yeah, you didn't-- you know, nobody got hurt by this bug, but if you just caused 50 million home screens to break, like, that's a lot of pressure.

00:09:19   It's a big problem. And I mean, I think it's like one of those-- so I have this moment where I realize, like, that-- okay, once I was fairly confident, that was the case.

00:09:29   Like, it was happening on multiple devices, it was happening in 17.2 as well, I was pretty sure that was the case.

00:09:34   And it's like, this is the moment where I feel like I had to-- it's one of those things where you feel like an actual, like, legitimate professional.

00:09:43   And I realized-- some of them I remember talking about being a professional. I think they were talking about in the context of sports.

00:09:50   But essentially, it's like being a professional is about doing the work even when it's difficult, even when you don't want to do it.

00:09:55   It's about showing up when it's tough. Like, that's what the difference between being a hobbyist, an amateur, someone like that, and being a professional is that, you know, when you're the basketball player who's trying to make the free throw,

00:10:05   that if they make it, they win the game, if they miss it, they lose the game. Like, that's scary, but you're a professional.

00:10:10   You've trained for that, you've practiced it, you know you can do it, and so you can just rely on your practice and your experience and go for it.

00:10:18   And I was like, "All right, I have to fix this, obviously." Like, it's essentially one of those "it's a make or break" situations, because if 50% of my users' widgets are just completely broken and I was 17.1, like, you can't come back from that.

00:10:31   And thankfully, at this point, it's only out to 5.5% of my users, so that's a relatively small number, but it's still meaningful, but small.

00:10:40   And so in the same way that I talked at the beginning of the story about the little nudges and strategies that I use to get back into the flow of coding, you know, when I'm coming back from a rest or kind of trying to get back into it,

00:10:53   this is where I deploy the, like, break glass in case of emergency version of that, which I feel like we probably all have.

00:11:00   Like, there are some things that you can do that are like unsustainable strategies for productivity that you can apply, but only in a limited basis.

00:11:07   And so the most obvious of these is things like coffee. Like, just having a large, strong cup of coffee at 4pm, which is when I discovered this problem, is not something I typically do.

00:11:19   But I went downstairs and I made a very strong cup of coffee, brought that up with me.

00:11:23   That's a good start.

00:11:24   There's other things I tend to do. Like, so there's a particular album that I listen to when I really need to get going, and this is tense for me. The thing that really is like helpful for like almost the audio form of Caffeine is aggressively optimistic power metal.

00:11:41   So specifically, there's a Dragon Force album called Extreme Power Metal and the song Cosmic Power in the Infinite Shred Machine. And I just put that on repeat.

00:11:51   That's amazing.

00:11:53   And I go to work. Like, this is one of those things like I am as amped up as you can be like my neurons are firing, you know, at 1.5x like I am, I'm in the zone and let's see what I can do because if I can't solve this, like as quickly I'm racing against the iOS 17.1 rollout at this point, which is not a great place to be.

00:12:12   Oh my god. And by the way, like, for anybody who doesn't know, Dave, I don't think I've ever seen you even look stressed or tense, let alone like amped up. Like you're always a very like even chill guy. I've never seen this side of you.

00:12:30   But no, Extreme Power Metal, man, that is the mindset that I was in. I needed to not be calm, quiet, like methodical, Dave. I needed to be like firing all cylinders. You know, just sort of rattling the screws loose kind of Dave, but that's where I was.

00:12:48   And so I got started and it's like, all right, so like, let's solve this bug. I've solved bugs like this before. This seems like it's an iOS 17.1 thing, so at least I don't need to worry that it's a something in my code that is necessarily like a bug that I introduced.

00:13:02   It seems like something I've been doing is now crossing a limit. So I need to isolate what that limit is, identify all the places in my app where it is not abiding by that limit and kind of work from there.

00:13:16   And so I was able to narrow it down that yes, it is that there is a new limit that was introduced in 17.1 that is the based on the megapixels essentially of any image resource shown in a widget.

00:13:28   I was able to do a quick to make it quick like test project to verify that. And then I need to work out what I can do to sort of solve this. Where is the issue in this?

00:13:37   And the reason I was specifically running into this is the images shown in photo widgets, I store on disk in the rendered form slightly larger than the actual widget where they will be shown.

00:13:51   Because I know how big the widgets are going to be, but I render them slightly larger because inside of Widgetsmith when I'm previewing it, often I show widgets larger than like real size essentially.

00:14:03   Just because that's generally speaking better for several places where I'm showing you a preview rather than shrinking it down to whatever the size that's shown in your home screen is.

00:14:14   I can show it to you larger, it's a better preview and I want those to be full resolution.

00:14:18   And so rather than saving it sort of twice, having the shrunken version and then the version that is essentially twice that size, I was just using the slightly oversized version of that inside of the actual widgets itself. It worked fine.

00:14:33   I just put a resizable modifier on that and that's how it's been working since iOS 14.0. For the last three years that's been working no problems. But now I can't do it that way. And I need to resize them and I need to decide how to do this in a way that will also, the fix has to apply without the main app ever being run.

00:14:55   Because otherwise, people will have to open the, otherwise all these widgets are going to break, which in this case they turn gray, is sort of the manifestation of it.

00:15:05   And then maybe it would be a reasonable solution if they opened the app and it started to work, but that is not ideal. That is not a situation that I would really prefer.

00:15:14   I would much rather if they just, it never happens for all these people. All my customers, they just keep working.

00:15:19   So I need to do it in a way that doesn't involve the main app having to be run, which means I need to resize these images on the fly as part of the rendering process.

00:15:29   Within the memory limits of the widget extension.

00:15:32   Exactly. So you can't do it the straightforward way, which is you read in the image from the disk, you resize it, and you pass that into SwiftUI. Because resizing is always going to get you over the memory limit, which is 30 megabytes for any widget extension.

00:15:51   If you use more than 30 megabytes, you're immediately killed, so I can't do that.

00:15:55   So instead I end up using ImageIO, which has a kind of thumbnailer capability where you can point a system, a system API, to a file on disk and say, "Give me this image, but give it to me no larger than a particular size."

00:16:10   And this is typically used, if you imagine you have like a, you know, you have a photo app that has a bunch of thumbnails in a grid on the main screen and then the full resolution on the second screen.

00:16:20   So it's a way of very quickly making lower resolution versions of it. And so that's what I went and tried to use.

00:16:26   And it seemed to work. Like it seemed that if I switch from reading my large, too large images to switching to something that was 100% of the rendered widget size, you know, so for a particular widget is 169 points by 169 points,

00:16:42   I render the image at 169 points by 169 points, you know, accounting for the scale of the screen. And as far as I could tell, that seemed to always be below the limit, which makes sense.

00:16:53   And so now I have a fix. Now I need to see kind of what the knock-on effects of this are. And I found a few issues, you know, that if you start changing assumptions in your app, inevitably other things are going to break.

00:17:07   At least I had the issue here that the consequence of not shipping a fix immediately massively out, is massively bigger than the content, than the consequence of ship, of, you know, shipping some small regression in a knock-on smaller part of the app.

00:17:23   Like anything I could do to get small photo widgets rendering again, worth it, even if it meant that other parts of the app would have to be sort of patched or fixed later.

00:17:31   So I get my fix. That's great. The next thing I do is I install the version that I built that had a fix on every iPhone I have in my office, which is quite a lot.

00:17:42   I think I had maybe six or seven and then it's like, call down to my family, basically, we're going to have a QA party.

00:17:48   And so me, my wife, my son, and my daughter, we get around the dinner table.

00:17:53   And it's like, I just pick a phone and just go crazy, make widgets, different sizes, different things, load them on different places, do whatever you can.

00:18:01   And we're just going to just brute force this as best we can with the four of us.

00:18:06   And your neighbors are like, man, those Smiths have weird parties.

00:18:10   We do. We're just, we're just, it was an exciting party, having a QA party with my family testing WidgetSmith.

00:18:18   And then in parallel to that, I also submitted a version of the app for TestFlight and got that sort of process started.

00:18:29   And then asked on Mastodon for if anyone who had time and was running iOS 17.1 or really running anything, I just wanted to test it.

00:18:36   And just like, here's a test flight build. If you have time, if you have make that QA party worldwide, we can have a worldwide QA party for WidgetSmith.

00:18:44   Get that going out and then also submit it to App Review.

00:18:48   And with the scare, clicking the scariest button, I think you can ever push as an iOS developer, which is the release to all users at once, rather than a phased rollout.

00:18:59   Because I need to win the race of iOS 17.1's rollout. So I need to be faster than that in order for this to not just turn into a giant pain.

00:19:08   So once I get to the point that I feel confident that things are safe, things are working, in my QA party downstairs with my family, I haven't run into any issues.

00:19:16   On TestFlight, I had a thing that I wanted where it's like, if 50 people have installed the app, then I would be feel somewhat confident that, you know, if I haven't gotten any bad reports, things are looking okay.

00:19:28   So that happens.

00:19:30   And App Review actually comes back and in 22 minutes from when I submitted it, it was approved. So I don't know if that was like, just the way that I caught someone on a good day or something, but 22 minutes was amazing.

00:19:42   And from App Review's perspective, I felt good. I hit go.

00:19:46   And yeah, now that's what's been out into the worldwide world, you know, the wider world as we're recording.

00:19:53   It's been deployed to 85% of my active users in Widgetsmith, which means that I'm winning the race because 17.1 is about 6% for me right now.

00:20:03   So there's still going to be some people who are running the wrong version on the new OS.

00:20:07   But like the reality is, now I have a solution out there. I have a way that if anyone reports this issue or sees the issue, you know, if they go to the App Store, they'll see a bug fix there.

00:20:16   If they go to the frequently asked questions and help, it'll say, "Hey, there's this bug. Go make sure you get the update."

00:20:22   And it seems like I won the race. So at that point, I just kind of collapsed into a puddle.

00:20:28   And I'm glad that this is not the normal realities of being an iOS developer.

00:20:33   We are brought to you this episode by Indeed. What's a game where no one wins? The waiting game.

00:20:38   When it comes to hiring, don't wait for great talent to find you. Find them first with Indeed.

00:20:42   When you're hiring, you need Indeed. Indeed is a hiring platform where you can attract, interview, and hire all in one place.

00:20:49   Instead of spending hours on multiple job sites searching for candidates with just the right skills, you can use Indeed's powerful hiring platform that can help you do it all.

00:20:57   Indeed streamlines hiring with powerful tools that find you matched candidates. With Instant Match, over 80% of employers get quality candidates whose resume on Indeed matches their job description the moment they sponsor a job.

00:21:10   Indeed's hiring platform is fantastic because it gets you one step closer to the hire by immediately matching you with quality candidates.

00:21:18   And even better, Indeed is the only job site where you only pay for applications that meet your must-have requirements, making it an unbelievably powerful hiring platform.

00:21:28   Indeed delivers four times more hires than all other job sites combined, according to Talent Nest 2019.

00:21:34   So join more than 3 million businesses worldwide that use Indeed to hire great talent fast.

00:21:39   Start hiring now with a $75 sponsored job credit to upgrade your job post at Indeed.com/undertheradar.

00:21:47   Offer good for a limited time. Claim your $75 credit now at Indeed.com/undertheradar.

00:21:57   To support the show by saying you heard about it on this podcast.

00:22:00   Terms and conditions apply. Need to hire? You need Indeed.

00:22:04   Our thanks to Indeed for their support of this show and Relay FM.

00:22:08   So I think what's interesting about this story, I mean, first of all, it's, you know, the massive scale that you have. Again, this is one of the areas where I think, you know, the way that you have to operate Widgetsmith and the pressures and the ramifications and the stakes are just very different than what most of us ever work on.

00:22:26   You know, usually to have that kind of impact, most people who had that kind of impact work at a big company.

00:22:32   You know, maybe you work at Facebook or Google or whatever and like one of your big apps has a huge impact, but like for most indie developers, we don't get that kind of scale.

00:22:41   And so you mentioned like, you know, hitting the button to release to everybody is so terrifying.

00:22:44   Like, well, not for me. I do the release to everybody almost every version update I do because my scale is so much smaller.

00:22:51   It's probably fine. But I think, you know, the bigger story here that can apply to lots of people though, and both of us included and a lot of people bigger and smaller is that the reality of software development, and I've used this phrase before, it's like we're building on quicksand.

00:23:09   Because the environment that we are operating our software in, the platform, the OS, the hardware, you know, all of this, it changes constantly. The services we're talking to on the back end, network conditions around the world.

00:23:23   There's so much variability that we are operating in. And so it's unrealistic to put expectations on yourself that this kind of disaster scenario will never happen.

00:23:33   Of course it will. Sometimes it will be your fault, sometimes it won't. But these kind of things happen. And there's a couple of, I think, encouraging points on this that I've picked up over time.

00:23:47   One was like early in my career when I was at Tumblr, there was, and keep in mind this was like, you know, 2007 era. Flickr was one of the biggest sites on the web at that time.

00:23:58   Like Flickr was massively popular, it was massively influential. You know, we look, now it's kind of lost most of its stature. But back then, in 2007, Flickr was a huge deal.

00:24:09   And there was, I remember there was this one entire weekend where Flickr went down as some kind of major server problem on like a Thursday or Friday. And it was down the entire weekend.

00:24:21   And it didn't come back up again until like Monday or Tuesday the next week. So this major site on the internet that tons of people were using that was a major high profile thing was down for like four days.

00:24:33   And at the time, I was at Tumblr and I was freaked out about the amount of traffic that we were serving and how it was kind of like keeping it up and running was mostly resting on my shoulders.

00:24:44   And so I was feeling a lot of stress about that. And then when Flickr, which was way bigger than us at the time, when they had this massive downtime, I noticed afterwards, no one really cared.

00:24:56   Like, yeah, it was inconvenient. Like when you went to it, it was down. That sucked for that weekend. But then, you know, a week later, no one even remembered. Everyone just moved on.

00:25:04   And certainly nobody after that was like, "Wow, I'm not going to use Flickr anymore," because they were down for a weekend. And nobody, they didn't even develop a bad reputation for being down. It just happened. It was a disaster. They handled it and they moved on.

00:25:17   And that to me, that is like the disaster scenario. Like, wow, total downtime for your entire app or service for multiple days. What a huge disaster scenario that is. That's catastrophic, right?

00:25:30   No, actually it's not. Like, you know, data loss would be a lot more catastrophic if that was part of it, but it wasn't. And so like in this case, like what happened was, you know, people were inconvenienced.

00:25:42   And then afterwards they got back onto it and it was fine. People, I think, are very forgiving of imperfections. You know, your users, your customers, the world out there at large.

00:25:52   As long as they are temporary and as long as you make reasonable efforts to fix them in a reasonable amount of time, people will move on and forget about it. Because the reality is, the world we live in with all of our modern hardware and software and services and all this stuff, yeah, stuff breaks all the time.

00:26:08   Like, little stuff breaks all the time. And it's not, it's unrealistic to expect anybody to work perfectly 100% of the time. What matters is, you know, do you have some kind of ability to fix the problem when it comes up and do you care enough to fix the problem?

00:26:23   If something like that just went unfixed forever, people might assume your app was abandoned and you would slowly lose users. But as long as you, like, again, make a reasonable effort to fix it in a reasonable amount of time, people are generally pretty forgiving.

00:26:39   Yeah, and I think that is certainly comforting. I would say it's sort of borne out from my experience that even in this. So once I got back into this and I have these things coming out, I went into my support queue, which I'd been neglecting because I'd been enjoying coding so much.

00:26:54   And perhaps unsurprisingly, there were lots of people who said, "My small widgets are all broken." And they've been saying this for the last week. And if I'd been in there, I would have known that. And that's sort of like, that's on me.

00:27:05   Like the other half of being a professional is about taking responsibility for the mistakes or the issues that you're, you know, that you are responsible for and not trying to blame anyone else. It's like, I should have been aware of this much sooner.

00:27:17   I should have been in my support queue. I should have been in like, even in like my App Store reviews, like my Star Raid. There's several of them that are listing out the same thing.

00:27:25   And so like, after I got this update out, I went to go through, I respond to the people in the help desk, I respond to the reviews in the App Store. And generally people got back, it's like, "Oh, great, thank you so much. It works great now."

00:27:36   Like, and as you say, it is not, it feels more scary and it feels more catastrophic than in reality it probably is. Because it's just, you know, like people are used to it.

00:27:47   And it's the number one thing, I think you said this perfectly, is it's like that you need to, as long as you care enough to fix the problems when they happen, and you know, treat it like a serious problem when it happens, you're going to be okay.

00:27:59   Like there's things you can do to avoid that you can minimize it, strategies you can take. I've learned from this, like I need to add in app messaging to Widgetsmith was one of those like features that have been on the back burner for a while.

00:28:10   But I would love, I would have been amazing if I had the ability, like right now to say, "If you're running iOS 17.1 and you're running a version of the app less than this, show this message on launch."

00:28:21   Like how useful and wonderful that would be. Like that's on me. I should, rather than bepping at the very bottom of my like task list, maybe I should move that up.

00:28:29   And like maybe I should be working on those kinds of things. And when there's a new beta that comes out, I need to do a fuller test than just installing it on my own phone and hoping that I will just sort of like, ambiently run into any issue or change that happens there.

00:28:44   Because clearly, that wasn't enough. Like I should have been more responsible in that way. And I think I would have caught this sooner. And if I'd caught this when iOS 17.1 beta, you know, beta three came out, it wouldn't have been nearly as big of a deal.

00:28:56   It would have been affected if a fraction of users and people running the beta version of an iOS version are going to be pretty chill. And so I think overall, like that would be fine.

00:29:05   And I think the last thing that I would just serve this is a great opportunity to probably mention it is I have filed the feedback. And if anyone at Apple is listening, I would love it if these limits in WidgetKit were documented somewhere.

00:29:15   I take full responsibility for the fact that it is my responsibility to find these issues and to deal with them. But anything like that would be tremendously helpful in allowing me to do my job better, which is ultimately, you know, I think better for everyone.

00:29:28   So that link to that feedback will be in the show notes. But otherwise, this story is behind us. It's fixed. It's great. I won the race. And it was just a little bit exhausting in the process.

00:29:38   But hopefully, you know, Dave's story time was enjoyable and fun, even if it wasn't fun necessarily the whole time through for me.

00:29:46   Thanks, everybody, for listening, and we'll talk to you in two weeks.

00:29:49   Bye.

00:29:51   [ Silence ]