simwire pairs your Android phone with your code. Send and receive real texts from Node.js with no accounts, no per-message fees, and nothing in between.
No dashboard, no API keys, no billing form. Your terminal and your phone.
Install the app, run npx simwire pair and scan the QR. The token never leaves your two devices.
Call sms.send() and get real carrier statuses back: queued, sent, delivered. As promises or events.
Incoming SMS stream to your machine over the LAN, or straight into your local server with simwire listen.
Everything you keep rebuilding around SMS APIs, in the box.
Your phone pushes every incoming SMS to your dev machine over WebSocket. OTP flows become testable end-to-end, offline.
Not just accepted by an API. Actually sent by the SIM, actually delivered to the handset. As events, or awaited.
Same API, no hardware. Outbox assertions, simulated incoming, forced failures.
Pick the SIM per message: OTPs on one carrier, alerts on the other.
One command that says why it's not working, with the fix.
Messages persist on the phone before they're accepted. A killed app restarts and resumes exactly where it left off.
Plain WebSocket frames, documented pairing, mDNS discovery. Build your own client in an afternoon.
TypeScript-first, promise-based, event-driven. One import for production, one for tests.
import { connect } from "simwire"; const sms = await connect(); // finds your phone on the LAN const msg = await sms.send({ to: "+15550142834", text: "Your code is 4821", }); await msg.waitForDelivery(); // real carrier status
sms.on("message", (m) => { if (m.text.startsWith("BANK:")) reconcilePayment(m); }); // or pipe straight into your local server: // $ npx simwire listen --forward http://localhost:3000/sms
import { mock } from "simwire"; const sms = mock(); // no phone, same API await sms.send({ to: "+15550100000", text: "OTP: 1234" }); expect(sms.outbox).toHaveLength(1); sms.simulateIncoming({ from: "+15550100001", text: "STOP" });
For development, testing and transactional volume, the phone in your pocket wins.
| simwire | Twilio & friends | |
|---|---|---|
| Price per SMS | Your plan, usually free | $0.008 to 0.05, plus number rental |
| Setup | 2 min, one QR scan | Account, billing, compliance forms |
| Receive in local dev | Native, streams to localhost | Public webhook plus tunnel |
| Test story | Built-in mock device | Magic numbers, third-party mocks |
| Data path | Stays on your LAN | Vendor cloud |
| Bulk campaigns | No, by design | Yes, that's their job |
npm installOpen source, MIT licensed, yours to keep.