41554 blogs · [ { "id": "01a07df4-8104-72cc-a953-856e4e6632bb", "title": "Apple Foundation Models: Hybrid AI with Dynamic Profiles", "url": "https://peterfriese.dev/blog/2026/hybrid-ai-apple-foundation-models-gemini/", "published_at": "2026-08-18T07:41:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e4ea1cb1c", "title": "Agentic Coding in Xcode with Gemini CLI", "url": "https://peterfriese.dev/blog/2026/agentic-coding-xcode-geminicli/", "published_at": "2026-02-11T12:13:50+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e4edbcb4d", "title": "Turn Your Photos Into Miniature Magic with Nano Banana", "url": "https://peterfriese.dev/blog/2025/gemini-nano-banana-ios/", "published_at": "2025-09-12T13:48:15+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e4f446747", "title": "Reverse-Engineering Xcode's Coding Intelligence prompt", "url": "https://peterfriese.dev/blog/2025/reveng-xcode-coding-intelligence/", "published_at": "2025-06-21T09:41:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e502f0486", "title": "Extracting structured data from PDFs using Gemini 2.0 and Genkit", "url": "https://peterfriese.dev/blog/2025/gemini-genkit-pdf-structured-data/", "published_at": "2025-02-16T16:30:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e509e7c01", "title": "Understanding SwiftUI Preferences", "url": "https://peterfriese.dev/blog/2025/swiftui-preferences-swift6/", "published_at": "2025-02-03T12:30:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5160b82a", "title": "Creating a reusable action menu component in SwiftUI", "url": "https://peterfriese.dev/blog/2025/swiftui-action-menu/", "published_at": "2025-01-20T15:30:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e51b2ec82", "title": "Creating custom SF Symbols using the SF Symbols app", "url": "https://peterfriese.dev/blog/2025/custom-sf-symbols/", "published_at": "2025-01-09T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e51b2fe69", "title": "Improve your app's UX with SwiftUI's task view modifier", "url": "https://peterfriese.dev/blog/2024/delay-task-modifier/", "published_at": "2024-10-18T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e524c1830", "title": "SwiftUI Hero Animations with NavigationTransition", "url": "https://peterfriese.dev/blog/2024/hero-animation/", "published_at": "2024-06-21T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e52febe68", "title": "Styling SwiftUI Views", "url": "https://peterfriese.dev/blog/2023/swiftui-styling-views/", "published_at": "2023-01-06T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e537cf9e0", "title": "Previewing Stateful SwiftUI Views", "url": "https://peterfriese.dev/blog/2022/swiftui-previews-interactive/", "published_at": "2022-12-21T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e545feb78", "title": "Asynchronous programming with SwiftUI and Combine", "url": "https://peterfriese.dev/blog/2022/combine-vs-async/", "published_at": "2022-03-21T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e54f617c4", "title": "Building a Custom Combine Operator for Exponential Backoff", "url": "https://peterfriese.dev/blog/2022/swiftui-combine-custom-operators/", "published_at": "2022-03-03T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e552f29b1", "title": "Error Handling with Combine and SwiftUI", "url": "https://peterfriese.dev/blog/2022/swiftui-combine-networking-errorhandling/", "published_at": "2022-02-14T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5611362f", "title": "Calling asynchronous Firebase APIs from Swift", "url": "https://peterfriese.dev/blog/2022/firebase-async-calls-swift/", "published_at": "2022-01-31T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e57048e9a", "title": "Optimise your networking layer with Combine", "url": "https://peterfriese.dev/blog/2022/swiftui-combine-networking-efficient/", "published_at": "2022-01-24T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e57df8e02", "title": "Networking with Combine and SwiftUI", "url": "https://peterfriese.dev/blog/2022/swiftui-combine-networking-gettingstarted/", "published_at": "2022-01-17T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5801e87e", "title": "Confirmation Dialogs in SwiftUI", "url": "https://peterfriese.dev/blog/2021/swiftui-confirmation-dialogs/", "published_at": "2021-11-26T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e58a2c556", "title": "Using View Modifiers to Display Empty State", "url": "https://peterfriese.dev/blog/2021/swiftui-empty-state/", "published_at": "2021-11-12T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5983f15b", "title": "Managing Focus in SwiftUI List Views", "url": "https://peterfriese.dev/blog/2021/swiftui-list-focus/", "published_at": "2021-11-05T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5a1984f5", "title": "Swipe Actions in SwiftUI 3", "url": "https://peterfriese.dev/blog/2021/swiftui-listview-part4/", "published_at": "2021-10-18T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5b09f84e", "title": "Styling List Views", "url": "https://peterfriese.dev/blog/2021/swiftui-listview-part3/", "published_at": "2021-09-29T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5bcef669", "title": "Building Dynamic Lists in SwiftUI", "url": "https://peterfriese.dev/blog/2021/swiftui-listview-part2/", "published_at": "2021-09-06T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5c980f28", "title": "Building Static Lists in SwiftUI", "url": "https://peterfriese.dev/blog/2021/swiftui-listview-part1/", "published_at": "2021-08-30T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5d3d539d", "title": "Cooperative Task Cancellation", "url": "https://peterfriese.dev/blog/2021/swiftui-concurrency-essentials-part2/", "published_at": "2021-07-11T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5e32d605", "title": "Getting Started with async/await in SwiftUI", "url": "https://peterfriese.dev/blog/2021/swiftui-concurrency-essentials-part1/", "published_at": "2021-06-24T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5ee5d86e", "title": "SwiftUI List Bindings", "url": "https://peterfriese.dev/blog/2021/swiftui-list-item-bindings-behind-the-scenes/", "published_at": "2021-06-10T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e5fb34f42", "title": "Mapping Firestore Data in Swift", "url": "https://peterfriese.dev/blog/2021/firestore-codable-the-comprehensive-guide/", "published_at": "2021-03-23T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e60a09145", "title": "Using async/await in SwiftUI", "url": "https://peterfriese.dev/blog/2021/async-await-in-swiftui/", "published_at": "2021-02-09T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e6164b3e0", "title": "Firebase Authentication: Migrating User Data", "url": "https://peterfriese.dev/blog/2020/replicating-reminder-swiftui-firebase-part4/", "published_at": "2020-11-09T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e61bcd13d", "title": "Firebase and the new SwiftUI 2 Application Life Cycle", "url": "https://peterfriese.dev/blog/2020/swiftui-new-app-lifecycle-firebase/", "published_at": "2020-10-19T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e629808f9", "title": "The Ultimate Guide to the SwiftUI 2 Application Life Cycle", "url": "https://peterfriese.dev/blog/2020/ultimate-guide-to-swiftui2-application-lifecycle/", "published_at": "2020-10-09T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e62a3ab7a", "title": "Updating Data in Firestore from a SwiftUI app", "url": "https://peterfriese.dev/blog/2020/swiftui-firebase-update-data/", "published_at": "2020-09-28T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e62b0d1f2", "title": "Fetching API Keys from Property List Files", "url": "https://peterfriese.dev/blog/2020/reading-api-keys-from-plist-files/", "published_at": "2020-08-12T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e632cad3f", "title": "Adding Data to Firestore from a SwiftUI app", "url": "https://peterfriese.dev/blog/2020/swiftui-firebase-add-data/", "published_at": "2020-07-01T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e64061162", "title": "SwiftUI: Mapping Firestore Documents using Swift Codable", "url": "https://peterfriese.dev/blog/2020/swiftui-firebase-codable/", "published_at": "2020-05-05T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e649ac715", "title": "SwiftUI: Fetching Data from Firestore in Real Time", "url": "https://peterfriese.dev/blog/2020/swiftui-firebase-fetch-data/", "published_at": "2020-04-22T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e6507d78c", "title": "Sign in with Apple using SwiftUI and Firebase", "url": "https://peterfriese.dev/blog/2020/replicating-reminder-swiftui-firebase-part3/", "published_at": "2020-03-24T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e6604ae05", "title": "Connecting SwiftUI and Cloud Firestore", "url": "https://peterfriese.dev/blog/2020/replicating-reminder-swiftui-firebase-part2/", "published_at": "2020-02-05T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e6662536b", "title": "SwiftUI, Combine, and Firebase", "url": "https://peterfriese.dev/blog/2020/replicating-reminder-swiftui-firebase-part1/", "published_at": "2020-01-18T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e66e59d81", "title": "Essential Xcode Shortcuts for More Efficient Coding", "url": "https://peterfriese.dev/blog/2019/xcode-shortcuts/", "published_at": "2019-10-07T00:00:00+00:00" }, { "id": "01a07df4-8104-72cc-a953-856e67183822", "title": "SwiftUI + Combine = ❤️", "url": "https://peterfriese.dev/blog/2019/swift-combine-love/", "published_at": "2019-09-13T00:00:00+00:00" } ] posts Claim your blog
Back to Peter Friese
Blog · corpus.blog/blogs/peterfriese.dev/posts

Peter Friese

peterfriese.dev

2026

2025

2024

2023

2022

2021

2020

2019