Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
ce8eaf1
Add iPhone relay health monitoring
Xare123 Jul 24, 2026
5db2ec5
Harden iPhone relay health monitoring
Xare123 Jul 24, 2026
991b805
Show relay health only for iPhone relays
Xare123 Jul 24, 2026
ab9293a
Clean up stale UI listeners
Xare123 Jul 24, 2026
cf7e519
Fix UI lifecycle and relay retry edge cases
Xare123 Jul 24, 2026
b576167
Avoid eager full-resolution image decoding
Xare123 Jul 24, 2026
7478ceb
Improve Android control accessibility
Xare123 Jul 24, 2026
9cf1034
Build resilient Alpha profile APK
Xare123 Jul 24, 2026
95ef277
Prioritize Alpha profile artifact
Xare123 Jul 24, 2026
ad26128
Remove workflow trailing whitespace
Xare123 Jul 24, 2026
e6e284c
Compile resilient anisette provisioning
Xare123 Jul 24, 2026
018bd01
Retry anisette transport failures
Xare123 Jul 24, 2026
1fc63f0
Harden message refresh and receive diagnostics
Xare123 Jul 24, 2026
b2c8184
Use fresh message service on transcript refresh
Xare123 Jul 24, 2026
c01e6b7
Fix nullable reaction preview fallback
Xare123 Jul 24, 2026
dc2bd90
Run focused message helper test
Xare123 Jul 24, 2026
f8fe0e2
docs: add Android development and diagnostics guide
Xare123 Jul 24, 2026
95c08b5
docs: define delivery and performance verification plan
Xare123 Jul 24, 2026
b7e9b98
Harden background routing and reconnect lifecycle
Xare123 Jul 24, 2026
d2e8c6b
Back off terminal APS poll panics
Xare123 Jul 24, 2026
d332a41
Register socket callbacks before connecting
Xare123 Jul 24, 2026
696461d
fix: preserve incoming message delivery integrity
Xare123 Jul 24, 2026
18c8cdb
Fix avatar resource leaks and push acknowledgement ordering
Xare123 Jul 24, 2026
2f324f2
fix: harden group participant and reaction handling
Xare123 Jul 24, 2026
e7623f9
Refresh group avatars without background controller churn
Xare123 Jul 24, 2026
7791de6
Harden partial widget initialization and profile loading
Xare123 Jul 25, 2026
cdac24b
Use upstream RustPush provisioning dependency
Xare123 Jul 25, 2026
27a2d33
Close remaining UI lifecycle races
Xare123 Jul 25, 2026
1da494a
Use HTTPS for public submodules
Xare123 Jul 25, 2026
92eeedb
Fix reply navigation and message lifecycle races
Xare123 Jul 25, 2026
d31edcf
Fix recycled message controller remounts
Xare123 Jul 25, 2026
d6eba36
Make conversation keyboard dismissal reliable
Xare123 Jul 25, 2026
6028e16
Load complete reply threads with originators
Xare123 Jul 25, 2026
b0ba95e
Don't fail sends while the push connection is reconnecting
claude Jul 27, 2026
58d2c60
Retry shared contact profile downloads
Xare123 Jul 27, 2026
7b61ee0
Retry transient sends and harden attachment streams
Xare123 Jul 28, 2026
16583eb
Prioritize tapped attachment downloads
Xare123 Jul 28, 2026
dfccf20
Align attachment priority handler
Xare123 Jul 28, 2026
21823a3
Harden desktop sync, rendering, and Apple sign-in
Xare123 Jul 28, 2026
1502ba0
Add Windows x64 and experimental ARM64 build lanes
Xare123 Jul 28, 2026
1bad5a8
Run bridge validation on API pushes
Xare123 Jul 28, 2026
4ef2659
Validate bridge workflow changes
Xare123 Jul 28, 2026
cf82d6f
Verify bare bridge generator checksums
Xare123 Jul 28, 2026
3bf1089
Pin Windows x64 CI to Visual Studio 2022
Xare123 Jul 28, 2026
2ee0bba
Provision test FairPlay fixtures for bridge CI
Xare123 Jul 28, 2026
b3e5b0e
Make generated bindings and Windows builds reproducible
Xare123 Jul 28, 2026
9a38761
Build Windows release from a short real path
Xare123 Jul 28, 2026
7cf9e28
Bound Windows Rust build memory
Xare123 Jul 28, 2026
cbfebf1
Compile committed Rust bridge bindings
Xare123 Jul 28, 2026
91d8cd4
Bound conversation media memory
Xare123 Jul 29, 2026
426ad3b
Harden startup and provisioning retries
Xare123 Jul 29, 2026
f785741
Refresh Rust lockfile for current dependencies
Xare123 Jul 29, 2026
d3e285e
Verify Windows Android native builds
Xare123 Jul 29, 2026
ae273e9
Enable fullscreen media swiping
Xare123 Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions .github/workflows/bridge-bindings.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
name: Rust bridge validation

on:
workflow_dispatch:
push:
paths:
- ".github/workflows/bridge-bindings.yml"
- "rust/src/api/**"
- "flutter_rust_bridge.yaml"
- "lib/src/rust/**"
- "rust/src/frb_generated*"
pull_request:
paths:
- ".github/workflows/bridge-bindings.yml"
- "rust/src/api/**"
- "flutter_rust_bridge.yaml"
- "lib/src/rust/**"
- "rust/src/frb_generated*"

jobs:
bindings:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: recursive

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable

- name: Install native build tools
run: |
sudo apt-get update
sudo apt-get install -y protobuf-compiler

- name: Set up test FairPlay certificates
shell: bash
run: |
destination="rustpush/certs/fairplay"
mkdir -p "$destination"
for name in \
4056631661436364584235346952193 \
4056631661436364584235346952194 \
4056631661436364584235346952195 \
4056631661436364584235346952196 \
4056631661436364584235346952197 \
4056631661436364584235346952198 \
4056631661436364584235346952199 \
4056631661436364584235346952200 \
4056631661436364584235346952201 \
4056631661436364584235346952208
do
cp rustpush/certs/legacy-fairplay/fairplay.pem "$destination/$name.pem"
cp rustpush/certs/legacy-fairplay/fairplay.crt "$destination/$name.crt"
done

- name: Compile committed Rust bridge
run: cargo check --manifest-path rust/Cargo.toml --lib --message-format short
26 changes: 21 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,28 @@ jobs:
cp rustpush/certs/legacy-fairplay/fairplay.crt rustpush/certs/fairplay/$name.crt
done

- name: Run focused message helper tests
run: flutter test test/helpers/message_helper_test.dart

- name: Run bounded memory cache tests
run: >-
flutter test
test/helpers/memory/bounded_byte_cache_test.dart
test/helpers/memory/bounded_lru_map_test.dart

# First run is expected to fail until ffmpeg_kit_flutter_new is fixed.
- name: Run Build Script
run: |
flutter build apk --flavor alpha --debug --target-platform android-arm64

- name: Build Alpha Profile APK
run: flutter build apk --flavor alpha --profile --target-platform android-arm64

- uses: actions/upload-artifact@v4
with:
name: Alpha Profile APK
path: build/app/outputs/flutter-apk/app-alpha-profile.apk

- name: Build Alpha Debug APK
run: flutter build apk --flavor alpha --debug --target-platform android-arm64

- uses: actions/upload-artifact@v4
with:
name: Alpha Debug APK
path: build/app/outputs/flutter-apk/app-alpha-debug.apk
path: build/app/outputs/flutter-apk/app-alpha-debug.apk
223 changes: 223 additions & 0 deletions .github/workflows/windows-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,223 @@
name: Windows builds

on:
workflow_dispatch:
push:
pull_request:

permissions:
contents: read

concurrency:
group: windows-build-${{ github.ref }}
cancel-in-progress: true

jobs:
windows:
name: Windows ${{ matrix.arch }}
runs-on: ${{ matrix.runner }}
continue-on-error: ${{ matrix.experimental }}
strategy:
fail-fast: false
matrix:
include:
- arch: x64
# Flutter 3.24 does not recognize the Visual Studio 2026 image
# currently behind windows-latest. Pin VS 2022 until the app's
# Flutter toolchain is upgraded.
runner: windows-2022
flutter-version: 3.24.0
rust-target: x86_64-pc-windows-msvc
build-directory: x64
experimental: false
- arch: arm64
runner: windows-11-arm
# Native Windows ARM64 Dart and engine artifacts are available
# starting with Flutter 3.44.
flutter-version: 3.44.8
rust-target: aarch64-pc-windows-msvc
build-directory: arm64
experimental: true

steps:
- name: Check out source
uses: actions/checkout@v4
with:
submodules: recursive

- name: Report runner architecture
shell: pwsh
run: |
$osArchitecture = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture
Write-Host "Runner architecture: $osArchitecture"
Write-Host "PROCESSOR_ARCHITECTURE=$env:PROCESSOR_ARCHITECTURE"
if ("$osArchitecture".ToLowerInvariant() -ne "${{ matrix.arch }}") {
throw "Expected a native ${{ matrix.arch }} runner, but received $osArchitecture."
}

# Do not remove this guard merely to make CI green. A native ARM64
# executable cannot load the x64 DLLs currently selected by these
# packages. Re-audit all three dependencies before enabling the build.
- name: Audit native ARM64 dependency compatibility
if: matrix.arch == 'arm64'
shell: pwsh
run: |
Write-Error @"
Native Windows ARM64 packaging is blocked by the locked native dependencies:

1. objectbox_flutter_libs 4.0.3 selects ObjectBox C 4.0.2 using
CMAKE_SYSTEM_PROCESSOR, but that release provides Windows x86 and
x64 archives only. There is no objectbox-windows-ARM64.zip.
2. printing 5.13.4 hard-codes PDFIUM_ARCH=x64 and downloads an x64
PDFium archive.
3. media_kit_libs_windows_video 1.0.10 hard-codes an x86_64 libmpv
archive and an x64 ANGLE bundle.

This job is experimental and allowed to fail. Keep it blocked until
native ARM64 replacements exist and are runtime-tested.
"@
exit 1

- name: Set up Flutter
id: flutter
uses: subosito/flutter-action@v2
with:
channel: stable
flutter-version: ${{ matrix.flutter-version }}
# Flutter's full Windows SDK archive is x64. On the ARM64 runner,
# the next step replaces its Dart SDK and downloads ARM64 engines.
architecture: x64
cache: true

- name: Bootstrap native ARM64 Dart and Flutter engine
if: matrix.arch == 'arm64'
shell: pwsh
run: |
$flutterRoot = "${{ steps.flutter.outputs['cache-path'] }}"
Remove-Item -Force "$flutterRoot\bin\cache\engine-dart-sdk.stamp" -ErrorAction SilentlyContinue
& "$flutterRoot\bin\internal\update_dart_sdk.ps1"

$dartVersion = & "$flutterRoot\bin\dart.bat" --version 2>&1 | Out-String
Write-Host $dartVersion
if ($dartVersion -notmatch "windows_arm64") {
throw "Expected an ARM64 Dart SDK, but got: $dartVersion"
}

& "$flutterRoot\bin\flutter.bat" precache --windows
$engineDirectory = "$flutterRoot\bin\cache\artifacts\engine\windows-arm64-release"
if (-not (Test-Path $engineDirectory)) {
throw "Flutter did not install the native Windows ARM64 release engine."
}

- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.rust-target }}

- name: Set up Protocol Buffers compiler
shell: pwsh
run: |
# protobuf does not publish a native Windows ARM64 protoc archive.
# The official win64 compiler is build-time tooling and runs under
# Windows 11 ARM's x64 emulation without affecting app architecture.
$version = "29.5"
$expectedHash = "633d3e555fc97f0a1f55b4adb03256cd94b8059e51e7abbae98ff39e58a9dfa5"
$archive = Join-Path $env:RUNNER_TEMP "protoc-$version-win64.zip"
$destination = Join-Path $env:RUNNER_TOOL_CACHE "protoc\$version\x64"
Invoke-WebRequest `
"https://github.com/protocolbuffers/protobuf/releases/download/v$version/protoc-$version-win64.zip" `
-OutFile $archive

$actualHash = (Get-FileHash $archive -Algorithm SHA256).Hash.ToLowerInvariant()
if ($actualHash -ne $expectedHash) {
throw "protoc archive checksum mismatch: expected $expectedHash, got $actualHash"
}

Expand-Archive -Path $archive -DestinationPath $destination -Force
"$destination\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
& "$destination\bin\protoc.exe" --version

- name: Set up test FairPlay certificates
shell: pwsh
run: |
$destination = "rustpush\certs\fairplay"
New-Item -ItemType Directory -Force -Path $destination | Out-Null
$certificateNames = @(
"4056631661436364584235346952193",
"4056631661436364584235346952194",
"4056631661436364584235346952195",
"4056631661436364584235346952196",
"4056631661436364584235346952197",
"4056631661436364584235346952198",
"4056631661436364584235346952199",
"4056631661436364584235346952200",
"4056631661436364584235346952201",
"4056631661436364584235346952208"
)
foreach ($name in $certificateNames) {
Copy-Item "rustpush\certs\legacy-fairplay\fairplay.pem" "$destination\$name.pem"
Copy-Item "rustpush\certs\legacy-fairplay\fairplay.crt" "$destination\$name.crt"
}

- name: Resolve Flutter dependencies
shell: pwsh
run: |
flutter config --enable-windows-desktop
flutter doctor -v
flutter pub get

- name: Build Windows release
shell: pwsh
env:
# Keep the large Rust release link inside the standard hosted
# runner's memory budget.
CARGO_BUILD_JOBS: "2"
CARGO_PROFILE_RELEASE_CODEGEN_UNITS: "4"
CARGO_TERM_COLOR: never
CARGOKIT_VERBOSE: "1"
run: |
# OpenSSL's longest generated object path exceeds the legacy
# 260-character compiler limit from GitHub's nested checkout path.
# Build from a real short path and regenerate Flutter's absolute
# plugin links there. A substituted drive breaks Cargokit's link
# integrity checks because the links retain the original drive.
$shortWorkspace = "D:\s"
New-Item -ItemType Directory -Force -Path $shortWorkspace | Out-Null
robocopy "$env:GITHUB_WORKSPACE" $shortWorkspace /E `
/XD `
"$env:GITHUB_WORKSPACE\.git" `
"$env:GITHUB_WORKSPACE\.dart_tool" `
"$env:GITHUB_WORKSPACE\build" `
"$env:GITHUB_WORKSPACE\windows\flutter\ephemeral" `
/NFL /NDL /NJH /NJS /NP
if ($LASTEXITCODE -ge 8) {
throw "Failed to stage the short Windows build workspace."
}

Set-Location $shortWorkspace
flutter pub get
flutter build windows --release

- name: Package Windows release
shell: pwsh
run: |
$bundle = "D:\s\build\windows\${{ matrix.build-directory }}\runner\Release"
if (-not (Test-Path "$bundle\bluebubbles_app.exe")) {
throw "Expected release executable was not produced at $bundle\bluebubbles_app.exe"
}

New-Item -ItemType Directory -Force -Path dist | Out-Null
$archive = "dist\OpenBubbles-windows-${{ matrix.arch }}.zip"
Compress-Archive -Path "$bundle\*" -DestinationPath $archive -Force
$hash = (Get-FileHash $archive -Algorithm SHA256).Hash.ToLowerInvariant()
"$hash OpenBubbles-windows-${{ matrix.arch }}.zip" |
Set-Content "$archive.sha256"

- name: Upload Windows artifact
uses: actions/upload-artifact@v4
with:
name: OpenBubbles-windows-${{ matrix.arch }}
path: |
dist/OpenBubbles-windows-${{ matrix.arch }}.zip
dist/OpenBubbles-windows-${{ matrix.arch }}.zip.sha256
if-no-files-found: error
4 changes: 2 additions & 2 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[submodule "rustpush"]
path = rustpush
url = git@github.com:OpenBubbles/rustpush.git
url = https://github.com/OpenBubbles/rustpush.git
[submodule "telephony_plus"]
path = telephony_plus
url = git@github.com:OpenBubbles/telephony_plus.git
url = https://github.com/OpenBubbles/telephony_plus.git
7 changes: 6 additions & 1 deletion CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ We encourage all contributions to this project! All we ask are you follow these
Please make sure you have completed the following pre-requisites:

* Install Git: [download](https://git-scm.com/downloads)
* Install Java: [download](https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html)
* Install Java 21: [download](https://adoptium.net/temurin/releases/?version=21)
* Install Flutter: [guide/download](https://flutter.dev/docs/get-started/install)
* Install Android Studio [download](https://developer.android.com/studio)
- Also install the Flutter & Dart Plugins via the Plugin Manager
Expand All @@ -26,6 +26,11 @@ Once you have a code editor installed, remember to install all of the required p
* Flutter
* Intellisense/Intellicode

Before opening a pull request, read the repository-specific
[development and diagnostics notes](docs/DEVELOPMENT.md). Do not commit relay
registration codes, Apple credentials, phone numbers, message text, generated
signing files, or `.env` values.

## Forking the Repository

In order to start contributing, follow these steps:
Expand Down
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,11 @@ If you need help setting up the app, have any issues or feature requests, or jus
## Getting Started

[Quickstart](https://openbubbles.app/quickstart.html)

## Contributor documentation

The repository-specific development and diagnostic notes are in
[`docs/DEVELOPMENT.md`](docs/DEVELOPMENT.md) and
[`docs/DIAGNOSTICS.md`](docs/DIAGNOSTICS.md). They document the Android build
matrix, the iMessage/relay versus SMS/MMS/RCS boundary, safe log collection,
and the current known limitations.
Loading