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
join.jacobstechtavern.com
My life was a lie. It turns out the shiny new Mutex was just syntax sugar on `os_unfair_lock` all along 👻
Read my full article to see how performance of this Mutex in the Synchronisation framework compares against Swift actors: blog.jacobstechtavern.com/p/the-synchr...
Read my full article to see how performance of this Mutex in the Synchronisation framework compares against Swift actors: blog.jacobstechtavern.com/p/the-synchr...
November 4, 2025 at 8:00 AM
My life was a lie. It turns out the shiny new Mutex was just syntax sugar on `os_unfair_lock` all along 👻
Read my full article to see how performance of this Mutex in the Synchronisation framework compares against Swift actors: blog.jacobstechtavern.com/p/the-synchr...
Read my full article to see how performance of this Mutex in the Synchronisation framework compares against Swift actors: blog.jacobstechtavern.com/p/the-synchr...
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
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
November 3, 2025 at 9:25 PM
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
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
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.
The prize? The hearts and souls of native mobile engineers everywhere.
November 3, 2025 at 5:01 PM
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.
The prize? The hearts and souls of native mobile engineers everywhere.
SwiftUI is like magic. But, like all well-designed magic systems, it comes with a cost.
What, you thought that beautiful declarative syntax and automatic data bindings come free? Think again.
What, you thought that beautiful declarative syntax and automatic data bindings come free? Think again.
November 3, 2025 at 8:01 AM
SwiftUI is like magic. But, like all well-designed magic systems, it comes with a cost.
What, you thought that beautiful declarative syntax and automatic data bindings come free? Think again.
What, you thought that beautiful declarative syntax and automatic data bindings come free? Think again.
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.
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.
November 2, 2025 at 5:02 PM
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.
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.
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
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
November 2, 2025 at 11:00 AM
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
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
My favourite Swift feature is switching over self on enum computed properties and it’s not close
What’s your favourite?
Master Swift for 10 mins a week @ join.jacobstechtavern.com
What’s your favourite?
Master Swift for 10 mins a week @ join.jacobstechtavern.com
November 1, 2025 at 5:00 PM
My favourite Swift feature is switching over self on enum computed properties and it’s not close
What’s your favourite?
Master Swift for 10 mins a week @ join.jacobstechtavern.com
What’s your favourite?
Master Swift for 10 mins a week @ join.jacobstechtavern.com
Jacob’s Tech Tavern is hiring!! 🚀
I need to pay someone £10 a pop to hit me over the head with a bat whenever I touch my Facebook ads
Pls apply in the comments below
I need to pay someone £10 a pop to hit me over the head with a bat whenever I touch my Facebook ads
Pls apply in the comments below
November 1, 2025 at 11:29 AM
Jacob’s Tech Tavern is hiring!! 🚀
I need to pay someone £10 a pop to hit me over the head with a bat whenever I touch my Facebook ads
Pls apply in the comments below
I need to pay someone £10 a pop to hit me over the head with a bat whenever I touch my Facebook ads
Pls apply in the comments below
I need to find a way to integrate these kinds of stats into Jacob's Tech Tavern.
I reckon I'm sleeping on some great viral shareability.
What stats would people like to see?
I reckon I'm sleeping on some great viral shareability.
What stats would people like to see?
November 1, 2025 at 11:00 AM
I need to find a way to integrate these kinds of stats into Jacob's Tech Tavern.
I reckon I'm sleeping on some great viral shareability.
What stats would people like to see?
I reckon I'm sleeping on some great viral shareability.
What stats would people like to see?
You after reading Jacob’s Tech Tavern for 10 minutes (sorry for the slop 😅)
October 31, 2025 at 8:38 PM
You after reading Jacob’s Tech Tavern for 10 minutes (sorry for the slop 😅)
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.
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.
October 31, 2025 at 7:40 PM
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.
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.
First they came for the URL.appendingPathComponent(_:), but I was not a path component, so I said nothing...
October 31, 2025 at 2:00 PM
First they came for the URL.appendingPathComponent(_:), but I was not a path component, so I said nothing...
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
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
October 31, 2025 at 12:58 PM
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
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
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
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
October 31, 2025 at 11:01 AM
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
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
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
October 31, 2025 at 8:37 AM
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
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
Just tried to sign in with 2FA mid-mouthful-of-coffee and oh man is it hard to do without reading out loud
October 31, 2025 at 8:37 AM
Just tried to sign in with 2FA mid-mouthful-of-coffee and oh man is it hard to do without reading out loud
Strictly speaking not tech related but here’s a video of Cody booping my son’s face 🥹
October 31, 2025 at 8:00 AM
Strictly speaking not tech related but here’s a video of Cody booping my son’s face 🥹
The 3 horsemen of Substack
October 30, 2025 at 9:15 PM
The 3 horsemen of Substack
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
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
October 30, 2025 at 4:56 PM
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
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
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
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
October 30, 2025 at 4:54 PM
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
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
LazyVStack got a serious under-the-hood performance upgrade in iOS 18 🦹♀️
My vsync and memory profiling massively exceeded my expectations.
I’ve read before that LazyVStack is only lazy one-way; with cells sticking around in memory indefinitely after appearing.
My vsync and memory profiling massively exceeded my expectations.
I’ve read before that LazyVStack is only lazy one-way; with cells sticking around in memory indefinitely after appearing.
October 30, 2025 at 2:05 PM
LazyVStack got a serious under-the-hood performance upgrade in iOS 18 🦹♀️
My vsync and memory profiling massively exceeded my expectations.
I’ve read before that LazyVStack is only lazy one-way; with cells sticking around in memory indefinitely after appearing.
My vsync and memory profiling massively exceeded my expectations.
I’ve read before that LazyVStack is only lazy one-way; with cells sticking around in memory indefinitely after appearing.
The backend-driven SwiftUI spec we designed is flexible enough to use stack layouts and nested navigation links. Using it, we can create a Netflix-style layout with a list of videos alongside a player. (screenshot 1)
We achieve this by adding containers and navigation.
We achieve this by adding containers and navigation.
October 30, 2025 at 11:01 AM
The backend-driven SwiftUI spec we designed is flexible enough to use stack layouts and nested navigation links. Using it, we can create a Netflix-style layout with a list of videos alongside a player. (screenshot 1)
We achieve this by adding containers and navigation.
We achieve this by adding containers and navigation.
Had the stupidest bug ever with SF symbols this week.
Image(systemName: "microphone") worked fine, but broke for my iOS 17 test device. The image simply wasn't there.
The culprit?
The symbol was called "mic" prior to iOS 18. 🤦
Image(systemName: "microphone") worked fine, but broke for my iOS 17 test device. The image simply wasn't there.
The culprit?
The symbol was called "mic" prior to iOS 18. 🤦
October 30, 2025 at 8:00 AM
Had the stupidest bug ever with SF symbols this week.
Image(systemName: "microphone") worked fine, but broke for my iOS 17 test device. The image simply wasn't there.
The culprit?
The symbol was called "mic" prior to iOS 18. 🤦
Image(systemName: "microphone") worked fine, but broke for my iOS 17 test device. The image simply wasn't there.
The culprit?
The symbol was called "mic" prior to iOS 18. 🤦
The website you spent too much time on in the 2010s → the tech company you work for
4chan → X (formerly Tumblr)
MySpace → Meta
Wasn't allowed on the internet → Amazon
Club Penguin → Microsoft
Formspring → TikTok
Habbo Hotel → Airbnb
StumbleUpon → YouTube
Newgrounds → Google
4chan → X (formerly Tumblr)
MySpace → Meta
Wasn't allowed on the internet → Amazon
Club Penguin → Microsoft
Formspring → TikTok
Habbo Hotel → Airbnb
StumbleUpon → YouTube
Newgrounds → Google
October 29, 2025 at 9:45 PM
The website you spent too much time on in the 2010s → the tech company you work for
4chan → X (formerly Tumblr)
MySpace → Meta
Wasn't allowed on the internet → Amazon
Club Penguin → Microsoft
Formspring → TikTok
Habbo Hotel → Airbnb
StumbleUpon → YouTube
Newgrounds → Google
4chan → X (formerly Tumblr)
MySpace → Meta
Wasn't allowed on the internet → Amazon
Club Penguin → Microsoft
Formspring → TikTok
Habbo Hotel → Airbnb
StumbleUpon → YouTube
Newgrounds → Google