Inspiration

Every developer who needs to send an OTP eventually runs into Twilio, Vonage, or one of the other big SMS APIs , and with them, per-message pricing, number verification requirements, and free tiers that run out fast. We wanted an easier path that skips the vendor entirely: if you already own an Android phone with a SIM, you already have everything you need to send OTPs and notifications from your own backend. SignalDesk makes that easy. Pair a phone, call a simple API to the SMS gateway, and you're sending real SMS in minutes.

What it does

SignalDesk sends a text message through a paired Android phone's SIM on behalf of your projects - OTPs, login codes, order updates, alerts, anything you'd normally text a person. You call the API with a phone number and a message, the paired phone sends it through its real SIM, and you can check back whether it went through. One phone, any number of recipients, no per-message vendor fee.

How we built it

The project has three parts, each with one job. The backend (Express + Prisma + PostgreSQL) is the core of the system - it's the API, the source of truth for every message and its status, and the thing your application actually talks to. The Android app is a node: its only job is to stay paired, pick up work, and send through the SIM, with no interface beyond that. The frontend dashboard (React + Vite) is for the human owner - it's where you pair and monitor devices, create and manage API keys, and read the docs, but it never touches the sending path itself.

I originally built the entire project with Codex 5.4. When GPT-5.6 released partway through OpenAI Build Week, I used it to substantially rework the project ,the look and feel of the dashboard changed, and the underlying dispatch and delivery logic was rebuilt into what it is now.

Challenges we ran into

Getting delivery semantics right was the hardest part: a message is assigned to exactly one phone, is never silently retried on another device, and a late status report after the 60-second timeout must be acknowledged without changing the already-terminal result. Codex helped us reason through the edge cases, like what happens when a phone reports late or fails mid-send, and encode them as explicit rules instead of implicit assumptions in the queue logic.

Accomplishments that we're proud of

A phone fleet that shares load fairly through round-robin assignment, a full audit trail from request to delivery, and a setup flow calm enough that a non-technical owner can pair a phone and send a first message in minutes.

What we learned

Treating the Android phone as a dumb, polling worker rather than a push target massively simplified the system: the backend never needs to reach a phone directly, so there's no push infrastructure, no FCM dependency, and no reachability problem when a phone is asleep or offline.

What's next for SignalDesk

Carrier-reported delivery receipts where available, opt-out/STOP keyword handling, and rate-limit controls per API key. Also on the roadmap: Telegram-based phone verification, where a user shares their phone number with a companion SignalDesk bot, receives a one-time code back through the bot, and confirms it there - a lightweight way to verify a number without exposing it through the public API.

Share this project:

Updates