Skip to main content

Tech stack

LayerTechnology
FrontendReact 18, TypeScript, Vite, Tailwind CSS, Radix UI
BackendNode.js, Express.js, TypeScript
DatabaseMySQL 8 (Drizzle ORM)
CachingRedis (Upstash in prod)
AuthJWT (access + refresh tokens), OAuth2
AI / LLMGoogle Gemini, LangChain, OpenAI (embeddings)
Vector DBQdrant
Cloud StorageAWS S3
PaymentsStripe, Cashfree
WhatsAppGupshup (primary), Wasimple, Facebook Meta
Real-timeWebSockets
Job Schedulingnode-cron

Production services

ServicePurpose
MySQL (managed)Primary database
Upstash RedisCaching + sessions
AWS S3Media file storage
Qdrant CloudVector search (RAG)
GupshupWhatsApp messaging
StripeSubscriptions and payments
Google CloudGemini API (AI + embeddings)

Docker deployment

Uncomment the app service in docker-compose.yml and run:
docker-compose up -d
The Dockerfile builds the full app. Port 5001 is exposed.

Manual / VPS deployment

# 1. Install dependencies
npm install

# 2. Build
npm run build

# 3. Set production env vars in .env

# 4. Run migrations
npm run db:push

# 5. Start
npm run start
Build outputs:
  • 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