One AI voice agent that answers your business phones.
Book appointments. Take orders. Handle FAQs. Route calls. 24/7.
Universal and config-driven: shaped per tenant by capabilities, not by an industry.
| ~450ms voice-to-voice |
6 toggleable capabilities |
3 LLM providers |
Multi-tenant architecture |
Phone Call
|
v
+-----------+
| SignalWire | SIP trunking / WebSocket streaming
+-----+-----+
|
v
+-----------+
| Deepgram | Speech-to-Text .............. ~150ms
+-----+-----+
|
v
+-----------+
| LLM | Gemini / OpenAI / Groq ...... ~200ms TTFT
| + Tools | booking, FAQ, routing, CRM
+-----+-----+
|
v
+-----------+
| Cartesia | Text-to-Speech .............. ~40ms
+-----+-----+
|
v
AI Response ........................ ~450ms total
Three services, one docker compose up:
| Service | Stack | What it does |
|---|---|---|
| soniq-api | Hono + TypeScript + Node 22 | REST API, voice pipeline, business logic, scheduled jobs |
| soniq-dashboard | Next.js 16 + React 19 + Tailwind | Tenant dashboard, live call monitoring, CRM, setup wizard |
| soniq-agent | Python + LiveKit Agents SDK | Voice agent worker with tool calling |
Call Handling -- Appointment booking with calendar sync (Google, Outlook, Calendly) / order taking with verification / FAQ from tenant knowledge base / smart routing with full conversation context / voicemail with transcription
Automation -- SMS confirmations via Twilio / post-call review requests / follow-up scheduling / engagement scoring / callback queue
CRM -- Contacts with call history / deals pipeline / task management / sentiment detection for priority escalation
Multi-tenant -- Per-tenant config, prompts, voice, phone numbers, and capabilities / tenant isolation at database level / white-label ready
Soniq is one universal voice agent, not a bundle of industry templates. There is no industry to pick. Each tenant is shaped by two things:
Capabilities -- toggle what the agent is allowed to do on a call:
| Capability | Default | What it does |
|---|---|---|
| Appointment booking | on | Checks availability and books with calendar sync |
| FAQ & knowledge | on | Answers from the tenant's business description and Q/A pairs |
| Call transfer / escalation | on | Hands off to a human with full conversation context |
| Voicemail | on | Captures and transcribes messages after hours |
| Callbacks | on | Queues and schedules return calls |
| Order / request taking | off | Takes a domain-neutral order or request |
Business config -- free-form: business name, agent name, voice, greetings, operating hours, location, escalation rules, and a knowledge base of FAQ pairs. Universal terminology (customer, booking, deal, task) and one default deal pipeline apply to every tenant, so the same agent serves any business without per-industry code.
Tech stack details
| Layer | Technology | Role |
|---|---|---|
| Telephony | SignalWire | SIP trunking, WebSocket audio streaming |
| STT | Deepgram Nova-2 | Streaming speech-to-text, phone-optimized |
| LLM | Gemini / OpenAI / Groq | Multi-provider fallback with tool calling |
| TTS | Cartesia Sonic | Streaming text-to-speech synthesis |
| Voice Agent | LiveKit Agents SDK | Python agent worker with Silero VAD |
| Database | Supabase (PostgreSQL) | Multi-tenant data, auth, real-time |
| Frontend | Next.js 16, shadcn/ui, Radix | App Router, SSR, responsive dashboard |
| Backend | Hono.js, TypeScript | Lightweight, fast, middleware-based API |
- Node.js 22+
- Python 3.12+ (for voice agent)
- Supabase project
- API keys for: Deepgram, Cartesia, SignalWire, and at least one LLM provider
git clone https://github.com/oneKn8/soniq.git
cd soniq
cp .env.example .env
# Edit .env with your API keysOption A -- Dev script (recommended)
./dev.sh # starts API + dashboard
./dev.sh --api # API only
./dev.sh --fe # dashboard onlyOption B -- Manual
# terminal 1
cd soniq-api && npm install && npm run dev # localhost:3100
# terminal 2
cd soniq-dashboard && npm install && npm run dev # localhost:3000Option C -- Docker
docker compose upSee .env.example for the full list. Key groups:
| Group | Variables |
|---|---|
| Database | SUPABASE_URL SUPABASE_ANON_KEY SUPABASE_SERVICE_ROLE_KEY |
| LLM | GEMINI_API_KEY OPENAI_API_KEY GROQ_API_KEY |
| Voice | DEEPGRAM_API_KEY CARTESIA_API_KEY |
| Telephony | SIGNALWIRE_PROJECT_ID SIGNALWIRE_API_TOKEN SIGNALWIRE_SPACE_URL |
| LiveKit | LIVEKIT_API_KEY LIVEKIT_API_SECRET |
soniq/
├── soniq-api/ # Backend
│ ├── src/
│ │ ├── index.ts # Hono entry point
│ │ ├── routes/ # REST endpoints
│ │ ├── services/ # Voice pipeline, LLM, calendar, CRM
│ │ ├── middleware/ # Auth, rate limiting
│ │ ├── jobs/ # Scheduled automation
│ │ └── config/ # Universal prompt, pipeline, voice config
│ ├── migrations/ # SQL migrations
│ └── Dockerfile
│
├── soniq-dashboard/ # Frontend
│ ├── app/
│ │ ├── (auth)/ # Login, signup, password reset
│ │ └── (dashboard)/ # All dashboard pages
│ ├── components/ # UI components
│ ├── lib/ # API client, terminology, capabilities
│ └── Dockerfile
│
├── soniq-agent/ # Voice Agent
│ ├── agent.py # LiveKit agent worker
│ ├── tools.py # Booking, FAQ, routing tools
│ └── Dockerfile
│
├── docker-compose.yml
├── nginx.conf
├── dev.sh
└── .env.example
Built with Hono, Next.js, LiveKit, Deepgram, Cartesia, and Supabase