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