Open-source AI voice assistant platform. Connect your sipgate phone numbers to AI assistants — built with Next.js, Supabase, and the sipgate AI Flow SDK.
App only (requires external Supabase):
✅ sipgate OAuth login — sign in with your sipgate account; phone numbers are imported automatically
✅ AI Voice Assistants — custom personalities, system prompts, LLM provider choice (OpenAI, Gemini, Mistral)
✅ Visual Call Flows — drag-and-drop routing logic with multiple agents and scenarios
✅ Knowledge Base — RAG-powered context injection via pgvector
✅ Real-time Call Monitoring — live transcripts and dashboards via WebSocket + Supabase Realtime
✅ Post-call Evaluation — CSAT scoring and configurable success criteria per assistant
✅ Multi-tenancy — organizations with role-based access control and Row Level Security
✅ Webhooks & MCP — post-call actions, tool integrations, MCP server support
✅ Automated Testing — call simulation and regression testing framework
✅ i18n — English and German UI
🔜 LLM Cascading — automatic fallback chain across providers on failure
🔜 A/B Testing — split traffic across prompt variants and compare performance
🔜 Human Takeover — escalate live calls to a human agent from the dashboard
The fastest way to run everything locally or on a server:
# 1. Clone
git clone https://github.com/BlackMac/flow-io.git
cd flow-io
# 2. Configure
cp .env.docker.example .env.docker
# Edit .env.docker — fill in your API keys (see Prerequisites below)
# 3. Start
docker compose --env-file .env.docker up -d| Service | URL |
|---|---|
| Flow-IO app | http://localhost:3000 |
| Supabase Studio | http://localhost:8000 (login: DASHBOARD_USERNAME/PASSWORD) |
| Email test inbox | http://localhost:54324 |
Everything runs in one command: Postgres, Auth, Storage, Realtime, the app, and automatic database migrations.
You need accounts / API keys for:
| Service | Purpose | Link |
|---|---|---|
| sipgate | Login + phone numbers | Register · Create OAuth app |
| OpenAI | LLM + embeddings | platform.openai.com |
| ElevenLabs | Text-to-speech | elevenlabs.io |
sipgate OAuth app setup:
- Go to console.sipgate.com/third-party-clients
- Create a new app, set redirect URI to
https://your-domain.com/api/auth/sipgate/callback - Copy Client ID and Client Secret into
.env.docker(or.env.localfor dev)
Supabase and Google Gemini / Mistral are optional (Supabase Cloud or self-hosted via Docker).
Flow-IO needs a Next.js host and a Supabase instance (Postgres + Auth + Storage + Realtime). The Docker setup bundles everything. For PaaS platforms, you use Supabase Cloud (free tier available) for the backend.
| Platform | Supabase needed? | Notes |
|---|---|---|
| Docker (self-hosted) | ❌ bundled | Full control, runs anywhere |
| Coolify | ❌ bundled | Git-connected, deploys full docker-compose.yml |
| Railway (UI import) | ❌ bundled | Drag docker-compose.yml onto Railway canvas |
| Railway (button) | ✅ Supabase Cloud | App only, add env vars |
| Render | ✅ Supabase Cloud | Deploy as Docker container |
| Fly.io / any Docker host | ✅ Supabase Cloud | docker run the app image |
Follow the Quick Start above. Supabase runs alongside the app — no external accounts needed.
Coolify is an open-source self-hosted PaaS that deploys directly from your Git repo using docker-compose.yml.
- In Coolify, create a new Resource → Docker Compose
- Connect your GitHub repo (or paste the repo URL)
- Set the Docker Compose file to
docker-compose.yml - Add all environment variables from
.env.docker.examplein the Coolify UI - Deploy — Coolify starts all services and handles restarts automatically
Coolify also provides automatic HTTPS, a web UI for logs, and one-click redeploys on git push.
Railway supports importing a docker-compose.yml via drag & drop onto the project canvas:
- Create a new Railway project at railway.app
- Drag your local
docker-compose.ymlonto the project canvas — Railway creates each service automatically - Add all environment variables from
.env.docker.examplein the Railway dashboard - Deploy
Note: Railway's docker-compose import is still evolving and not all compose features are supported yet.
These options only host the app — use Supabase Cloud (free tier works) for the backend:
- Create a Supabase project at supabase.com
- Run migrations:
npx supabase link --project-ref your-project-ref npx supabase db push
- Deploy the app — click one of the buttons at the top, or deploy manually to any platform that can run a Docker container or Node.js
- Set all environment variables from
.env.example
| Variable | Description |
|---|---|
NEXT_PUBLIC_SUPABASE_URL |
Supabase project URL |
NEXT_PUBLIC_SUPABASE_ANON_KEY |
Supabase anon key |
SUPABASE_SERVICE_ROLE_KEY |
Supabase service role key |
SIPGATE_OAUTH_CLIENT_ID |
sipgate OAuth client ID |
SIPGATE_OAUTH_CLIENT_SECRET |
sipgate OAuth client secret |
SIPGATE_WEBHOOK_SECRET |
Shared secret for webhook HMAC-SHA256 signature verification |
SIPGATE_WEBHOOK_TOKEN |
Token for WebSocket authentication (x-api-token header) |
NEXT_PUBLIC_APP_URL |
Canonical app URL for OAuth redirects and email links (required in production) |
OPENAI_API_KEY |
OpenAI API key |
ELEVENLABS_API_KEY |
ElevenLabs API key |
See .env.example for the full list including optional variables.
# Install dependencies
npm install
# Copy and fill in environment variables
cp .env.example .env.local
# Start Supabase locally
npx supabase start
# Apply migrations
npx supabase db push
# Start dev server
npm run devOpen http://localhost:3000.
┌──────────────────────────────────────────┐
│ Next.js App │
│ (Frontend + API routes + Server Actions)│
└───────────┬──────────────┬───────────────┘
│ │
┌───────▼──────┐ ┌────▼────────────┐
│ Supabase │ │ sipgate │
│ │ │ │
│ - Auth │ │ - OAuth login │
│ - PostgreSQL │ │ - AI Flow SDK │
│ - pgvector │ │ - Webhooks │
│ - Storage │ │ - Phone numbers │
│ - Realtime │ └─────────────────┘
└───────┬──────┘
│
┌───────▼──────────────┐
│ LLM Providers │
│ OpenAI · Gemini │
│ Mistral · ElevenLabs│
└──────────────────────┘
Auth flow:
- User clicks "Mit sipgate anmelden"
- sipgate OAuth2 (scopes:
openid profile email account:read numbers:read all) - Phone numbers are synced from the sipgate account automatically
- Organization is created, user lands on the dashboard
Users can also sign up with email/password and connect their sipgate account later in Settings → Telefonie.
| Layer | Technology |
|---|---|
| Framework | Next.js 16 (App Router, standalone output) |
| Language | TypeScript (strict) |
| Styling | Tailwind CSS v4 + shadcn/ui |
| Database | Supabase PostgreSQL + pgvector |
| Auth | Supabase Auth + sipgate OAuth2 |
| Telephony | sipgate AI Flow SDK |
| LLM | OpenAI GPT-5.4 · Google Gemini · Mistral |
| TTS | ElevenLabs |
| Testing | Vitest |
Key tables (all with Row Level Security):
| Table | Purpose |
|---|---|
organizations |
Workspaces / tenants |
organization_members |
User↔org relationships with roles |
assistants |
AI assistant configurations |
call_scenarios |
Visual routing scenario definitions |
call_sessions |
Call records |
call_transcripts |
Conversation transcripts |
knowledge_bases |
Document collections |
kb_chunks |
Document chunks with vector embeddings |
phone_numbers |
Phone numbers synced from sipgate |
telephony_accounts |
Connected telephony provider accounts (per org) |
webhooks |
Post-call webhook configurations |
flow-io/
├── app/
│ ├── (auth)/ # Login, signup, forgot-password
│ ├── [orgSlug]/ # Org-scoped pages (dashboard, assistants, …)
│ └── api/
│ ├── auth/sipgate/ # sipgate OAuth callback + complete
│ └── sipgate/webhook # sipgate AI Flow webhook handler
├── components/
│ ├── ui/ # shadcn/ui base components
│ ├── auth/ # Login buttons
│ ├── assistants/ # Assistant management UI
│ ├── settings/ # Org settings (incl. telephony section)
│ └── …
├── lib/
│ ├── supabase/ # Supabase client (browser + server)
│ ├── telephony/ # Modular telephony provider layer
│ │ └── providers/
│ │ └── sipgate/ # sipgate OAuth, REST client, phone sync
│ ├── llm/ # LLM provider abstraction
│ ├── embeddings/ # pgvector operations
│ └── flow-engine/ # Call flow execution
├── supabase/
│ ├── migrations/ # SQL migrations (applied automatically in Docker)
│ └── config.toml
├── docker-compose.yml # Full self-hosted stack
├── .env.example # Environment variable reference
└── .env.docker.example # Docker-specific env reference
- Fork the repo and create a branch
- Follow the code style (TypeScript strict, no
any) - Write tests for new features (
npm testmust pass) - Run
npm run type-checkandnpm run buildbefore opening a PR - Use conventional commit messages
MIT — see LICENSE for details.