An open API service indexing awesome lists of open source software.

https://github.com/profullstack/smshub

A multi-platform, real-time SMS messaging platform with unified inbox, multi-provider support (Twilio + Telnyx), and an API-first architecture.
https://github.com/profullstack/smshub

api sms telnyx twilio

Last synced: 4 days ago
JSON representation

A multi-platform, real-time SMS messaging platform with unified inbox, multi-provider support (Twilio + Telnyx), and an API-first architecture.

Awesome Lists containing this project

README

          

# SMSHub


SMSHub logo

[![Next.js](https://img.shields.io/badge/Next.js-16-black?logo=next.js)](https://nextjs.org/)
[![React](https://img.shields.io/badge/React-19-61DAFB?logo=react&logoColor=white)](https://react.dev/)
[![TypeScript](https://img.shields.io/badge/TypeScript-5.9-3178C6?logo=typescript&logoColor=white)](https://typescriptlang.org/)
[![Supabase](https://img.shields.io/badge/Supabase-Postgres%20%2B%20Realtime-3FCF8E?logo=supabase&logoColor=white)](https://supabase.com/)
[![Expo](https://img.shields.io/badge/Expo-React%20Native-000020?logo=expo&logoColor=white)](https://expo.dev/)
[![Electron](https://img.shields.io/badge/Electron-Desktop-47848F?logo=electron&logoColor=white)](https://electronjs.org/)
[![Vitest](https://img.shields.io/badge/Tests-103%20passing-6E9F18?logo=vitest&logoColor=white)](https://vitest.dev/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](http://makeapullrequest.com)

A multi-platform, real-time SMS messaging platform with unified inbox, multi-provider support (Twilio + Telnyx), and an API-first architecture.

> **๐Ÿš€ Coming Soon:** [phonenumbers.bot](https://phonenumbers.bot) โ€” Real SIM phone numbers with a developer-first API

## Platforms

| Platform | Tech | Status |
|---|---|---|
| ๐ŸŒ Web | Next.js 16 (App Router) | โœ… v1 |
| ๐Ÿ“ฒ PWA | Service Worker + Manifest | โœ… v1 |
| ๐Ÿ“ฑ iOS | React Native (Expo) | โœ… v1 |
| ๐Ÿค– Android | React Native (Expo) | โœ… v1 |
| ๐Ÿ–ฅ Desktop | Electron | โœ… v1 |

## Features

- **Unified Inbox** โ€” Threaded conversations across all devices
- **Real-time Messaging** โ€” Sub-second updates via Supabase Realtime
- **Multi-Provider** โ€” Twilio + Telnyx with unified API (`sendSMS()`)
- **Compose Flow** โ€” New message modal with sender number picker
- **Unread Tracking** โ€” Badge counts, auto-mark read on open
- **Search** โ€” Filter conversations by name or phone number
- **Contact Management** โ€” Auto-create on inbound, inline name editing
- **Delivery Receipts** โ€” Live status updates (queued โ†’ sent โ†’ delivered โ†’ failed)
- **Keyboard Shortcuts** โ€” Ctrl+N (compose), Ctrl+K (search), arrows, Escape
- **Push Notifications** โ€” Native on mobile (Expo), OS notifications on desktop (Electron)
- **PWA** โ€” Installable, offline support, background sync
- **Dark Mode** โ€” Default, developer-focused UI

## Tech Stack

| Layer | Technology |
|---|---|
| Frontend | Next.js 16, React 19, TailwindCSS |
| Mobile | React Native, Expo, expo-router |
| Desktop | Electron, electron-builder |
| Backend | Next.js API routes |
| Database | Supabase (Postgres + Realtime + Auth + RLS) |
| Providers | Twilio, Telnyx |
| Testing | Vitest (48 tests) |
| CI | Husky pre-commit (tests + typecheck + lint) |
| Mobile Deploy | Expo EAS (expo.dev) |
| Desktop Build | electron-builder (AppImage, dmg, NSIS) |

## Getting Started

### Prerequisites

- Node.js 22+
- pnpm
- A [Supabase](https://supabase.com) project
- Twilio and/or Telnyx account(s)

### Setup

```bash
# Install dependencies
pnpm install

# Copy env file and fill in your values
cp .env.example .env

# Run database migrations against your Supabase project
# (paste supabase/migrations/*.sql into the Supabase SQL editor)

# Start dev server
pnpm dev
```

### Mobile (Expo)

```bash
cd mobile
pnpm install
npx expo start

# Build for iOS/Android via Expo EAS
eas build --profile production --platform all
```

### Desktop (Electron)

```bash
cd electron
pnpm install
pnpm dev

# Package distributable
pnpm package
```

### Environment Variables

| Variable | Description |
|---|---|
| `NEXT_PUBLIC_SUPABASE_URL` | Supabase project URL |
| `NEXT_PUBLIC_SUPABASE_ANON_KEY` | Supabase anon/public key |
| `SUPABASE_SERVICE_ROLE_KEY` | Supabase service role key (server-only) |
| `TWILIO_ACCOUNT_SID` | Twilio Account SID |
| `TWILIO_AUTH_TOKEN` | Twilio Auth Token |
| `TELNYX_API_KEY` | Telnyx API Key |
| `TELNYX_PUBLIC_KEY` | Telnyx Public Key (webhook verification) |
| `NEXT_PUBLIC_APP_URL` | App URL (default: `http://localhost:3000`) |

## Project Structure

```
src/ # Web app (Next.js)
โ”œโ”€โ”€ app/
โ”‚ โ”œโ”€โ”€ api/
โ”‚ โ”‚ โ”œโ”€โ”€ contacts/ # GET, PATCH /api/contacts/[id]
โ”‚ โ”‚ โ”œโ”€โ”€ conversations/ # GET, POST /api/conversations/[id]/read
โ”‚ โ”‚ โ”œโ”€โ”€ messages/ # GET, POST /api/messages/send
โ”‚ โ”‚ โ”œโ”€โ”€ providers/ # DELETE /api/providers/[id]
โ”‚ โ”‚ โ”œโ”€โ”€ phone-numbers/ # DELETE /api/phone-numbers/[id]
โ”‚ โ”‚ โ””โ”€โ”€ webhooks/ # Twilio + Telnyx inbound & status callbacks
โ”‚ โ”œโ”€โ”€ login/ # Login page
โ”‚ โ”œโ”€โ”€ register/ # Register page
โ”‚ โ”œโ”€โ”€ settings/ # Provider & phone number management
โ”‚ โ”œโ”€โ”€ phonenumbers/ # phonenumbers.bot coming soon page
โ”‚ โ””โ”€โ”€ offline/ # PWA offline fallback
โ”œโ”€โ”€ components/
โ”‚ โ”œโ”€โ”€ inbox-client.tsx # Main inbox (sidebar + chat + realtime)
โ”‚ โ”œโ”€โ”€ new-message-modal.tsx # Compose new conversation
โ”‚ โ”œโ”€โ”€ contact-name-editor.tsx
โ”‚ โ”œโ”€โ”€ toast-container.tsx # Toast notifications
โ”‚ โ””โ”€โ”€ sw-register.tsx # Service worker registration
โ”œโ”€โ”€ contexts/
โ”‚ โ””โ”€โ”€ toast-context.tsx # Global toast state
โ”œโ”€โ”€ lib/
โ”‚ โ”œโ”€โ”€ providers/ # Twilio + Telnyx unified layer
โ”‚ โ”œโ”€โ”€ supabase/ # Client/server/middleware helpers
โ”‚ โ””โ”€โ”€ types/ # TypeScript definitions
โ”œโ”€โ”€ middleware.ts # Auth guard
mobile/ # React Native (Expo)
โ”œโ”€โ”€ app/ # expo-router screens
โ”‚ โ”œโ”€โ”€ (tabs)/ # Inbox + Settings tabs
โ”‚ โ”œโ”€โ”€ chat/[id].tsx # Chat screen
โ”‚ โ””โ”€โ”€ auth.tsx # Login/register
โ”œโ”€โ”€ lib/ # Supabase, API client, notifications
โ””โ”€โ”€ eas.json # Expo EAS build profiles
electron/ # Desktop app
โ”œโ”€โ”€ main.ts # Window + tray + IPC
โ”œโ”€โ”€ preload.ts # Renderer bridge
โ”œโ”€โ”€ notifications.ts # Supabase Realtime โ†’ OS notifications
โ”œโ”€โ”€ updater.ts # Auto-updater
โ””โ”€โ”€ electron-builder.yml # Build config
supabase/
โ””โ”€โ”€ migrations/ # 001_initial_schema + 002_unread_tracking
```

## API Endpoints

| Method | Endpoint | Description |
|---|---|---|
| `POST` | `/api/messages/send` | Send an SMS |
| `GET` | `/api/messages?conversation_id=` | Get messages for a conversation |
| `GET` | `/api/conversations` | List conversations |
| `POST` | `/api/conversations/[id]/read` | Mark conversation as read |
| `GET` | `/api/contacts` | List contacts |
| `PATCH` | `/api/contacts/[id]` | Update contact name |
| `DELETE` | `/api/providers/[id]` | Delete a provider |
| `DELETE` | `/api/phone-numbers/[id]` | Delete a phone number |
| `POST` | `/api/webhooks/twilio` | Twilio inbound webhook |
| `POST` | `/api/webhooks/telnyx` | Telnyx inbound webhook |
| `POST` | `/api/webhooks/twilio/status` | Twilio delivery status callback |
| `POST` | `/api/webhooks/telnyx/status` | Telnyx delivery status callback |

## Scripts

```bash
pnpm dev # Start development server
pnpm build # Production build
pnpm start # Start production server
pnpm test # Run tests (48 passing)
pnpm test:watch # Run tests in watch mode
pnpm test:coverage # Run tests with coverage
pnpm lint # Lint source files
pnpm typecheck # TypeScript type checking
```

## Pre-commit Hook

Every commit automatically runs:
1. ๐Ÿงช **Tests** โ€” `vitest run`
2. ๐Ÿ” **Type check** โ€” `tsc --noEmit`
3. โœจ **Lint** โ€” `eslint --fix` on staged `.ts/.tsx` files

## Database Schema

Tables: `providers`, `phone_numbers`, `contacts`, `conversations`, `messages`

- Row Level Security (RLS) on all tables
- Realtime enabled on `messages` and `conversations`
- Unread tracking via `last_read_at` + computed count

See `supabase/migrations/` for the full schema.

## Contributing

PRs welcome! Please ensure all checks pass before submitting:

```bash
pnpm test && pnpm tsc --noEmit && pnpm lint
```

## License

MIT