Hundreds of initiatives are trying to bring women artisans online. Almost all of them ask her to learn something first β an app, a dashboard, a checkout flow, English. The ones that don't, leave her offline and invisible.
HastKala asks her to learn nothing. The whole journey β discovery, training, certification, listing, orders, payments, support β happens inside one app she already trusts: WhatsApp.
We are not asking women artisans to become digital sellers.
We are making digital selling adapt to them.
Three women, three different starting points. One platform that meets each of them where they are.
ββββββββββββββββββββββββββββββββββββββββ
β The Hesitant Artisan β
β β
β joins via her community, β
β takes a 7-day workshop, β
β becomes a certified seller. β
ββββββββββββββββββββ¬ββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β The Confident Artisan β
β β
β sends a photo + voice note, β
β bot drafts the listing, β
β product goes live, orders flow. β
ββββββββββββββββββββ¬ββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββ
β The Entrepreneur Artisan β
β β
β web dashboard for inventory, β
β network, bulk requests, payments β
β β full control, on her terms. β
ββββββββββββββββββββββββββββββββββββββββ
She never has to leave WhatsApp until she chooses to.
- 5 languages: English, Hindi, Kannada, Tamil, Malayalam
- Voice-first input β she speaks; the bot listens, transcribes, confirms
- 7-day learning track inside WhatsApp β certificate as a real PDF
- Listing flow: photo + voice note β AI-cleaned catalog entry, pre-filled and editable
- Orders, customer details, payment links β all delivered as WhatsApp messages
- Persistent session β once paired, the bot survives restarts and deploys without re-pairing
- Allowlist for safety; demo mode for testing without leaking real numbers
- Public marketplace at cyberkunju.com β TanStack Start SSR
- Browse by craft, district, or category; product story on every listing
- WhatsApp-style purchase flow β name, address, phone, all in natural language
- Order tracking, certificate viewing, community network browsing
- Buyer-side OTP authentication via WhatsApp (no passwords)
- Express + Prisma against Supabase Postgres
- Karigar Sakhi admin console β pending products, members, orders, certifications
- Activity feed β every approval, certificate, order, broadcast
- Razorpay payment links generated per order
- Cloudinary image hosting; OpenAI for AI extraction; Sarvam-ready for native Indic voice
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β cyberkunju.com (Cloudflare) β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β HTTPS
ββββββββββββΌβββββββββββ
β EC2 / Fedora 43 β
β nginx :443 β
ββββ¬βββββββ¬βββββββ¬βββββ
β β β
ββββββββββββΌβ ββββΌβββ ββΌβββββββββββ
β web :3000 β β api β β wabot β
β TanStack β β5000 β β :5001 β
β Start SSR β β β β Chromium β
βββββββββββββ ββββ¬βββ βββββββ¬ββββββ
β β
βββββββββΌββββ βββββΌβββββββ
β Supabase β β WhatsApp β
β Postgres β β Web β
βββββββββββββ ββββββββββββ
CI/CD: every push to main deploys via GitHub Actions, with smoke tests against both the origin and the public Cloudflare URL.
- Node 22+
- A Supabase Postgres
DATABASE_URL - An OpenAI API key
- A WhatsApp number for the bot (any Android phone or WhatsApp Web)
# Clone
git clone https://github.com/cyberkunju/hastkala.git
cd hastkala
# Install root deps (frontend + shared)
npm install
# API
cd apps/api && npm install && npx prisma generate
cp .env.example .env # fill in DATABASE_URL, OPENAI_API_KEY, etc.
npm run dev # starts on :5000
# WhatsApp bot
cd ../wa-bot && npm install
cp .env.example .env # fill in OPENAI_API_KEY, ALLOWED_TEST_NUMBERS
npm run dev # starts on :5001 β scan the QR
# Frontend
cd ../.. && npm run dev # starts on :3000Or run everything together:
npm run dev:allThis repo deploys itself. Push to main, and the Deploy to EC2 workflow:
- SSHes to the configured EC2 instance
- Pulls the commit
- Builds API, bot, and frontend
- Smart-restarts only the services whose
dist/actually changed (preserves WhatsApp session) - Smoke-tests every public endpoint
Provisioning a fresh box is a one-shot script β see scripts/AWS-DEPLOY.md.
hastkala/
βββ apps/
β βββ api/ Express + Prisma backend
β β βββ prisma/ Schema (14 models: Artisan, Product, Order, β¦)
β β βββ src/
β β βββ controllers/ Request handlers
β β βββ routes/ Express routers (/api/products, /api/orders, β¦)
β β βββ services/ AI, storage, WhatsApp integration
β β βββ middleware/ Auth, error handling
β β
β βββ wa-bot/ WhatsApp bot (whatsapp-web.js)
β βββ src/
β βββ conversations/ ~70-state engine + per-flow handlers
β βββ services/ Transcription, TTS, NLU, translation, Q&A
β βββ server/ Internal HTTP server (:5001)
β βββ openwa/ WhatsApp Web client + supervisor
β
βββ src/ Buyer marketplace (TanStack Start)
β βββ routes/ File-based routing
β βββ components/ Layout, product, common
β βββ lib/ API client, i18n, Razorpay, types
β
βββ vendor_ui/ Karigar Sakhi admin console (static HTML+JS)
βββ scripts/ Deploy, bootstrap, runbooks
βββ .github/workflows/ CI/CD
βββ Logo/ Brand assets
The bot is the heart of HastKala. It's a deterministic finite-state machine over ~70 conversation states, with NLU + voice transcription as the input layer:
Voice/text in any language
β
βΌ
ββββββββββββββββ ββββββββββββββββββββ
β Transcribe βββββΆβ Universal cmds β RESET, MENU, BACK,
β (gpt-4o) β β β HELP, LANGUAGE,
ββββββββββββββββ ββββββββββ¬ββββββββββ HUMAN, EXIT
β
βΌ
ββββββββββββββββββ
β NLU classifier β Maps free text β
β (gpt-4o-mini) β menu choice / nav
ββββββββββ¬ββββββββ
β
βΌ
ββββββββββββββββββ
β State dispatch β ~70 states across
β β identity, seller,
ββββββββββ¬ββββββββ buyer, sakhi flows
β
βΌ
ββββββββββββββββββ
β Translate + β ta/ml: gpt-4o-audio
β TTS β en/hi/kn: gpt-4o-mini-tts
ββββββββββββββββββ (Sarvam Bulbul if key set)
Voice-confirmation gates protect critical inputs (price, address, phone) β the bot reads back what it heard before committing.
| Language | Bot text | Voice in | Voice out (TTS) |
|---|---|---|---|
| English | Native pack | β | Native |
| Hindi | Native pack | β | Indic-tuned |
| Kannada | Native pack | β | Indic-tuned |
| Tamil | Runtime trans | β | Unified audio |
| Malayalam | Runtime trans | β | Unified audio |
Set SARVAM_API_KEY in apps/wa-bot/.env to switch the Indic stack to Sarvam Bulbul + Saaras for native-grade transcription and prosody.
| Module | Where | Status |
|---|---|---|
| WhatsApp bot | apps/wa-bot |
β Live |
| Voice transcription + TTS | services/transcribeService.ts, ttsService.ts |
β Live |
| 5-language UI | conversations/messages/{en,hi,kn}.ts + runtime |
β Live |
| Product catalog API | apps/api/src/routes/product.routes.ts |
β Live |
| Order management | apps/api/src/routes/order.routes.ts |
β Live |
| Buyer marketplace | src/routes/ |
β Live |
Karigar Sakhi admin (/admin) |
src/routes/admin.tsx |
β Live |
| Community + certification | apps/api/src/routes/community.routes.ts |
β Live |
| 7-day learning modules | apps/api/src/routes/community.routes.ts |
β Live |
| Seller product CRUD (web) | src/routes/seller.tsx |
β Live |
| Direct order β seller WhatsApp | apps/api/src/controllers/order.controller.ts |
β Live |
| Artisan talent-request alerts | apps/api/src/routes/network.routes.ts |
β Live |
| Cloudinary image hosting | apps/api/src/services/storage.service.ts |
β Live |
| BUY deeplink β purchase flow | apps/wa-bot/src/conversations/engine.ts |
β Live |
| Autoplay bot demo on homepage | src/components/common/BotDemo.tsx |
β Live |
| WhatsApp CTA on homepage | src/routes/index.tsx |
β Live |
| RESET clears pending state | apps/wa-bot/src/conversations/engine.ts |
β Live |
| Buyer requests + quotes | apps/api/src/routes/{request,quote}.routes.ts |
β Live |
| Auto-deploy CI/CD | .github/workflows/deploy.yml |
β Live |
- 5 Indian languages
- ~70 conversation states in the bot engine
- 14 Prisma models
- 17 frontend routes
- ~25 API route files
- 1 app the artisan needs to know β WhatsApp
Project Sankalp / Code4Change Hackathon
Problem statement: W-1 β Artisan Women's Market Exclusion Across 15+ Craft Districts
Theme: Women's Entrepreneurship & Economic Empowerment
MIT β see LICENSE.
The artisan stories, names, and example imagery are illustrative; production deployments must collect explicit consent before showcasing real artisans publicly.
HastKala β from a voice note to a livelihood