Three steps to your own private SMS bridge.

1
Deploy Server
2
Enter URL
3
Build App

🚀 Deploy your server to Railway

Railway hosts your server.py for free so your Android phone can reach it anywhere on the internet. Click the button below to deploy in one click — no credit card needed.

Deploy to Railway

How to find your URL after deploying

💡 Your Railway URL will look like:
https://sms-bridge-production-xxxx.up.railway.app

Already have a server URL? Skip straight to the next step.

Enter your Server URL

Paste the Railway (or other) URL where server.py is running. This will be baked into both the web app and the Android APK.

Must start with https:// — no trailing slash needed.

Building your NexusBridge…

Starting…

What's in the zip

📱 nexusbridge.apk — install on your Android phone (enable Install unknown apps first)
🌐 index.html — open in any browser to send/read SMS from your computer
🐍 server.py + requirements.txt — your pre-configured server files
.card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 40px 36px; width: 100%; max-width: 680px; } .logo { display: flex; align-items: center; gap: 12px; margin-bottom: 8px; } .logo-icon { width: 44px; height: 44px; background: linear-gradient(135deg, var(--purple), #5b4ef0); border-radius: 10px; display: flex; align-items: center; justify-content: center; font-size: 22px; } h1 { font-size: 26px; font-weight: 700; } .subtitle { color: var(--muted); font-size: 14px; margin-bottom: 36px; margin-top: 6px; } label { display: block; font-size: 13px; font-weight: 600; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 8px; } input[type="url"], input[type="text"] { width: 100%; background: var(--surface2); border: 1px solid var(--border); border-radius: 8px; color: var(--text); font-size: 15px; padding: 12px 16px; outline: none; transition: border-color .2s; } input[type="url"]:focus, input[type="text"]:focus { border-color: var(--purple); } .hint { font-size: 12px; color: var(--muted); margin-top: 6px; } .checkbox-row { display: flex; align-items: center; gap: 10px; margin-top: 24px; background: var(--surface2); border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; cursor: pointer; } .checkbox-row input[type="checkbox"] { width: 18px; height: 18px; accent-color: var(--purple); cursor: pointer; } .checkbox-row span { font-size: 14px; } .checkbox-row .sub { font-size: 12px; color: var(--muted); display: block; } .btn { display: block; width: 100%; margin-top: 28px; padding: 15px; background: var(--purple); color: #fff; border: none; border-radius: 8px; font-size: 16px; font-weight: 700; cursor: pointer; transition: background .2s, transform .1s; } .btn:hover { background: var(--purple2); } .btn:active { transform: scale(.98); } .btn:disabled { opacity: .5; cursor: not-allowed; } /* ── progress panel ── */ #panel { margin-top: 32px; display: none; } .progress-header { display: flex; align-items: center; gap: 12px; margin-bottom: 14px; } .spinner { width: 20px; height: 20px; border: 2px solid var(--border); border-top-color: var(--purple); border-radius: 50%; animation: spin .8s linear infinite; flex-shrink: 0; } @keyframes spin { to { transform: rotate(360deg); } } #status-text { font-weight: 600; font-size: 15px; } #log-box { background: #0a0a10; border: 1px solid var(--border); border-radius: 8px; padding: 14px 16px; font-family: "Fira Mono", "Consolas", monospace; font-size: 12px; line-height: 1.7; color: #b0c4b8; max-height: 320px; overflow-y: auto; white-space: pre-wrap; } .dl-btn { display: inline-flex; align-items: center; gap: 8px; margin-top: 20px; padding: 13px 28px; background: var(--green); color: #fff; border: none; border-radius: 8px; font-size: 15px; font-weight: 700; text-decoration: none; transition: opacity .2s; } .dl-btn:hover { opacity: .88; } .dl-btn.hidden { display: none; } .err-banner { margin-top: 16px; padding: 12px 16px; background: #3a1515; border: 1px solid var(--red); border-radius: 8px; color: #ff8a8a; font-size: 13px; display: none; } /* ── steps ── */ .steps { margin-top: 36px; padding-top: 28px; border-top: 1px solid var(--border); } .steps h3 { font-size: 14px; color: var(--muted); text-transform: uppercase; letter-spacing: .05em; margin-bottom: 16px; } .step { display: flex; gap: 14px; margin-bottom: 16px; } .step-num { width: 28px; height: 28px; background: var(--surface2); border: 1px solid var(--border); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-size: 12px; font-weight: 700; color: var(--purple); flex-shrink: 0; } .step-body { font-size: 14px; line-height: 1.6; } .step-body code { background: var(--surface2); border: 1px solid var(--border); border-radius: 4px; padding: 1px 6px; font-family: monospace; font-size: 12px; color: var(--purple2); }

Generate a custom build of NexusBridge pre-configured for your own server.

The URL where you will run server.py. Must be HTTPS (except localhost).

Starting…

What you get

1
server.py + requirements.txt — upload to any Linux VPS or Raspberry Pi.
pip install -r requirements.txt then python server.py
2
index.html — open directly in any browser or serve as a static file.
Connects to your server automatically.
3
nexusbridge.apk — install on your Android phone.
Enable Settings → Install unknown apps first.
4
Want to build the APK yourself later? Run cd android && ./gradlew assembleDebug after cloning the repo.