A complete SMS Bridge system that connects an Android phone to a web-based messaging UI via a WebSocket relay server.
π Go to https://sms-bridge-jmtdi.devpush.app/ (Recommended)
The builder will walk you through three steps:
- Deploy your server β click the "Deploy to Railway" button to spin up a free server in one click
- Enter your server URL β paste the Railway URL you get after deploying
- Build your app β the builder generates and downloads a zip containing:
nexusbridge.apkβ ready-to-install Android appindex.htmlβ web messaging UI, pre-configured for your server
No coding required.
If you want to run the builder yourself instead of using the hosted version:
git clone https://github.com/JMTDI/nexussmsbridge
cd nexussmsbridge
pip install -r requirements.txt
python builder.pyOpen http://localhost:8000 in your browser.
Android App (phone) ββWebSocketβββΆ server.py ββWebSocketβββΆ index.html (browser)
β
REST API
/new-session
/session-status/{token}
Runs on port 8000 (HTTP + WebSocket on the same port).
Setup:
pip install -r requirements.txt
python server.pyEndpoints:
GET /β servesindex.htmlGET /new-sessionβ creates a new session, returns{ sessionToken, pin, qrData }GET /session-status/{token}β returns phone connection statusGET /healthβ health checkwss://host/ws/{token}?role=phone|clientβ WebSocket bridge
Single-file, no build step required. Open directly in a browser or via https://yourserver.com/.
Features:
- Pairing screen with QR code + 6-digit PIN
- Full conversation list + thread view
- Real-time messaging via WebSocket
- Dark theme, fully responsive
- Session saved in
localStoragefor reconnection
Package: com.nexusbridge.smsbridge
Features:
- D-pad navigable numpad for PIN entry
- ZXing QR code scanner
- Foreground service maintaining persistent WebSocket connection
- Reads SMS/MMS via ContentProvider
- Sends SMS via SmsManager
- BroadcastReceiver for incoming SMS
- Exponential backoff reconnection
Build:
Open android/ folder in Android Studio and run on device.
Required Permissions: READ_SMS, SEND_SMS, RECEIVE_SMS, READ_CONTACTS, INTERNET, FOREGROUND_SERVICE, POST_NOTIFICATIONS, CAMERA
All WebSocket messages are JSON:
{ "type": "...", "payload": { ... } }| Type | Direction | Description |
|---|---|---|
sms_list |
phone β client | Full conversation list |
sms_thread |
client β phone, phone β client | Request/response for thread messages |
sms_send |
client β phone | Send SMS { to, body } |
sms_incoming |
phone β client | New inbound SMS notification |
read_receipt |
client β phone | Mark thread as read |
typing_indicator |
client β phone | Typing notification |
mms_attachment |
phone β client | Base64 MMS attachment |
contacts_list |
phone β client | Contact directory |
ping / pong |
both | 30-second keepalive |
phone_connected |
server β client | Phone joined the session |
phone_disconnected |
server β client | Phone disconnected |
connection_status |
server β client | Current phone connection state |
- Web client calls
GET /new-sessionβ getssessionToken+pin+qrData - Web client connects WebSocket as
role=client - Web client polls
GET /session-status/{token}every 2 seconds - Android app scans QR or enters PIN β connects WebSocket as
role=phone - Server links phone β client, notifies client via
phone_connected - All messages relay bidirectionally in real time