Ecommerce Template
Modern ecommerce template built with Next.js 16, React 19, Drizzle, Better Auth, Supabase, and Stripe.
For home kitchens that sell on Instagram and WhatsApp: one store link, drops with a cut-off, everyday menu orders, counter billing, UPI you confirm, one orders board and receipts on WhatsApp.
CommerceTypeScript · JavaScriptGitHub @gengirishOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
AI Voice-Powered Billing & UPI Payment Platform for Indian Vendors — Bol. Bill. Becho.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Orders, UPI billing and receipts for India's home kitchens that sell on Instagram and WhatsApp. Post a batch with a cut-off or an everyday menu → buyers order from your link in bio or on WhatsApp → paid by UPI → cook list and delivery list on the day → receipt on WhatsApp. Voice POS for counter sales. 30 days free.
Status: Production-deployed, with design-partner vendors in Hyderabad. Live counts are on the admin-only
/admin/metricspage.
Voice command in Hindi → cart fills in real time → UPI QR → WhatsApp receipt. Sixty seconds, end-to-end, on a real phone, in a real chai stall.
The recorded video is not published yet. The original April 2026 script is archived (and partly stale) at
docs/archive/DEMO_VIDEO.md.Live walkthroughs (Zoom / investor rooms):
docs/DEMO_GUIDE.md.
| Surface | URL |
|---|---|
| Production app | https://awaazos.vercel.app |
| Pricing | https://awaazos.vercel.app/pricing |
| Sign up | https://awaazos.vercel.app/sign-up |
| GitHub | https://github.com/gengirish/awaazos |
| 60s video demo | not published yet |
| Live demo script | docs/DEMO_GUIDE.md (Zoom / investors) |
60-second test: sign up → onboard a stall → add 3 menu items → open
/poson your phone → tap the orange mic → say "do samosa aur ek chai" → see the cart fill → scan the UPI QR → billAWZ-YYYYMMDD-0001is generated atomically → check/analytics.
Instagram-based cloud kitchens: home bakers, meal-box kitchens, snack and sweet makers who find buyers on Instagram and sell direct, not through Swiggy or Zomato. Today their orders live in DMs, payments are UPI screenshots, and the cook list is a notebook. Full profile, fit and gaps: docs/ICP.md.
What they use: the storefront /s/[slug] as their link in bio, Drops (a batch with a cut-off
and capped stock), UPI / pay-on-delivery / their own Razorpay, the orders board and prep sheet,
Web Push alerts, and a ready-made Instagram story image for each drop.
The sections below describe the original counter-POS wedge (street stalls and kiranas). That product still ships and still works; it is no longer who we build for first.
India has 63 million MSMEs and ~25 million micro-merchants — chai walas, dosa carts, kirana shops, samosa stalls, paan shops. They:
The gap: existing POS software (Petpooja, Zomato Hub, Square clones) assumes a manager-class user who can type, navigate menus, and trust an English UI. That cuts out 90% of India's actual point-of-sale.
A POS where the only interface is your voice and your eyes.
AWZ-20260423-0001 → DB transaction commits → vendor taps Send on WhatsApp and the receipt opens pre-filled in their own WhatsApp (wa.me link)All of this on a phone, in <8 seconds per transaction. Hindi + English at MVP. More on roadmap once 50 vendors are active.
aria-live for screen readers/api/ai/transcribe, STARTER+) is wired with per-provider circuit breakers: OpenAI → Groq → self-hosted Whisper for en/hi, Sarvam Saaras v3 → Groq → Whisper for Telugu / Kannada / Tamil. te/kn/ta are dormant: the code and golden fixtures are kept, but the language picker offers only English and HindishouldEscalate()) or a Haiku errorparseFloat, no toFixed (single exception: UPI deep-link am= per spec)AWZ-YYYYMMDD-NNNN via BillSequence.upsert inside prisma.$transaction, race-safe across concurrent saleswa.me link (GET /api/receipts/message); no Business API, no template, free on every plan. Customer phone is PII-protected (never logged, only last-4 in CSV exports). An older Gupshup + BullMQ path is still in the code but unused by the UI<details> data table for accessibilityvendorId scoping enforced on every query, two-layer RBAC (platform UserRole + per-tenant StaffRole)billingAccess()), with no timers; a locked store keeps read access to its records. A super admin can extend a store's free access by date (/admin/vendors)/s/[slug] in Settings → Online store; photos are shrunk on the phone before uploadDriven by docs/ICP.md "Plan, in order": validate with 5–10 kitchens running real drops, checkout inside Instagram's in-app browser, measuring Instagram demand, a store-level story image, and delivery hand-off from the prep sheet.
Also planned, not shipped: automated accessibility audits in CI (@axe-core/playwright is not installed today — a11y is hand-checked against the aria-live, contrast, and chart-data-table work listed above).
| Layer | Choice | Why |
|---|---|---|
| Frontend | Next.js 15 App Router + React 19 + TypeScript strict | RSC for server-side data fetch, no waterfall to API |
| UI | Tailwind CSS 4 + shadcn/ui (slate) | Fast iteration, accessible primitives, mobile-first |
| Charts | Recharts ^2.15 | SSR-friendly, accessible (data tables sibling) |
| Auth | Auth.js v5 (NextAuth) + @auth/prisma-adapter + bcryptjs | No vendor lock-in, edge-safe middleware, JWT sessions |
| Database | Neon Serverless PostgreSQL | Branchable, scales to zero, Indian-region availability |
| ORM | Prisma | Type-safe, $transaction for atomicity, upsert for idempotency |
| AI / Voice | Anthropic Claude Haiku 4.5 (primary) + Sonnet 4.5 (fallback), tool-use, prompt caching | Best Indic instruction-following at lowest cost |
| STT | Web Speech API (en/hi, in-browser) + server cascade: OpenAI gpt-4o-mini-transcribe, Groq whisper-large-v3-turbo, Sarvam Saaras v3 (dormant te/kn/ta), self-hosted Whisper on Fly | Web Speech is free and needs no server call from us; the cascade covers the opt-in server path, each hop behind its own circuit breaker |
| Background jobs | BullMQ + Redis (Fly.io workers) | Voice telemetry, retention runs, retries with backoff |
| Serverless KV | @upstash/redis HTTP on Vercel | Rate limits, idempotency keys, AI usage caps; no TCP from serverless |
| Payments | Razorpay subscriptions (platform) · UPI deep link + QR (POS) · vendor's own Razorpay keys (storefront) | India-first; storefront money goes to the vendor, never through the platform |
| Messaging | wa.me links from the vendor's own WhatsApp · Web Push (web-push, VAPID) · AgentMail (password-reset and buyer magic-link email) |
# 1. Clone + install
git clone https://github.com/gengirish/awaazos.git
cd awaazos
npm install
# 2. Copy env template, fill in your secrets
cp .env.local.example .env.local
# Required to boot: DATABASE_URL, AUTH_SECRET (set AUTH_URL too)
# Required for voice parsing: ANTHROPIC_API_KEY
# Optional server STT: OPENAI_API_KEY, GROQ_API_KEY, WHISPER_STT_URL + WHISPER_STT_SECRET
# (SARVAM_API_KEY only matters for the dormant te/kn/ta path)
# Optional: RAZORPAY_* (incl. RAZORPAY_PLAN_STARTER_MONTHLY / _YEARLY), BLOB_READ_WRITE_TOKEN,
# VAPID keys (Web Push), AGENTMAIL_*, SENTRY_*
# Redis: UPSTASH_REDIS_REST_* (HTTP) and REDIS_URL (TCP, BullMQ) — see "Two Redis surfaces" in CLAUDE.md
# Every variable is documented in .env.local.example
# 3. Push Prisma schema to your Neon DB (no migration files, no seed script)
npx prisma db push
# 4. Run dev server
npm run dev
# → http://localhost:3000
# 5. (Optional) Run BullMQ workers locally (voice telemetry, retention)
docker run -d --name awaazos-redis -p 6379:6379 redis:7-alpine
npm run worker # or: npx tsx workers/index.ts
awaazos-db in the aws-us-east-1 region (closest to where Vercel deploys serverless functions; switch if Vercel deploys to Mumbai)DATABASE_URL-pooler from the host) → DIRECT_URLANTHROPIC_API_KEYclaude-haiku-4-5 (primary) and claude-sonnet-4-5 (fallback) — override with ANTHROPIC_PRIMARY_MODEL / ANTHROPIC_FALLBACK_MODEL if needednpm run typecheck # tsc --noEmit
npm run lint # eslint . (ESLint 9 flat config)
npm test # vitest run
npm run build # next build
npm run e2e # playwright (uses dev server) — chromium + mobile
Vitest unit + Playwright E2E (chromium + Pixel 7 mobile, en-IN locale, IST timezone). See ARCHITECTURE.md for the full testing stack and what each suite guards.
The E2E suite writes real rows (it registers vendors and rings up sales). Never run it against the production database or deployment; use a throwaway Postgres as shown in
CLAUDE.md.
The app is deployed across these services:
| Service | Host | What runs there |
|---|---|---|
| Web | Vercel (awaazos.vercel.app) | Next.js App Router, all /api/* routes, marketing + vendor pages |
| Workers | Fly.io awaazos-workers (BOM region) | BullMQ workers for voice-parse-log, send-receipt (dormant Gupshup path) and retention. The Fly app does not currently exist; see TODO.md 1.1 |
| Whisper STT | Fly.io (services/whisper-stt) | Optional self-hosted last-resort ASR |
| Redis (HTTP) | Upstash REST (UPSTASH_REDIS_* on Vercel) | Rate limiting, idempotency, circuit breakers, monthly AI caps, /api/ready Redis probe |
| Redis (TCP) | REDIS_URL, a public rediss:// endpoint | BullMQ: Vercel routes enqueue, Fly workers consume |
| Database | Neon Serverless Postgres (us-east-1) | All app data, prisma.$transaction boundaries |
The two Redis surfaces are not interchangeable; the canonical explanation is in CLAUDE.md.
Vercel deploys through its GitHub integration. vercel.json skips every non-production build, so preview deployments are off and a push to main is a production deploy.
# 1. Vercel (frontend + API): connect the GitHub repo in the Vercel dashboard, then set env
vercel link
vercel env add DATABASE_URL production # paste Neon pooled URL
vercel env add AUTH_SECRET production # openssl rand -base64 32
vercel env add AUTH_TRUST_HOST production # value: true
vercel env add AUTH_URL production # the public production origin
vercel env add ANTHROPIC_API_KEY production
# Upstash REST (Vercel serverless — rate limits, idempotency, /api/ready)
vercel env add UPSTASH_REDIS_REST_URL production # https://....upstash.io
vercel env add UPSTASH_REDIS_REST_TOKEN production
# REDIS_URL: public TCP endpoint. Without it, BullMQ enqueues fail (voice telemetry is dropped).
vercel env add REDIS_URL production
# ... (add OPENAI_* / GROQ_* / WHISPER_*, RAZORPAY_*, VAPID keys, AGENTMAIL_*, BLOB_READ_WRITE_TOKEN, SENTRY_* as needed)
git push origin main # builds and deploys production
# 2. Fly.io workers
flyctl launch --name awaazos-workers --region bom --no-deploy
# Provision Redis with a TCP URL workers can hold open (Fly Redis, or Upstash rediss://)
flyctl redis create --name awaazos-redis --org personal --region bom \
--no-replicas --enable-eviction --enable-prodpack=false
# copy the printed URL — private Fly *.internal URLs do NOT work from Vercel
# A worker holds a TCP connection 24/7; on a pay-per-command Redis plan that bills even at zero traffic.
# DATABASE_URL + AUTH_SECRET are boot-required by lib/env.ts. GUPSHUP_* only feed the dormant
# receipt worker; the workers never call Anthropic.
flyctl secrets set --app awaazos-workers \
REDIS_URL="rediss://..." \
DATABASE_URL="postgresql://..." \
AUTH_SECRET="..." \
GUPSHUP_API_KEY="..." \
GUPSHUP_APP_NAME="..." \
GUPSHUP_SOURCE_NUMBER="..."
flyctl deploy --app awaazos-workers --remote-only --ha=false
The optional Whisper ASR service has its own Fly app and instructions in services/whisper-stt/README.md.
For every meaningful change:
npm test && npm run typecheck && npm run lint && npm run build — must all passCLAUDE.md), never against productiongit commit -m "feat(scope): ..." — conventional commitsgit push origin main — the GitHub integration builds and deploys production; CI runs lint, typecheck, unit, build, the bundle-size budget, gitleaks and npm audit (the Playwright job is switched off on CI, so step 2 is the only E2E run)See ARCHITECTURE.md for system diagrams, docs/OBSERVABILITY.md for production monitoring/alerting setup, docs/README.md for the index of ops docs and production controls, docs/DEMO_GUIDE.md for live demo walkthroughs, and PITCH.md for the YC pitch.
.env.local is gitignored. Real secrets live only in Vercel env + Fly secrets.crypto.timingSafeEqual.Strict-Transport-Security (2 years, includeSubDomains, preload) is set in next.config.mjs alongside the CSP; AUTH_TRUST_HOST=true lets Vercel's proxy work for Auth.js.where clause includes vendorId. Helper requireVendorRole(role) returns the resolved vendor and throws on cross-tenant access. CI guard recommended (not yet wired).PlanGateError(402) returns { code, requiredPlan, currentPlan, feature } so the UI can render contextual upgrade CTAs.awaazos/
├── app/
│ ├── (marketing)/ landing, pricing (public)
│ ├── (auth)/ sign-in, sign-up, forgot / reset password, claim a demo store
│ ├── (onboarding)/ first-run vendor setup
│ ├── (vendor)/ pos, menu, transactions, analytics, orders, drops, help,
│ │ settings (hub + sections incl. offers, receipts)
│ ├── (print)/receipts/ staff receipt print page (58/80 mm thermal or A4)
│ ├── admin/metrics/ platform KPIs (admin only; lib/admin-metrics.ts)
│ ├── admin/vendors/ give a store free access until a date (super admin; lib/admin-free-access.ts)
│ ├── home/ landing redirect: onboarding, /orders or /pos (lib/home.ts)
│ ├── s/[slug]/ public storefront: menu, drops, checkout, buyer order + account pages
│ ├── r/[token]/ public customer receipt page
│ ├── legal/ terms, privacy, refund, DPDP rights
│ └── api/ ai/ (transcribe, parse-order, parse-drop, parse-menu), transactions,
│ menu, offers, receipts, drops, storefront-orders, s/ (buyer), push,
│ razorpay, vendor, me, admin, internal/ (demo stores), demo-claim,
│ webhooks/ (razorpay, razorpay-orders), health, ready
├── components/ ui/ (shadcn) plus pos, menu, transactions, analytics, storefront,
│ drops (incl. the orders board), settings, setup, push, pwa, help,
│ receipts, billing, marketing, legal, admin, shell
├── hooks/ useVoiceOrder (mic → Web Speech or recorder → transcribe → parse-order),
│ POS outbox, voice dictation, install-prompt and push-alert stores
├── lib/ domain + integration modules (currency, upi, rbac, anthropic, STT
│ clients, drops, offers, receipt, push, kv, queues, datetime, phone, …) and __tests__/
├── workers/ BullMQ workers (voice-parse-log, receipt, retention) for Fly
├── prisma/schema.prisma data model (applied with `prisma db push`; no migrations)
├── public/ service worker (sw.js: push + offline /pos), offline.html, PWA icons
├── services/whisper-stt/ optional self-hosted Whisper ASR (Python, own Fly app)
├── scripts/ STT smoke tests, bundle budget, agent-rule sync, Razorpay plan setup,
│ offer seed data, PWA icon generator
├── tests/golden/ LLM / ASR regression fixtures (parse-order, parse-drop, parse-menu, stt)
├── e2e/ Playwright specs + helpers
├── src/types/ next-auth type augmentation
├── docs/ observability, demo guide, runbooks/, archive/ (frozen April 2026 material)
├── .cursor/ rules/*.mdc (enforced conventions) and skills/
├── .github/workflows/ci.yml lint, typecheck, unit, build, bundle budget, gitleaks, npm audit
│ (E2E job defined but switched off)
├── middleware.ts Auth.js edge middleware (imports lib/auth.config.ts only)
├── next.config.mjs CSP + security headers, Sentry
├── vercel.json production-only builds (no previews)
├── Dockerfile.worker, fly.toml worker image + Fly app config (BOM)
├── CLAUDE.md guide for contributors and coding agents
├── AGENTS.md pointer to CLAUDE.md
├── ARCHITECTURE.md system diagrams + data model
├── TODO.md open items
└── PITCH.md pitch + deck
30 days free, then Starter at ₹299/month or ₹2,990/year (+ 18% GST). Unlimited bills.
One plan is sold. Stores that signed up before the trial stay on the old FREE tier (50 bills a
month) and are never locked. Plan enforcement is server-side: requirePlan(vendor, Plan.STARTER)
returns a structured 402, and requireActiveBilling returns 402 billing_locked once a trial
ends unpaid. Details in docs/RAZORPAY_SUBSCRIPTIONS_PLAN.md.
This is a solo-built project today. If you're an Indian-language voice researcher, a kirana/dukaan owner who wants to be a design partner, or an engineer who wants to ship for Bharat — open an issue or DM.
For internal contributors and coding agents, the canonical guide is CLAUDE.md. Read it before opening a PR.
Girish Hiremath — 14+ years of enterprise software engineering across compliance, pharma, banking, fintech, telecom, and IoT for Fortune 500 companies. Currently Principal Software Engineer at a Compliance & RegTech company in Hyderabad, while pursuing an M.Tech in Data Science & AI at IIIT Dharwad (Institute of National Importance) — coursework includes Speech & NLP, Generative AI, Computer Vision, Financial Analytics, and AI in Healthcare.
Indic AI is a 14-year through-line, not a 2026 hobby. First production AI project in 2012: a Hindi Reader Android app using OpenCV + Artificial Neural Networks at a leading semiconductor company, presented at their developer conference. AwaazOS is the natural culmination of that arc — banking-grade reliability, pharma-grade data integrity, fintech-grade payment rails, applied to a problem only an Indian engineer who's lived through paper bills at a chai stall can really see clearly.
| 🌐 Portfolio | https://girishbhiremath.vercel.app |
| [email protected] | |
| linkedin.com/in/girishbhiremath | |
| 🐙 GitHub | github.com/gengirish |
AwaazOS is a flagship product of IntelliForge AI — a Hyderabad-based AI engineering studio.
| 🌐 Site | https://www.intelliforge.tech |
| 📧 Contact | [email protected] |
| 📍 Location | Hyderabad, Telangana, India |
Proprietary. © 2026 AwaazOS · IntelliForge AI. Code published for transparency, not for redistribution. Reach out at [email protected] for licensing, partnership, or design-partner inquiries.
Built for the chai-wala in Hyderabad, the dosa cart in Bengaluru, the kirana shop in Indore, and the paan stall in Kolkata. Bol. Bill. Becho.
/s/[slug] page where buyers order from the everyday menu or from a pre-order "drop" (cut-off, capped stock, prep sheet). Payment by UPI + the buyer's "I've paid" claim (the seller confirms), pay on delivery, or the vendor's own Razorpay keys. Optional Instagram and WhatsApp links in the store header/orders holds menu orders and every drop's orders, with a source picker, search, pickup/delivery filter, bulk confirm / mark paid / deliver, and Undo after handoverlib/offers.ts, Settings → Offers)/api/ai/parse-drop, /api/ai/parse-menu)/r/[token]; GSTIN printed when setclientRef)GET /api/drops/[id]/story-image)lib/push.ts, public/sw.js); an open app also says "New order received from " aloud/orders, /drops and /pos; in-app guide at /help+91 10-digit phone validation, Intl.NumberFormat('en-IN', { currency: 'INR' }), libphonenumber-jsprisma.$transaction for sign-upEmptyState / Notice / ResponsiveDialog primitives| No WhatsApp Business API or templates needed |
| Hosting | Vercel (Next.js) + Fly.io BOM region (workers) | Edge for users, BOM for low-latency to Indian compute |
| Storage | Vercel Blob | Menu item photos, store banner and logo |
| Testing | Vitest (unit) + Playwright (E2E — chromium + Pixel 7 mobile, en-IN locale, Asia/Kolkata timezone) | Fast unit feedback, real-browser E2E on the exact locale and timezone vendors run in |