A fork of Signal
for Android with proprietary Google binary blobs removed.
Uses OpenStreetMap for maps and a websocket server connection, instead
of Google Maps and Firebase Cloud Messaging.
DISCLAIMER: You might want to consider the
officially supported APK download
from Signal if you don't mind proprietary dependencies. This is an unofficial
client with no guarantees of timely (or any) updates. It's licensed under GPL3,
like Signal, meaning it has no warranty and you use it at your own risk.
Signal is a registered trademark of the Signal Foundation in the USA.
This connects to Signal's servers, all terms from their
Source is on Github
in branches whose name ends in '-FOSS'. You can use Github to compare the
branch with upstream's release tag of the same version to see the changes.
Frequently Asked Questions
Isn't Signal for Android open source?
Not entirely. All official APKs include multiple closed source Google
dependencies including Firebase Cloud Messaging (for notifications), Maps,
Authentication and (since v5.24.15) Wallet/Payments. See the
file in Signal's source, or search the codebase for for any imports of
com.google.firebase - these two links search the
whole Signal codebase for files that import those dependencies.
The Signal developers explain their reasons here.
What's the difference between this and official Signal for Android?
Links go to pages describing relevant privacy policies:
A websocket connection often uses slightly more battery than Firebase
Cloud Messaging, which the official client uses for message notification
pings. Maps and in-app Donations in both official builds only work on
devices with Google Apps (GAPPS) installed, otherwise the map is blank.
Signal versions 4.61.4 - 5.3.7 included Firebase ML Vision for facial
recognition; this was replaced in 5.3.8 with Android's inbuilt support.
Does GPS work?
GPS works for maps, but can be slow on phones without Google's location
services installed; consider waiting a while, or installing another
location provider to accelerate GPS locks like
How do I switch between this and an official Signal build?
- It's best to switch between identical versions of Signal.
- Make sure backups are enabled in your "Chats and Media" preferences and you
have written down the backup password and made a backup.
- Check your backup exists in the "Signal/Backups" folder on your internal storage.
- Uninstall the application.
- Install the other application and let it import backups on first run.
Can this be distributed on F-Droid?
F-Droid requires the original
project's permission to distribute an application in their main repository.
I asked for
permission on their bug tracker and the Signal developers declined.
How do I compile it?
Clone the Github project, see the
file; you need to add a Base64 encoded Java private key generated from
apksign, and its corresponding
password, both as named Github secrets. Then just push a branch whose name
ends in "-FOSS" and it will compile, sign and release a build.
To build locally, checkout the source and see the
Signal wiki for instructions (or look into the
Reproducible Builds directory for Docker build instructions).
NOTE: Instead of
./gradlew build use
./gradlew assemblePlayFossProdRelease to build without
Google proprietary dependencies. Also, please use
jarsigner if the wiki suggests that.
Can I trust this build?
Builds are automatically generated by Github Actions from source.
If you're logged into GitHub check the project's
Actions for the
relevant build, in the "Sign APKs" step, there's a SHA256SUM listed for each
build by filename. Currently the Universal builds are published here.
The only new dependency on top of plain Signal is the open source
- Molly.im (Valldrac)
- For Firebase Messaging stubs from Molly-FOSS.
- Fumiakiy Yoshimatsu
- For OpenStreetMap support.
- Updated Github Actions workflow file to add more swap space.
- Pulled new upstream.
- Note this release is built manually as Github Actions kept cancelling
the build for some reason.
- Changed libfakegms build.gradle for upstream Gradle 8 / JDK 17.
- Added Task onCancelListener to libfakegms.
- Updated osmdroid to 6.1.16.
- Updated libfakegms with MapStyleOptions and setMapStyle().
- Switched Github Actions to run on ubuntu-latest (this was on 20.04, and
upstream just switched to ubuntu-latest-8-cores which doesn't run).
- Updated build.gradle to match upstream library convention plugins.
- Fixed getPaymentsClient in Wallet to accept context not activity.
- Removed extra MmsDatabase import, not needed and upstream renamed.
- Edited new permissions in GitHub workflow file to allow writing.
- Updated version used in OSM useragent to Signal-FOSS/6.
- Updated osmdroid to 6.1.14 and its appropriate dependencies.
- Added com.google.firebase.FirebaseApp to libfakegms.
- Added RemoteMessage.PRIORITY_HIGH to libfakegms.
- Reorganised gradle/verification-metadata.xml
- Removed one patch from this build as it was accepted upstream
- Updated to new Gradle dependency verification, and upstream fixes.
- Updated libfakegms to handle status codes in wallet.
- Added ENVIRONMENT_PRODUCTION to WalletConstants in libfakegms.
- Large addition of com.google.android.gms.wallet stubs to support new
':donations' project in upstream source.
- Added place marker to OSM map and refactored URL construction.
Thanks to sergimn for suggesting it.
- Updated build.gradle to match upstream reformat of libs.
- Changed Github action to match upstream e.g. use Java 11.
- Updated libfakegms Task.java to match Molly.
- Slimmed libfakegms build.gradle and changed fragment dependency to fragment-ktx. Now it properly uses witness-verification to validate dependencies.
- Added onCompleteListener to com.google.android.gms.tasks to support new Signal upstream features.
- Tweaked build.gradle to ignore GMS in selectableFlavors.
- Removed all flavors from libfakegms as no longer needed.
- Removed Gradle memory boost and Instantiatable lint disable; unneeded.
- Updated OSMDroid to 6.1.11.
- Updated libfakegms with some tips from Valldrac for upstream Firebase/Tasks changes.
- Updated osmdroid to 6.1.10.
- Updated Java version to 8.0.292.
- Added patch to remove new GMS import from emoji/EmojiJsonParser.kt
- Specified Java version in android.yml and boosted Java/Gradle memory.
- More build types in libfakegms to match upstream.
- Added some more required Firebase messaging stubs.
- Changed map text URLs to openstreetmap.org.
- Removed Firebase ML Vision from libfakegms as Signal has switched to using
Android's inbuild FaceDetector.
- Added getMessageId() and onDeleteMessages() to Firebase stubs.
- Tweaks to CI workflow, logs SHA256 of signed builds.
- Changed CI signing to use apksigner instead of jarsigner to make V2 signatures for better compatibility.
- Added a couple of extra map types if other forks want to use this.
- Added Github CI script to automatically build and sign releases.
- Added "perf" buildtype to libfakegms.
- Added OpenStreepMap support thanks to Fumiakiy Yoshimatsu.
- Switched SDK/tools version in libfakegms to use variables.
- A fix for file transfers from valldrac.
- Worked around a FcmReceiveService 'Instantiatable' error by disabling that
check in lint options :(.
- Added more flavor dimensions to match upstream - production/staging.
- Refactored code into "libfakegms" library in project folder.
- Adopted Firebase Messaging and ML Kit Vision stubs from valldrac.
- Signal added Firebase ML Vision binaries. Dummy file to override.
- Worked around Signal using GMS libs for array concatenation.