Jacob Bartlett 🍺

Jacob Bartlett 🍺

@jacobstechtavern.com

Writing the #1 iOS newsletter on Substack. Turbocharge your Swift career with in-depth weekly articles 🚀 Sign up free today! join.jacobstechtavern.com

468 followers1.1K following2.9K posts

Indie creator log day 13/100 (before my wife makes me get a real job) ARR growth: +$636. I can proudly announce I have achieved minimum wage 🎉 If I can release a banger like this every week we might be getting somewhere. Spent the day rushing to finish my Kotlin Multiplatform

View full thread

concurrency course as a new pillar in why someone should become a paid subscriber. Think like a game where each level is an increasingly difficult puzzle that you have to solve with a different tool, or combination of tools, in Swift Concurrency. With my full focus this week, I'm aiming to get it

Indie creator log day 13/100 (before my wife makes me get a real job) ARR growth: +$636. I can proudly announce I have achieved minimum wage 🎉 If I can release a banger like this every week we might be getting somewhere. Spent the day rushing to finish my Kotlin Multiplatform

View full thread

Thanks a ton to to Alex Bush and Pierluigi Cifani 🙏 I have an interview with a very legendary figure in the iOS community tomorrow, so I spent the rest of the day prepping the various questions I want to ask. With the rest of the day, I actually managed to get a gym session in which is

crazy. I think my potential positive avenues vis-a-vis sponsorship has reduced the intensity with which I'm going to try and muck around with LeetCode. Depends on my runway though. Spent the last part of the day planning out my “Swift Concurrency Kata” which is going to join in with my

Indie creator log day 13/100 (before my wife makes me get a real job) ARR growth: +$636. I can proudly announce I have achieved minimum wage 🎉 If I can release a banger like this every week we might be getting somewhere. Spent the day rushing to finish my Kotlin Multiplatform

vs Swift for Android post. Fortunately/unfortunately, they team had just merged in a way to interop Async/Await with swift-java. This dramatically improves the ergonomics, but I had to re-write my whole f*cking project. Got it out in time. Managed to get some people to proofread my stuff.

It's the "Xbox vs. Playstation" of the multiplatform era. Swift for Android has arisen to challenge the dominance of Kotlin Multiplatform. The prize? The hearts and souls of native mobile engineers everywhere.

View full thread

SwiftUI can run into very painful performance problems when dealing with infinite scrolling feeds. Today, we will investigate these performance problems, understand why they happen, and explore techniques to mitigate them, making your SwiftUI performance buttery smooth 🧈.

To achieve the maximum 120Hz refresh rate, the main thread has to execute all layout computation and rendering in 8.3ms to avoid a frame drop: the dreaded hitch. With system overhead, you’re lucky to get 5ms for this work.

The 120FPS SwiftUI challenge: Pushing LazyVStack with dynamic sizing Let’s take a look at dynamically-sized cells. Because LazyVStack sizing and layout computations are performed on-demand, we are trading off some accuracy to get this performance.

View full thread

If you programmatically scroll to a specific cell way off-screen, SwiftUI suddenly has to run all this layout computation, causing a big performance hit. With dynamically-sized cells, we see a visible degradation in performance, with several dropped frames.

The 120FPS SwiftUI challenge: Pushing LazyVStack with dynamic sizing Let’s take a look at dynamically-sized cells. Because LazyVStack sizing and layout computations are performed on-demand, we are trading off some accuracy to get this performance.

LazyVStack dynamically estimates geometry based on the number of views. What does this mean practically? Let’s imagine your views are all dynamically sized, or your layout contains cells with varying heights.

Advanced Swift tips: Argument Attributes It's not every day a meme gives you imposter syndrome, but this showed me I knew nothing about argument attributes. To fix this knowledge gap, I built an app implementing a function using @escaping @Sendable @MainActor @autoclosure

Indie creator log day 10/100 (before my wife makes me get a real job) ARR growth: +$455 🚀 this is the first day since I started where the ARR growth is actually on-plan, so I’m gonna have a beer to celebrate. Uuhh I was super busy writing so forgot to do this as I went along.

I spent all day writing "Swift for Android vs Kotlin Multiplatform". Coming Monday. Also fixed some boring tracking stuff with my ads. Annoyingly, after a great first day, the Meta algo ate 98% of my ad spend on the Apple Notes ad with zero extra results. Turned the f*cker off. I really need

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering

View full thread

It's just the subscribe button that I'm trying to track was being ignored in favour of the subscribe quick link that is added to the bottom of the page by default. Thanks Beehiv! I cannot believe you didn't test this once. It's not fun to debug this. It's not like coding, it's like… a sh*t version

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering

View full thread

growth engine of about $1 per signup. Remember to tip your marketing guy because it is incredibly annoying to set up this tracking and attribution. It's so fiddly, I mean, I'm sort of already quite good at it because every time it broke, the marketing people would always make it my problem.

But damn, I hate it. I can't believe that before App Tracking Transparency and cookies, you could literally just track people and it would work perfectly. I feel like maybe privacy has gone too far. After debugging the tracking again, it looks like it is working fine.

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering

View full thread

very profitable engine where I reinvest revenue into inorganic growth, and Surprisingly good results with my Apple-Notes-style ad, so will keep that one running. Re-made the carousel with my thumbnails, mostly because I’m very attached to it. My “Apple is Killing Swift” creative is still

getting incredibly cheap clicks but terrible landing-page conversion, so I ran an A/B test, creating a variant where traffic is sent to Beehiv page with a free subscriber break. Interested to see if this converts better, because if I can get 33% conversion on this page, we have an ultra-cheap

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering

I make for my work because it's pretty obvious that if I post an article about this ASAP, it'll probably make me some money. If you want me to save you the time, don't do it. It took me forever to get my head around the weird broken bridging so I didn’t get a chance to self-flaggelate via leetcode

or even get a rough draft ready. Maybe tomorrow I can do a LeetCode marathon if I get this post finished. I have a killer thumbnail though, I won’t spoil it yet. Spent the morning looking at my ads. They are actually getting pretty cheap now. If I can successfully sell ad space, I can see a

Swift 6 and iOS 18 introduce the Synchronization framework, containing two new low-level concurrency primitives — Mutex and Atomics.  These features could only be introduced with Swift 6 because they are implemented using the brand-new generic ownership mechanics. I tested them out and

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering I

View full thread

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering I

View full thread

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering I

View full thread

Indie creator log day 9/100 (before my wife makes me get a real job) ARR growth: +$142, despite getting 4 new paid subs in the last 24 hours. Make it make sense! I spent quite a lot of my day smashing my head against Kotlin Multiplatform and Swift for Android. This is the sort of suffering I