🐝 Rusty Bee
A self-hosted SMS gateway that runs on your own Android phone.
Plug in a spare phone, run one small server, and you get an SMS API. You don't need a Twilio account, you don't pay per message, and nobody else sees your messages. Texts go out through your phone's normal SIM.
What it's good for
- OTP and 2FA for side projects. Send login codes from your own app without signing up for an SMS provider.
- Reverse OTP. Have users text a code to your number instead. Rusty Bee forwards every incoming SMS to your webhook, so you can verify phone ownership without sending anything.
- Testing SMS flows. Point dev and staging at a real phone and see real delivery, failures and replies, without spending provider credits.
- Alerts from your homelab. Uptime checks, backups, Home Assistant, n8n: anything that can make an HTTP call can text you.
- An SMS inbox for your code. Every received message becomes a webhook, so you can build bots, auto-replies or a shared inbox.
How it works
your app ──HTTPS──▶ Rusty Bee server ◀──WebSocket── Android phone ──▶ SMS
(API, dashboard, (sends and receives
webhooks, SQLite) with your SIM)
The phone keeps one connection open to your server, so it needs no open ports or public IP. Messages are queued on both sides, so nothing is lost if the phone drops offline. Everything is replayed when it reconnects.
Quick start
docker run -d --name rustybee -p 8080:8080 -v rustybee-data:/data \
-e RUSTYBEE_PUBLIC_URL=https://sms.example.com \
-e RUSTYBEE_ADMIN_PASSWORD='pick-a-long-password' \
ghcr.io/joowdx/rustybee:latest
- Install the APK from the latest release on an Android 16+ phone.
- In the dashboard, open Devices → Pair a device and scan the QR code with the app.
- Create an API key and send your first text:
curl https://sms.example.com/api/v1/messages \
-H "Authorization: Bearer rbk_…" -H 'Content-Type: application/json' \
-d '{"to":["+15551234567"],"body":"Hello from Rusty Bee 🐝"}'
Why it's nice to run
- Tiny. An image of about 8 MB and roughly 10–30 MB of RAM. It runs on a Raspberry Pi, NAS or cheap VPS.
- One binary, one SQLite file. No Redis, no broker and no separate database to babysit.
- Written in Rust. Memory stays flat and predictable, and a strict message state machine means no double-sends.
- FOSS by default. The recommended app build has zero Google code. An optional build adds Firebase wake-ups for aggressive phones.
- Safe to expose. The dashboard login can use a code texted to your own phone, with optional Cloudflare Turnstile, signed webhooks and rate-limited logins.
Learn more
Full setup, the API reference, webhooks, reverse proxies and configuration are in the repo:
github.com/joowdx/rustybee
MIT licensed. Started as a fork of textbee and rewritten from scratch in Rust.