Open-Source Power Dialer — Tinder for Sales Calls
Features • Quick Start • Architecture • API • Docker • Contributing
DialerJazz is the world's most beautiful open-source Power Dialer. It completely reimagines the outbound sales experience by replacing boring spreadsheet-like UIs with a gamified workflow featuring an unmatched premium design.
Three distinct calling modes:
- 🔥 Tinder Mode: Rapidly swipe through leads with our signature gamified UI.
- ⚡ Power Mode: Automated, high-velocity sequential dialing to maximize connect rates.
- 📞 Normal Mode: Traditional, controlled single-dial workflows with a premium facelift.
DialerJazz offers universal connectivity—hook into Telnyx, Twilio, or any custom WebRTC provider out of the box.
| Category | Details |
|---|---|
| Dialer | Tinder-style swipe UI, power dialing, manual dialer, WebRTC calls via Telnyx |
| CRM | Lead management, CSV import, company/contact tracking, disposition workflow |
| Campaigns | Create campaigns, assign leads, track progress, filter by status |
| Auth | Email/password, Google OAuth, email verification with OTP, password recovery |
| Dashboard | Real-time stats, campaign overview table, quick actions |
| Pagination | Server-side offset pagination across all list endpoints with standardized meta |
| UI/UX | KokonutUI dark theme, collapsible sidebar, Framer Motion animations, responsive |
| Infra | Docker-ready, rate limiting, Zod validation, centralized error handling |
- Node.js 22+ & npm
- An InsForge project (provides Postgres, Auth, Storage)
- A Telnyx account (for WebRTC calling)
# 1. Clone
git clone https://github.com/moazzam-07/DialerJazz.git
cd DialerJazz
# 2. Install all dependencies (client + server)
npm run install:all
# 3. Configure environment
cp .env.example .env
# Edit .env with your InsForge and Telnyx credentials
# 4. Run the full stack (client on :5173, server on :3001)
npm run dev| Variable | Required | Description |
|---|---|---|
INSFORGE_API_KEY |
✅ | InsForge admin API key (server-side) |
INSFORGE_BASE_URL |
✅ | InsForge project URL |
INSFORGE_ANON_KEY |
✅ | InsForge anonymous/public key |
VITE_INSFORGE_BASE_URL |
✅ | Same URL, baked into client at build time |
VITE_INSFORGE_ANON_KEY |
✅ | Same anon key, baked into client |
VITE_API_URL |
— | API base URL (defaults to /api) |
JWT_SECRET |
✅ | Secret for JWT token verification |
FRONTEND_URL |
— | CORS allowed origin (defaults to http://localhost:5173) |
PORT |
— | Server port (defaults to 3001) |
DialerJazz/
├── client/ # React 19 + Vite + TypeScript
│ ├── src/
│ │ ├── components/ # UI components (ShadCN, custom)
│ │ │ ├── ui/ # Reusable UI primitives
│ │ │ └── layout/ # Dashboard layout, sidebar
│ │ ├── hooks/ # Custom hooks (usePagination, etc.)
│ │ ├── contexts/ # Auth context provider
│ │ ├── lib/ # API client, utilities, InsForge SDK
│ │ └── pages/ # Route-level page components
│ └── tailwind.config.js
│
├── server/ # Express + TypeScript
│ └── src/
│ ├── routes/ # REST API route handlers
│ │ ├── campaigns.ts # CRUD + server-side pagination
│ │ ├── leads.ts # CRM + bulk import + pagination
│ │ ├── calls.ts # Call logging + stats + pagination
│ │ ├── settings.ts # User settings (Telnyx config)
│ │ └── telnyx.ts # WebRTC token generation
│ ├── middleware/ # Auth, error handling
│ ├── services/ # Business logic
│ └── index.ts # Express + Socket.io entry point
│
├── Dockerfile # Multi-stage production build
└── .env.example # Environment template
| Layer | Technology |
|---|---|
| Frontend | React 19, TypeScript, Vite, Tailwind CSS 3.4, Framer Motion, ShadCN/Radix |
| Backend | Node.js 22, Express, TypeScript, Zod, Socket.io |
| Database | PostgreSQL via InsForge (PostgREST API) |
| Auth | InsForge Auth (email/password, Google OAuth, OTP verification) |
| Calling | Telnyx WebRTC SDK |
| Deployment | Docker (multi-stage), any cloud provider |
All list endpoints support server-side offset pagination with standardized responses.
GET /api/campaigns?page=2&per_page=10
Response format:
{
"data": [...],
"meta": {
"total": 142,
"page": 2,
"per_page": 10,
"total_pages": 15
}
}| Method | Endpoint | Description |
|---|---|---|
GET |
/api/campaigns?page=&per_page= |
List campaigns (paginated) |
GET |
/api/campaigns/:id |
Get single campaign |
POST |
/api/campaigns |
Create campaign |
PATCH |
/api/campaigns/:id/status |
Update campaign status |
PATCH |
/api/campaigns/:id/rename |
Rename campaign |
DELETE |
/api/campaigns/:id |
Delete campaign |
GET |
/api/leads?page=&per_page= |
List all CRM leads (paginated) |
GET |
/api/leads/campaign/:id |
Leads by campaign |
POST |
/api/leads/bulk |
Bulk CSV import |
POST |
/api/leads/assign |
Assign leads to campaign |
PATCH |
/api/leads/:id/disposition |
Update lead disposition |
GET |
/api/calls?page=&per_page= |
List call logs (paginated) |
POST |
/api/calls/log |
Log a completed call |
GET |
/api/calls/stats |
Aggregated call statistics |
GET |
/api/settings |
Get user settings |
PUT |
/api/settings |
Update settings |
POST |
/api/telnyx/token |
Generate WebRTC token |
GET |
/api/health |
Health check |
# Build
docker build \
--build-arg VITE_INSFORGE_BASE_URL=https://your-app.region.insforge.app \
--build-arg VITE_INSFORGE_ANON_KEY=your-anon-key \
-t dialerjazz .
# Run
docker run -d \
-p 3001:3001 \
-e INSFORGE_API_KEY=your-api-key \
-e INSFORGE_BASE_URL=https://your-app.region.insforge.app \
-e INSFORGE_ANON_KEY=your-anon-key \
-e JWT_SECRET=your-secret \
dialerjazzThe Docker image uses a multi-stage build:
- Stage 1 (Builder): Installs dependencies, builds client with Vite (VITE_ vars baked in)
- Stage 2 (Production): Copies server source + built client, runs via
tsxfor ESM support
The server serves the built client as static files and proxies /api/* to the Express backend.
We love contributions! Whether it's adding new features, fixing bugs, or improving documentation, check out our Contributing Guide.
Please ensure you adhere to our Code of Conduct.
If you discover a security vulnerability, please consult our Security Policy for reporting guidelines.
DialerJazz is open-sourced software licensed under the MIT License.