Upload a call recording, transcribe & analyze it with AI, and automatically send a follow-up email based on extracted action items.
- Upload a call audio file (MP3, WAV, M4A, etc.) via REST API
- Queue the job with BullMQ + Redis for async processing
- Analyze with Gemini 2.5 Flash (multimodal inference — one call does transcription + AI analysis)
- Store transcript, sentiment, summary, and action items in PostgreSQL
- Auto-send a follow-up email (via Ethereal test SMTP) if the AI identifies that the call requires a follow-up
[Audio Upload]
|
v
[Express API] --> [PostgreSQL: calls table]
|
v
[Redis Queue] --> [BullMQ Worker]
|
+-- Gemini 2.5 Flash (audio -> transcript + insights)
+-- PostgreSQL: call_insights table
+-- Nodemailer Ethereal -> messages table
| Component | Technology |
|---|---|
| Backend API | Node.js + Express |
| AI Analysis | Google Gemini 2.5 Flash API (free tier) |
| Database | PostgreSQL 16 |
| Job Queue | BullMQ + Redis 7 |
| Email Service | Nodemailer + Ethereal Email |
| Logging | Winston |
| Containers | Docker Compose |
- Node.js 18+
- Docker + Docker Compose
- Google Gemini API key
git clone https://github.com/yourusername/voqstra.git
cd voqstra
npm installCopy the example environment file:
cp .env.example .envOpen .env and set your Gemini API key:
GEMINI_API_KEY=your_key_hereStart PostgreSQL and Redis via Docker Compose:
docker compose up -dYou can start the Express API and BullMQ worker together using concurrently:
npm run dev:allAlternatively, you can run them in separate terminals:
# Terminal 1 - API server (auto-migrates DB on first run)
npm run dev
# Terminal 2 - BullMQ worker
npm run workerOpen your browser and navigate to:
http://localhost:3000
curl -X POST http://localhost:3000/api/calls/upload \
-F "audio=@sample.wav" \
-F "customer_name=Jane Smith" \
-F "customer_email=jane@example.com" \
-F "customer_phone=+1234567890"Response:
{
"message": "Call uploaded successfully. Processing started.",
"call_id": "uuid-here",
"job_id": "1",
"status": "pending",
"check_status": "/api/calls/uuid-here"
}curl http://localhost:3000/api/calls/{call_id}curl http://localhost:3000/api/callscurl http://localhost:3000/api/calls/health- calls: id, customer_name, customer_email, customer_phone, audio_filename, status, created_at
- call_insights: id, call_id, transcript, sentiment, summary, action_items (JSONB), needs_followup, created_at
- messages: id, call_id, recipient_email, channel, message_body, preview_url, sent_at, status
MIT License




