Build Yourself / Contribution Guide
How to build the app on your own system, or how to contribute to the project
We encourage all contributions to this project! This guide will help you get your development environment set up and show you how to contribute effectively.
Code of Conduct
Write clean, well-commented code
Format your code with
dart format ./ --line-length=120Test your changes thoroughly before submitting
Avoid making large formatting changes to files, unless that is the goal of your PR — it makes it easier for us to review your changes
Development Environment Setup
Prerequisites
Install Git: Download
Install Java JDK: Download
Install Flutter Version Manager (FVM) - Recommended
FVM allows you to manage multiple Flutter versions easily:
dart pub global activate fvmThen install and use the Flutter version specified in the project:
fvm install fvm useAlternatively, install Flutter directly, following the guide for your OS all the way up to the "Test Drive" page: Flutter installation guide
Install Android Studio: Download
Install Flutter & Dart plugins via the Plugin Manager
Install Command Line Tools via SDK Manager
Configure an Android Virtual Device (AVD) via AVD Manager, or connect a physical Android device with USB debugging enabled
Install Visual Studio Code (Recommended): Download
Install the following extensions:
Dart
Flutter
IntelliCode (optional but recommended)
Android Device Setup
Option 1: Android Virtual Device (AVD)
Open Android Studio → AVD Manager
Create a new virtual device
Choose a device definition (e.g., Pixel 6)
Select a system image (API 30 or higher recommended)
Finish setup and launch the emulator
Option 2: Physical Android Device
Enable Developer Options on your device
Enable USB Debugging
Connect via USB
Verify connection:
flutter devices
Repository Setup
Forking and Cloning
Create a GitHub account if you don't have one
Fork the
bluebubbles-apprepositoryClone your forked repository:
Set up the upstream remote:
Fetch branches and pull the latest changes:
Installing Dependencies
Building the App
Development Builds
Run the app in debug mode:
Production Builds
Build release APKs with flavor support:
Flavors
The Android app is built using Flutter build flavors, which let several variants of the app (different app names, icon colors, and application/package IDs) ship from the same codebase without conflicting with each other on a device. Flavors are defined in the productFlavors block of android/app/build.gradle:
prod: Production builds for the Google Play Store (
com.bluebubbles.messaging) - this is the default flavorprodNoAa: Identical to
prod, but without Android Auto supportbeta: Beta testing builds with Firebase Test Lab integration
alpha: Internal alpha testing builds
To build or run a specific flavor:
Adding your own flavor
If you'd like your own personal flavor (for example, to install a dev build alongside a production install without them overwriting each other), add a new entry to the productFlavors block in android/app/build.gradle:
Then give it a signing config in the buildTypes.release block:
Assigning signingConfigs.debug lets the flavor build immediately using Flutter's auto-generated debug keystore. Only assign signingConfigs.release once you've set up your own keystore, as described below.
Signing Keys (Keystore)
Debug builds — flutter run, or any flavor assigned signingConfigs.debug — require no setup from you. Flutter automatically generates a debug keystore (~/.android/debug.keystore) the first time you build, and it's used automatically.
Release builds — flutter build apk --release, for flavors assigned signingConfigs.release (prod, prodNoAa, beta, alpha) — need a keystore you control:
Generate a keystore with the JDK's
keytool:Create
android/key.properties(this file is gitignored — never commit it):
android/app/build.gradle reads key.properties automatically and wires it into signingConfigs.release — no other changes are needed. If key.properties is missing, any flavor using signingConfigs.release will fail to build with a signing error. While testing locally, it's often easiest to add your own flavor assigned to signingConfigs.debug (see above) instead of setting up a keystore.
Web
In the terminal window at the root of the project directory, run flutter build web --web-renderer=canvaskit. It will output the build files to build/web to be hosted on your server.
Desktop
Windows Build
Install NuGet package manager
Go to Visual Studio Installer -> Modify Build Tools -> Individual Components and install the latest Windows 10 SDK
Run the following commands:
Linux Build
Under construction...
Code Formatting
Always format your code before committing:
This project uses a max line length of 120 characters.
Codebase Reference
Before diving into an issue, it's worth getting familiar with how the app is put together. These pages go deeper than this guide into the client codebase itself:
Architecture Overview — the app's layers (UI, services, background isolates, database), state management (
GetItvsGetX,ChatState/MessageState), and service startup order.Theming and Components — the reusable
BBScaffold/BBAppBar/BBChip/dialog widgets, and how the skin (iOS/Material/Samsung) and theme (light/dark/custom colors) systems work under the hood.
Workflow: Picking an Issue
Check the issues page
Filter by labels:
Difficulty: Easy,Difficulty: Medium,Difficulty: Hardgood first issue- Great for newcomersbug- Bug fixesenhancement- New features
If working on something without an issue, create one first for tracking
Workflow: Making Changes
Create a feature branch off of
master:Make your changes
Format your code:
Test thoroughly on both emulator and physical device if possible. Make sure you don't commit any of your changes that comment out
onContentCommit.The client apps have a lot of variables that need to be tested. For example, if you're making a UI change, please make sure it looks good in all the default themes, and all the skins as well.
If you wish to make a backend change, we suggest you consult with the main developers before writing code. This is so we can come up with a plan of attack and make sure we don't degrade existing functionality or create bugs.
Stage and commit:
Push to your fork:
Workflow: Submitting a Pull Request
Go to your forked repository on GitHub
Click "Pull requests" → "New pull request"
Set the base repository to
BlueBubblesApp/bluebubbles-appand the base branch tomasterInclude in your PR description:
Problem: What issue does this solve?
Solution: How did you fix it?
Testing: How did you test the changes?
Screenshots: If applicable, include before/after screenshots
Submit and wait for review!
Additional Resources
Questions?
Join our Discord community for help and discussions!
Last updated
Was this helpful?