> ## Documentation Index
> Fetch the complete documentation index at: https://docs.bloom.diy/llms.txt
> Use this file to discover all available pages before exploring further.

# Deploying Your App

> Export your code and publish to the App Store and Google Play.

Once you've built and tested your app in Bloom, you have two options for getting it into users' hands:

1. **Instant sharing** (covered in [Instant Sharing](/instant-sharing)) — Share immediately with links and QR codes
2. **App Store publishing** (this guide) — Deploy to official app stores for public distribution

This guide covers **publishing to the iOS App Store and Google Play Store** for permanent, discoverable app listings.

<Info>
  **Not sure which you need?** If you're testing, demoing, or building an internal tool, [instant sharing](/instant-sharing) is faster and easier. If you want public distribution, monetization, or app store credibility, follow this guide.
</Info>

## Why publish to app stores?

<CardGroup cols={2}>
  <Card title="Discoverability" icon="magnifying-glass">
    Users can find your app by searching app stores. You appear in categories, featured lists, and recommendations.
  </Card>

  <Card title="Credibility" icon="shield-check">
    Official app store listings build trust with users. Many people prefer downloading from stores they know.
  </Card>

  <Card title="Monetization" icon="dollar-sign">
    Sell your app, offer in-app purchases, or use subscription models through app store payment systems.
  </Card>

  <Card title="Push notifications" icon="bell">
    Full push notification support (iOS requires App Store distribution for reliable push).
  </Card>

  <Card title="Analytics & reviews" icon="chart-bar">
    Access to app store analytics, user reviews, and ratings to improve your product.
  </Card>

  <Card title="Professional presence" icon="briefcase">
    Essential for businesses, brands, or apps serving large audiences.
  </Card>
</CardGroup>

## Requirements for publishing

### Plan requirements

<Tabs>
  <Tab title="Starter or Higher">
    **Code export** is available on Starter plans and above.

    <Check>
      Export your full Expo + Convex project as a ZIP
    </Check>

    <Check>
      Deploy to any hosting platform
    </Check>

    <Check>
      Publish to app stores
    </Check>

    [View pricing →](/pricing-and-credits)
  </Tab>

  <Tab title="Premium or Higher">
    **GitHub sync** is available on Premium plans and above.

    <Check>
      Two-way sync with GitHub
    </Check>

    <Check>
      Automatic code pushes
    </Check>

    <Check>
      Integrate with CI/CD pipelines
    </Check>

    <Check>
      Use GitHub Actions for automated builds
    </Check>

    [View pricing →](/pricing-and-credits)
  </Tab>
</Tabs>

### Developer accounts

To publish to app stores, you'll need:

<AccordionGroup>
  <Accordion title="Apple Developer Program" icon="apple">
    **Cost:** \$99/year

    **Required for:** Publishing to the iOS App Store

    **Sign up:** [developer.apple.com/programs](https://developer.apple.com/programs/)

    **What you get:**

    * Ability to submit apps to App Store
    * Access to App Store Connect
    * TestFlight for beta testing
    * App analytics and sales reports
    * Certificate and provisioning profile management

    <Info>
      You can build and test iOS apps without this account using Bloom's instant sharing. You only need it when you're ready to publish officially.
    </Info>
  </Accordion>

  <Accordion title="Google Play Console" icon="google">
    **Cost:** \$25 one-time fee

    **Required for:** Publishing to Google Play Store

    **Sign up:** [play.google.com/console](https://play.google.com/console/)

    **What you get:**

    * Ability to publish apps to Play Store
    * Access to Play Console
    * Internal testing and beta tracks
    * App analytics and user feedback
    * Revenue reports (for paid apps)

    <Tip>
      Much cheaper than Apple's yearly fee—just a one-time \$25 payment and you can publish unlimited apps.
    </Tip>
  </Accordion>
</AccordionGroup>

## Exporting your code

### Option 1: Download as ZIP (Starter+)

<Steps>
  <Step title="Click 'Download Code'" icon="download">
    In the top right corner of the editor, click the **Download Code** button.

    <Frame>
      <img src="https://mintcdn.com/bloom-eafef039/6Jj6W1TQ2_0nANBi/images/download-code.png?fit=max&auto=format&n=6Jj6W1TQ2_0nANBi&q=85&s=b6b41c56c6f97cf7dd81b31925d745c5" alt="Download Code button" width="788" height="260" data-path="images/download-code.png" />
    </Frame>
  </Step>

  <Step title="Download the ZIP file" icon="file-zipper">
    Bloom bundles your current project version and downloads it as a ZIP file.

    The export includes:

    * Full Expo project (frontend)
    * Complete Convex deployment (backend)
    * Configuration files
    * Package dependencies
    * Environment setup instructions
  </Step>

  <Step title="Extract and explore" icon="folder-open">
    Unzip the file on your computer. You'll see:

    ```
    my-app/
    ├── expo/           # Your frontend code
    ├── convex/         # Your backend functions
    ├── package.json    # Dependencies
    ├── README.md       # Setup instructions
    └── ...
    ```
  </Step>
</Steps>

<Info>
  Your exported code is a standard Expo + Convex project. You can run it locally, deploy it to your own infrastructure, or publish it to app stores.
</Info>

### Option 2: GitHub Sync (Premium+)

In the top right corner of the editor, click the **GitHub Sync** button.

<Frame>
  <img src="https://mintcdn.com/bloom-eafef039/6Jj6W1TQ2_0nANBi/images/github-sync.png?fit=max&auto=format&n=6Jj6W1TQ2_0nANBi&q=85&s=41f0095bc097c8473197f47d7fc9d89c" alt="GitHub Sync" width="1115" height="1347" data-path="images/github-sync.png" />
</Frame>

<Steps>
  <Step title="Create a new empty repository on GitHub">
    Click **Create New Repository** to open GitHub directly. The repository must be empty for the initial sync to work correctly.
  </Step>

  <Step title="Install the GitHub App">
    Click **Install GitHub App** to install the Bloom GitHub App and grant it access to your repository. You can grant access to all repositories or only select repositories.
  </Step>

  <Step title="Enter your repository name">
    Enter your repository name in the format `username/repository` or `organization/repository`, then click **Configure**.

    You can also click **Browse Available Repositories** to select from repositories you've already granted access to.
  </Step>

  <Step title="Configure CI/CD (optional)" icon="gears">
    With your code in GitHub, you can set up automated workflows:

    * **GitHub Actions** for automated builds
    * **Expo EAS** for app store submissions
    * **Automated testing** on every commit
    * **Deployment pipelines** for staging and production
  </Step>
</Steps>

<Note>
  GitHub Sync is ideal for teams or developers who want version control and automated deployment workflows.
</Note>

## Publishing to iOS App Store

<Steps>
  <Step title="Prepare your app" icon="clipboard-check">
    Before submitting, ensure you have:

    <Check>
      App name and description
    </Check>

    <Check>
      App icon (1024x1024px)
    </Check>

    <Check>
      Screenshots for required device sizes
    </Check>

    <Check>
      Privacy policy URL (if collecting user data)
    </Check>

    <Check>
      App category selection
    </Check>

    <Check>
      Age rating information
    </Check>
  </Step>

  <Step title="Set up App Store Connect" icon="apple">
    1. Log in to [App Store Connect](https://appstoreconnect.apple.com)
    2. Click **My Apps** → **+** → **New App**
    3. Fill in app information:
       * Platform: iOS
       * Name
       * Primary language
       * Bundle ID (must match your Expo app)
       * SKU (internal identifier)

    <Info>
      Your **Bundle ID** is in your Expo configuration. Find it in `app.json` or `app.config.js` in your exported code.
    </Info>
  </Step>

  <Step title="Build your app with Expo EAS" icon="hammer">
    Bloom apps are built with Expo, which means you'll use **Expo Application Services (EAS)** for building and submission.

    <Accordion title="Install EAS CLI">
      ```bash theme={null}
      npm install -g eas-cli
      ```
    </Accordion>

    <Accordion title="Login to Expo">
      ```bash theme={null}
      eas login
      ```
    </Accordion>

    <Accordion title="Configure EAS Build">
      ```bash theme={null}
      eas build:configure
      ```

      This creates `eas.json` with build profiles.
    </Accordion>

    <Accordion title="Build for iOS">
      ```bash theme={null}
      eas build --platform ios
      ```

      EAS builds your app in the cloud and provides a download link.
    </Accordion>

    <Tip>
      Follow Expo's [App Store submission guide](https://docs.expo.dev/submit/ios/) for detailed instructions.
    </Tip>
  </Step>

  <Step title="Submit to App Store" icon="paper-plane">
    Once your build completes:

    1. Download the `.ipa` file from EAS
    2. Upload to App Store Connect via Transporter or Xcode
    3. Add screenshots, descriptions, and metadata
    4. Submit for review

    <Warning>
      Apple review typically takes 1-3 days but can be longer. Monitor your submission status in App Store Connect.
    </Warning>
  </Step>

  <Step title="App Review" icon="magnifying-glass">
    Apple reviews your app for:

    * Compliance with App Store guidelines
    * Privacy policy requirements
    * Functionality and crashes
    * Accurate metadata

    If approved, your app goes live automatically (or on your scheduled release date).

    If rejected, you'll receive feedback and can resubmit after making changes.
  </Step>
</Steps>

<Card title="Learn more about iOS publishing" icon="book" href="https://docs.expo.dev/submit/ios/">
  Expo's comprehensive guide to App Store submission
</Card>

## Publishing to Google Play Store

<Steps>
  <Step title="Prepare your app" icon="clipboard-check">
    Before submitting, ensure you have:

    <Check>
      App name and short description (80 chars)
    </Check>

    <Check>
      Full description (4000 chars)
    </Check>

    <Check>
      App icon (512x512px)
    </Check>

    <Check>
      Feature graphic (1024x500px)
    </Check>

    <Check>
      Screenshots (at least 2 per device type)
    </Check>

    <Check>
      Privacy policy URL (if collecting user data)
    </Check>

    <Check>
      Content rating questionnaire completed
    </Check>
  </Step>

  <Step title="Set up Google Play Console" icon="google">
    1. Log in to [Google Play Console](https://play.google.com/console)
    2. Click **Create app**
    3. Fill in basic information:
       * App name
       * Default language
       * App or game
       * Free or paid
    4. Accept terms and create app
  </Step>

  <Step title="Build your app with Expo EAS" icon="hammer">
    <Accordion title="Configure for Android">
      ```bash theme={null}
      eas build:configure
      ```
    </Accordion>

    <Accordion title="Build for Android">
      ```bash theme={null}
      eas build --platform android
      ```

      Choose **apk** for testing or **aab** (Android App Bundle) for Play Store submission.
    </Accordion>

    <Tip>
      For Play Store, always use **aab** format—it's required and provides smaller download sizes.
    </Tip>
  </Step>

  <Step title="Upload to Play Console" icon="upload">
    1. In Play Console, go to **Production** → **Create new release**
    2. Upload your `.aab` file from EAS
    3. Add release notes
    4. Review and roll out

    <Info>
      You can also use internal testing or closed testing tracks before going to production.
    </Info>
  </Step>

  <Step title="Complete store listing" icon="store">
    Fill out all required fields in Play Console:

    * App details (name, description, category)
    * Graphics (icon, feature graphic, screenshots)
    * Categorization (app category, tags)
    * Contact details (email, website, privacy policy)
    * Content rating
    * Target audience and content

    <Warning>
      Play Store requires more detailed content ratings than iOS. Complete the questionnaire carefully.
    </Warning>
  </Step>

  <Step title="Submit for review" icon="paper-plane">
    Once all required fields are complete:

    1. Click **Review release**
    2. Check for any errors or warnings
    3. Click **Start rollout to Production**

    Google's review is typically faster than Apple's (often within hours to 1 day).
  </Step>
</Steps>

<Card title="Learn more about Android publishing" icon="book" href="https://docs.expo.dev/submit/android/">
  Expo's comprehensive guide to Play Store submission
</Card>

## Managing your backend

After publishing, your Convex backend continues to run and scale automatically. You can:

<CardGroup cols={2}>
  <Card title="Monitor in Bloom" icon="chart-line">
    Keep using Bloom's [Backend Dashboard](/backend-dashboard) to monitor health, view logs, and manage data.
  </Card>

  <Card title="Manage directly in Convex" icon="database">
    Your Convex deployment is accessible at the URL shown in your Backend Dashboard settings. Open in a new tab for full Convex dashboard access.
  </Card>
</CardGroup>

<Info>
  Your Convex deployment URL remains the same after publishing. Your published app connects to the same backend you use in Bloom.
</Info>

## Updating your published app

### For apps exported as ZIP:

<Steps>
  <Step title="Make changes in Bloom">
    Continue editing your app in Bloom to add features, fix bugs, or update UI.
  </Step>

  <Step title="Export updated code">
    Download a fresh ZIP export when you're ready to publish an update.
  </Step>

  <Step title="Build and submit new version">
    * Update version number in `app.json`
    * Build with EAS: `eas build --platform ios|android`
    * Submit new build to app stores
  </Step>
</Steps>

### For apps with GitHub sync:

<Steps>
  <Step title="Changes sync automatically">
    Your GitHub repo updates as you work in Bloom.
  </Step>

  <Step title="Trigger CI/CD pipeline">
    If you've set up GitHub Actions or automated builds, they run automatically on new commits.
  </Step>

  <Step title="Submit new version">
    Automated pipelines can submit directly to app stores, or you can trigger manually.
  </Step>
</Steps>

<Tip>
  **Over-the-air updates:** With Expo's EAS Update, you can push JavaScript changes to users instantly without resubmitting to app stores. Native changes still require new builds.
</Tip>

## Common publishing questions

<AccordionGroup>
  <Accordion title="How long does app review take?">
    * **Apple App Store:** 1-3 days on average (sometimes longer)
    * **Google Play Store:** Hours to 1 day typically

    First submissions often take longer as reviewers are more thorough.
  </Accordion>

  <Accordion title="What if my app gets rejected?">
    Both stores will provide reasons for rejection. Common issues:

    * Missing privacy policy
    * Crashes or bugs
    * Metadata that doesn't match functionality
    * Violations of content guidelines

    Fix the issues and resubmit. You can appeal if you believe the rejection is incorrect.
  </Accordion>

  <Accordion title="Do I need to rebuild for every change?">
    **Native changes:** Yes, anything that modifies native code, dependencies, or app configuration requires a new build and submission.

    **JavaScript changes:** No. Use Expo's EAS Update to push JS changes instantly without rebuilding.
  </Accordion>

  <Accordion title="Can I test before publishing?">
    Yes! Both platforms offer testing options:

    * **iOS:** Use TestFlight for beta testing
    * **Android:** Use internal testing or closed testing tracks

    You can also continue using Bloom's [**instant sharing**](/instant-sharing) for quick testing.
  </Accordion>

  <Accordion title="What about environment variables and API keys?">
    After exporting:

    1. Configure environment variables in your build profiles (EAS)
    2. Keep sensitive keys in `.env` files (never commit to GitHub)
    3. Use Expo's secure storage for production credentials

    Your Convex backend URL is automatically included in the build.
  </Accordion>

  <Accordion title="How do I handle app store fees?">
    * **Apple:** 30% commission on paid apps and in-app purchases (15% for small businesses earning under \$1M/year)
    * **Google:** 15% commission on first \$1M, then 30% after

    Free apps with no in-app purchases have no commissions.
  </Accordion>
</AccordionGroup>

## What's next?

<CardGroup cols={2}>
  <Card title="Monitor with Backend Dashboard" icon="chart-line" href="/backend-dashboard">
    Track performance and health as users start using your published app.
  </Card>

  <Card title="View Logs" icon="terminal" href="/logs">
    Debug issues and monitor user activity in production.
  </Card>

  <Card title="Expo EAS Documentation" icon="book" href="https://docs.expo.dev/eas/">
    Learn advanced build and deployment workflows with Expo.
  </Card>

  <Card title="Convex Production Hosting" icon="server" href="https://docs.convex.dev/production/hosting">
    Understand how your backend scales and how to optimize for production.
  </Card>
</CardGroup>

<Card title="Need help publishing?" icon="life-ring">
  Contact Bloom support for assistance with app store submission and deployment.
</Card>
