Tech stack
| Layer | Technology |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, Radix UI |
| Backend | Node.js, Express.js, TypeScript |
| Database | MySQL 8 (Drizzle ORM) |
| Caching | Redis (Upstash in prod) |
| Auth | JWT (access + refresh tokens), OAuth2 |
| AI / LLM | Google Gemini, LangChain, OpenAI (embeddings) |
| Vector DB | Qdrant |
| Cloud Storage | AWS S3 |
| Payments | Stripe, Cashfree |
| Gupshup (primary), Wasimple, Facebook Meta | |
| Real-time | WebSockets |
| Job Scheduling | node-cron |
Production services
| Service | Purpose |
|---|---|
| MySQL (managed) | Primary database |
| Upstash Redis | Caching + sessions |
| AWS S3 | Media file storage |
| Qdrant Cloud | Vector search (RAG) |
| Gupshup | WhatsApp messaging |
| Stripe | Subscriptions and payments |
| Google Cloud | Gemini API (AI + embeddings) |
Docker deployment
Uncomment theapp service in docker-compose.yml and run:
Dockerfile builds the full app. Port 5001 is exposed.
Manual / VPS deployment
- Client →
dist/public/ - Server →
dist/index.js
Pre-deploy checklist
NODE_ENV=production
DATABASE_SSL=true
SESSION_USE_SECURE_COOKIE=true
Real JWT_SECRET and JWT_REFRESH_SECRET set
Stripe webhook secret matches endpoint in Stripe dashboard
Gupshup webhook URL updated to production domain
ALLOWED_ORIGINS set to production domain only