<?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/3mtvubdta4s25</link><description>New on the Kickstart blog: TestFlight beta testing best practices – run a beta that actually improves your app. How to recruit testers who respond, give them tasks instead of builds, write What to Test notes that get read, and know when to ship. https://www.kickstart.tools/blog/testflight-beta-testing-best-practices-run-a-beta-that-actually-improves-your-app</description><pubDate>25 Aug 2026 12:51 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtvubdta4s25</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtu4h7cxi22e</link><description>&#34;Swift version&#34; has always meant two things - the compiler version and the language mode - and that confusion is real. 🤔 Swift formalizes &#34;language mode&#34; as the official term. https://www.hackingwithswift.com/swift/6.1/language-mode</description><pubDate>24 Aug 2026 20:12 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtu4h7cxi22e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtqyavkrac2e</link><description>Sunday Build with HWS+: Craft a word game where players spell words from a grid of letters, but each word must match a special rule like &#34;must contain at least 5 letters&#34; or &#34;must start and end with the same letter.&#34; #SundayBuild https://www.hackingwithswift.com/plus/live-streams/wordcraft</description><pubDate>23 Aug 2026 14:19 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtqyavkrac2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtmtyurhv223</link><description>New on the Kickstart blog: 6 ways to promote your app without spending a penny. Six free ways to get your app in front of more people, and how much time each one actually takes. https://www.kickstart.tools/blog/6-ways-to-promote-your-app-without-spending-a-penny</description><pubDate>21 Aug 2026 22:52 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtmtyurhv223</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtlvs4aquc2e</link><description>Instead of stretching an image to fill space, SwiftUI can tile it by repeating horizontally and vertically. Just pass .tile to the resizable() modifier&#39;s resizingMode parameter. https://www.hackingwithswift.com/quick-start/swiftui/how-to-tile-an-image</description><pubDate>21 Aug 2026 13:51 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtlvs4aquc2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtjetwmk5c2e</link><description>If you&#39;re passing raw strings around for things like usernames and email addresses, you&#39;re scattering validation checks everywhere. Value objects with failable initializers mean invalid instances literally can&#39;t exist. https://www.hackingwithswift.com/articles/188/improving-your-swift-code-using-value-objects</description><pubDate>20 Aug 2026 13:43 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtjetwmk5c2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mthrwv3fmc2g</link><description>New on the Kickstart blog: App Store offer codes – how to track campaigns, win back subscribers, and grow your app. Offer codes can associate redemption activity directly with a campaign, which makes them a fantastic marketing tool – when used wisely! https://www.kickstart.tools/blog/app-store-offer-codes-how-to-track-campaigns-win-back-subscribers-and-grow-your-app</description><pubDate>19 Aug 2026 22:32 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mthrwv3fmc2g</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtgzeeh5wc2e</link><description>For HWS+ subscribers: Structs have single owners, which is usually exactly what you want, but wrapping one in a generic Box class is the cleanest way to share it safely when you genuinely need to. https://www.hackingwithswift.com/plus/intermediate-swift/the-ultimate-box-type</description><pubDate>19 Aug 2026 15:12 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtgzeeh5wc2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtengeacws2e</link><description>SwiftData&#39;s #Predicate macro looks like pure Swift but gets compiled into something else entirely. Some things crash at runtime, some silently return nothing, and !value can behave differently to value == false. 😅 https://www.hackingwithswift.com/quick-start/swiftdata/how-to-filter-swiftdata-results-with-predicates</description><pubDate>18 Aug 2026 16:33 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtengeacws2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtecb6uad22d</link><description>Kickstart Exchange launched exactly 24 hours ago, and already has 115 apps onboard! 🎉 It’s a free advertising network to help indie app developers grow: you show ads for other apps, and they show ads for you – everyone wins. Sign up today: exchange.kickstart.tools&#xA;https://exchange.kickstart.tools</description><pubDate>18 Aug 2026 13:13 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtecb6uad22d</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtcoxlq6cc22</link><description>New on the Kickstart blog: How to promote your App Store app for free with Kickstart Exchange. It&#39;s a new, free cross-promotion service for indie apps – here’s how to get started today! https://www.kickstart.tools/blog/how-to-promote-your-app-store-app-for-free-with-kickstart-exchange</description><pubDate>17 Aug 2026 21:55 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtcoxlq6cc22</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtbt25dnqs2e</link><description>Top-level Swift code - scripts and playgrounds - can use await directly without needing to wrap everything in a task or a dedicated @main type. A genuine quality of life win for scripting and quick experiments. https://www.hackingwithswift.com/swift/5.7/top-level-concurrency</description><pubDate>17 Aug 2026 13:36 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtbt25dnqs2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mtbs5eyl6k2m</link><description>Today I’m really proud to launch Kickstart Exchange: a free service that provides advertising for indie app developers. You show small adverts in your app, and in exchange adverts for your apps appear elsewhere – it&#39;s a link exchange! exchange.kickstart.tools&#xA;https://exchange.kickstart.tools</description><pubDate>17 Aug 2026 13:19 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mtbs5eyl6k2m</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mt7cl7z7h22e</link><description>Sunday Build with HWS+: Create a watchOS fitness app that tracks walking workouts and compares your pace against your overall average, perfect for seeing progress on a regular route.🚶🏼‍♂️ #SundayBuild https://www.hackingwithswift.com/plus/live-streams/shadowsteps</description><pubDate>16 Aug 2026 13:36 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mt7cl7z7h22e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mt7cky2wq22e</link><description>Sunday Build with HWS+: Create a watchOS fitness app that tracks walking workouts and compares your pace against your overall average, perfect for seeing progress on a regular route.🚶🏼‍♂️ #SundayBuild https://www.hackingwithswift.com/plus/live-streams/shadowsteps</description><pubDate>16 Aug 2026 13:35 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mt7cky2wq22e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mt4sxikefk2e</link><description>It’s Saturday: a great day to do some indie hacking! (Or to chill out a bit.)</description><pubDate>15 Aug 2026 13:51 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mt4sxikefk2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mt2hfr6a4c25</link><description>New on the Kickstart blog: How to user test your app with just 5 people. Five testers, Apple’s three questions, and what to watch for in your tests! https://www.kickstart.tools/blog/how-to-user-test-your-app-with-just-5-people</description><pubDate>14 Aug 2026 15:19 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mt2hfr6a4c25</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msxuhqax4s2e</link><description>Swift&#39;s auto-synthesized Hashable checks all properties for equality, which means two objects with the same ID but different timestamps can silently create near-duplicates in your sets. https://www.hackingwithswift.com/articles/199/avoiding-near-duplicates-in-sets</description><pubDate>13 Aug 2026 14:34 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msxuhqax4s2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mswfyu5yi22v</link><description>New on the Kickstart blog: How to avoid App Store rejection – an App Review checklist. Apple rejected over 2 million App Store submissions last year, so here are the mistakes that caused them, and the checklist that gets you through first time. https://www.kickstart.tools/blog/how-to-avoid-app-store-rejection-an-app-review-checklist</description><pubDate>13 Aug 2026 00:43 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mswfyu5yi22v</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msvdxzfp4s2e</link><description>For HWS+ subscribers: From generic counted sets to property wrappers, some really elegant patterns open up once you get comfortable writing your own generic types. https://www.hackingwithswift.com/plus/intermediate-swift/understanding-generics-part-2</description><pubDate>12 Aug 2026 14:34 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msvdxzfp4s2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mssmb2acd22e</link><description>SwiftData&#39;s underlying store is just SQLite, which means you can inspect it directly from Terminal when something seems off. A handy ModelContext extension makes getting the right command trivial: https://www.hackingwithswift.com/quick-start/swiftdata/how-to-read-the-contents-of-a-swiftdata-database-store</description><pubDate>11 Aug 2026 12:24 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mssmb2acd22e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msqy6nvbg22e</link><description>If a generic function has a default value for a type parameter, Swift can infer the type from that default rather than requiring you to spell it out every time. Subtle, but it removes a whole category of unnecessary verbosity. https://www.hackingwithswift.com/swift/5.7/default-type-inference</description><pubDate>10 Aug 2026 20:52 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msqy6nvbg22e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3mspwpkjb222r</link><description>New on the Kickstart blog: How to get featured on the App Store – nominations, timing, and what editors want. Apple takes featuring requests through App Store Connect, so here’s how the nominations form works, when to file it, and what editors pick. https://www.kickstart.tools/blog/how-to-get-featured-on-the-app-store-nominations-timing-and-what-editors-want</description><pubDate>10 Aug 2026 10:53 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3mspwpkjb222r</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msnz3jgatc2e</link><description>Sunday Build with HWS+: Create a watchOS fitness app that tracks walking workouts and compares your pace against your overall average, perfect for seeing progress on a regular route.🚶🏼‍♂️ #SundayBuild https://www.hackingwithswift.com/plus/live-streams/shadowsteps</description><pubDate>09 Aug 2026 16:30 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msnz3jgatc2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msixsad7vc2y</link><description>💰 New on the Kickstart blog: It’s fine to build apps just for the money. Nobody demands that plumbers feel passion for pipes, so why do developers apologize for wanting profit? Money is a perfectly good reason to ship. https://www.kickstart.tools/blog/its-fine-to-build-apps-just-for-the-money</description><pubDate>07 Aug 2026 16:24 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msixsad7vc2y</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msij2cwlrc2e</link><description>Want to customize the way links are opened? Tapping a link in SwiftUI opens Safari by default, but a custom OpenURLAction lets you intercept, redirect, or handle the URL yourself. https://www.hackingwithswift.com/quick-start/swiftui/how-to-customize-the-way-links-are-opened</description><pubDate>07 Aug 2026 12:00 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msij2cwlrc2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msgot3sax22i</link><description>It&#39;s not easy for indie developers to market their app, but I&#39;ve built a solution that works for everyone – and it&#39;s both free and 100% private. It&#39;s called Kickstart Exchange, and it enters beta today. Find out more here: exchange.kickstart.tools&#xA;https://exchange.kickstart.tools</description><pubDate>06 Aug 2026 18:38 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msgot3sax22i</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msgcjolxzs2e</link><description>Double-click a brace to select an entire code block. Randomize test order to catch hidden dependencies. Xcode&#39;s spell checker even understands camelCase. There are 24 of these. https://www.hackingwithswift.com/articles/229/24-quick-xcode-tips</description><pubDate>06 Aug 2026 14:58 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msgcjolxzs2e</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msehbduxk22g</link><description>New on the Kickstart blog: App Store competitor analysis – how to (ethically!) spy on your rivals. Version histories, paywall flows, ad libraries, metadata snapshots – your competitors publish their entire strategy in public, so here’s how to read it. https://www.kickstart.tools/blog/app-store-competitor-analysis-how-to-spy-on-your-rivals</description><pubDate>05 Aug 2026 21:18 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msehbduxk22g</guid></item><item><link>https://bsky.app/profile/twostraws.bsky.social/post/3msdq34k3hs2e</link><description>For HWS+ subscribers: Adding constraints to a generic function might sound like it limits what you can do, but it actually unlocks more functionality, and it lets the compiler use static dispatch to generate faster code. https://www.hackingwithswift.com/plus/intermediate-swift/understanding-generics-part-1</description><pubDate>05 Aug 2026 14:22 +0000</pubDate><guid isPermaLink="false">at://did:plc:2izaurqsrmguegexlfoc7pps/app.bsky.feed.post/3msdq34k3hs2e</guid></item></channel></rss>