<?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: Shovan</title>
    <description>The latest articles on DEV Community by Shovan (@shovan).</description>
    <link>https://dev.to/shovan</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F234010%2F6c11a81f-4b97-4d85-aedb-4c189851c1f6.png</url>
      <title>DEV Community: Shovan</title>
      <link>https://dev.to/shovan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shovan"/>
    <language>en</language>
    <item>
      <title>How to Build an iOS App on Windows in 2026. Let Xcode Cloud Be Your Mac</title>
      <dc:creator>Shovan</dc:creator>
      <pubDate>Sat, 22 Aug 2026 19:08:03 +0000</pubDate>
      <link>https://dev.to/shovan/build-ios-app-on-windows-xcode-cloud-2h09</link>
      <guid>https://dev.to/shovan/build-ios-app-on-windows-xcode-cloud-2h09</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A practical Windows-first iOS workflow using GitHub, Vercel, Neon, Capacitor, App Store Connect CLI, Xcode Cloud and TestFlight. We tried and tested this and below is the approach. -&lt;a href="https://www.linkedin.com/in/shovanco/" rel="noopener noreferrer"&gt;Shovan&lt;/a&gt;, &lt;a href="https://www.scube.co/" rel="noopener noreferrer"&gt;SCube&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Can you build an iOS app on Windows? Yes, with an important qualification.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can do most application development, testing, backend work, infrastructure management, App Store Connect configuration and release orchestration from Windows.&lt;/p&gt;

&lt;p&gt;What you cannot move to Windows is Apple's native iOS compilation and signing toolchain.&lt;/p&gt;

&lt;p&gt;The solution is to move that part somewhere else.&lt;/p&gt;

&lt;p&gt;Instead of making every developer use a Mac, use &lt;strong&gt;Xcode Cloud as the Mac that builds the application&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The result looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Windows developer
       │
       │ Git / CLI
       ▼
     GitHub
       │
       ├──────────────► Vercel Preview
       │                       │
       │                       ▼
       │                      Neon
       │
       ▼
   Xcode Cloud
 Apple-hosted macOS
       │
       ▼
    TestFlight
       │
       ▼
      iPhone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is still one Mac-specific step: &lt;strong&gt;the first Xcode Cloud workflow must be initialised using Xcode&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;After that, the normal developer workflow can be Windows-first.&lt;/p&gt;

&lt;p&gt;This guide shows the complete setup.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko85wiw2e4conkfg10yl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fko85wiw2e4conkfg10yl.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What this architecture actually solves&lt;/li&gt;
&lt;li&gt;The tools we will use&lt;/li&gt;
&lt;li&gt;Install the CLI stack on Windows&lt;/li&gt;
&lt;li&gt;Create an isolated Git development branch&lt;/li&gt;
&lt;li&gt;Build the application normally on Windows&lt;/li&gt;
&lt;li&gt;Create a preview environment with Vercel&lt;/li&gt;
&lt;li&gt;Give the feature its own Neon database&lt;/li&gt;
&lt;li&gt;Connect the preview deployment to the test database&lt;/li&gt;
&lt;li&gt;Create the Apple resources from the command line&lt;/li&gt;
&lt;li&gt;Prepare the iOS project for cloud builds&lt;/li&gt;
&lt;li&gt;The one-time Mac handoff&lt;/li&gt;
&lt;li&gt;Configure Xcode Cloud and TestFlight&lt;/li&gt;
&lt;li&gt;Manage iOS delivery from the CLI after bootstrap&lt;/li&gt;
&lt;li&gt;The daily Windows developer workflow&lt;/li&gt;
&lt;li&gt;Security and isolation rules&lt;/li&gt;
&lt;li&gt;Common problems&lt;/li&gt;
&lt;li&gt;FAQ&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  1. What this architecture actually solves
&lt;/h1&gt;

&lt;p&gt;The usual assumption is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;iOS development requires every developer to own and work from a Mac.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is no longer the most useful way to think about the problem.&lt;/p&gt;

&lt;p&gt;There are really several different jobs hidden inside "building an iOS app":&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Needs macOS?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Write React/TypeScript/web code&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build APIs&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Run automated web tests&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Work with Git/GitHub&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Configure Vercel&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create/manage Postgres environments&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manage many App Store Connect resources&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Create Preview deployments&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native iOS compilation&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iOS code signing&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local iOS Simulator&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native debugging in Xcode&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TestFlight installation on an iPhone&lt;/td&gt;
&lt;td&gt;No developer Mac required&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The goal is therefore not &lt;strong&gt;Mac-free iOS development&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A better description is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Windows-first iOS development with macOS compilation delegated to Xcode Cloud.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;We are not trying to work around Apple's platform.&lt;/p&gt;

&lt;p&gt;We are trying to stop Apple's platform from determining which computer every application developer must use.&lt;/p&gt;




&lt;h1&gt;
  
  
  2. The tools we will use
&lt;/h1&gt;

&lt;p&gt;This guide uses:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source control&lt;/td&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub operations&lt;/td&gt;
&lt;td&gt;GitHub CLI (&lt;code&gt;gh&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web/API deployment&lt;/td&gt;
&lt;td&gt;Vercel CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;Neon CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web-to-native runtime&lt;/td&gt;
&lt;td&gt;Capacitor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apple account automation&lt;/td&gt;
&lt;td&gt;App Store Connect CLI (&lt;code&gt;asc&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native build&lt;/td&gt;
&lt;td&gt;Xcode Cloud&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Beta distribution&lt;/td&gt;
&lt;td&gt;TestFlight&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Vercel and Neon are optional.&lt;/p&gt;

&lt;p&gt;If your app uses another hosting platform or database, substitute those layers.&lt;/p&gt;

&lt;p&gt;The core pattern is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git
  ↓
Cloud build
  ↓
Apple signing
  ↓
TestFlight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Vercel + Neon combination simply gives us a particularly clean way to create isolated Preview infrastructure for each feature branch.&lt;/p&gt;

&lt;h3&gt;
  
  
  A note about App Store Connect CLI
&lt;/h3&gt;

&lt;p&gt;In this guide, &lt;code&gt;asc&lt;/code&gt; refers to the open-source &lt;strong&gt;App Store Connect CLI&lt;/strong&gt; project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rorkai/App-Store-Connect-CLI" rel="noopener noreferrer"&gt;https://github.com/rorkai/App-Store-Connect-CLI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a community-maintained tool, not Apple's official CLI.&lt;/p&gt;

&lt;p&gt;It provides a command-line interface for many App Store Connect, TestFlight, signing and Xcode Cloud operations.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Install the CLI stack on Windows
&lt;/h1&gt;

&lt;p&gt;Start with PowerShell or Windows Terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git
&lt;/h2&gt;

&lt;p&gt;If you do not already have Git:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Git.Git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-e&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;git&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  GitHub CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;GitHub.cli&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-e&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can now create PRs, inspect CI, work with issues and call GitHub APIs without opening the browser.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;view&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Vercel CLI
&lt;/h2&gt;

&lt;p&gt;Assuming Node.js is installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;vercel&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;vercel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;login&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;vercel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;whoami&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Neon CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;npm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;neonctl&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;neonctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check your projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;neonctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;projects&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;list&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  App Store Connect CLI
&lt;/h2&gt;

&lt;p&gt;Check whether the WinGet package is currently available:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;search&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;asc&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If &lt;code&gt;Rorkai.ASC&lt;/code&gt; is listed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;winget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--id&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;Rorkai.ASC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--exact&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otherwise, use the signed Windows release binary from the project's GitHub Releases page.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;asc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;version&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="n"&gt;asc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;--help&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At this point the Windows machine has a command-line interface to almost every platform involved in delivery.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Create an isolated Git development branch
&lt;/h1&gt;

&lt;p&gt;Do not start by modifying your release branch.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git switch main
git pull
git switch &lt;span class="nt"&gt;-c&lt;/span&gt; feature/new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Push it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin feature/new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you or your coding agents regularly work on several features concurrently, use Git worktrees.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree add ../new-ios-capability feature/new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git worktree list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A worktree gives each feature or agent an independent checkout while keeping everything connected to the same Git repository.&lt;/p&gt;

&lt;p&gt;That is especially useful for agent-assisted development:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent A → worktree A → feature A

Agent B → worktree B → feature B

Developer → main checkout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is much less chance of two processes rewriting the same working directory.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Build the application normally on Windows
&lt;/h1&gt;

&lt;p&gt;This example assumes a web-first application wrapped for iOS using Capacitor.&lt;/p&gt;

&lt;p&gt;A typical stack might be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;React / Vue / Svelte
        │
        ▼
     Web build
        │
        ▼
     Capacitor
        │
        ▼
      iOS app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run tests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Capacitor is not already installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @capacitor/core @capacitor/cli
npm &lt;span class="nb"&gt;install&lt;/span&gt; @capacitor/ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Initialise it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cap init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add iOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx cap add ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After building your web app, copy the bundle into the native project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npx cap copy ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The native iOS project should live in Git.&lt;/p&gt;

&lt;p&gt;Do not treat the Mac developer's laptop as the only place where the native project exists.&lt;/p&gt;

&lt;p&gt;Your repository should contain everything Xcode Cloud requires to reproduce the build.&lt;/p&gt;

&lt;p&gt;If you use React Native, Flutter or a native iOS project instead of Capacitor, the exact build commands change, but the GitHub → Xcode Cloud → TestFlight architecture still applies.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Create a preview environment with Vercel
&lt;/h1&gt;

&lt;p&gt;Link the local directory to your Vercel project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your GitHub repository is connected to Vercel, pushing a feature branch can automatically create a Preview deployment.&lt;/p&gt;

&lt;p&gt;You can also deploy manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do &lt;strong&gt;not&lt;/strong&gt; use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel &lt;span class="nt"&gt;--prod&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for experimental feature work.&lt;/p&gt;

&lt;p&gt;The goal is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;main
  ↓
Production

feature/new-ios-capability
  ↓
Preview
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each feature branch should have a safe place to run without affecting your production application.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  7. Give the feature its own Neon database
&lt;/h1&gt;

&lt;p&gt;Do not point experimental application code at your production database simply because it is convenient.&lt;/p&gt;

&lt;p&gt;There are two useful isolation levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option A: Neon database branch
&lt;/h2&gt;

&lt;p&gt;For normal feature development, Neon branching works well.&lt;/p&gt;

&lt;p&gt;Link the workspace once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;neonctl &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create or select a database branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;neonctl checkout feature-new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pull its environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;neonctl &lt;span class="nb"&gt;env &lt;/span&gt;pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git branch
feature/new-ios-capability

        ↕

Neon branch
feature-new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a useful branch-first development model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Option B: completely separate Neon project
&lt;/h2&gt;

&lt;p&gt;For high-risk experiments, protocol changes, migrations or release laboratories, stronger isolation may be appropriate.&lt;/p&gt;

&lt;p&gt;Create a new project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;neonctl projects create
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you a completely separate Postgres project and connection string.&lt;/p&gt;

&lt;p&gt;A practical rule:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Normal feature
    → database branch

Risky migration / experimental app
    → separate database project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Production data should never become the accidental test environment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frizd8dolc1cvkegt1cw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Frizd8dolc1cvkegt1cw6.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Connect the preview deployment to the test database
&lt;/h1&gt;

&lt;p&gt;Now connect the feature-specific Vercel deployment to the feature-specific database.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel &lt;span class="nb"&gt;env &lt;/span&gt;add DATABASE_URL preview feature/new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CLI will prompt for the value.&lt;/p&gt;

&lt;p&gt;For secrets, prefer the interactive prompt rather than putting the credential directly in the command because shell history is very good at remembering things you wish it had forgotten.&lt;/p&gt;

&lt;p&gt;Verify the configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel &lt;span class="nb"&gt;env ls &lt;/span&gt;preview feature/new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pull the exact Preview configuration locally if required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;vercel &lt;span class="nb"&gt;env &lt;/span&gt;pull .env.preview.local &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--environment&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;preview &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--git-branch&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;feature/new-ios-capability
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feature/new-ios-capability
        │
        ├── Vercel Preview
        │
        └── isolated Neon database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This principle is more important than the products being used:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Isolate code, deployment and data together.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A Git branch alone is not an isolated environment if it still writes to production infrastructure.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Create the Apple resources from the command line
&lt;/h1&gt;

&lt;p&gt;This is where the workflow becomes considerably more interesting.&lt;/p&gt;

&lt;p&gt;Many operations that traditionally require Developer Portal or App Store Connect browser sessions can now be orchestrated from the terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an App Store Connect API key
&lt;/h2&gt;

&lt;p&gt;In App Store Connect, create a Team API Key with the minimum role your workflow requires.&lt;/p&gt;

&lt;p&gt;You will receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Key ID
Issuer ID
AuthKey_XXXXXXXXXX.p8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;.p8&lt;/code&gt; file is a private credential.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;commit it
paste it into a ticket
paste it into an AI conversation
store it in your repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Authenticate &lt;code&gt;asc&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc auth login &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Company App Store Connect"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--key-id&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;KEY_ID&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--issuer-id&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;ISSUER_ID&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--private-key&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;PATH_TO_AUTH_KEY.p8&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--network&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Validate the setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc auth status &lt;span class="nt"&gt;--validate&lt;/span&gt;
asc auth doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want the authentication check to succeed before creating anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Create the Bundle ID
&lt;/h2&gt;

&lt;p&gt;Instead of opening Certificates, Identifiers &amp;amp; Profiles manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc bundle-ids create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--identifier&lt;/span&gt; &lt;span class="s2"&gt;"com.example.product.lab"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Product Lab"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; IOS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc bundle-ids list &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your new Bundle ID should appear.&lt;/p&gt;




&lt;h2&gt;
  
  
  Authenticate the Apple web session
&lt;/h2&gt;

&lt;p&gt;Some operations are performed by &lt;code&gt;asc&lt;/code&gt; through its Apple web-session workflow rather than the normal App Store Connect API.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc web auth login &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--apple-id&lt;/span&gt; &lt;span class="s2"&gt;"developer@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may be prompted for password and two-factor authentication.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc web auth status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Create the App Store Connect app record
&lt;/h2&gt;

&lt;p&gt;Now create the actual App Store Connect application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc web apps create &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"Product Lab"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bundle-id&lt;/span&gt; &lt;span class="s2"&gt;"com.example.product.lab"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sku&lt;/span&gt; &lt;span class="s2"&gt;"product-lab-2026"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--primary-locale&lt;/span&gt; &lt;span class="s2"&gt;"en-GB"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--platform&lt;/span&gt; IOS &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--apple-id&lt;/span&gt; &lt;span class="s2"&gt;"developer@example.com"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc apps list &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--bundle-id&lt;/span&gt; &lt;span class="s2"&gt;"com.example.product.lab"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Record the numeric App Store Connect application ID returned by Apple.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;App ID: &amp;lt;APP_STORE_CONNECT_APP_ID&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will use it later.&lt;/p&gt;

&lt;p&gt;At this point we have created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Git feature branch
        +
Preview deployment
        +
isolated database
        +
Apple Bundle ID
        +
App Store Connect application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without making the developer work through several unrelated dashboards.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Prepare the iOS project for cloud builds
&lt;/h1&gt;

&lt;p&gt;Xcode Cloud does not build whatever happens to be sitting on somebody's Mac.&lt;/p&gt;

&lt;p&gt;It clones your repository into a clean build environment.&lt;/p&gt;

&lt;p&gt;That means the Git repository must contain enough native configuration to reproduce the application.&lt;/p&gt;

&lt;p&gt;At minimum, review:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ios project/workspace
shared Xcode scheme
Info.plist
entitlements
package/dependency locks
Capacitor configuration
CI scripts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Capacitor applications, a useful Xcode Cloud post-clone script might perform:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt;

npm ci
npm run build
npx cap copy ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Xcode Cloud should rebuild the web assets from the same Git commit that it is compiling.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Do not rely on somebody remembering to manually copy the latest frontend build into Xcode.&lt;/p&gt;

&lt;p&gt;If the script is created on Windows, remember that shell scripts in Git may also need their executable bit set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git update-index &lt;span class="nt"&gt;--chmod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;+x ci_scripts/ci_post_clone.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add Xcode Cloud build pipeline"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  11. The one-time Mac handoff
&lt;/h1&gt;

&lt;p&gt;Here is the remaining Apple boundary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first Xcode Cloud workflow must be configured using Xcode on a Mac.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This does not mean the Windows developer has to move their work to the Mac.&lt;/p&gt;

&lt;p&gt;The Mac operator is simply bootstrapping Apple's cloud build system.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fknzjr79638g1i0nneoea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fknzjr79638g1i0nneoea.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Windows developer hands over:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Repository
Branch
Bundle ID
App Store Connect App ID
Scheme
required environment variables
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Mac operator then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls the same repository and branch.&lt;/li&gt;
&lt;li&gt;Opens the &lt;code&gt;.xcodeproj&lt;/code&gt; or &lt;code&gt;.xcworkspace&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Signs into the correct Apple Developer team.&lt;/li&gt;
&lt;li&gt;Confirms the Bundle ID.&lt;/li&gt;
&lt;li&gt;Confirms the correct shared Xcode scheme.&lt;/li&gt;
&lt;li&gt;Opens Xcode Cloud setup.&lt;/li&gt;
&lt;li&gt;Selects the product/scheme.&lt;/li&gt;
&lt;li&gt;Grants Xcode Cloud access to the GitHub repository.&lt;/li&gt;
&lt;li&gt;Selects the correct branch.&lt;/li&gt;
&lt;li&gt;Starts the first build.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the one-time bootstrap.&lt;/p&gt;

&lt;p&gt;The Windows developer does not need to hand over their application implementation.&lt;/p&gt;

&lt;p&gt;Everything is already in Git.&lt;/p&gt;




&lt;h1&gt;
  
  
  12. Configure Xcode Cloud and TestFlight
&lt;/h1&gt;

&lt;p&gt;For an internal development build, keep the workflow deliberately narrow.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Workflow
Internal Lab

Scheme
ProductLab

Branch
feature/new-ios-capability

Action
Archive iOS

Distribution
Internal TestFlight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Avoid accidentally pointing an experimental workflow at your production branch.&lt;/p&gt;

&lt;p&gt;If your application needs environment variables during its build, configure them on this workflow.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;APP_ENV=lab

API_ORIGIN=https://&amp;lt;preview-deployment&amp;gt;

FEATURE_LAB=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact values depend on your application.&lt;/p&gt;

&lt;p&gt;A good test-build configuration should &lt;strong&gt;fail closed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Missing test API configuration
        ↓
disable sync / API functionality
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is safer than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Missing test API configuration
        ↓
silently use production
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once Xcode Cloud completes the archive, it can distribute the build directly through TestFlight.&lt;/p&gt;

&lt;p&gt;You should not need to manually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;archive
export IPA
upload IPA
wait for processing
assign build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for every change.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Manage iOS delivery from the CLI after bootstrap
&lt;/h1&gt;

&lt;p&gt;Once the first Xcode Cloud product exists, return to the command line.&lt;/p&gt;

&lt;p&gt;Inspect it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc apps ci-product view &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--id&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;APP_STORE_CONNECT_APP_ID&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pretty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;List workflows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc xcode-cloud workflows list &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--app&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;APP_STORE_CONNECT_APP_ID&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--output&lt;/span&gt; table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trigger a build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc xcode-cloud run &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--app&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;APP_STORE_CONNECT_APP_ID&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workflow&lt;/span&gt; &lt;span class="s2"&gt;"Internal Lab"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--branch&lt;/span&gt; &lt;span class="s2"&gt;"feature/new-ios-capability"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--wait&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Inspect the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc xcode-cloud build-runs list &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--workflow-id&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;WORKFLOW_ID&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where the Mac stops being the team's build machine.&lt;/p&gt;

&lt;p&gt;Apple's cloud infrastructure becomes the build machine.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. The daily Windows developer workflow
&lt;/h1&gt;

&lt;p&gt;After the platform has been bootstrapped, an ordinary Windows developer's day becomes surprisingly conventional.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull

git switch feature/new-ios-capability

npm &lt;span class="nb"&gt;install

&lt;/span&gt;npm run dev

&lt;span class="c"&gt;# write code&lt;/span&gt;

npm &lt;span class="nb"&gt;test

&lt;/span&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Implement capability"&lt;/span&gt;
git push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rest can happen automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git push
   │
   ▼
 GitHub
   │
   ├─────────────► Vercel Preview
   │                    │
   │                    ▼
   │               isolated DB
   │
   ▼
Xcode Cloud
   │
   ├── install dependencies
   ├── build web application
   ├── copy native assets
   ├── compile iOS application
   ├── sign
   └── archive
          │
          ▼
      TestFlight
          │
          ▼
        iPhone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The developer tests the actual iOS application through TestFlight.&lt;/p&gt;

&lt;p&gt;A local Mac is no longer part of every feature cycle.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqy7ufn1wu83kcxmnuzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqy7ufn1wu83kcxmnuzo.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Security and isolation rules
&lt;/h1&gt;

&lt;p&gt;The tooling is useful, but the architecture matters more than the commands.&lt;/p&gt;

&lt;p&gt;These are the rules I would keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Never make production the default fallback
&lt;/h2&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TEST_API_URL missing
        ↓
use PROD_API_URL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TEST_API_URL missing
        ↓
fail build or disable network functionality
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Isolate more than Git
&lt;/h2&gt;

&lt;p&gt;A real test environment may need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;separate Git branch
separate deployment
separate database
separate Bundle ID
separate iOS sandbox
separate TestFlight application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Git branch connected to the production database is not isolated.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Keep credentials outside the repository
&lt;/h2&gt;

&lt;p&gt;Do not commit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.p8 keys
database passwords
Vercel tokens
Apple passwords
API keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use the relevant platform's secret/environment system.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Give CI the minimum required permissions
&lt;/h2&gt;

&lt;p&gt;An automated build normally does not need unrestricted access to every production resource.&lt;/p&gt;

&lt;p&gt;Use scoped credentials and separate test infrastructure where practical.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Keep native configuration in Git
&lt;/h2&gt;

&lt;p&gt;Your Mac operator should not possess invisible project knowledge.&lt;/p&gt;

&lt;p&gt;If a scheme, entitlement or CI script is required to build the application, it should normally be represented in source control.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Treat TestFlight as part of CI/CD
&lt;/h2&gt;

&lt;p&gt;TestFlight should not be the final manual chore performed by one person.&lt;/p&gt;

&lt;p&gt;It can be the output of the pipeline.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. Common problems
&lt;/h1&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;no Xcode Cloud product found&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If you run something similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;asc xcode-cloud workflows list &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--app&lt;/span&gt; &lt;span class="s2"&gt;"&amp;lt;APP_ID&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;no Xcode Cloud product found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;before the first Xcode Cloud setup, that is expected.&lt;/p&gt;

&lt;p&gt;Complete the one-time workflow setup using Xcode on a Mac and start the first build.&lt;/p&gt;

&lt;p&gt;Then retry the CLI.&lt;/p&gt;




&lt;h2&gt;
  
  
  App works locally but fails in Xcode Cloud
&lt;/h2&gt;

&lt;p&gt;Remember that Xcode Cloud starts with a clean environment.&lt;/p&gt;

&lt;p&gt;Check that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies are installed
runtime versions are compatible
required configuration is committed
build scripts are committed
environment variables exist
dependency lockfiles exist
the Xcode scheme is shared
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your build only works because of something installed manually on one developer's Mac, the CI build has exposed useful information.&lt;/p&gt;




&lt;h2&gt;
  
  
  Preview app connects to production
&lt;/h2&gt;

&lt;p&gt;Stop.&lt;/p&gt;

&lt;p&gt;Do not solve this by continuing to test carefully.&lt;/p&gt;

&lt;p&gt;Fix the architecture.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;branch-specific environment variables
API origin
database connection string
runtime environment detection
fallback behaviour
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your experimental build should be structurally unable to use production by mistake.&lt;/p&gt;




&lt;h2&gt;
  
  
  TestFlight contains old frontend code
&lt;/h2&gt;

&lt;p&gt;If you wrap a web application with Capacitor, make the cloud build rebuild the web application before Xcode compiles it.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci
npm run build
npx cap copy ios
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not assume previously generated native assets are current.&lt;/p&gt;




&lt;h1&gt;
  
  
  17. FAQ
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Can I build an iOS app on Windows?
&lt;/h2&gt;

&lt;p&gt;Yes, most application development can be performed on Windows. Apple's iOS compiler, signing tools and Xcode still require macOS, so use a Mac or a macOS cloud build environment such as Xcode Cloud for the native build.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do I need a Mac for iOS development?
&lt;/h2&gt;

&lt;p&gt;You do not necessarily need a Mac for every developer or every development task. You still need access to macOS for the initial Xcode Cloud setup, native debugging, the iOS Simulator and some Xcode-specific configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can Xcode Cloud build an iOS app from GitHub?
&lt;/h2&gt;

&lt;p&gt;Yes. Xcode Cloud connects to your Git repository, checks out the source code, resolves dependencies, executes configured scripts and runs Xcode build/archive actions in Apple's cloud environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Xcode Cloud?
&lt;/h2&gt;

&lt;p&gt;Xcode Cloud is Apple's CI/CD platform for Apple-platform applications. It runs builds and tests in cloud-hosted macOS environments and integrates with Xcode, App Store Connect and TestFlight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can a Windows developer publish to TestFlight?
&lt;/h2&gt;

&lt;p&gt;A Windows developer can drive much of the workflow from Git and CLI tools. Xcode Cloud performs the macOS build and signing, after which the build can be delivered to TestFlight without the Windows developer manually archiving it on a Mac.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can Xcode Cloud run without my Mac being online?
&lt;/h2&gt;

&lt;p&gt;Yes. Once the repository and workflow are configured, Apple's cloud infrastructure performs the build. Your local Mac is not acting as the build server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can I use Capacitor for iOS development on Windows?
&lt;/h2&gt;

&lt;p&gt;Capacitor allows most of the shared web application to be developed with normal web tooling on Windows. Native iOS compilation and native debugging still require Apple's macOS/Xcode environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does this work with React Native or Flutter?
&lt;/h2&gt;

&lt;p&gt;The same delivery architecture can. The application-specific build commands are different, but GitHub, isolated cloud environments, Xcode Cloud and TestFlight can serve the same roles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is App Store Connect CLI an official Apple tool?
&lt;/h2&gt;

&lt;p&gt;No. The &lt;code&gt;asc&lt;/code&gt; tool used in this guide is an open-source third-party CLI for App Store Connect. Evaluate it like any other dependency before adopting it in a production release process.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should every feature get its own database?
&lt;/h2&gt;

&lt;p&gt;Not necessarily. Database branches are often sufficient for normal feature work. For high-risk experiments, migrations or security-sensitive testing, a completely separate database project can provide stronger isolation.&lt;/p&gt;




&lt;h1&gt;
  
  
  The bigger idea
&lt;/h1&gt;

&lt;p&gt;The interesting part of this workflow is not any individual CLI.&lt;/p&gt;

&lt;p&gt;GitHub CLI has existed for years.&lt;/p&gt;

&lt;p&gt;Cloud databases have existed for years.&lt;/p&gt;

&lt;p&gt;CI/CD has existed for years.&lt;/p&gt;

&lt;p&gt;The change is that these systems can now be treated as &lt;strong&gt;one programmable development control plane&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer or coding agent
          │
          ├── Git
          ├── GitHub
          ├── preview infrastructure
          ├── database
          ├── Apple configuration
          ├── cloud build
          └── beta distribution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A coding agent can operate the same commands a developer can.&lt;/p&gt;

&lt;p&gt;That changes the role of the human.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;open dashboard
click settings
copy value
open another dashboard
create environment
open another dashboard
upload build
wait
repeat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the human can concentrate on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;architecture
constraints
security
review
device validation
release approval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The workflow still works without AI.&lt;/p&gt;

&lt;p&gt;Agents simply make the programmable interface much more valuable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxtipof1lsy8ur2zs9yfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxtipof1lsy8ur2zs9yfn.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h1&gt;
  
  
  Final architecture
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                  Windows developer

                        │
                   code + tests
                        │
                        ▼
                      GitHub
                        │
             ┌──────────┴───────────┐
             │                      │
             ▼                      ▼
        Vercel Preview          Xcode Cloud
             │                      │
             ▼                      │
      isolated database             │
                                    ▼
                              signed iOS build
                                    │
                                    ▼
                                TestFlight
                                    │
                                    ▼
                                  iPhone
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Mac has not disappeared.&lt;/p&gt;

&lt;p&gt;It has stopped being the centre of the development workflow.&lt;/p&gt;

&lt;p&gt;And for teams where most developers use Windows, that is a much more important improvement.&lt;/p&gt;




&lt;p&gt;[build ios app on windows] [xcode cloud] &lt;/p&gt;

</description>
      <category>microsoft</category>
      <category>ios</category>
      <category>appdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Streamline Website Management with Breeze.bar -</title>
      <dc:creator>Shovan</dc:creator>
      <pubDate>Sun, 14 May 2023 18:33:52 +0000</pubDate>
      <link>https://dev.to/shovan/streamline-website-management-with-breezebar--48pd</link>
      <guid>https://dev.to/shovan/streamline-website-management-with-breezebar--48pd</guid>
      <description>&lt;p&gt;Hey there, fellow developers and website managers! Tired of the complexities and challenges in website management? Introducing Breeze.bar, your ultimate solution to simplify and streamline your website management process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;If you manage more than one website you need Breeze.bar&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dor447aj84ss5q9fj8w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2dor447aj84ss5q9fj8w.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automated website audits for comprehensive analysis&lt;/li&gt;
&lt;li&gt;Seamless Chrome extension integration for enhanced development workflow&lt;/li&gt;
&lt;li&gt;Live edits, screenshot capture, responsive layout checker, and environment switcher&lt;/li&gt;
&lt;li&gt;Collaborative playbook for storing essential agency knowledge
SEO checklists, QA processes, release workflows, and design reviews
Intuitive checklists for efficient project management&lt;/li&gt;
&lt;li&gt;Centralized repository for storing useful links and project-related documents&lt;/li&gt;
&lt;li&gt;Advanced sitemap engine for visualizing website structure&lt;/li&gt;
&lt;li&gt;Collaborative platform to add and manage project team members
Assignment of pages to specific owners for accountability and transparency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Breeze.bar, you can bid farewell to manual tasks, tedious audits, and disorganized collaboration. This powerful tool empowers you to master website management with ease and efficiency.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ib6ld6n09b9lxxbbdbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4ib6ld6n09b9lxxbbdbz.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
As developers, we understand the importance of technical excellence. That's why Breeze.bar offers an advanced Chrome extension that seamlessly integrates into your development environment. Perform live edits, capture screenshots, check responsive layouts, and switch between environments effortlessly.&lt;/p&gt;

&lt;p&gt;But Breeze.bar doesn't stop there. It provides a dedicated agency playbook, allowing you to store essential agency knowledge and share best practices with your team. With intuitive checklists and a centralized repository, you can manage projects efficiently and maintain consistency across your workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhraqgn4uaq6588f25i9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhraqgn4uaq6588f25i9.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Join the Breeze.bar community and revolutionize your website management process. As we prepare for our &lt;a href="https://appsumo.com/products/breeze-website-migration-management-tool?utm_source=partner-link&amp;amp;utm_medium=referral&amp;amp;utm_campaign=partner-44482" rel="noopener noreferrer"&gt;AppSumo&lt;/a&gt; launch, we're offering an exclusive lifetime discount of 90% to early adopters like you. Your feedback will help shape the future development of this powerful tool.&lt;/p&gt;

&lt;p&gt;Secure your lifetime discount and experience the power of Breeze.bar. Simplify your website management, boost efficiency, and elevate your projects to new heights.&lt;/p&gt;

&lt;p&gt;Let's embrace the breeze and revolutionize website management together!&lt;/p&gt;

&lt;p&gt;Shovan&lt;br&gt;
&lt;a href="https://breeze.bar" rel="noopener noreferrer"&gt;https://breeze.bar&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Appsumo: &lt;a href="https://appsumo.com/products/breeze-website-migration-management-tool?utm_source=partner-link&amp;amp;utm_medium=referral&amp;amp;utm_campaign=partner-44482" rel="noopener noreferrer"&gt;https://appsumo.com/products/breeze-website-migration-management-tool?utm_source=partner-link&amp;amp;utm_medium=referral&amp;amp;utm_campaign=partner-44482&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>operations</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Store and switch dev environments</title>
      <dc:creator>Shovan</dc:creator>
      <pubDate>Sun, 11 Sep 2022 02:23:16 +0000</pubDate>
      <link>https://dev.to/shovan/store-and-switch-dev-environments-51id</link>
      <guid>https://dev.to/shovan/store-and-switch-dev-environments-51id</guid>
      <description>&lt;p&gt;As a web developer, it can be a hassle to constantly switch between various &lt;a href="https://breeze.bar/product/domain-environments-switcher" rel="noopener noreferrer"&gt;website environments&lt;/a&gt; (e.g. dev, uat, prod). This &lt;a href="https://chrome.google.com/webstore/detail/breeze-website-management/gedoaajonjaiigaefeaanpfmhnadkgkm" rel="noopener noreferrer"&gt;Breeze Chrome Extension&lt;/a&gt; simplifies the process by allowing you to quickly swap domains between specified URL groups. This way, you can stay on the same page while keeping the rest of your development process streamlined.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create an unlimited number of Environments&lt;/li&gt;
&lt;li&gt;Unique colour for each Environment&lt;/li&gt;
&lt;li&gt;Share it with your team&lt;/li&gt;
&lt;li&gt;Access From Extension Bar&lt;/li&gt;
&lt;li&gt;Environment Password&lt;/li&gt;
&lt;/ul&gt;


&lt;div&gt;
  &lt;iframe src="https://loom.com/embed/6a620bcb9a774e318b84d1b3e4d86ce3"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>extension</category>
      <category>chrome</category>
      <category>chromeextension</category>
    </item>
    <item>
      <title>Ruby Package</title>
      <dc:creator>Shovan</dc:creator>
      <pubDate>Mon, 23 Mar 2020 10:26:33 +0000</pubDate>
      <link>https://dev.to/shovan/ruby-package-1p9n</link>
      <guid>https://dev.to/shovan/ruby-package-1p9n</guid>
      <description>&lt;p&gt;Hi, &lt;/p&gt;

&lt;p&gt;I have three separate files, I would like to have a script that would install the below files in the local folder &lt;/p&gt;

&lt;p&gt;&lt;em&gt;Package Items&lt;/em&gt;&lt;br&gt;
&lt;a href="https://gitlab.com/darkout/builder/-/raw/master/_data/do-hero-content.yml" rel="noopener noreferrer"&gt;https://gitlab.com/darkout/builder/-/raw/master/_data/do-hero-content.yml&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://gitlab.com/darkout/builder/-/raw/master/_includes/do-hero-content.html" rel="noopener noreferrer"&gt;https://gitlab.com/darkout/builder/-/raw/master/_includes/do-hero-content.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://gitlab.com/darkout/builder/-/raw/master/_sass/modules/do-hero-content.scss" rel="noopener noreferrer"&gt;https://gitlab.com/darkout/builder/-/raw/master/_sass/modules/do-hero-content.scss&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sample code example&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;install do-hero&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Should install the above three files in the local in the following folders&lt;/p&gt;

&lt;p&gt;&lt;em&gt;expected output: to have the files in the local below folder&lt;/em&gt;&lt;br&gt;
local &amp;gt; /_data/do-hero-content.yml&lt;br&gt;
local &amp;gt; /_includes/do-hero-content.html&lt;br&gt;
local &amp;gt; /_sass/modules/do-hero-content.scss&lt;/p&gt;

&lt;p&gt;Could someone advise me what's the best way to execute this? &lt;/p&gt;

&lt;p&gt;Thanks&lt;br&gt;
Shovan&lt;/p&gt;

</description>
      <category>ruby</category>
    </item>
  </channel>
</rss>
