QasidRelay is an open-source Android SIM relay for transactional SMS.
It lets a self-hosted application queue SMS messages, then an Android phone with an authorized SIM polls that application, sends messages through the device SIM, and reports delivery state back to the server.
QasidRelay is intended for lawful transactional messaging using a SIM and carrier plan you are authorized to use. It is not designed for unsolicited bulk messaging, scraping, spam, or bypassing carrier/provider rules.
Release line: 0.1.x phone-local Android client.
Latest signed prerelease:
v0.1.7.
If you installed an older CI/debug APK such as v0.1.5, Android requires one
uninstall before installing the signed line because debug and release signing
certificates differ. Signed releases v0.1.6 and newer use the same signing
path and increasing versionCode, so they should update in place.
The Android app has a working polling baseline, HMAC-signed requests, Keystore-backed private relay key storage, simplified operator setup with optional setup QR/deep-link prefill, local status reporting, Android sent callbacks, manual restart handling, and request-signing unit tests. The next major milestone is real-device validation against a test gateway.
- Development and staging environments that need real SMS without committing to a hosted provider yet.
- Private pilots where a maintainer owns the Android device, SIM, and carrier package.
- Self-hosted applications that need a simple transactional SMS bridge.
For production at public scale, use a carrier-approved A2P/business SMS provider.
Your app/server
-> stores pending SMS jobs
<- QasidRelay polls over HTTPS
Android phone
-> sends SMS using the installed SIM
-> reports sent/failed status
The phone initiates all network traffic. That means the Android device does not need a public IP address and should not expose an inbound HTTP server.
- Java-based Android app.
- Minimum SDK: Android 6.0 / API 23.
- Direct SMS sending through
SmsManager. - Phone-local messaging enable/disable control for operators.
- Optional setup deep link:
qasidrelay://setup. - Android sent-result callbacks before terminal status reporting.
- Persistent retry queue for status reports.
- Bounded recovery for stale SMS attempts that never receive Android callbacks.
remoteMessagingforeground service for the relay worker.- Polling-only network model.
- HTTPS-first configuration.
- HMAC-signed requests.
- Cleartext HTTP disabled by Android network security config.
- No camera permission; setup QR scanning is handled by the phone camera or QR scanner, then opened in QasidRelay as a deep link.
- No Android
READ_SMSpermission. - No inbound SMS support in the initial release.
- No bulk-marketing features.
app/ Android app module
docs/ protocol, threat model, testing, and compatibility notes
TODO.impl/ deferred implementation tracks
.github/ CI, issue templates, and PR template
See CHANGELOG.md.
./gradlew :app:testDebugUnitTest --no-daemon
./gradlew :app:assembleDebug --no-daemonGitHub Actions uploads qasidrelay-debug-apk for CI runs and
qasidrelay-signed-release-apk when release signing secrets are configured.
Use the signed release APK for operator testing; keep debug APKs for internal CI
validation only.
See docs/protocol.md.
For server implementation notes, see docs/server-integration.md.
See docs/threat-model.md.
See docs/android-compatibility.md.
For manual phone validation, see docs/real-device-testing.md.
Apache-2.0. See LICENSE.