← Back to posts Cover image for Flutter Beyond the App Stores: Publishing to F-Droid, GitHub, and More

Flutter Beyond the App Stores: Publishing to F-Droid, GitHub, and More

· 5 min read
Weekly Digest

The Flutter news you actually need

No spam, ever. Unsubscribe in one click.

Chris
By Chris

Unlocking Distribution: How to Share Your Flutter App Without the App Stores

Publishing on the Google Play Store and Apple App Store is the standard path, but it’s not the only one. Store fees, review processes, and policy restrictions can be hurdles, especially for indie developers, niche tools, or open-source projects. What if you want to distribute your app freely, directly to your users? Fortunately, Flutter’s cross-platform nature makes it an excellent fit for alternative distribution channels.

Let’s explore three practical, free methods to get your app into users’ hands outside the traditional stores.

1. F-Droid: The Home for Open-Source Apps

F-Droid is a popular repository for free and open-source software (FOSS) on Android. It’s ideal if your app’s source code is publicly available under an approved open-source license.

The Benefit: Your app gains visibility within a community that values privacy and software freedom. F-Droid also handles updates, notifying users when a new version is available.

The Key Requirement: Your app must be FOSS. This means your pubspec.yaml dependencies should be compatible with your chosen license, and you need to provide a full, buildable source repository.

Practical Steps:

  1. Prepare Your Source Repository: Ensure your Flutter project is hosted on a platform like GitHub or GitLab, with a clear LICENSE file (e.g., GPLv3, MIT, Apache 2.0).

  2. Create a Metadata File: F-Droid requires a metadata file. You submit this via a Merge Request to their data repository. Here’s a basic example of what that file (metadata/<your.package.name>.yml) looks like:

    Categories:
      - Productivity
    License: MIT
    SourceCode: https://github.com/yourusername/your_flutter_app
    IssueTracker: https://github.com/yourusername/your_flutter_app/issues
    
    AutoName: Your Cool App
    Summary: A short description of your fantastic Flutter app.
    Description: |
      A more detailed description spanning multiple lines.
      Explain what your app does here.
    
    RepoType: git
    Repo: https://github.com/yourusername/your_flutter_app
    
    Builds:
      - versionName: 1.0.0
        versionCode: 100
        commit: v1.0.0
        subdir: .
        gradle:
          - app
        output: build/app/outputs/flutter-apk/app-release.apk
        srclibs:
          - flutter@3.22.2
        build: |
          flutter config --no-analytics
          flutter pub get
          flutter build apk --release
  3. Submit for Inclusion: Follow F-Droid’s submission guide. Their build servers will automatically compile your app from source for each release, ensuring transparency.

Common Mistake: Forgetting to disable or configure analytics and crash reporting libraries that might not be FOSS-compliant. Review your pubspec.yaml dependencies carefully.

2. GitHub Releases: Direct APK Distribution

For any project (open-source or not), GitHub Releases provides a simple, versioned hosting solution for your compiled binaries. This is incredibly straightforward for Flutter Android apps.

The Benefit: Full control. You host the file directly, linked to your code repository. It’s perfect for beta testers, early access, or apps you don’t intend to publish on a store.

Practical Steps:

  1. Build a Release APK: From your project root, run:

    flutter build apk --release

    The APK will be generated at build/app/outputs/flutter-apk/app-release.apk.

  2. Create a New Release: On your GitHub repository page, navigate to the “Releases” section and click “Create a new release.”

  3. Tag and Upload: Assign a tag (like v1.0.0), add release notes, and simply drag your app-release.apk file into the binary attachments area. Publish the release.

  4. Share the Link: You can now share the direct download link (e.g., https://github.com/yourusername/your_flutter_app/releases/download/v1.0.0/app-release.apk) with your users.

Pro Tip: To make this smoother, automate the process. Here’s a simple Dart script you could integrate into your workflow (scripts/prepare_release.dart):

import 'dart:io';
import 'package:path/path.dart' as path;

void main() async {
  final projectDir = Directory.current;
  final buildDir = Directory(path.join(projectDir.path, 'build', 'app', 'outputs', 'flutter-apk'));
  
  // Find the latest APK
  final apkFiles = buildDir.listSync().where((file) => file.path.endsWith('.apk')).toList();
  
  if (apkFiles.isEmpty) {
    print('No APK found. Run `flutter build apk --release` first.');
    exit(1);
  }

  // Sort by modification time, newest first
  apkFiles.sort((a, b) => b.statSync().modified.compareTo(a.statSync().modified));
  final latestApk = apkFiles.first;

  // Copy it to a predictable location for your CI/CD or manual upload
  final releaseDir = Directory(path.join(projectDir.path, 'release'));
  if (!releaseDir.existsSync()) {
    releaseDir.createSync(recursive: true);
  }

  final destination = File(path.join(releaseDir.path, 'my_app-latest.apk'));
  latestApk.copySync(destination.path);
  
  print('Latest APK prepared at: ${destination.path}');
  print('Ready for upload to GitHub Releases!');
}

3. Direct Sharing & Other Repositories

Sometimes, the simplest method is the best. You can share the APK file directly via email, cloud storage (like Google Drive or Dropbox), or even a personal website. Just provide the download link and instructions.

For Android users, installing an APK requires enabling “Install from unknown sources” (now more granularly called “Install unknown apps”) for the specific app (e.g., Chrome, Files) used for the download. Always remind your users of this step.

Beyond F-Droid, other community repositories like IzzyOnDroid offer similar FOSS-focused distribution, often with less stringent build requirements, acting as a helpful supplement.

Important Considerations

  • iOS is Different: Apple’s ecosystem is much more locked down. Outside the App Store, options are essentially limited to limited ad-hoc distribution (via TestFlight for up to 100 testers) or enterprise certificates, both of which require an Apple Developer account.
  • Updates are Your Responsibility: Unlike the Play Store, you must manage update notifications and delivery when distributing APKs directly. Consider integrating an update-checking library if this is crucial for your app.
  • Security & Trust: Users must trust you directly when installing APKs outside a store. Be transparent, use code signing, and consider getting your app included in reputable repositories like F-Droid to build trust.

Distributing your Flutter app beyond the major app stores opens up new possibilities for audience reach, control, and community engagement. Whether you’re building an open-source tool or need a direct distribution pipeline, these methods provide robust, free alternatives to get your work into the world.

This blog is produced with the assistance of AI by a human editor. Learn more

Related Posts

Cover image for Flutter's Hidden Gem: Building Powerful Linux Desktop Apps with Ease

Flutter's Hidden Gem: Building Powerful Linux Desktop Apps with Ease

Flutter is gaining traction as a robust framework for Linux desktop development, offering a smoother experience compared to traditional toolkits like GTK and Qt. This post will explore why Flutter excels for Linux apps, highlight its advantages, and provide practical insights for developers looking to leverage Flutter for their desktop projects.

Cover image for Simplifying Flutter Desktop Deployment: Signing and Distribution for Windows

Simplifying Flutter Desktop Deployment: Signing and Distribution for Windows

Deploying Flutter desktop apps on Windows can be challenging, especially regarding code signing and preventing Windows from blocking installations. This post will guide developers through the process of signing their Flutter desktop applications, exploring alternatives to the Microsoft Store like creating executable installers, and covering the necessary steps to ensure a smooth user experience.

Cover image for Mastering Flutter Tooling: Streamlining SDK Management and Installation on Windows

Mastering Flutter Tooling: Streamlining SDK Management and Installation on Windows

Developers frequently voice frustrations about Flutter SDK version management and installation processes, particularly on Windows. This post will explore best practices for managing multiple Flutter versions using tools like FVM, discuss integrating Flutter with package managers like Winget for a smoother Windows setup, and offer strategies to ensure a consistent development environment across projects and teams.