Sign in

Michael Freiwald

@freiwald.dev
889 followers 330 following 449 posts

📱 Developer on  platforms 👨‍💻 Mobile Consultant @ Netlight 💛 Love talking about Swift • SwiftUI • iOS 🏡 Interested in Smart Home & KNX 🇩🇪 Living in Munich with my family 👩‍❤️‍👨👧👶 Developer of @getskydeck.app & @getremark.app 🌐 freiwald.dev

PostsRepliesMedia
Michael Freiwald @freiwald.dev · 24/08/2026
Added SkyDeck's follower widget to my home screen. No more opening the app just to check the number, it's right there next to the weather 👀 #BuildInPublic #iOSDev
iPhone home screen with the SkyDeck follower-count widget next to the Weather widget, showing 887 followers.
030
Michael Freiwald @freiwald.dev · 20/08/2026
Anyone using Postiz for social media content planning? The web app is not really mobile responsive, so I‘m locking into building a native app for Apple platforms. #BuildInPublic #iOSDev
Postiz web view on a mobile device
020
Michael Freiwald @freiwald.dev · 04/08/2026
The SkyDeck account leads with 🚀 I lead with 😅, 42 times out of 250. Which is about right for shipping software😅 #BuildInPublic #iOSDev
SkyDeck on an iPhone showing the Your Emoji screen. A grinning face with sweat at the top, used 42 times, 17% of all emoji. Below: 44% of posts have an emoji, 64 different emoji, 250 in total. Then a ranked list: grinning face 30 times, relieved face 27, rocket 12, star-struck 11, smiling face 9.
182
Michael Freiwald @freiwald.dev · 16/06/2026
Finally added images to posts in the widgets 🙃 Looks a lot better now #iOSDev #BuildInPublic #SkyDeck
190
Michael Freiwald @freiwald.dev · 06/02/2026
🚀
New SkyDeck feature posting your growth graph on Bluesky
000
Michael Freiwald @freiwald.dev · 06/02/2026
Nice growth lately: +31 followers. Tracking it with @getskydeck.app #SkyDeckApp
Total follower growth graph.
000
Michael Freiwald @freiwald.dev · 19/01/2026
I think I found another good solution for using the TabViewBottomAccessory #SwiftUI #iOSDev
020
Michael Freiwald @freiwald.dev · 11/06/2025
If you want to leverage the new #SwiftUI modifiers in your existing codebase, here’s a quick example of how you can achieve this—no need to change your views once you set iOS 26 as your minimum deployment target. #iOSDev #WWDC25 #iOS26
060
Michael Freiwald @freiwald.dev · 09/06/2025
This definitely needs to be fixed first 🙃 #iOS26 #SkyDeckApp
010
Michael Freiwald @freiwald.dev · 09/06/2025
Maybe it’ll be a long night because of this...
100
Michael Freiwald @freiwald.dev · 09/06/2025
All videos will be available in one hour today. It’s going to be a long night… #WWDC25
130
Michael Freiwald @freiwald.dev · 09/06/2025
How is this possible? I thought it was supposed to be better? #WWDC25
100
Michael Freiwald @freiwald.dev · 09/06/2025
No A anymore? #WWDC25
020
Michael Freiwald @freiwald.dev · 08/06/2025
Are you (or your codebase) ready? 🤩 #WWDC #iOSDev #Apple #Xcode
020
Michael Freiwald @freiwald.dev · 08/06/2025
Just submitted the next version for @getskydeck.app 🤞 And all with @helm-app.bsky.social on iOS ☺️ #BuildInPublic #iOSDev #SkyDeck #Unfollows #Tracker
261
Michael Freiwald @freiwald.dev · 07/06/2025
And this is how it looks on the dashboard (for now 😉) #BuildInPublic #iOSDev
020
Michael Freiwald @freiwald.dev · 06/06/2025
The next feature is landing on @getskydeck.app! Unfollows have been tracked since v1.1.0, and now with v1.3.0, the UI is finally here to view them. Still figuring out the best way to represent them on the dashboard…
141
Michael Freiwald @freiwald.dev · 29/05/2025
🥳 I can now set custom rate limits for my different sync services. This helps prevent updates from hitting the official rate limit, so users can still use other features like following or blocking. #BuildInPublic #iOSDev #ATProto
150
Michael Freiwald @freiwald.dev · 21/05/2025
It depends on how you create the relationship This picture is one of my slides about SwiftData where you can see three approaches. If you want to have more details about this, look at this article fatbobman.com/en/posts/rel... from @fatbobman.bsky.social
The image compares three different approaches for associating 5000 Post objects with an Author object in Swift, using SwiftData. On the left, Swift code is shown:
	1.	Append individually – each Post is created and directly appended to author.posts.
	2.	Assign author reference – each Post is created and has its .author property set to author.
	3.	Batch append with contentsOf: – all posts are first created in an array, then added to author.posts in one step using append(contentsOf:).

On the right, a bar graph compares the performance of the three methods:
	•	Append takes 11.788ms
	•	Assign takes 1.510ms
	•	contentsOf takes 1.320ms

The graph visually emphasizes the inefficiency of individual append operations compared to batched or reference-based association.
250
Michael Freiwald @freiwald.dev · 17/05/2025
And that's a wrap — for now! 😊 Super happy with how this turned out. The new filter and sheet view feel intuitive and clean. Would love to hear your thoughts about the toggle behavior for the engagement metrics! #BuildInPublic #iOSDev #SwiftUI #UXDesign
190
Michael Freiwald @freiwald.dev · 16/05/2025
I’m really leaning toward this approach—it feels much better! Just a few more UI tweaks, and it should be solid. 🚀 #BuildInPublic #iOSDev #SwiftUI #UXDesign #Filters #SheetView
Screenshot of the Post Performance view in the Skydeck app on an iPhone. It features a sheet interface with filters for time range (e.g., This week, This month) and engagement metrics (e.g., Like, Reply, Repost), as well as options to filter posts by type (Posts only, Posts & Replies, All).
030
Michael Freiwald @freiwald.dev · 16/05/2025
Thinking of adding another filter to the Post Performance feature in @getskydeck.app Currently, it shows all posts, including replies. I’ve added a filter to the view, but I’m unsure about the UX. Another idea: move everything to a sheet view. Thoughts? Feedback? #BuildInPublic #iOS #UI #UX
Three screenshots of the Post Performance feature in a mobile app.

The first screenshot shows a drop-down menu for selecting time filters: 'All time,' 'This week,' 'This month,' and 'This year.'
The second screenshot displays filter options above the post list: checkboxes for 'Posts only,' 'Posts and Replies,' and 'All.'
The third screenshot illustrates a 'Filter only' dropdown menu, showing filter categories like Likes, Replies, Reposts, and Quotes.
Each screen has a clean, modern user interface with tabs at the bottom for navigation.
020
Michael Freiwald @freiwald.dev · 15/05/2025
Used #Instruments to cut AVG view body time for two #SwiftUI views from 150-200ms to 17-24ms. 🚀 Small changes, big performance boost. #iOSDev #Swift
140
Michael Freiwald @freiwald.dev · 09/05/2025
Here's another version showing how smooth the swipe and movement are. It's an infinite card stack—the front card slides back to the end of the stack, keeping the flow seamless.
010
Michael Freiwald @freiwald.dev · 09/05/2025
Looked through my old photos and found this from two years ago. Still proud of how it turned out with #SwiftUI. Even added motion sensor support for subtle movement inside the card.
130
Michael Freiwald @freiwald.dev · 03/05/2025
AppStore Screenshots are not 100% automated yet, but I started creating them with SwiftUI and later I can just run a UITest which creates snapshots of every "tab" #BuildInPublic #SwiftUI #AppStore
080
Michael Freiwald @freiwald.dev · 30/04/2025
🚀 Exciting update ahead of the next #SkyDeck release! I’ve integrated #ATProto Verify records into the Profile view. Now you can easily see if a user is verified by trusted verifiers or others. 🔍✨ #BuildInPublic #iOSDev
Three iPhones frames with screenshots of SkyDeck App highlighting a the "Verified" feature
171
Michael Freiwald @freiwald.dev · 29/04/2025
The next version of @getskydeck.app will switch the user accounts when clicking on the corosponding profile widget Multi-Account support is exclusive to SkyDeck Pro users. To make things clear and user-friendly, I’ve added Toast notifications to provide helpful hints where needed. #iOSDev #SwiftUI
010
Michael Freiwald @freiwald.dev · 27/04/2025
Hey @telemetrydeck.com would it be possible to exclude TestFlight purchases from the Purchases & Revenue views?
110
Michael Freiwald @freiwald.dev · 14/04/2025
I‘m really impressed by the new GPT-4o image generation. But I‘m not feeling very comfortable to use an 100% AI generated app icon for #SkyDeck
An AI generated app icon showing a butterfly half cut by a hammer
250
Michael Freiwald @freiwald.dev · 11/04/2025
Yes there is already something in place ☺️
010
Michael Freiwald @freiwald.dev · 11/04/2025
Do you mean something like that?
100
Michael Freiwald @freiwald.dev · 10/04/2025
That’s all for now
030
Michael Freiwald @freiwald.dev · 10/04/2025
Also took a peek at the Apple TV app and now I’m reconsidering the zoom transition for navigating to the profiles again… They keep the tab bar visible and and having the drag gesture would make it possible to remove the native Navbar.. #SwiftUI
000
Michael Freiwald @freiwald.dev · 10/04/2025
Been going back and forth a lot lately with the profile view. The first drafts required either a custom navigation bar or some UIKit hacks—which I really wanted to avoid. So I asked my “designer” for a few fresh ideas. And here’s the current version - feeling pretty good about it! #BuildInPublic
460
Michael Freiwald @freiwald.dev · 06/04/2025
Okay, I’ll probably skip the zoom transition, but I’m thinking about trying something with contextMenu previews instead. 🤔
020
Michael Freiwald @freiwald.dev · 05/04/2025
I'm a bit uncertain about the navigation transition. I love how smooth and intuitive the zoom transition in SwiftUI is, but I'm not sure how well it works for deep navigation scenarios, like going from Profile A -> Profile B -> Profile A #BuildInPublic #iOSDev #SwiftUI
250
Michael Freiwald @freiwald.dev · 03/04/2025
Kind of happy with the current state of the view #SkyDeck #BuildInPublic
160
Michael Freiwald @freiwald.dev · 02/04/2025
It’s been pretty quiet these past few days, so I used the time to work on another new feature (again 😅). The ProfileView isn’t finished or perfect yet, but here’s a first draft 👀 #BuildInPublic #iOSDev #SwiftUI
image
020
Michael Freiwald @freiwald.dev · 29/03/2025
Building the feature: 1 day Making it better: 2 more days 😅 I've boosted performance in calculating your top posts. Plus, now you can customize the time span to focus on specific date ranges for more tailored insights. 🎉 Will upload a new TestFlight later ☺️ #buildinpublic #iOSDev #SkyDeck
041
Michael Freiwald @freiwald.dev · 27/03/2025
I've put in a lot of time to build a strong foundation for #SkyDeck, and now I can add new features in a day! 🚀 Want to see your top posts? I'm rolling out v1.2.0 next week! 🤩 #BuildInPublic #iOSDev #BSkyApps
040
Michael Freiwald @freiwald.dev · 27/03/2025
Planned for minor tweaks, decided to implement the Top Posts feature instead. 🔄 Sometimes projects take unexpected turns. #DevLife #buildinpublic #iOSDev #SkyDeck
130
Michael Freiwald @freiwald.dev · 23/03/2025
The tuple should be the problem? I don't think so, because calling the Tuple version from other places works as expected (not on main-thread)
000
Michael Freiwald @freiwald.dev · 23/03/2025
It gets even better with SwiftData and ModelActor 🙈 One function is called on main-thread the other not 🤪
320
Michael Freiwald @freiwald.dev · 23/03/2025
Ok, so ModelActor protocol is doing really wired things... To do ModelContext stuff on background: ➡️ Init ModelActor on a background thread This should do all ModelContext stuff in background BUT everything happening in ModelActor functions is happening on the Main-Thread 🤯 #SwiftData
020
Michael Freiwald @freiwald.dev · 22/03/2025
Fixed some small bugs for #SkyDeck and finally improved the Follower List! 🛠️ Now you can see more details about the profiles following you. Should help decide whether to follow back right away or not. #buildinpublic #iOSDev #SwiftUI
A smartphone screen showing a dark mode interface of a social media app's "New Followers" page. The screen displays four user profiles with their avatars, usernames, brief descriptions, and follower/following counts. Options to follow or unfollow each account are visible.
130
Michael Freiwald @freiwald.dev · 21/03/2025
Do you know about context menus? 😅
000
Michael Freiwald @freiwald.dev · 18/03/2025
2. Manual migrations: These present optional actions to the user. Developers can show hints or prompts for users to perform these actions if they choose. The term "Migration" might not be ideal, as it's more of an optional action the user can perform rather than a true migration.
020
Michael Freiwald @freiwald.dev · 18/03/2025
I've developed an interesting Migration System in #Swift for handling app updates. This system allows developers to perform actions when a user installs an app update, offering two main functionalities:
enum MigrationType {
  case automatic
  case manual
}

protocol Migration {
  associatedtype Action: MigrationAction
  
  var id: String { get }
  var version: String { get }
  var type: MigrationType { get }
  var title: String { get }
  var systemImage: String { get }
  var description: String { get }
  var action: Action { get }
  func shouldApply(previousVersion: String?, currentVersion: String) -> Bool
}

extension Migration {
  func shouldApply(previousVersion: String?, currentVersion: String) -> Bool {
    // No previous version means, no migration needed at all
    guard let previousVersion else { return false }
    return previousVersion.compare(version, options: .numeric) == .orderedAscending && currentVersion.compare(version, options: .numeric) != .orderedAscending
  }
}

protocol MigrationAction {
  associatedtype Dependencies
  associatedtype Output

  var title: String { get }
  var dependencies: Dependencies { get }
  func execute(_ trigger: MigrationDependenciesTrigger) async throws -> Output
}
110
Michael Freiwald @freiwald.dev · 18/03/2025
Am I the only one having trouble reading these mismatched numbers? 🫣 Xcode 16.3 beta 3 using the SDK for iOS 18.4 beta 4
Xcode 16.3 beta 3 using the SDK for
iOS 18.4 beta 4, iPadOS 18.4 beta 4,
100