{"apps":[{"externalURL":"https:\/\/translatekit.app","name":"TranslateKit: App Localization","tagline":"The most accurate AI translation for String Catalogs"},{"externalURL":"https:\/\/freemiumkit.app","name":"FreemiumKit: In-App Purchases","tagline":"The easiest way to monetize your apps"},{"externalURL":"https:\/\/apps.apple.com\/app\/apple-store\/id6477829138?pt=549314&ct=fline.dev&mt=8","name":"FocusBeats: Pomodoro + Music","tagline":"Deep focus with proven techniques"},{"externalURL":"https:\/\/apps.apple.com\/app\/apple-store\/id6587583340?pt=549314&ct=fline.dev&mt=8","name":"Pleydia Organizer: Media Renamer","tagline":"Smart media renaming for your collection"},{"externalURL":"https:\/\/apps.apple.com\/app\/apple-store\/id6472669260?pt=549314&ct=fline.dev&mt=8","name":"CrossCraft: Custom Crosswords","tagline":"Create themed & personalized crosswords"},{"externalURL":"https:\/\/apps.apple.com\/app\/apple-store\/id6478062053?pt=549314&ct=fline.dev&mt=8","name":"Posters: Discover Movies at Home","tagline":"Pin interactive movie posters to your walls"},{"externalURL":"https:\/\/apps.apple.com\/app\/apple-store\/id6480134993?pt=549314&ct=fline.dev&mt=8","name":"FreelanceKit: Time Tracking","tagline":"Simple & affordable time tracking"},{"externalURL":"https:\/\/apps.apple.com\/app\/apple-store\/id6479207869?pt=549314&ct=fline.dev&mt=8","name":"Guided Guest Mode","tagline":"Showcase Vision effortlessly"}],"articles":[{"category":"developer","section":"blog","slug":"tandemkit-pair-programming-for-ai-agents","summary":"I'd been running Claude and Codex in parallel manually for months — copy-pasting between sessions, passing findings back and forth. TandemKit automates that workflow.","tags":["claude-code","codex","ai-agents","productivity","open-source"],"title":"Pair Programming for Claude and Codex, Without the Copy-Paste","url":"\/blog\/tandemkit-pair-programming-for-ai-agents\/"},{"category":"developer","section":"blog","slug":"why-im-not-using-xcode-26s-ai-chat-integration-and-what-could-change-my-mind","summary":"7 missing features keeping me from using Xcode's AI, plus my 5-release roadmap for Apple to catch up with Claude Code and Cursor.","tags":["ai","xcode","wwdc25","cursor","claude-code","ios-development","productivity"],"title":"Why I'm Not Using Xcode 26's AI Chat Integration (And What Could Change My Mind)","url":"\/blog\/why-im-not-using-xcode-26s-ai-chat-integration-and-what-could-change-my-mind\/"},{"category":"developer","section":"blog","slug":"top-10-developer-tools-apple-introduced-at-wwdc25","summary":"Explore breakthrough features like Foundation Models bringing on-device AI, ChatGPT integration in Xcode, AlarmKit enabling true alarm apps, and major improvements to visionOS spatial experiences.","tags":["wwdc25","wwdc","handyswiftui","swift-6","xcode","foundation-models","alarmkit","app-store-connect","visionos","wifi-aware"],"title":"Top 10 Developer Tools Apple introduced at WWDC25","url":"\/blog\/top-10-developer-tools-apple-introduced-at-wwdc25\/"},{"category":"developer","section":"blog","slug":"making-swift-error-messages-human-friendly-together","summary":"Swift error messages can be cryptic, but as a community, we can make them clearer. Help others (and your future self) by contributing better explanations.","tags":["error-handling","errorkit","community","open-source","swift","swift-package"],"title":"Making Swift Error Messages Human-Friendly—Together","url":"\/blog\/making-swift-error-messages-human-friendly-together\/"},{"category":"developer","section":"blog","slug":"better-error-reporting-in-swift-apps-automatic-logs-analytics","summary":"Tired of vague bug reports like \"it doesn't work\"? In this post, you'll learn how to collect automatic logs and track real-world errors in your Swift apps—with just a few lines of code.","tags":["error-handling","errorkit","analytics","user-feedback","logging","debugging","swift"],"title":"Better Error Reporting in Swift Apps: Automatic Logs + Analytics","url":"\/blog\/better-error-reporting-in-swift-apps-automatic-logs-analytics\/"},{"category":"developer","section":"blog","slug":"swift-6-typed-throws-error-chains","summary":"Discover how to turn Typed Throws from a headache into a superpower — with clean error handling and powerful debugging insights.","tags":["errorkit","swift-6","swift","error-handling","debugging","error-chains","typed-throws"],"title":"Unlocking the Real Power of Swift 6's Typed Throws with Error Chains","url":"\/blog\/swift-6-typed-throws-error-chains\/"},{"category":"developer","section":"blog","slug":"swift-error-handling-done-right-overcoming-the-objective-c-error-legacy","summary":"Tired of cryptic Swift error messages like '(YourError error 0)'? Here's how to fix them for good—with clarity and elegance.","tags":["developer-tools","error-handling","swift-6","swift","errorkit"],"title":"Swift Error Handling Done Right: Overcoming the Objective-C Error Legacy","url":"\/blog\/swift-error-handling-done-right-overcoming-the-objective-c-error-legacy\/"},{"category":"developer","section":"blog","slug":"solving-swift-macro-trust-issues-in-xcode-cloud-builds","summary":"Swift macros are powerful but can break your CI pipeline with trust errors. Learn how to implement a simple post-clone script that solves the \"Target must be enabled\" error in Xcode Cloud once and for all.","tags":["xcode","xcode-cloud","swift","macros","app-store"],"title":"Solving Swift Macro Trust Issues in Xcode Cloud Builds","url":"\/blog\/solving-swift-macro-trust-issues-in-xcode-cloud-builds\/"},{"category":"developer","section":"blog","slug":"sherlocked-to-success","summary":"A candid story about resilience in indie app development—and how the worst day of your developer life can sometimes lead to building something better.","tags":["translatekit","localization","string-catalog","ios-development","mac-app","xcode"],"title":"When Getting Sherlocked Leads to Something Better: The TranslateKit Journey","url":"\/blog\/sherlocked-to-success\/"},{"category":"developer","section":"blog","slug":"swift-localization-in-2025-best-practices-you-couldnt-use-before","summary":"String Catalogs improved localization but introduced new challenges. This article explores how to regain structure and efficiency with modern best practices and a new open-source tool that could change the way you localize.","tags":["translatekit","open-source","swift","swift-package","macros","community","localization"],"title":"Swift Localization in 2025: Best Practices You Couldn't Use Before","url":"\/blog\/swift-localization-in-2025-best-practices-you-couldnt-use-before\/"},{"category":"developer","section":"blog","slug":"handyswiftui-styles","summary":"From attention-grabbing pulsating buttons and versatile label layouts to cross-platform checkboxes and vertical form styles - discover the SwiftUI styles that bring polish and consistency to your apps. These battle-tested styles power the UI of 10 production apps and counting.","tags":["handyswiftui","swiftui","button-styles","label-styles","toggle-styles"],"title":"HandySwiftUI Styles: Enhancing SwiftUI's Standard Views","url":"\/blog\/handyswiftui-styles\/"},{"category":"developer","section":"blog","slug":"handyswiftui-extensions","summary":"Discover powerful SwiftUI extensions for clean optional bindings, intuitive color management, XML-style text formatting, and more. These battle-tested utilities will help you write more elegant SwiftUI code while reducing boilerplate in your apps.","tags":["handyswiftui","swiftui","helper","binding","colors","formatting","image-loading"],"title":"HandySwiftUI Extensions: Making SwiftUI Development More Convenient","url":"\/blog\/handyswiftui-extensions\/"},{"category":"developer","section":"blog","slug":"handyswiftui-view-modifiers","summary":"From smart color contrast and streamlined error handling to simplified deletion flows and platform-specific styling - discover the SwiftUI modifiers that eliminate common boilerplate code and help create more maintainable apps.","tags":["handyswiftui","swiftui","colors","error-handling","multi-platform","app-lifecycle","confirm-delete"],"title":"HandySwiftUI View Modifiers: Streamlining Your SwiftUI Code","url":"\/blog\/handyswiftui-view-modifiers\/"},{"category":"developer","section":"blog","slug":"handyswiftui-new-types","summary":"From platform-specific values without #if checks to sophisticated selection controls and async state management - discover the essential SwiftUI types that helped ship apps faster. These battle-tested views and types fill common gaps in SwiftUI development.","tags":["handyswiftui","swiftui","multi-platform","image-loading","multi-selector","searchable-grid-picker","asyncbutton","nsopenpanel"],"title":"HandySwiftUI New Types: Essential Views and Types for SwiftUI Development","url":"\/blog\/handyswiftui-new-types\/"},{"category":"developer","section":"blog","slug":"test-your-swift-packages-linux-compatibility-on-mac","summary":"Ever wondered how to test your Swift code's compatibility with Linux from your Mac without diving into Docker? In this article, I'll share a simple command that makes the process effortless!","tags":["swift-package","swift-on-server","media-server","swift","linux"],"title":"Test your Swift Packages Linux Compatibility on Mac","url":"\/blog\/test-your-swift-packages-linux-compatibility-on-mac\/"},{"category":"developer","section":"blog","slug":"introducing-linkskit-simplifying-app-links-for-swift-developers","summary":"Tired of repeatedly implementing essential links in your apps? LinksKit is the Swift package that handles it all—from legal requirements to cross-promotion—saving you time and boosting your app's visibility.","tags":["open-source","linkskit","promotion","marketing","app-links","legal-links"],"title":"Introducing LinksKit: Simplifying App Links for Swift Developers","url":"\/blog\/introducing-linkskit-simplifying-app-links-for-swift-developers\/"},{"category":"developer","section":"blog","slug":"why-i-stopped-building-for-visionos-and-what-could-bring-me-back","summary":"Explore the limitations hindering the Vision Pro from reaching its full potential. This article highlights the missing APIs essential for transforming it into a true mixed-reality platform and discusses what needs to change for that to happen.","tags":["apple-vision-pro","visionos","success","innovation"],"title":"Why I Stopped Building for visionOS (And What Could Bring Me Back)","url":"\/blog\/why-i-stopped-building-for-visionos-and-what-could-bring-me-back\/"},{"category":"developer","section":"blog","slug":"why-i-chose-freemiumkit-over-revenuecat-for-my-diabetes-management-app-guest-post","summary":"Struggling with in-app subscription integration? Discover how FreemiumKit transformed my development process, helping me overcome challenges with RevenueCat and fast-tracking my app's launch.","tags":["freemiumkit","in-app-purchases","revenuecat","diabetes","ios-app","ios-development","swiftui","guest-post"],"title":"Guest Post: Why I Chose FreemiumKit Over RevenueCat for My App","url":"\/blog\/why-i-chose-freemiumkit-over-revenuecat-for-my-diabetes-management-app-guest-post\/"},{"category":"apps","section":"blog","slug":"introducing-pleydia-organizer","summary":"Effortlessly organize your media library with Pleydia Organizer, an automated app that simplifies renaming TV and movie files. Discover unmatched speed, accuracy, and convenience in managing your media collection.","tags":["pleydia","organizer","movies","tv-series","tv-shows","renamer","macos","mac-app","media-server","plex","kodi","jellyfin","infuse"],"title":"Introducing Pleydia Organizer: The Ultimate Native Mac App for Renaming TV & Movie Files","url":"\/blog\/introducing-pleydia-organizer\/"},{"category":"indie","section":"blog","slug":"reacting-to-pricing-backlash-lessons-learned","summary":"My take on how to find the right pricing and how I reacted to a user calling my app \"overpriced\". Learn from my mistakes and avoid bad reviews.","tags":["pricing","app-store","onboarding","translatekit"],"title":"Reacting to Pricing Backlash: Lessons Learned","url":"\/blog\/reacting-to-pricing-backlash-lessons-learned\/"},{"category":"apps","section":"blog","slug":"2-new-vision-pro-apps-guided-guest-mode-focusbeats-pomodoro-music","summary":"\"Guided Guest Mode\" elevates Apple Vision Pro demos with easy-to-follow guides for an immersive introduction to spatial computing. \"FocusBeats: Pomodoro + Music\" combines productivity-enhancing Pomodoro technique with themed music to boost focus during work sessions.","tags":["focusbeats","guided-guest-mode","apple-vision-pro","visionos","focus","timer","deep-work","music","showcase","demo","experience"],"title":"2 New Vision Pro Apps: \"Guided Guest Mode\" & \"FocusBeats: Pomodoro + Music\"","url":"\/blog\/2-new-vision-pro-apps-guided-guest-mode-focusbeats-pomodoro-music\/"},{"category":"apps","section":"blog","slug":"introducing-freelancekit","summary":"Affordable & native time tracking that syncs across iPhone, iPad, Mac, and Vision. Watch your earned money update live. Export to CSV. And much more!","tags":["freelancer","invoicing","billing","time-tracking","productivity","visionos","apple-vision-pro","freelancing","earnings","time-log"],"title":"Introducing FreelanceKit: Time Tracking for all  Platforms!","url":"\/blog\/introducing-freelancekit\/"},{"category":"developer","section":"blog","slug":"my-top-10-wishes-for-wwdc24","summary":"From a SportsKit API and .zoom modifier in SwiftUI, over improved SwiftData and source control in Xcode, to my biggest pain points in tvOS and visionOS, and much more! Blending long-standing requests with fresh ideas.","tags":["wwdc","wwdc24","cloudkit","swiftui","zoom","swiftdata","windows","volumes","visionos","tvos","string-catalog","llm","ai","source-control","xcode","swiftui-previews"],"title":"My Top 10 Wishes for WWDC24","url":"\/blog\/my-top-10-wishes-for-wwdc24\/"},{"category":"developer","section":"blog","slug":"introducing-handyswift-4","summary":"Investing time in Open Source again: Complete revamp of HandySwift with vastly improved documentation and lots of added handy features extracted from my apps. Read on to learn which helpers I use most often!","tags":["handyswift","swift","convenience","helper","swift-package","packages","library"],"title":"Introducing HandySwift 4.0","url":"\/blog\/introducing-handyswift-4\/"},{"category":"developer","section":"blog","slug":"migrating-my-swiftui-app-to-visionos","summary":"How I migrated my SwiftUI app CrossCraft to support visionOS for the Day 1 Release of the Apple Vision Pro. It took effectively about 2 hours in total, this article summarizes my key learnings along the way.","tags":["swiftui","visionos","apple-vision-pro","migration","hover-effect","crosscraft"],"title":"Migrating my SwiftUI App to VisionOS in 2 Hours","url":"\/blog\/migrating-my-swiftui-app-to-visionos\/"},{"category":"apps","section":"blog","slug":"introducing-posters-my-first-spatial-first-app-for-vision-pro","summary":"Breath life into your home with auto-updating & interactive posters of the latest trending movies & TV shows. Tap on a poster to unveil the trailer, find out where it's currently streaming, or locate a cinema showing near you. The future is here!","tags":["posters","apple-vision-pro","visionos","spatial-first","movies","tv-series"],"title":"Introducing \"Posters\" – My first Spatial-first app for Vision Pro","url":"\/blog\/introducing-posters-my-first-spatial-first-app-for-vision-pro\/"},{"category":"apps","section":"blog","slug":"huge-crosscraft-update-seven-major-features","summary":"This update brings key improvements like saving and syncing crosswords, expanded content with 30 new topics, and enhanced user experience with features like puzzle tips, a native Mac app, a native Vision Pro app & sharing options for competitive play.","tags":["crosscraft","game","mac-app","crossword","gamecenter"],"title":"HUGE CrossCraft 2.0 Update: Seven Major New Features!","url":"\/blog\/huge-crosscraft-update-seven-major-features\/"},{"category":"apps","section":"blog","slug":"8-steps-to-create-crosswords-with-chatgpt","summary":"Discover the ease of creating personalized crossword puzzles on any topic harnessing the full power of ChatGPT. This guide walks you through eight simple steps, from generating clue-answer pairs to crafting and customizing your puzzle with the innovative CrossCraft app.","tags":["crosscraft","crossword","chatgpt","ai","dall-e","ios-app","mac-app"],"title":"8 Simple Steps to Create Crosswords on Any Topic in Minutes Using ChatGPT","url":"\/blog\/8-steps-to-create-crosswords-with-chatgpt\/"},{"category":"apps","section":"blog","slug":"introducing-crosscraft","summary":"Create themed & personalized crossword puzzles with ease and either play yourself or surprise your loved ones with a custom-tailored special gift. Perfect also to playfully learn vocabulary or challenge your students or friends with a fun quiz.","tags":["crosscraft","learning","crossword","create","personalized","custom"],"title":"Introducing CrossCraft: Custom Crosswords","url":"\/blog\/introducing-crosscraft\/"},{"category":"developer","section":"blog","slug":"freemiumkit-learnings-from-analyzing-mobile-paywalls","summary":"Dive into how FreemiumKit, a user-friendly paywall open-source library, simplifies the creation of successful paywalls and streamlines A\/B testing. Its highly customizable UI components are based on my deep analysis of common paywall designs.","tags":["freemiumkit","storekit","in-app-purchases","paywall","framework","open-source","pricing"],"title":"Learnings from Analyzing 20 Successful Mobile Paywalls","url":"\/blog\/freemiumkit-learnings-from-analyzing-mobile-paywalls\/"},{"category":"developer","section":"blog","slug":"the-missing-string-catalogs-faq-for-xcode-15","summary":"Discover the game-changing implications of Apple's new feature, String Catalogs, which replaces traditional localization files and streamlines the localization process. From automatic key extraction to safety checks, find out why developers should be excited about this powerful tool in Xcode 15.","tags":["localization","xcode","wwdc23","string-catalog","swift"],"title":"The Missing String Catalogs FAQ for Localization in Xcode 15","url":"\/blog\/the-missing-string-catalogs-faq-for-xcode-15\/"},{"category":"developer","section":"blog","slug":"introducing-reviewkit","summary":"ReviewKit: Get app reviews from satisfied users at the right time. Say goodbye to intrusive prompts and optimize your app review process.","tags":["developer-tools","reviewkit","app-review","ios-development"],"title":"Introducing ReviewKit: Improve your App Store Rating with Ease","url":"\/blog\/introducing-reviewkit\/"},{"category":"developer","section":"blog","slug":"remafox-wwdc-sale","summary":"Shipping 3 new features that help save time for every Swift developer and reducing the price of all subscriptions for WWDC week with a long-term twist you don't want to miss!","tags":["remafox","developer-tools","ios-development","localization","wwdc","wwdc23","xcode"],"title":"RemafoX Sale: Get 50% Off on all Subscription Plans during WWDC Week!","url":"\/blog\/remafox-wwdc-sale\/"},{"category":"developer","section":"blog","slug":"taking-over-wwdc-notes-and-its-future","summary":"Evolving the Open-Source Project: Join the Community effort and shape the Future of how we discover and learn from WWDC Sessions effectively!","tags":["wwdc","wwdc23","wwdc-notes","community","notes"],"title":"Taking over WWDC Notes & Envisioning its Future","url":"\/blog\/taking-over-wwdc-notes-and-its-future\/"},{"category":"developer","section":"blog","slug":"window-management-on-macos-with-swiftui-4","summary":"Learnings from modernizing the window handling of my Mac app after upgrading to SwiftUI 4. Explaining `\\.openWindow`, `.windowResizability` & more.","tags":["swiftui","macos","window-management","swift","the-composable-architecture-tca"],"title":"Window Management with SwiftUI 4","url":"\/blog\/window-management-on-macos-with-swiftui-4\/"},{"category":"developer","section":"blog","slug":"my-top-5-wishes-for-wwdc-2023","summary":"WWDC is only weeks away, so it's time for me to update my wishlist. One wish came true last year, how many will it be in 2023?","tags":["wwdc","wwdc23","xcode","charts","secrets","live-stream"],"title":"My Top 5 Wishes for WWDC 2023","url":"\/blog\/my-top-5-wishes-for-wwdc-2023\/"},{"category":"developer","section":"blog","slug":"preparing-for-swift-6","summary":"How to enable Swift 6 mode for your Xcode projects and for your SwiftPM modules today. And what the migration experience is like.","tags":["xcode","swift-6","swift","swiftpm","migration","remafox"],"title":"Preparing My App for Swift 6","url":"\/blog\/preparing-for-swift-6\/"},{"category":"developer","section":"blog","slug":"binding-equatable-vs-equatablebinding","summary":"How I fixed a subtle bug in SwiftUI Pickers in my app by using a Property Wrapper instead of conforming Binding to Equatable.","tags":["swiftui","the-composable-architecture-tca","remafox","property-wrappers"],"title":"Binding: Equatable vs EquatableBinding","url":"\/blog\/binding-equatable-vs-equatablebinding\/"},{"category":"developer","section":"blog","slug":"migrating-to-tca-1-0","summary":"Sharing my learnings and my code structure after migrating my app to the vastly modernized APIs of TCA 1.0.","tags":["ios-development","the-composable-architecture-tca","swift","swiftui","app-architecture","migration","remafox"],"title":"Migrating to The Composable Architecture (TCA) 1.0","url":"\/blog\/migrating-to-tca-1-0\/"},{"category":"developer","section":"blog","slug":"organizing-my-swiftpm-modules","summary":"How to organize your apps Swift modules for clarity & convenience using a hidden (unofficial) Swift feature. A practical solution for small to medium-sized apps.","tags":["swiftpm","modularization","swift","remafox"],"title":"2,000 Imports: Organizing my Apps' SwiftPM modules","url":"\/blog\/organizing-my-swiftpm-modules\/"},{"category":"developer","section":"blog","slug":"hardware-requirements-for-ios-development","summary":"From the cheapest viable option to the best value Mac for iOS Developers.","tags":["hardware","getting-started","beginner"],"title":"Hardware Requirements for iOS Development (May 2025)","url":"\/blog\/hardware-requirements-for-ios-development\/"},{"category":"developer","section":"blog","slug":"introducing-remafox-easy-app-localization","summary":"Say hello to RemafoX, the app on the mission to simplify developer life by providing new workflows for localization when working with Xcode.","tags":["remafox","developer-tools","localization"],"title":"Introducing RemafoX: Easy App Localization","url":"\/blog\/introducing-remafox-easy-app-localization\/"},{"category":"developer","section":"blog","slug":"making-the-most-of-wwdc-2022","summary":"How to enjoy both Keynotes with other developers (remotely) and how to maximize your learnings throughout the week. If you can invest the time","tags":["wwdc","wwdc22","community","learning"],"title":"Making the Most of WWDC 2022","url":"\/blog\/making-the-most-of-wwdc-2022\/"},{"category":"indie","section":"blog","slug":"streaming-open-source-development-on-twitch-part-2","summary":"My Software Setup & used 3rd Party Services.","tags":["twitch","streaming","software","services","open-source"],"title":"Streaming Open Source Development on Twitch — Part 2","url":"\/blog\/streaming-open-source-development-on-twitch-part-2\/"},{"category":"developer","section":"blog","slug":"my-top-3-wishes-for-wwdc-2022","summary":"With Apple announcing WWDC week for June 6–10 this year, let’s dive into what new frameworks, APIs, and tools I hope to see unveiled and what using them might feel like with examples.","tags":["wwdc","wwdc22","xcode","modularization","persistence","swift"],"title":"My Top 3 Wishes for WWDC 2022","url":"\/blog\/my-top-3-wishes-for-wwdc-2022\/"},{"category":"indie","section":"blog","slug":"streaming-open-source-development-on-twitch-part-1","summary":"My Streaming Motivation & Hardware Setup with Reviews.","tags":["twitch","open-source","streaming","hardware"],"title":"Streaming Open Source Development on Twitch — Part 1","url":"\/blog\/streaming-open-source-development-on-twitch-part-1\/"},{"category":"developer","section":"blog","slug":"swiftpm-coredata-failing-swiftui-previews-here-are-5-tips-to-fix","summary":"Fixing Xcode bugs that make SwiftUI previews fail in apps modularized with SwiftPM and that are using CoreData.","tags":["swiftpm","coredata","swiftui","swiftui-previews"],"title":"SwiftPM + CoreData: Failing SwiftUI Previews? Here Are 5 Tips to Fix","url":"\/blog\/swiftpm-coredata-failing-swiftui-previews-here-are-5-tips-to-fix\/"},{"category":"developer","section":"blog","slug":"multi-selector-in-swiftui","summary":"Adding a missing SwiftUI component for prototyping purposes.","tags":["swiftui","multi-selector","swift","ios-development"],"title":"Multi Selector in SwiftUI","url":"\/blog\/multi-selector-in-swiftui\/"},{"category":"developer","section":"blog","slug":"hiding-secrets-from-git-in-swiftpm","summary":"A step-by-step guide on how to prevent your 3rd party service secrets from committing to Git when using apps modularized with SwiftPM.","tags":["swift","swiftpm","secrets","git"],"title":"Hiding Secrets From Git in SwiftPM","url":"\/blog\/hiding-secrets-from-git-in-swiftpm\/"},{"category":"indie","section":"blog","slug":"laser-focus-priority-strategy","summary":"A simple but effective prioritization technique that can help slim down your apps scope and give you more confidence in it with different stages that can be mapped to Alpha, Beta & Release.","tags":["prioritization","task-management"],"title":"Laser Focus priority strategy","url":"\/blog\/laser-focus-priority-strategy\/"},{"category":"developer","section":"blog","slug":"git-merge-vs-rebase","summary":"An FAQ that explains and answers when to use which and why.","tags":["git","version-control"],"title":"Git Merge vs Rebase","url":"\/blog\/git-merge-vs-rebase\/"},{"category":"developer","section":"blog","slug":"primer-on-regular-expressions","summary":"In this post, I will try to give you a practical overview of Regular Expressions to teach you what they are, what they can be used for and a quick intro to how you can use them.","tags":["regular-expressions","ruby"],"title":"Primer on Regular Expressions","url":"\/blog\/primer-on-regular-expressions\/"},{"category":"","section":"snippets","slug":"vapor-maximum-active-connections","summary":"A non-obvious Vapor configuration detail that can cause intermittent 500 errors when your actual connection count exceeds what you think you configured.","tags":["swift","vapor","server-side-swift"],"title":"Vapor's maximumActiveConnections Is Per Event Loop, Not Per Worker","url":"\/snippets\/vapor-maximum-active-connections\/"},{"category":"","section":"snippets","slug":"apple-implements-feedback-requests","summary":"A personal experience of having a Feedback Assistant request implemented in Xcode 26, and tips for writing effective feedback reports.","tags":["xcode","ios-dev","productivity"],"title":"Apple Implements Feedback Requests -- Filing Reports Works","url":"\/snippets\/apple-implements-feedback-requests\/"},{"category":"","section":"snippets","slug":"labelstyle-icononly-swiftui","summary":"The proper SwiftUI pattern for icon-only buttons that preserves accessibility without sacrificing readability.","tags":["swift","swiftui","accessibility","ios-dev"],"title":"Use .labelStyle(.iconOnly) Instead of Nesting Image in Button","url":"\/snippets\/labelstyle-icononly-swiftui\/"},{"category":"","section":"snippets","slug":"editorconfig-swiftpm-package","summary":"Why every Swift package should include an .editorconfig file to enforce consistent indentation across all contributors.","tags":["swift","swiftpm","open-source","productivity"],"title":"EditorConfig for Every SwiftPM Package","url":"\/snippets\/editorconfig-swiftpm-package\/"},{"category":"","section":"snippets","slug":"push-notifications-app-store-reviews","summary":"How to enable push notifications for new App Store reviews in the App Store Connect app so you can respond to user feedback quickly.","tags":["ios-dev","productivity"],"title":"Push Notifications for App Store Reviews","url":"\/snippets\/push-notifications-app-store-reviews\/"},{"category":"","section":"snippets","slug":"docc-videos-tabs-documentation","summary":"Two lesser-known DocC features that make your documentation more interactive: embedded videos and tabbed content navigation.","tags":["swift","docc","wwdc24","open-source"],"title":"Videos and Tabs in DocC Documentation","url":"\/snippets\/docc-videos-tabs-documentation\/"},{"category":"","section":"snippets","slug":"convert-paid-apps-freemium","summary":"How to use StoreKit's AppTransaction API to transition from paid-up-front to freemium while preserving access for users who already paid.","tags":["swift","storekit","ios-dev"],"title":"Convert Paid Apps to Freemium Without Affecting Existing Users","url":"\/snippets\/convert-paid-apps-freemium\/"},{"category":"","section":"snippets","slug":"xcode-quick-help-sidebar","summary":"The Quick Help inspector in Xcode's sidebar auto-updates documentation as your cursor moves, removing the need to Cmd-click for docs.","tags":["xcode","productivity"],"title":"Xcode Quick Help in the Sidebar","url":"\/snippets\/xcode-quick-help-sidebar\/"},{"category":"","section":"snippets","slug":"asyncbutton-swiftui-progress-status","summary":"A reusable button component that handles async actions with automatic loading state, disabling, and success\/failure indication.","tags":["swift","swiftui","concurrency"],"title":"Building an AsyncButton in SwiftUI","url":"\/snippets\/asyncbutton-swiftui-progress-status\/"},{"category":"","section":"snippets","slug":"imagerenderer-uikit-backed-views","summary":"SwiftUI's ImageRenderer silently fails on views that use UIKit or AppKit under the hood, like List and ScrollView.","tags":["swift","swiftui","ios-dev"],"title":"ImageRenderer Cannot Export UIKit-Backed Views","url":"\/snippets\/imagerenderer-uikit-backed-views\/"},{"category":"","section":"snippets","slug":"combine-swift-imports-wrapper-module","summary":"Create a single import that re-exports all your commonly used frameworks using @_exported import.","tags":["swift","swiftpm","productivity"],"title":"Combine Swift Imports with a Wrapper Module","url":"\/snippets\/combine-swift-imports-wrapper-module\/"},{"category":"","section":"snippets","slug":"swiftui-navigation-present-data","summary":"Understanding the mental model shift from imperative navigation in UIKit to data-driven navigation in SwiftUI.","tags":["swift","swiftui","navigation","ios-dev"],"title":"SwiftUI Navigation: Present Data, Not Views","url":"\/snippets\/swiftui-navigation-present-data\/"},{"category":"","section":"snippets","slug":"asyncimage-resizable-modifier","summary":"SwiftUI's AsyncImage does not allow the .resizable() modifier, requiring a phase-based workaround.","tags":["swift","swiftui","ios-dev"],"title":"AsyncImage Does Not Support .resizable()","url":"\/snippets\/asyncimage-resizable-modifier\/"},{"category":"","section":"snippets","slug":"multi-line-code-ctrl-m-xcode-15","summary":"Xcode 15 introduces a Ctrl+M shortcut to expand function calls and parameters across multiple lines.","tags":["xcode","productivity"],"title":"Multi-Line Code with Ctrl+M in Xcode 15","url":"\/snippets\/multi-line-code-ctrl-m-xcode-15\/"},{"category":"","section":"snippets","slug":"search-apple-documentation-shift-cmd-o","summary":"Use the same Open Quickly shortcut to search Apple's developer documentation directly on the web.","tags":["xcode","docc","wwdc23","productivity"],"title":"Search Apple Documentation with Shift+Cmd+O","url":"\/snippets\/search-apple-documentation-shift-cmd-o\/"},{"category":"","section":"snippets","slug":"xcode-15-type-safe-asset-catalogs","summary":"Xcode 15 generates type-safe Swift accessors for images and colors in asset catalogs, replacing the need for SwiftGen.","tags":["xcode","swift","wwdc23","ios-dev"],"title":"Xcode 15 Brings Type-Safe Asset Catalog Access","url":"\/snippets\/xcode-15-type-safe-asset-catalogs\/"},{"category":"","section":"snippets","slug":"xcode-15-string-catalogs","summary":"Xcode 15 introduces String Catalogs, a visual editor for managing localized strings that replaces legacy .strings and .stringsdict files.","tags":["xcode","wwdc23","ios-dev"],"title":"Xcode 15 String Catalogs Replace .strings and .stringsdict","url":"\/snippets\/xcode-15-string-catalogs\/"},{"category":"","section":"snippets","slug":"xcode-15-format-parameters-multiple-lines","summary":"Xcode 15 adds a built-in action to reformat long function parameter lists from a single line to multiple lines.","tags":["xcode","wwdc23","productivity"],"title":"Xcode 15's Format to Multiple Lines Feature","url":"\/snippets\/xcode-15-format-parameters-multiple-lines\/"},{"category":"","section":"snippets","slug":"preview-loading-states-swiftui","summary":"A preview-only helper that simulates network delays so you can see loading states in SwiftUI previews.","tags":["swift","swiftui","xcode","ios-dev"],"title":"Previewing Loading States in SwiftUI Without Changing Production Code","url":"\/snippets\/preview-loading-states-swiftui\/"},{"category":"","section":"snippets","slug":"speed-up-xcode-disable-debug-executable","summary":"A hidden Xcode scheme setting that can significantly reduce app launch times during development.","tags":["xcode","productivity","ios-dev"],"title":"Speed Up Xcode Launches by Disabling Debug Executable","url":"\/snippets\/speed-up-xcode-disable-debug-executable\/"},{"category":"","section":"snippets","slug":"xcode-snippets-developer-warnings","summary":"Using Xcode code snippets with #warning to leave actionable reminders in your codebase.","tags":["swift","xcode","productivity"],"title":"Xcode Code Snippets for Developer Warnings","url":"\/snippets\/xcode-snippets-developer-warnings\/"},{"category":"","section":"snippets","slug":"swift-evolution-proposal-summaries-github","summary":"A simple URL trick to read summarized versions of Swift Evolution proposals on GitHub.","tags":["swift","swift-evolution"],"title":"Quick Access to Swift Evolution Proposal Summaries on GitHub","url":"\/snippets\/swift-evolution-proposal-summaries-github\/"},{"category":"","section":"snippets","slug":"pulsating-button-animation-swiftui","summary":"How to create a pulsating button effect in SwiftUI to guide users during onboarding.","tags":["swift","swiftui","animation","onboarding"],"title":"Pulsating Button Animation in SwiftUI","url":"\/snippets\/pulsating-button-animation-swiftui\/"}],"tags":{"accessibility":"Accessibility","ai":"AI","ai-agents":"AI Agents","alarmkit":"AlarmKit","analytics":"Analytics","animation":"Animation","app-architecture":"App Architecture","app-lifecycle":"App Lifecycle","app-links":"App Links","app-review":"App Review","app-store":"App Store","app-store-connect":"App Store Connect","apple-vision-pro":"Apple Vision","asyncbutton":"AsyncButton","beginner":"Beginner","billing":"Billing","binding":"Binding","button-styles":"Button Styles","charts":"Charts","chatgpt":"ChatGPT","claude-code":"Claude Code","cloudkit":"CloudKit","codex":"Codex","colors":"Colors","community":"Community","concurrency":"Concurrency","confirm-delete":"Confirm Delete","convenience":"Convenience","coredata":"Core Data","create":"Create","crosscraft":"CrossCraft","crossword":"Crossword","cursor":"Cursor","custom":"Custom","dall-e":"DALL-E","debugging":"Debugging","deep-work":"Deep Work","demo":"Demo","developer-tools":"Developer Tools","diabetes":"Diabetes","docc":"DocC","earnings":"Earnings","error-chains":"Error Chains","error-handling":"Error Handling","errorkit":"ErrorKit","experience":"Experience","focus":"Focus","focusbeats":"FocusBeats","formatting":"Formatting","foundation-models":"Foundation Models","framework":"Framework","freelancer":"Freelancer","freelancing":"Freelancing","freemiumkit":"FreemiumKit","game":"Game","gamecenter":"Game Center","getting-started":"Getting Started","git":"Git","guest-post":"Guest Post","guided-guest-mode":"Guided Guest Mode","handyswift":"HandySwift","handyswiftui":"HandySwiftUI","hardware":"Hardware","helper":"Helper","hover-effect":"Hover Effect","image-loading":"Image Loading","in-app-purchases":"In-App Purchases","infuse":"Infuse","innovation":"Innovation","invoicing":"Invoicing","ios-app":"iOS App","ios-dev":"iOS Dev","ios-development":"iOS Development","jellyfin":"Jellyfin","kodi":"Kodi","label-styles":"Label Styles","learning":"Learning","legal-links":"Legal Links","library":"Library","linkskit":"LinksKit","linux":"Linux","live-stream":"Live Stream","llm":"LLM","localization":"Localization","logging":"Logging","mac-app":"Mac App","macos":"macOS","macros":"Macros","marketing":"Marketing","media-server":"Media Server","migration":"Migration","modularization":"Modularization","movies":"Movies","multi-platform":"Multi-Platform","multi-selector":"Multi-Selector","music":"Music","navigation":"Navigation","notes":"Notes","nsopenpanel":"NSOpenPanel","onboarding":"Onboarding","open-source":"Open Source","organizer":"Organizer","packages":"Packages","paywall":"Paywall","persistence":"Persistence","personalized":"Personalized","plex":"Plex","pleydia":"Pleydia","posters":"Posters","pricing":"Pricing","prioritization":"Prioritization","productivity":"Productivity","promotion":"Promotion","property-wrappers":"Property Wrappers","regular-expressions":"Regular Expressions","remafox":"RemaFox","renamer":"Renamer","revenuecat":"RevenueCat","reviewkit":"ReviewKit","ruby":"Ruby","searchable-grid-picker":"Searchable Grid Picker","secrets":"Secrets","server-side-swift":"Server-Side Swift","services":"Services","showcase":"Showcase","software":"Software","source-control":"Source Control","spatial-first":"Spatial-First","storekit":"StoreKit","streaming":"Streaming","string-catalog":"String Catalog","success":"Success","swift":"Swift","swift-6":"Swift 6","swift-evolution":"Swift Evolution","swift-on-server":"Swift on Server","swift-package":"Swift Package","swiftdata":"SwiftData","swiftpm":"SwiftPM","swiftui":"SwiftUI","swiftui-previews":"SwiftUI Previews","task-management":"Task Management","the-composable-architecture-tca":"The Composable Architecture (TCA)","time-log":"Time Log","time-tracking":"Time Tracking","timer":"Timer","toggle-styles":"Toggle Styles","translatekit":"TranslateKit","tv-series":"TV Series","tv-shows":"TV Shows","tvos":"tvOS","twitch":"Twitch","typed-throws":"Typed Throws","user-feedback":"User Feedback","vapor":"Vapor","version-control":"Version Control","visionos":"visionOS","volumes":"Volumes","wifi-aware":"WiFi Aware","window-management":"Window Management","windows":"Windows","wwdc":"WWDC","wwdc-notes":"WWDC Notes","wwdc22":"WWDC22","wwdc23":"WWDC23","wwdc24":"WWDC24","wwdc25":"WWDC25","xcode":"Xcode","xcode-cloud":"Xcode Cloud","zoom":"Zoom"}}