<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"><channel><description>I write Swift and write about Swift, but most people prefer my dogs.</description><link>https://bsky.app/profile/twostraws.bsky.social</link><title>@twostraws.bsky.social - Paul Hudson</title><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlwdnepzoc2i</link><description>Can I make one YouTube video showing all the features in Kickstart? No! But I can certainly try to show off my favorites 😎  youtu.be/nJmzliRXg2M&#xA;https://youtu.be/nJmzliRXg2M</description><pubDate>15 May 2026 22:04 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlwdnepzoc2i</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlvx7vtuuc27</link><description>My new Mac app is out today, and I wrote a blog post about it: what it does, who it&#39;s for, and what you get for free. (Spoiler: it&#39;s a lot! 😅)  https://www.hackingwithswift.com/articles/285/introducing-kickstart-the-app-that-helps-indie-developers-ship</description><pubDate>15 May 2026 18:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlvx7vtuuc27</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlvh6gkr4k25</link><description>My new Mac app is out today! It&#39;s called Kickstart, and it has just one job: helping indie app developers make more money on the App Store. It is *packed* with features, many of which are completely free. Get it here: https://apps.apple.com/app/kickstart-app-accelerator/id6758355178</description><pubDate>15 May 2026 13:35 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlvh6gkr4k25</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlsv7hqwwk24</link><description>accessibilityInputLabels() lets Voice Control users activate UI controls with custom spoken commands. Without it, they&#39;d have to recite the entire text of a view just to tap a button - imagine doing that when a stock price changes every second. https://www.hackingwithswift.com/articles/261/i-screwed-up-one-key-accessibility-behavior-and-now-i-m-on-a-mission-to-do-better</description><pubDate>14 May 2026 13:08 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlsv7hqwwk24</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlnv567k6k24</link><description>Use @Attribute(.externalStorage) to hint to SwiftData that large data like images should live outside the main store. It handles everything transparently, just don&#39;t try using those properties in predicates. https://www.hackingwithswift.com/quick-start/swiftdata/how-to-store-swiftdata-attributes-in-an-external-file</description><pubDate>12 May 2026 13:23 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlnv567k6k24</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mllevupzac2j</link><description>Pro tip: Some APIs are fundamentally unsafe to call from async contexts. The @available(*, noasync) attribute lets you mark them as such, so the compiler will warn callers rather than letting subtle bugs slip through at runtime. https://www.hackingwithswift.com/swift/5.7/noasync</description><pubDate>11 May 2026 13:28 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mllevupzac2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mliulrrow22j</link><description>Sunday Build with HWS+: Flashcard apps are great for studying, but making the cards is tedious. This one uses Apple&#39;s Foundation Models framework to generate study cards automatically from any text you paste in. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/snapcards</description><pubDate>10 May 2026 13:30 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mliulrrow22j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlgxm7a7k222</link><description>Chapter 3 of the Swift AI Playbook is out now, showing how to use text to speech to create beautiful, natural voices locally ✨ https://www.hackingwithswift.com/store/swift-ai-playbook</description><pubDate>09 May 2026 19:19 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlgxm7a7k222</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlgolcx43c2j</link><description>Floof patrol reporting for duty!</description><pubDate>09 May 2026 16:37 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlgolcx43c2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mldwcepozc2j</link><description>📚 SwiftUI colors aren&#39;t resolved to specific RGB values until they&#39;re drawn, so you need the environment to extract actual components. Use resolve(in:) to get a Color.Resolved you can inspect or encode as JSON. https://www.hackingwithswift.com/quick-start/swiftui/how-to-read-the-red-green-and-blue-values-from-a-color</description><pubDate>08 May 2026 14:18 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mldwcepozc2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mlbalfbffk2j</link><description>A handful of lines of Metal shading language can produce remarkable visual effects in SwiftUI ✨ Inferno is an open-source library of ready-to-use shaders that makes GPU-accelerated graphics accessible to every developer. https://www.hackingwithswift.com/articles/262/introducing-inferno-metal-shaders-for-swiftui</description><pubDate>07 May 2026 12:44 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mlbalfbffk2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3ml6tm4abhk2j</link><description>For HWS+ subscribers: A few lines of Core Motion code and suddenly your SwiftUI views respond to how the device is held - screen-blended circles, spinning masks, and even 3D rotations. https://www.hackingwithswift.com/plus/swiftui-special-effects/controlling-views-using-the-accelerometer</description><pubDate>06 May 2026 13:46 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3ml6tm4abhk2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3ml4bcotp2s2j</link><description>Mark a SwiftData property with @Transient and it stays in memory only, never written to disk. Two rules: it needs a default value, and you can&#39;t use it in predicates. 💾 https://www.hackingwithswift.com/quick-start/swiftdata/how-to-make-transient-attributes-in-a-swiftdata-model</description><pubDate>05 May 2026 13:13 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3ml4bcotp2s2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkzvkc5ha22v</link><description>Repeating the same test setup across multiple suites? Swift Testing&#39;s TestScoping protocol lets you wrap environment config into a reusable trait and apply it with a single annotation. https://www.hackingwithswift.com/swift/6.1/swift-testing-test-scopes</description><pubDate>04 May 2026 14:37 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkzvkc5ha22v</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkx76mygs22j</link><description>Sunday Build with HWS+: Calendar notifications are easy to miss, but alarms aren&#39;t. This app combines EventKit with AlarmKit to turn your events into unmissable alerts that sync to Apple Watch. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/neverforget</description><pubDate>03 May 2026 12:52 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkx76mygs22j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mksbov6ayk2j</link><description>With scrollTransition(), you can control opacity, scale, blur, and hue as views enter and leave the visible area of a scroll view. https://www.hackingwithswift.com/quick-start/swiftui/how-to-make-views-scroll-with-a-custom-transition</description><pubDate>01 May 2026 13:53 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mksbov6ayk2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkpr54zsis2j</link><description>SwiftData handles database creation, relationship management, view updates, and CloudKit sync - all without writing a single line of database code. Build a real app with it from scratch in this tutorial. https://www.hackingwithswift.com/articles/263/build-your-first-app-with-swiftui-and-swiftdata</description><pubDate>30 Apr 2026 13:52 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkpr54zsis2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkncea37r22j</link><description>For HWS+ subscribers: Confetti, fire, smoke, rain, snow - all from one SwiftUI particle system you build from scratch. The best part is how many effects you can create just by tweaking a few parameters. https://www.hackingwithswift.com/plus/swiftui-special-effects/creating-a-particle-system-in-swiftui</description><pubDate>29 Apr 2026 14:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkncea37r22j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkknwntqp22j</link><description>Codable structs and enums work as SwiftData properties, but collections like [String] get stored as binary data and can&#39;t be used in predicates. Tread *carefully*. https://www.hackingwithswift.com/quick-start/swiftdata/using-structs-and-enums-in-swiftdata-models</description><pubDate>28 Apr 2026 13:11 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkknwntqp22j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mki6paq25k2j</link><description>Catch the error, *then* what? #expect(throws:) and #require(throws:) in Swift Testing return the error directly, so you can inspect it separately from the throw check itself. https://www.hackingwithswift.com/swift/6.1/swift-testing-errors-expect</description><pubDate>27 Apr 2026 13:33 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mki6paq25k2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkfshnivac2j</link><description>Sunday Build with HWS+: I mean who *doesn&#39;t* love Regex? Create a SwiftUI app that lets you experiment with regular expressions in real time, with pattern matching, group highlighting, and Swift code generation. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/regexcoach</description><pubDate>26 Apr 2026 14:49 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkfshnivac2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkdfm5etts2j</link><description>First ice cream of the year - living the good life!</description><pubDate>25 Apr 2026 15:54 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkdfm5etts2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mkalsxy7ks2j</link><description>Use scrollTargetLayout() with .viewAligned to snap between individual child views, or .paging to move exactly one screen at a time. https://www.hackingwithswift.com/quick-start/swiftui/how-to-make-a-scrollview-snap-with-paging-or-between-child-views</description><pubDate>24 Apr 2026 13:07 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mkalsxy7ks2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mk6qkzmrbk25</link><description>After months of work, my new app is finally available to preorder on the Mac App Store. It&#39;s called Kickstart, and it has just one job: to help indie app developers make more money on the App Store. How does it do that? Let me explain…</description><pubDate>23 Apr 2026 19:27 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mk6qkzmrbk25</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mk66ipxw622j</link><description>What if you could build websites the same way you build SwiftUI apps, declaratively in pure Swift with no HTML required? That&#39;s the idea behind Ignite, and it works surprisingly well. 🔥 https://www.hackingwithswift.com/articles/266/build-your-next-website-in-swift</description><pubDate>23 Apr 2026 14:03 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mk66ipxw622j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mk3y3f7xmk2j</link><description>For HWS+ subscribers: Building a fully scalable, animated clock face with Canvas and TimelineView is a satisfying exercise in precise, relative drawing - and it looks great at any size. 🕰️ https://www.hackingwithswift.com/plus/recreating-ui/remaking-the-clock</description><pubDate>22 Apr 2026 17:03 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mk3y3f7xmk2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mjz4tlnryc2j</link><description>You can pass multiple configurations into a single ModelContainer, handy for keeping some data in permanent storage and others in memory only. Just remember: related models must always share the same store! https://www.hackingwithswift.com/quick-start/swiftdata/how-to-add-multiple-configurations-to-a-modelcontainer</description><pubDate>21 Apr 2026 13:50 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mjz4tlnryc2j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mjwm7mhlq22j</link><description>🏗️ Protocols with clashing names - like Transaction meaning three different things in the same app - can be nested inside the types that own them. Tidier namespacing, less chance of collision. https://www.hackingwithswift.com/swift/5.10/nested-protocols</description><pubDate>20 Apr 2026 13:47 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mjwm7mhlq22j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mjudeikay22j</link><description>Sunday Build with HWS+: Visualize algorithm complexity with Swift Charts, from O(n) to O(n!), in a way that makes Big O notation click. #SundayBuild https://www.hackingwithswift.com/plus/live-streams/complexity-explorer</description><pubDate>19 Apr 2026 16:04 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mjudeikay22j</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mjp3x3xnfs2j</link><description>Table gives you sortable, selectable multi-column data on iPad and Mac, with support for custom cell views, column widths, and expandable rows via&#xA;DisclosureTableRow. https://www.hackingwithswift.com/quick-start/swiftui/how-to-create-multi-column-lists-using-table</description><pubDate>17 Apr 2026 14:08 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mjp3x3xnfs2j</guid></item></channel></rss>