The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Handset listing page.
Texting inside your product, in an afternoon.
Open-source React components for embedded messaging, built on the Handset API. Distributed the shadcn way: the CLI copies the source into your repo, styled with your Tailwind tokens, yours to change.
Set HANDSET_API_KEY in your env, wire resolveTenantId() in the generated
route to your session, and render it:
| Item | What it is |
|---|---|
@handset/messaging | Two-pane texting surface — inbox + thread, responsive to mobile |
@handset/inbox | Conversation list: previews, relative times, STOP badges, infinite scroll |
@handset/thread | Message history: delivery states, opt-out handling, wired composer |
@handset/composer | Draft box with live SMS segment counting and unicode detection |
@handset/next-routes | Next.js proxy route — your API key never reaches the browser |
Two layers, like shadcn-on-Radix:
@handset/react (npm, versioned) — headless hooks:
useConversations, useThread, useComposer, plus segment math and a tiny
client. Logic we maintain; bring your own UI if you prefer.apps/www/registry) — the visual
components, copied into your project as source.Components never hold API keys. They call proxy routes in your backend
(added by @handset/next-routes); your server holds the Handset key and your
existing session auth decides which tenant each signed-in user sees. The
Handset API handles the rest — numbers, delivery, threading, 10DLC compliance,
STOP/HELP.
The docs site serves a mock Handset API (apps/www/app/api/handset) so the
demo works with zero setup.
See ROADMAP.md — shipped components, what's next (call summaries, MMS attachments, more framework proxies), and non-goals. Issues with real use cases move items up the list.
MIT © Handset HQ, Inc.