00:00:09 ◼ ► So there's an old adage that the best time to plant a tree is 20 years ago, but the second
00:00:22 ◼ ► I'm not sure if there's this, but maybe that's not a great name, but it was something that
00:00:27 ◼ ► I've been recently very strongly reminded of, of how sometimes we add features to our apps
00:00:44 ◼ ► And specifically, like a very concrete example of this is analytics inside your application
00:00:49 ◼ ► to understand how widely used particular features are, being able to understand, you know, when
00:01:03 ◼ ► But something that I've found incredibly helpful in the iOS 26 redesign that I'm doing is the
00:01:10 ◼ ► places where, you know, past Dave had the wisdom and insight to add some instrumentation
00:01:17 ◼ ► to some features to see how people are using them, what, you know, configuration options are
00:01:22 ◼ ► popular, things like that, because I'm doing a lot of what I kind of call like data informed
00:01:27 ◼ ► design through this redesign, where I don't bring a broadly subscribe to the like A, B test
00:01:39 ◼ ► We should just come up with lots of designs and just like, let the math design our app.
00:01:43 ◼ ► Like there is a version that you hear about for some companies that that's the seems to
00:01:54 ◼ ► I want to design it in a way that makes sense to me, that I think is good, that sort of checks
00:01:58 ◼ ► the boxes that I care about, even if that is not strictly or technically the most optimal
00:02:05 ◼ ► design from some KPI metric or something like that's not really, that just, that doesn't
00:02:18 ◼ ► And several times in this redesign, because the nature of my iOS 26 redesign is that I have
00:02:23 ◼ ► had to go through essentially every screen of my application and make adjustments to it
00:02:32 ◼ ► And every time I go through a screen, I definitely have this running process in the back of my
00:02:42 ◼ ► Or is this still just the version that I designed years ago when I didn't, you know, before the
00:02:47 ◼ ► app feature had ever been shown to the public, it was entirely like based on the fantasy I
00:02:57 ◼ ► And several times when I found, you know, I'm going through and there's, you know, say an
00:03:02 ◼ ► example in Penometer++'s iPhone-based workout mode, or like this, you know, you hit start
00:03:09 ◼ ► workout and it shows you previously, it had a fair bit of the screen, like maybe the top
00:03:21 ◼ ► And when I was doing my redesign, I was looking at this, and I was like, I wonder if that's
00:03:32 ◼ ► Like, and thankfully, I'd instrumented that in terms of a previous version of the app that
00:03:50 ◼ ► users are just choosing once, like they're runners, they're walkers, they're hikers, they're using
00:03:58 ◼ ► And so instead, now I have a much more compact view of that, that, you know, doesn't waste
00:04:02 ◼ ► And instead, I can dedicate the space to other features that, you know, warrant it more because
00:04:09 ◼ ► But it was one of these things where if I hadn't instrumented that particular section of the
00:04:20 ◼ ► And, you know, there have been a number of times where I really wish, you know, past me
00:04:25 ◼ ► had had the wisdom and foresight to instrument a feature because I look at some of these options
00:04:52 ◼ ► And so in some ways, this episode is just a, like, a warning to all of us that our future
00:04:58 ◼ ► cells will never really regret us adding extra bits of data collection or instrumentation to
00:05:04 ◼ ► our apps because it'll only, you know, it's like at the cost of some, you know, megabytes
00:05:10 ◼ ► of storage on a database somewhere, the future you can be greatly improved through this process.
00:05:19 ◼ ► Obviously, you know, there's the big caveat that you have to be really careful with privacy
00:05:54 ◼ ► When the app, you know, the app collects local events, and they just basically are, like,
00:06:01 ◼ ► It's through, and the server, you know, adds it to a database that's not connected to that
00:06:08 ◼ ► Like, so there's no, like, persistent identities going across, you know, more than a few days.
00:06:17 ◼ ► And, like, every day, it just basically, like, there's, like, analytics today and analytics
00:06:26 ◼ ► And then every day, you know, every night, there's a cron job that runs to basically consolidate
00:06:30 ◼ ► them into, like, counts and totals and percentages and stick that into analytics archive.
00:06:41 ◼ ► All I want to know is what percentage of people, you know, used X or, you know, of all the people
00:06:49 ◼ ► And that can be things, you know, basic things like, you know, what percentage of people
00:06:56 ◼ ► Or even specifics, like, what percentage of people use different types of audio outputs?
00:07:02 ◼ ► Like, what percentage of people use the built-in speaker on their phone versus Bluetooth versus
00:07:12 ◼ ► That kind of thing, like, when you plant those seeds, when you plant those features, you might
00:07:19 ◼ ► not realize when you are planting them what you will need them for or what value they will
00:07:35 ◼ ► Like, much higher than I thought when I first started trying to collect some basic data like
00:07:40 ◼ ► It can be simple things like, you know, oh, I'm going to see how many people use this feature,
00:07:44 ◼ ► and maybe down the road that might tell you, as it has with me a few times, huh, I should
00:07:59 ◼ ► Or you might learn, oh, this feature that I thought people used a lot, it turns out, like,
00:08:07 ◼ ► And so maybe that's not worth me rewriting it over the course of two months, you know, if
00:08:14 ◼ ► I can use that time in a way that would, you know, get a bigger impact for more customers.
00:08:18 ◼ ► Once you have those seeds planted, you might even discover, like, ideas that your new data
00:08:28 ◼ ► For instance, when I started doing listening stats as part of, you know, Overcast's features
00:08:35 ◼ ► last year, I started collecting listening stats because people wanted those, like, end-of-year,
00:08:39 ◼ ► like, Spotify rap-style, you know, playlist or, you know, top lists of what you listen to.
00:08:44 ◼ ► And so now I have listening stats of, like, total listening hours certain podcasts get.
00:08:51 ◼ ► Well, now I can use that to inform my search ranking algorithm or to inform promotional algorithms
00:08:57 ◼ ► because now I know not only how many people subscribe to it, not only how many people star
00:09:02 ◼ ► episodes in it, which I knew those for a long time now, but now I know how long people have
00:09:12 ◼ ► And if I'd never collected that data of listening sessions to build that other feature, if I never
00:09:18 ◼ ► had planted that seed, all of that, all those possibilities, I wouldn't even think about it.
00:09:24 ◼ ► So a lot of times you can plant these features not knowing necessarily where they will go.
00:09:33 ◼ ► If you do it very consciously with that in mind, you can greatly reduce your risks of having privacy
00:09:39 ◼ ► problems, you know, like what data you collect, how you tie it to anything, if anything, you know,
00:09:49 ◼ ► Like my session data for listening sessions, I only retain detailed versions of that for the past 48
00:09:59 ◼ ► And, you know, so there's, there's all sorts of, and that, by the way, that's why my undo
00:10:05 ◼ ► So again, like planting these seeds, you don't necessarily know where they're going to go.
00:10:14 ◼ ► That's, that's worth knowing, you know, but some of them, you might not know where it goes.
00:10:23 ◼ ► I can't tell you how many times during Instapaper and during Overcast that I wished I could like
00:10:31 ◼ ► display a message of some kind on old versions of the app that, you know, for instance, like if,
00:10:38 ◼ ► if long ago I had abandoned iOS 12 compatibility and I was about to cut off the API on the server
00:10:45 ◼ ► side that's, that iOS 12 communicated with, I would love people to like post a message in the app
00:10:51 ◼ ► for users of that old version saying, hey, sorry, this is, you know, this is going to end on this date.
00:10:57 ◼ ► And I couldn't do that because the only way you can do that is if you build in a system
00:11:01 ◼ ► that lets you post messages in the app remotely from the server without doing an app update five
00:11:07 ◼ ► years ago, because now you can no longer update that version of the app because you've moved on.
00:11:12 ◼ ► So it's like one of those features of like, you know, hey, put in a feature that you can,
00:11:17 ◼ ► you know, change something server side or, you know, change a file on S3 or something and display a
00:11:43 ◼ ► I have a minimum maximum build for each message so I can show it to just one build of the app
00:11:53 ◼ ► So now five years from now, when I have to deprecate the API that I use for iOS 17 clients
00:12:04 ◼ ► So if you think something like that might be useful to you at all, like even if you think
00:12:09 ◼ ► someday maybe I'll use this, if it's not that much effort to build, put it in there sometime,
00:12:22 ◼ ► I'm going to, I'm going to build a really boring feature that I might really appreciate
00:12:39 ◼ ► very simple web, you know, it's like what web server that's, you know, has a database behind
00:12:47 ◼ ► So like the simplest form of analytics that I think you can do that isn't super helpful
00:13:05 ◼ ► Everything is immediately aggregated and just reported in sort of these very broad, big buckets.
00:13:15 ◼ ► I don't even have user identifiers, so that wouldn't even be a thing I could do, but it's
00:13:24 ◼ ► And it was something that, you know, as I said, it did not, it was not very difficult to write
00:13:28 ◼ ► this because it is the world's simplest website because it, all it does is essentially a wrapper
00:13:33 ◼ ► around, you know, it's just a, a wrapper around some SQL queries that are just, you know,
00:13:38 ◼ ► just wrapping it to make sure that it's, you know, SQL injection safe and all the right
00:13:51 ◼ ► And very often on the other side, if the other kind of features you're describing with, you
00:13:54 ◼ ► know, I, I wish I had a, an announcements thing and it has definitely been added to my list
00:14:04 ◼ ► But in several places in my, in my apps, I have things that are driven from a very simple,
00:14:12 ◼ ► like just a JSON file on a file server somewhere, which is, you know, and very often with these
00:14:18 ◼ ► in the Swift world now, I just do this with, you know, I take a, I have a configuration struct.
00:14:30 ◼ ► You take that file and put it on a server and you can just reconstitute it using the JSON
00:14:45 ◼ ► It's like, if I had that system and had a message that I needed to send, I would just be manually
00:14:56 ◼ ► And that's in some ways kind of awkward, but also is super scalable and straightforward because
00:15:02 ◼ ► serving static JSON files, you can do to millions of people concurrently with not much, you know,
00:15:08 ◼ ► hardware or effort with, you know, I think I do most of mine with R2 and Cloudflare and
00:15:21 ◼ ► And it's something that is so, it's, it's almost feels like it's too easy that it should
00:15:28 ◼ ► But, you know, I can say from my experience, even just having something super basic and straightforward
00:15:42 ◼ ► And I think it's, I've definitely learned to be, you know, time and time again, it is be as, yeah, don't try and
00:15:55 ◼ ► But try and just instrument as much as you can, as much as is reasonable in your app, anywhere that you have, I guess in some ways it's trying to understand where inside the user's experience do they make choices.
00:16:09 ◼ ► And very often what I want to understand is which choices are people making, at what frequency, at what intervals.
00:16:20 ◼ ► I remember years ago I used an analytics package that was doing way more advanced stuff with this, where it's like, and gets a bit more into the privacy challenges, where, you know, it would try and instrument users pathing through the application and things.
00:16:32 ◼ ► You know, so they do this event, and then they do this event, and then they do this event, you know, these complicated, like, flow diagrams and stuff.
00:16:38 ◼ ► And I'm sure that's useful in some ways, but honestly, 90% of the time I think I can get enough information out of just, if a user is making a choice, which of the choices are they making at what frequency?
00:16:49 ◼ ► And you can infer, I think, a tremendous amount from that information without needing to worry about these super sophisticated, complicated, data-intensive, privacy-concerning things, like just a very simple collect event counts system.
00:17:05 ◼ ► And on the other side, with, you know, just things that are driven in the app based on JSON files, like, you can go a tremendous distance with just those two things.
00:17:24 ◼ ► Nobody likes the idea of these companies collecting your personal info and, you know, showing up in search results for your name so anybody can look up, like, you know, your phone number, your home address, like all this, you know, disgusting stuff.
00:17:36 ◼ ► So Incogni, what they do is they reach out to data brokers on your behalf, they request that your data be removed.
00:17:50 ◼ ► So you don't have to go out there and deal with hundreds of data brokers and, you know, new ones as they pop up, filing takedowns and opt-outs and everything.
00:18:04 ◼ ► You just create an account, grant them the right to contact data brokers on your behalf, and that's it.
00:18:13 ◼ ► They have a user-friendly dashboard to provide updates on the status of whatever removal requests they're currently filing.
00:18:18 ◼ ► So with Incogni on your side, you can reduce the amount of data brokers getting your contact details along.
00:18:24 ◼ ► So you can say goodbye to annoying spam and all the creepy risks that come along with this kind of thing.
00:18:32 ◼ ► It would take you hundreds of hours to do it manually, even just, you know, maybe even just one data broker.
00:18:37 ◼ ► And then you would need to repeat that process every few months as new data brokers continue collecting your data and creating new records.
00:18:55 ◼ ► Protect your privacy with Incogni and experience peace of mind knowing your personal information is safe.
00:19:19 ◼ ► Like, I think, you know, before we quite leave that topic, like, as you do your levels of, you know, hey, how many people make this choice?
00:19:26 ◼ ► One thing I have always valued is, like, anytime you have, like, a setting in the app or a view mode to a screen, instrument that.
00:19:38 ◼ ► How many people, like, you know, if you have some kind of obscure setting that is, you know, maintenance for you to maintain over time, like, oh, this screen you can view as a list or a grid or, you know, or whatever.
00:19:50 ◼ ► Whatever your default is, do you have, like, 99% of people who just leave it on the default?
00:19:56 ◼ ► Maybe you can get rid of the other option sometime, you know, as you are, you know, maintaining it over time.
00:20:01 ◼ ► You know, like, it's useful information to know, like, huh, if I do, like, when I'm redesigning the screen, do I want to do two different designs of the screen to accommodate these two different modes if only 1% of people are using the other mode?
00:20:14 ◼ ► That kind of thing can be very valuable as you plan things and evaluate things and, you know, evaluate cost and maintenance over time.
00:20:22 ◼ ► Yeah, because I think it is a funny thing where increasingly in my mind when I'm developing and designing things, I have in my mind that, like, a feature or a situation needs to be used by a meaningful proportion of users for it to be something that justifies sort of further attention and time.
00:20:40 ◼ ► And I shouldn't be too precious with, well, I built it once and so I need to maintain it and include it and have it be there forever.
00:20:49 ◼ ► But I think really, unless it is the differentiation between a free, you know, obviously your, like, premium features are going to be used by more, by fewer, much fewer people than your free features.
00:20:59 ◼ ► So, like, that differentiation doesn't quite follow this rule where if you're building your app for the 95% case, obviously your, you know, your premium situation will be slightly different than that.
00:21:08 ◼ ► But within each of those categories, building things that are focused around how people, the majority of users are actually using the app is so valuable and so helpful.
00:21:19 ◼ ► And I've just, there's so many times this summer as I've been doing these iOS 26 things that I'm like, I go and I look at the data.
00:21:39 ◼ ► Like, I think I've gotten to the point, you know, I'm pretty happy with my iOS 26 updates.
00:21:43 ◼ ► But there are a few places in, you know, especially in Widgetsmith where it's like, this is, it turns out, this is a feature that hardly anyone ever uses or ever opens.
00:21:51 ◼ ► And so those features and screens just got the, I opened them, I made sure they were not broken, and then I moved on to something else that was actually valuable and useful.
00:22:00 ◼ ► But knowing which of those things is the thing that needs, you know, that you can essentially do the light touch on, only make sure it's not broken, and then move on.
00:22:09 ◼ ► You requires that work that I've done, you know, in the past few years to collect the data.
00:22:14 ◼ ► So I know this particular feature, this particular screen doesn't need quite the level of polish that something else would.
00:22:24 ◼ ► But that is a difficult and much more complicated thing to do than, you know, just trying to understand where your emphasis is.
00:22:44 ◼ ► And I suppose this is one of those, you know, in the same way that I now have it to do to add an announcement system to my app if you are not collecting any of these kinds of things.
00:22:52 ◼ ► And I think sometimes maybe I've seen some people who have like a badge of honor that they don't collect any data as though this is something that they should be proud of and something that they are proud of.
00:23:04 ◼ ► And I mean, I'm not saying like if you're proud of that, like, you know, that's be proud of what you want to be proud of.
00:23:08 ◼ ► But I would say there has been a time in my career and a time in my history where I was much more on that side of things.
00:23:15 ◼ ► And I think in some ways the way I view it for myself now is that what I was saying is I know better than my users and I don't care how they're using it.
00:23:29 ◼ ► And I think increasingly I have a much more clear-eyed view of that, that I can learn a lot from my customers.
00:23:40 ◼ ► And as long as I do things in a clean, careful, intentional way, I don't need to feel bad about collecting general information about my users in a way that allows me to make the app better for them.
00:23:54 ◼ ► It makes me more, you know, efficient in my work because I can truly focus on things that are going to be used and impactful rather than just sort of guessing blindly in the dark or basing it all on myself.
00:24:05 ◼ ► Because, you know, for as much as it would be lovely if you're building an app where you are that, you know, the 99% user that does everything in the way that everyone does, like that is unlikely to be the case because that's just not the reality of my life.
00:24:20 ◼ ► Like I've tried that, I've tried building those apps in those ways and inevitably I find out it's like people like the core of the app, but they're using it in a way that is slightly different than necessarily the way that I do.
00:24:29 ◼ ► Yeah, I think there's a great like kind of philosophical divide there because I actually usually in most ways that I run and develop my app, usually I am more on the side of I'm going to do this the way I want or I'm going to do the features I want to do.
00:24:45 ◼ ► And I hope people like them, but I don't know, you know, that is usually closer to how I operate.
00:25:00 ◼ ► There's probably a nicer term for this, but you know, you can operate that way if that's how you choose to do your app, which again, that's usually the choice I make.
00:25:17 ◼ ► And there's, you know, as we mentioned, prioritization, you know, certain, you know, kind of basically unblindfolding yourself.
00:25:33 ◼ ► The data can just tell you and you can still if you want, like just because you have data does not necessarily mean that you have to make every decision by popular vote.
00:25:45 ◼ ► You know, if if if everyone uses this one thing and not this other thing, you don't have to get rid of the other thing or you don't have to necessarily, you know, not ever change those things.
00:25:56 ◼ ► It's like you can know the rules that you're breaking before you break them or you can you can decide, you know what, this thing is really unpopular, but I really like it.
00:26:05 ◼ ► So maybe I'll see if I can see if I can somehow convince more people to use it or maybe I'm not maybe I'm not showing the value of it, you know, in as well as I could or something like that.
00:26:13 ◼ ► So you don't have to necessarily give up creative control of what you're doing with your app by collecting data.
00:26:19 ◼ ► You can you are it's it's up to you what you do with the data and how you prioritize the insights that you get.
00:26:26 ◼ ► But if you don't have any of that data, you are just guessing and you're going to guess wrong a lot of the time.
00:26:36 ◼ ► And so as we wind down our summer work here and we're thinking about, you know, squeezing in these last few features for iOS 26, like this is just something that we're going to put out there.
00:26:45 ◼ ► That is, if you don't have any of these things, like it's probably a good, a reasonable time to do it because it's going to be a lot of upheaval and change, I suspect, in a couple of weeks.
00:26:55 ◼ ► I think we're, you know, our next episode of this is coming out on the other side of probably the iOS 26 submissions would have opened.
00:27:04 ◼ ► And so it's like it's a wild time in some ways, but it's going to be a very interesting time to just understand how people are using your apps and the best way to understand that is to have this thing.
00:27:14 ◼ ► And as we get towards that, I guess in some ways it's like, I hope, it's like my best wishes to all of our listeners who are thinking about their iOS, submitting iOS 26, you know, apps.
00:27:25 ◼ ► I think this summer has in many ways been a narrative arc between you and I of the various challenges and travails of the summer and of getting our apps ready for iOS 26.
00:27:46 ◼ ► Like I'm getting close to my, you know, the point where I put up a sign in my office that says no more new features, which, you know, is essentially me saying I'm done.
00:27:56 ◼ ► And I don't think you're quite there yet from some of the conversations I've, you know, you were saying on this week's ATP, but you're definitely seeming in a better place than you were before.
00:28:04 ◼ ► And so as we wind down the summer, you know, I think this is mostly just like, thanks everyone for enjoying the journey.
00:28:09 ◼ ► It's been really fun to hear people who found our journey helpful in this process because it has been a really interesting summer.
00:28:32 ◼ ► I'm still not happy with, you know, kind of what I was able to get done versus not get done this summer.