@NFTCPS: Don't throw away old Android phones! No need to buy virtual numbers or use third-party SMS platforms. httpSMS turns your Android phone into an SMS gateway. The logic is crude but practical: Send it an HTTP API request, and your Android phone sends the SMS for you. Incoming SMS can also be forwarded to your own…
Summary
httpSMS is an open-source tool that turns old Android phones into an SMS gateway, sending and receiving SMS via HTTP API, supporting end-to-end encryption and self-deployment. It is suitable as an alternative for regions where virtual numbers cannot be purchased.
View Cached Full Text
Cached at: 07/01/26, 06:03 AM
Don’t throw away your old Android phones! You don’t need to buy virtual numbers or use third-party SMS platforms. httpSMS turns the Android phone you already own into an SMS gateway. The logic is simple but practical: you send it an HTTP API request, and your Android phone sends the SMS for you. SMS messages received on the phone can also be forwarded to your own webhook. The coolest part is support for end-to-end AES-256 encryption — the key is stored only on your phone, so even the server can’t see the content. It’s open source, self-hostable, and a great alternative in regions where buying phone numbers isn’t possible. Truly awesome. https://github.com/NdoleStudio/httpsms…
NdoleStudio/httpsms
Source: https://github.com/NdoleStudio/httpsms
httpSMS
Web (https://github.com/NdoleStudio/httpsms/actions/workflows/web.yml) API (https://github.com/NdoleStudio/httpsms/actions/workflows/api.yml) GitHub contributors (https://github.com/NdoleStudio/httpsms/graphs/contributors) GitHub license (https://github.com/NdoleStudio/httpsms/blob/master/LICENSE) Contributor Covenant Scrutinizer Code Quality (https://scrutinizer-ci.com/g/NdoleStudio/httpsms/?branch=main) Better Stack Badge (https://uptime.betterstack.com/?utm_source=status_badge) Sponsors (https://github.com/sponsors/ndolestudio) Discord (https://discord.gg/kGk8HVqeEZ)
httpSMS (https://httpsms.com) is a service that lets you use your Android phone as an SMS Gateway to send and receive SMS messages. You make a request to a simple HTTP API and it triggers your Android phone to send an SMS. SMS messages received on your android phone can also be forwarded to your webhook endpoint.
Quick Start Guide 👉 https://docs.httpsms.com
Table Of Contents
- Why?
- Web UI
- API
- Android App
- Chat/forum
- Features
- End-to-end Encryption
- Webhook
- Back Pressure
- Message Expiration
- API Clients
- Flows
- Sending an SMS Message
- Self Host Setup - Docker
- 1. Setup Firebase
- 2. Setup SMTP Email service
- 3. Setup Cloudflare Turnstile
- 4. Download the code
- 5. Setup the environment variables
- 6. Build and Run
- 7. Create the System User
- 8. Build the Android App.
- Integration Testing
- License
Why?
I’m originally from Cameroon and I wanted an automated way to send and receive SMS messages using an API. Unfortunately many countries don’t support the ability to buy virtual phone numbers, and I could not find a good ready-made solution that could help me send/receive SMS messages using a mobile phone using an intuitive http API.
Web UI
The web interface https://httpsms.com is built using Nuxt (https://nuxtjs.org/) and Vuetify (https://vuetifyjs.com/en/). It is hosted as a single page application on firebase. The source code is in the web directory.
API
The API https://api.httpsms.com is built using Fiber (https://gofiber.io/), Go and CockroachDB (https://www.cockroachlabs.com/) for the database. It runs as a serverless application on Google Cloud Run. The API documentation can be found here https://api.httpsms.com/index.html
// Sending an SMS Message using Go
client := htpsms.New(htpsms.WithAPIKey(/* API Key from https://httpsms.com/settings */))
client.Messages.Send(context.Background(), &httpsms.MessageSendParams{
Content: "This is a sample text message",
From: "+18005550199",
To: "+18005550100",
})
Android App
The Android App (https://apk.httpsms.com/HttpSms.apk) is a native application built using Kotlin with material design principles. This app must be installed on an Android phone before you can start sending and receiving SMS messages.
Chat/forum
There are a few ways to get in touch with me and/or the rest of the community. Feel free to use any of these methods. Whatever works best for you:
- Discord server (https://discord.gg/kGk8HVqeEZ) - direct chat with the community
- GitHub issues (https://github.com/NdoleStudio/httpsms/issues) - questions, features, bugs
Features
End-to-end Encryption
You can encrypt your messages end-to-end using the military grade AES-256 encryption (https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) algorithm. Your encryption key is stored only on your mobile phone so the even the server won’t have any way to view the content of your SMS messages which are sent and received on your Android phone.
Webhook
If you want to build advanced integrations, we support webhooks. The httpSMS platform can forward SMS messages received on the android phone to your server using a callback URL which you provide.
Back Pressure
In-order not to abuse the SMS API on android, you can set a rate limit e.g 3 messages per minute. Such that even if you call the API to send messages to 100 people, It will only send the messages at a rate of 3 messages per minute.
Message Expiration
Sometimes it happens that the phone doesn’t get the push notification in time and I can’t send the SMS message. It is possible to set a timeout for which a message is valid and if a message becomes expired after the timeout elapses, you will be notified.
API Clients
- Go: https://github.com/NdoleStudio/httpsms-go
- JavaScript/TypeScript: https://github.com/NdoleStudio/httpsms-node
Flows
Sending an SMS Message
sequenceDiagram
User->>+httpSMS API: Call /v1/messages/send API
httpSMS API-->>+Push Queue: Schedule notification about new message
httpSMS API-->>-User: Respond with 202 (Accepted)
Push Queue-->>+httpSMS API: [Async] Send notification request
httpSMS API-->>-Android App: Send push notification about new message
Android App-->>httpSMS API: [Async] Fetch message
Android App-->>Android App: Send Message using Android SMS API
Android App-->>httpSMS API: [Async] Send result of sending SMS
Android App-->>httpSMS API: [Async] Send Delivery Report
Self Host Setup - Docker
1. Setup Firebase
- The httpSMS application uses firebase cloud messaging (https://firebase.google.com/docs/cloud-messaging) for sending push notifications to your Android phone to trigger an SMS message to be sent out. Visit the firebase console (https://console.firebase.google.com/) and create a new project and follow the steps here (https://firebase.google.com/docs/web/setup#register-app) to get your firebase web SDK config credentials. For example, I created a firebase project called
httpsms-dockerand this is my web SDK configuration
const firebaseConfig = {
apiKey: "AIzaSyAKqPvj51igvvNNcRtxxxxx",
authDomain: "httpsms-docker.firebaseapp.com",
projectId: "httpsms-docker",
storageBucket: "httpsms-docker.appspot.com",
messagingSenderId: "668063041624",
appId: "1:668063041624:web:29b9e3b702796xxxx",
measurementId: "G-18VRYL2xxxx",
};
- Enable
Email/Passwordsign-in in the Firebase console (https://console.firebase.google.com/u/0/), open the Authentication section. On the Sign in method tab, enable theEmail/passwordsign-in method and clickSave. - The firebase
email/passwordsign-in method has a bug (https://github.com/firebase/firebaseui-web/issues/1040) which prevents you from signing in. The work around right now is to disable email enumeration protection (https://cloud.google.com/identity-platform/docs/admin/email-enumeration-protection#disable) on the firebase console. - Generate your firebase service account credentials by following the steps here (https://firebase.google.com/docs/admin/setup#initialize_the_sdk_in_non-google_environments) and save the credentials in a file called
firebase-credentials.jsonwe will use this file to authenticate with the firebase admin SDK. - Generate your Android
google-services.jsonfile using the instructions here (https://support.google.com/firebase/answer/7015592?hl=en#android&zippy=%2Cin-this-article) we will use it later to configure the android app.
2. Setup SMTP Email service
The httpSMS application uses SMTP (https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol) to send emails to users e.g. when your Android phone has been offline for a long period of time. You can use a service like mailtrap (https://mailtrap.io/) to create an SMTP server for development purposes.
3. Setup Cloudflare Turnstile
The message search route (/v1/messages/search) is protected by a Cloudflare Turnstile (https://developers.cloudflare.com/turnstile/get-started/) captcha to prevent abuse. You need to set up a Turnstile widget for the search messages feature to work.
- Go to the Cloudflare dashboard (https://dash.cloudflare.com/) and navigate to Turnstile.
- Add a new site and configure it for your self-hosted domain (e.g.,
localhostfor local development). - Note down the Site Key and Secret Key — you will need them for the frontend and backend environment variables respectively.
4. Download the code
Clone the httpSMS GitHub repository
git clone https://github.com/NdoleStudio/httpsms.git
5. Setup the environment variables
- Copy the
.env.dockerfile in thewebdirectory into.env
cp web/.env.docker web/.env
- Update the environment variables in the
.envfile in thewebdirectory with your firebase web SDK configuration in step 1 above
FIREBASE_API_KEY=
FIREBASE_AUTH_DOMAIN=
FIREBASE_PROJECT_ID=
FIREBASE_STORAGE_BUCKET=
FIREBASE_MESSAGING_SENDER_ID=
FIREBASE_APP_ID=
FIREBASE_MEASUREMENT_ID=
# Cloudflare Turnstile site key from step 3
CLOUDFLARE_TURNSTILE_SITE_KEY=
- Copy the
.env.dockerfile in theapidirectory into.env
cp api/.env.docker api/.env
- Update the environment variables in the
.envfile in theapidirectory with your firebase service account credentials, SMTP server details, and Cloudflare Turnstile secret key.
# SMTP email server settings
SMTP_USERNAME=
SMTP_PASSWORD=
SMTP_HOST=
SMTP_PORT=
# Firebase service account credentials
FIREBASE_CREDENTIALS=
# This is the `projectId` from your firebase web config
GCP_PROJECT_ID=
# Cloudflare Turnstile secret key from step 3
CLOUDFLARE_TURNSTILE_SECRET_KEY=
- Don’t bother about the
EVENTS_QUEUE_USER_API_KEYandEVENTS_QUEUE_USER_IDsettings. We will set that up later.
6. Build and Run
- Build and run the API, the web UI, database and cache using the
docker-compose.ymlfile. It takes a while to build and download all the docker images. When it’s finished, you’ll be able to access the web UI at http://localhost:3000 and the API at http://localhost:8000
docker compose up --build
7. Create the System User
- The application uses the concept of a system user to process events async. You should manually create this user in
userstable in your database. Make sure you use the sameidandapi_keyas theEVENTS_QUEUE_USER_ID, andEVENTS_QUEUE_USER_API_KEYin your.envfile.
INSERT INTO users (id, api_key, email ) VALUES ('your-system-user-id', 'your-system-api-key', '[email protected]');
Restart your API docker container after modifying
EVENTS_QUEUE_USER_ID, andEVENTS_QUEUE_USER_API_KEYin your.envfile so that the httpSMS API can pick up the changes.
8. Build the Android App.
- Before building the Android app in Android Studio (https://developer.android.com/studio), you need to replace the
google-services.jsonfile in theandroid/appdirectory with the file which you got from step 1. You need to do this for the firebase FCM messages to work properly.
Integration Testing
The project includes end-to-end integration tests that validate the complete SMS send/receive lifecycle. Tests run the full stack (API, PostgreSQL, Redis) in Docker alongside a phone emulator that simulates an Android device.
📖 Full documentation: tests/README.md
Quick run:
cd tests
bash generate-firebase-credentials.sh
export FIREBASE_CREDENTIALS=$(jq -c . firebase-credentials.json)
docker compose up -d --build --wait
docker compose wait seed && sleep 2
go test -v -timeout 120s ./...
docker compose down -v
Integration tests also run automatically in CI on every push/PR to main.
License
This project is licensed under the GNU AFFERO GENERAL PUBLIC LICENSE Version 3 - see the LICENSE file for details.
Similar Articles
@hank_aibtc: Guys, found an amazing project! Turn your idle Android phone directly into an SMS gateway, freely call HTTP API to send and receive SMS, no more paying Twilio or SMS platforms wasted money! The project is called httpSMS, GitHub: NdoleStudio/httpsms In simple terms, install…
Introduces open-source project httpSMS, which turns idle Android phones into SMS gateways, sends and receives SMS via HTTP API, supports self-hosted Docker and end-to-end encryption, saving money and stable.
pppscn/SmsForwarder
SmsForwarder是一款Android短信转发工具,支持监控手机短信、来电和APP通知并按规则转发至钉钉、企业微信、邮箱等多种渠道,同时提供远程控制功能。
@wongmjane: I resurrected my 8-year-old phone into a Hermes Agent server Replaced Android with postmarketOS (Alpine Linux on ARM64)…
The user repurposed an 8-year-old phone into a Hermes Agent server using postmarketOS on ARM64, communicating via Matrix for E2E encrypted chat, reducing e-waste and eliminating the need for a Mac mini.
@IndieDevHailey: The God-tier Open-source Project Bitchat by Billionaire Jack Dorsey is a Modern Black Tech! Completely Offline, Using Bluetooth to Send and Receive #Bitcoin + Chat!!! - On Planes, Concerts, Subways, Wilderness, Disaster Zones Without Internet... Real-time Communication + Transfer with No Signal at All -…
Jack Dorsey has open-sourced the Bitchat project, a tool that enables offline communication and Bitcoin transfers without internet, using Bluetooth Mesh networking. It supports multi-hop relay, Cashu eCash offline transfers, and double encryption, suitable for scenarios like network outages and surveillance.
@QingQ77: Reliably transfer files between phone, computer, and browser—works even under restricted networks like NAT, hotel Wi-Fi, campus networks; large files support resume. https://github.com/shrimpsend/shrimpsend… ShrimpSend (虾传) is…
ShrimpSend (虾传) is an open-source cross-platform file transfer system that enables direct connections under restricted networks like NAT and hotel Wi-Fi, supports resumable transfers, and transfers files directly between devices without a server relay.