Quik Fork with Remotrix Matrix Bridge
Note
This project is a hard fork of the open-source Quik SMS messenger application. It has been modified to natively integrate Remotrix, a background service that bridges your SMS messages to a Matrix homeserver.
Why this fork?
The original Remotrix project was a standalone background bridge that required a separate, default SMS handler application. By deeply integrating Remotrix directly into Quik, we created a single, unified SMS application that offers a beautiful Material Design UI on the phone, while silently syncing all messages to your Matrix account (via Trixnity) in the background.
Key enhancements in this fork:
- Native Matrix Background Sync: SMS messages sent or received on the phone are instantly bridged to your Matrix account.
- Two-way Communication: Messages sent from Matrix are instantly forwarded as standard SMS messages from the phone.
- Coroutines Deadlock Fix: Upgraded Room database dependencies to resolve fatal
SQLiteConnectionPooldeadlocks during the cryptographic key generation phases. - Enhanced Visual Formatting: Matrix messages now use intuitive prefixes (🟢 for outgoing, 🔴 for incoming) to clearly distinguish participants without requiring AppService double puppeting.
- Gitea Actions CI/CD: Includes automated builds and automatic upstream fetching from the original Quik repository.
Management Room
When you log into the application with your Matrix bot account (@remotrix:yourserver.com) and specify a Manager ID (@you:yourserver.com), the bot creates a dedicated Management Room and invites you.
From there, you can issue commands:
!new <phone_number>- Opens a new Matrix room dedicated to chatting with that phone number.!close- Deletes a chat room.!ping- Checks bot latency.!reload- Restarts the background service.
Any non-command text sent in a dedicated phone number room will be sent as an SMS to that contact.
Starting over with Matrix
In Quik settings, open the Matrix login dialog and select Reset Matrix. Confirm the reset, remove the old rooms on your Matrix server, then sign in again. The reset removes local Matrix accounts, room mappings, encryption stores and bridge logs; SMS messages, Quik settings, the Manager ID and the backfill limit are preserved. New rooms use contact names from Android, and SMS history is copied again up to the configured limit.
History import
History import retries a failed message before advancing, with retry delays up to one minute. Synapse room-creation limits still apply. There is no fixed delay after each successful message. Progress is stored by native message type and ID, so identical SMS texts remain separate messages and saved progress is skipped when an unfinished import resumes. Reset Matrix clears this progress. The completion flag means all selected messages were handed to the persistent Matrix outbox (or intentionally excluded by forwarding settings); outbox delivery remains managed by Trixnity. Logcat reports progress and retry positions without logging SMS bodies or phone numbers.
Upgrading preserves an existing completed-import flag. It does not automatically replay old history: older versions did not retain per-message progress, so replaying that history could create duplicates. Checkpoint storage and the Matrix outbox use separate databases; an abrupt process/device failure between enqueueing a message and saving its checkpoint can still replay that last message.
Persistent release signing
Release APKs require the permanent signing key. Missing signing configuration fails the build; release builds never fall back to a generated debug key. Pull requests build and test Debug without release secrets and do not publish releases.
Gitea repository Settings → Actions → Secrets must contain:
ANDROID_KEYSTORE_BASE64: base64-encoded permanent PKCS12 keystore.ANDROID_KEYSTORE_PASSWORD: keystore password.ANDROID_KEY_ALIAS: signing key alias.ANDROID_KEY_PASSWORD: private key password.
The public certificate and its SHA-256 fingerprint are tracked in .gitea/release-signing.crt
and .gitea/release-signing.sha256. CI checks the restored key and the finished Release APK
against this fingerprint before publishing. The temporary CI key is removed even after failure.
Do not regenerate the signing key between builds; back up the key and passwords securely.
The initial local backup is .secrets/quik-release.p12 with credentials in
.secrets/release-signing.json. These private files are ignored by Git and must not be committed.
For a local Release build, set ANDROID_KEYSTORE_PATH, ANDROID_KEYSTORE_PASSWORD,
ANDROID_KEY_ALIAS and ANDROID_KEY_PASSWORD. Existing local .gradle/.gradlerc properties
and the legacy CI environment names are also supported. Debug APKs use a separate application ID
and are intended for development.
The former builds 50 and 51 used different disposable debug certificates. The new permanent key cannot update either installation in place; migrating once to the new certificate requires a reinstall. Subsequent Release updates keep the same signature.
Building and Releasing (Fork CI/CD)
The project uses Gitea Actions for CI/CD:
build.yml: Automatically builds the Debug and Release APKs (assembleDebug,assembleRelease) upon pushing tomasteror creating a tag. If a tag (e.g.,v1.0.0) is pushed, a Gitea Release is created automatically.sync.yml: Runs weekly to automatically fetch changes from the originalquikupstream repository and merge them into our fork.
To build manually:
./gradlew assembleDebug
The APK will be available in presentation/build/outputs/apk/debug/.
Original Quik Documentation Below:
QUIK
QUIK is an open source replacement to the stock messaging app on Android. It is a continuation of QKSMS.
Features
- Scheduled messages
- Message backup
- Speech-to-text and text-to-speech integrated within the app
- Message blocking and archiving
- Voice messages
- Attachments of any type of file
- Message sorting
- Message pinning
- Delayed sending
- Quick reply from notifications
- Swipe actions
- Emoji reaction handling
- and much, much more
Download
Grab QUIK from the official github releases page, or keep up with updates with the following:
Matrix Chat
You can chat with the community over at #quik-sms:matrix.org
Reporting bugs
A great bug report contains a description of the problem and steps to reproduce the problem. We need to know what we're looking for and where to look for it.
When reporting a bug, please make sure to provide the following information:
- Steps to reproduce the issue
- QUIK version
- Device / OS information
Contributing
Contributions are very welcome! Please see the contributing guidelines for details.
Translations
If you'd like to add translations to QUIK, please join the project on Weblate! Translations that are committed directly to source files will not be accepted. For more information see the translation guidelines.
Thank you
A special thank you to Jake (@klinker41) and Luke Klinker (@klinker24) for their work on android-smsmms, which has been an unspeakably large help in implementing MMS into QUIK.
A giant thank you to Moez moezbhatti for creating and maintaining QKSMS, of which QUIK would not exist without.
Contact
QUIK is developed and maintained by Marcos Jones.
Star History
License
QUIK is released under the The GNU General Public License v3.0 (GPLv3), which can be found in the LICENSE file in the root of this project.
Automated release checks
The workflow pins JDK 17 so test and build tools use the same Java runtime.
Before building or publishing APKs, Gitea Actions runs Robolectric tests against the actual
InjectionWorkerFactory. They construct every worker type used by Quik and the Matrix bridge,
verify SMS/MMS dependency injection, and exercise the Matrix watcher's service-start intent.
These tests use simulated Android services and mocked repositories, without sending SMS or
connecting to Matrix. Matrix room creation, client shutdown, reset and history import also have
regression tests. Signing checks run separately.
Run the same runtime gate locally with JDK 17 and the Android SDK:
./gradlew :presentation:cleanTestDebugUnitTest :remotrix-sync:cleanTestDebugUnitTest :presentation:testDebugUnitTest :remotrix-sync:testDebugUnitTest
python3 .gitea/scripts/check_test_results.py
The gate rejects failures, missing required suites, and skipped critical tests. A failed gate stops the workflow before publication. These tests cover known regression scenarios; they do not replace testing the installed Release APK on Android devices.



