<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ioannis Platsis</title>
    <description>The latest articles on DEV Community by Ioannis Platsis (@ioannis_platsis_b07339508).</description>
    <link>https://dev.to/ioannis_platsis_b07339508</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3710899%2Fe07920cb-e9f3-4ae9-867c-6877e12edc09.png</url>
      <title>DEV Community: Ioannis Platsis</title>
      <link>https://dev.to/ioannis_platsis_b07339508</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ioannis_platsis_b07339508"/>
    <language>en</language>
    <item>
      <title>SwiftUIFlow: Type-Safe Coordinator Navigation for SwiftUI</title>
      <dc:creator>Ioannis Platsis</dc:creator>
      <pubDate>Thu, 22 Jan 2026 15:05:47 +0000</pubDate>
      <link>https://dev.to/ioannis_platsis_b07339508/swiftuiflow-type-safe-coordinator-navigation-for-swiftui-1a8f</link>
      <guid>https://dev.to/ioannis_platsis_b07339508/swiftuiflow-type-safe-coordinator-navigation-for-swiftui-1a8f</guid>
      <description>&lt;p&gt;You're building a SwiftUI app. &lt;br&gt;
User navigates: &lt;strong&gt;Home → Product Details → Reviews → User Profile&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now they tap "Message this user"—a feature that lives in a completely different part of your app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you navigate there cleanly?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most solutions involve either tight coupling, global state, or writing hundreds of lines of custom coordination code.&lt;/p&gt;

&lt;p&gt;There's a better way.&lt;/p&gt;
&lt;h3&gt;
  
  
  At a Glance
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;SwiftUIFlow&lt;/strong&gt; is a type-safe coordinator navigation framework for SwiftUI that makes complex navigation simple.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate anywhere from anywhere: &lt;code&gt;coordinator.navigate(to: .route)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Smart automatic navigation — backward detection, modal dismissal, tab switching&lt;/li&gt;
&lt;li&gt;Context-preserving deep links — don't lose user state&lt;/li&gt;
&lt;li&gt;Type-safe enum routes — compiler catches mistakes&lt;/li&gt;
&lt;li&gt;50% less boilerplate with FlowOrchestrator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;iOS 17+ | MIT License | Production-ready&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/JohnnyPJr/SwiftUIFlow" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; | &lt;a href="https://johnnypjr.github.io/SwiftUIFlow/documentation/swiftuiflow/" rel="noopener noreferrer"&gt;Documentation&lt;/a&gt; | &lt;a href="https://github.com/JohnnyPJr/SwiftUIFlow/tree/main/SwiftUIFlowExample" rel="noopener noreferrer"&gt;Example &lt;br&gt;
  App&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  The Problem
&lt;/h3&gt;

&lt;p&gt;SwiftUI's NavigationStack handles basic navigation well. But real apps need:&lt;/p&gt;

&lt;p&gt;❌ &lt;strong&gt;Cross-feature navigation&lt;/strong&gt; — Settings (Tab 4) → Profile (Tab 1)?&lt;br&gt;
  ❌ &lt;strong&gt;Deep linking without state loss&lt;/strong&gt; — Push notification shouldn't kill user's upload progress&lt;br&gt;
  ❌ &lt;strong&gt;Modals with deep linking&lt;/strong&gt; — Navigate to Settings → Privacy → Delete Account from notification&lt;br&gt;
  ❌ &lt;strong&gt;Type safety&lt;/strong&gt; — String routes break at runtime&lt;/p&gt;

&lt;p&gt;Traditional solutions: Pass coordinators through views (tight coupling), global state (@EnvironmentObject everywhere), or custom routing infrastructure&lt;br&gt;
  (hundreds of lines).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if you could navigate to any route, from anywhere, with one line of code — and the framework handled everything?&lt;/strong&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Meet SwiftUIFlow
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;coordinator.navigate(to: .profile(userId: "alice"))&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's it. From anywhere in your app, navigate to any route.&lt;/p&gt;

&lt;p&gt;The framework automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Finds which coordinator handles the route&lt;/li&gt;
&lt;li&gt;✅ Switches tabs if needed&lt;/li&gt;
&lt;li&gt;✅ Dismisses modals if needed&lt;/li&gt;
&lt;li&gt;✅ Detects backward navigation (auto-pops)&lt;/li&gt;
&lt;li&gt;✅ Cleans up navigation state&lt;/li&gt;
&lt;li&gt;✅ Executes the navigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zero configuration. Zero boilerplate. It just works.&lt;/p&gt;


&lt;h3&gt;
  
  
  Key Features
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Universal Navigate API ⭐⭐
&lt;/h4&gt;

&lt;p&gt;Navigate from anywhere to anywhere. The framework finds the right path.&lt;/p&gt;

&lt;p&gt;The scenario:&lt;br&gt;
  User is deep in Tab 3. You need them in Tab 1's profile screen.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  coordinator.navigate(to: .profile(userId: "alice"))
  // Framework handles tab switching, coordinator lookup, navigation

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;How it works&lt;/strong&gt;: Routes bubble through the coordinator hierarchy. Each coordinator checks: "Can I handle this? Can my children? Can my parent?" The framework finds the right coordinator automatically.&lt;/p&gt;

&lt;p&gt;Deep linking becomes trivial:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  func handleDeepLink(url: URL) {
      let route = DeepLinkParser.parse(url)
      appCoordinator.navigate(to: route) // Done!
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  2. Smart Automatic Navigation ⭐⭐
&lt;/h4&gt;

&lt;p&gt;The framework watches your navigation state and does the right thing automatically.&lt;/p&gt;

&lt;p&gt;Automatic Backward Detection:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // Current stack: [Home, Settings, Profile]
  coordinator.navigate(to: .settings)
  // Framework detects .settings is already in stack
  // Automatically pops back to Settings (no duplicate!)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You wrote zero code for this. It just works.&lt;/p&gt;

&lt;p&gt;Automatic Modal Dismissal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // Tab 1 has a modal open
  coordinator.navigate(to: Tab2Route.settings)
  // Framework automatically:
  // 1. Dismisses the modal
  // 2. Switches to Tab 2
  // 3. Navigates to Settings
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Idempotency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  coordinator.navigate(to: .profile)
  coordinator.navigate(to: .profile) // Already there, skips
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No navigation loops. No duplicate screens. The framework prevents common bugs automatically.&lt;/p&gt;

&lt;h5&gt;
  
  
  Automatic Back Button Management:
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  // Framework provides environment values automatically
  @Environment(\.navigationBackAction) var backAction
  @Environment(\.canNavigateBack) var canNavigateBack

  // Back button appears automatically for:
  // - Pushed coordinators
  // - Modal presentations
  // - Detour presentations

  // Tapping back does the right thing automatically:
  // - Push? Pops from stack
  // - Modal? Dismisses modal
  // - Detour? Dismisses detour

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No manual configuration. Framework provides the correct action for every context.&lt;/p&gt;

&lt;h5&gt;
  
  
  Two-Phase Navigation (Validation Before Execution With Error Handling):
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  coordinator.navigate(to: .invalidRoute)
  // Framework validates the entire navigation path FIRST
  // If any coordinator can't handle it: reports error immediately
  // If valid: executes the navigation
  // No partial navigation failures!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents bugs where navigation half-succeeds then crashes.&lt;/p&gt;




&lt;h4&gt;
  
  
  3. Context-Preserving Deep Links (Detours) ⭐⭐
&lt;/h4&gt;

&lt;p&gt;The problem:&lt;/p&gt;

&lt;p&gt;User state: Tab 3 → Settings → Edit Profile → Uploading Photo (80% done)&lt;br&gt;
 Push notification: "New message from Alice"&lt;/p&gt;

&lt;p&gt;Traditional approach: Navigate to Messages → Upload lost → User frustrated 😤&lt;/p&gt;

&lt;p&gt;SwiftUIFlow's solution:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  let messagesCoord = MessagesCoordinator(messageId: "123")
  coordinator.presentDetour(messagesCoord, presenting: .messages)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What happens:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Message screen slides in full-screen&lt;/li&gt;
&lt;li&gt;User reads message&lt;/li&gt;
&lt;li&gt;User dismisses&lt;/li&gt;
&lt;li&gt;Back to Settings → Edit Profile → Upload still at 80%! ✨&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The underlying navigation state is completely preserved. Modals, stacks, uploads — everything stays intact.&lt;/p&gt;

&lt;p&gt;Uses .fullScreenCover under the hood but with complete coordinator lifecycle management.&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Push notifications (don't lose user's place)&lt;/li&gt;
&lt;li&gt;Error flows (show error, return to working state)&lt;/li&gt;
&lt;li&gt;Onboarding overlays (dismiss back to app)&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  4. Type-Safe Enum Routes ⭐
&lt;/h4&gt;

&lt;p&gt;Before (string-based routes):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  navigationPath.append("profile") // Typo? Runtime crash 💥

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After (enum routes):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;enum AppRoute: Route {
      case home
      case profile(userId: String)
      case settings

      var identifier: String {
          switch self {
          case .home: return "home"
          case .profile(let id): return "profile-\(id)"
          case .settings: return "settings"
          }
      }
  }

  coordinator.navigate(to: .profle) // Typo = compile error ✅
  coordinator.navigate(to: .profile) // Missing userId? = compile error ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiler catches mistakes before runtime&lt;/li&gt;
&lt;li&gt;Autocomplete shows available routes&lt;/li&gt;
&lt;li&gt;Associated values carry data type-safely&lt;/li&gt;
&lt;li&gt;Refactoring is safe (rename propagates everywhere)&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  5. Pushed Child Coordinators ⭐
&lt;/h4&gt;

&lt;p&gt;Delegate entire sub-flows to specialised coordinators.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  class ProductCoordinator: Coordinator&amp;lt;ProductRoute&amp;gt; {
      init() {
          super.init(router: Router(initial: .list, factory: factory))

          // Checkout handled by separate coordinator
          let checkoutCoordinator = CheckoutCoordinator()
          addChild(checkoutCoordinator)
      }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When user navigates to a checkout route:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Framework pushes CheckoutCoordinator onto navigation stack&lt;/li&gt;
&lt;li&gt;Checkout handles its own navigation independently&lt;/li&gt;
&lt;li&gt;Back button automatically returns to parent&lt;/li&gt;
&lt;li&gt;Clean separation of concerns&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Modular architecture without the complexity.&lt;/p&gt;




&lt;h4&gt;
  
  
  6. FlowOrchestrator ⭐
&lt;/h4&gt;

&lt;p&gt;Handle major flow transitions (Login ↔ Main App) with automatic lifecycle management.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  class AppCoordinator: FlowOrchestrator&amp;lt;AppRoute&amp;gt; {
      override func handleFlowChange(to route: any Route) -&amp;gt; Bool {
          switch route as? AppRoute {
          case .login:
              transitionToFlow(LoginCoordinator(), root: .login)
              return true
          case .mainApp:
              transitionToFlow(MainTabCoordinator(), root: .mainApp)
              return true
          default:
              return false
          }
      }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One line per flow transition&lt;/li&gt;
&lt;li&gt;Automatic coordinator deallocation (old flow cleaned up)&lt;/li&gt;
&lt;li&gt;Automatic coordinator creation and initialization&lt;/li&gt;
&lt;li&gt;Automatic parent-child relationship management&lt;/li&gt;
&lt;li&gt;Clean state transitions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measured result: 50% code reduction for flow transitions in the example app.&lt;/p&gt;

&lt;p&gt;Perfect for: Login flows, onboarding sequences, major app state changes (guest → authenticated, trial → paid, etc.)&lt;/p&gt;




&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Installation:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  dependencies: [
      .package(url: "https://github.com/JohnnyPJr/SwiftUIFlow.git", from: "1.0.1")
  ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Quick Setup:
&lt;/h4&gt;

&lt;h4&gt;
  
  
  1. Define enum routes:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; enum AppRoute: Route {
      case home
      case profile
      case settings

      var identifier: String {
          switch self {
          case .home: return "home"
          case .profile: return "profile"
          case .settings: return "settings"
          }
      }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  2. Create coordinator:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  class AppCoordinator: Coordinator&amp;lt;AppRoute&amp;gt; {
      init() {
          let factory = AppViewFactory()
          super.init(router: Router(initial: .home, factory: factory))
          factory.coordinator = self
      }

      override func canHandle(_ route: AppRoute) -&amp;gt; Bool {
          return true
      }

      override func navigationType(for route: AppRoute) -&amp;gt; NavigationType {
          switch route {
          case .home, .profile:
              return .push
          case .settings:
              return .modal
          }
      }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  3. Create ViewFactory:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  class AppViewFactory: ViewFactory&amp;lt;AppRoute&amp;gt; {
      weak var coordinator: AppCoordinator?

      override func buildView(for route: AppRoute) -&amp;gt; AnyView {
          guard let coordinator else {
              return AnyView(Text("Error: Coordinator not set"))
          }

          switch route {
          case .home:
              return AnyView(HomeView(coordinator: coordinator))
          case .profile:
              return AnyView(ProfileView(coordinator: coordinator))
          case .settings:
              return AnyView(SettingsView(coordinator: coordinator))
          }
      }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  4. Bootstrap:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  @main
  struct MyApp: App {
      let coordinator = AppCoordinator()

      var body: some Scene {
          WindowGroup {
              CoordinatorView(coordinator: coordinator)
          }
      }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  5. Navigate:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  coordinator.navigate(to: .profile) // Done!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  When to Use Coordinator Modals?
&lt;/h3&gt;

&lt;p&gt;Use plain SwiftUI .sheet() for simple modals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pickers, selectors, single-screen forms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use coordinator modals when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deep linking to the modal&lt;/li&gt;
&lt;li&gt;Navigation within the modal (calling .navigate(), not just dismissing)&lt;/li&gt;
&lt;li&gt;Custom modal detents (automatic content-sizing with .custom)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most modals should be plain SwiftUI. Only use coordinator modals when you need the power.&lt;/p&gt;




&lt;h3&gt;
  
  
  Why SwiftUIFlow
&lt;/h3&gt;

&lt;p&gt;Choose SwiftUIFlow when you need:&lt;/p&gt;

&lt;p&gt;✅ Universal navigation — Navigate anywhere from anywhere with one API&lt;br&gt;
  ✅ Smart automation — Backward detection, modal dismissal, tab switching automatic&lt;br&gt;
  ✅ Context preservation — Detours for notifications and interruptions&lt;br&gt;
  ✅ Type safety — Enum routes with compiler protection&lt;br&gt;
  ✅ Clean architecture — Modular coordinator hierarchy&lt;br&gt;
  ✅ Less boilerplate — FlowOrchestrator reduces code by 50%&lt;br&gt;
  ✅ Production-ready — Comprehensive tests, complete docs, battle-tested&lt;/p&gt;

&lt;p&gt;Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multi-feature apps with complex navigation&lt;/li&gt;
&lt;li&gt;Apps requiring robust deep linking&lt;/li&gt;
&lt;li&gt;Teams valuing type safety and testability&lt;/li&gt;
&lt;li&gt;Projects needing navigation solved, not reinvented&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not your fit? Simple apps with basic navigation flows are fine with plain SwiftUI NavigationStack.&lt;/p&gt;




&lt;h3&gt;
  
  
  Imagine This:
&lt;/h3&gt;

&lt;p&gt;You're adding push notifications. Product wants them to deep link anywhere in the app.&lt;/p&gt;

&lt;h4&gt;
  
  
  Without SwiftUIFlow:
&lt;/h4&gt;

&lt;p&gt;3 hours coordinating state across tabs and modals. 200 lines of custom routing logic. Manual tab switching code. Edge cases you didn't think of. 5 bugs caught in QA. Another 2 slip through.&lt;/p&gt;

&lt;h4&gt;
  
  
  With SwiftUIFlow:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  func handleNotification(_ route: any Route) {
      coordinator.navigate(to: route) // Done
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;1 line. 5 minutes. Works first time. Framework handles tabs, modals, state cleanup — everything.&lt;/p&gt;

&lt;p&gt;That's what SwiftUIFlow does. Navigation fades into the background. You build features, not infrastructure.&lt;/p&gt;




&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;📖 &lt;a href="https://johnnypjr.github.io/SwiftUIFlow/documentation/swiftuiflow/" rel="noopener noreferrer"&gt;https://johnnypjr.github.io/SwiftUIFlow/documentation/swiftuiflow/&lt;/a&gt; — 5 comprehensive guides&lt;br&gt;
  💻 &lt;a href="https://github.com/JohnnyPJr/SwiftUIFlow/tree/main/SwiftUIFlowExample" rel="noopener noreferrer"&gt;https://github.com/JohnnyPJr/SwiftUIFlow/tree/main/SwiftUIFlowExample&lt;/a&gt; — 21 files showing real patterns&lt;br&gt;
  🧪 &lt;a href="https://github.com/JohnnyPJr/SwiftUIFlow/tree/main/SwiftUIFlowTests" rel="noopener noreferrer"&gt;https://github.com/JohnnyPJr/SwiftUIFlow/tree/main/SwiftUIFlowTests&lt;/a&gt; — 25 test files&lt;br&gt;
  ⭐ &lt;a href="https://github.com/JohnnyPJr/SwiftUIFlow" rel="noopener noreferrer"&gt;https://github.com/JohnnyPJr/SwiftUIFlow&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;SwiftUIFlow powers production apps. If you've struggled with cross-feature navigation, deep linking, or coordinator boilerplate:&lt;br&gt;
&lt;strong&gt;Try SwiftUIFlow today&lt;/strong&gt; — install via SPM in 2 minutes, navigate from anywhere in 5 minutes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Coming next&lt;/strong&gt;: &lt;br&gt;
Part 2: Advanced Patterns — Custom tab bars, navigation paths, and production architectures.&lt;/p&gt;




&lt;p&gt;Built by &lt;a href="https://github.com/JohnnyPJr" rel="noopener noreferrer"&gt;https://github.com/JohnnyPJr&lt;/a&gt; — MIT License, open source, community-driven.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>swiftui</category>
      <category>swift</category>
      <category>mobile</category>
    </item>
  </channel>
</rss>
