尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證WhatsApp-first automation platform for service businesses. Bookings, payments, orders — all through WhatsApp. Multi-country support (NG, US, UK, CA, GH) with Paystack + Stripe.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
WhatsApp-first business automation platform. Businesses connect their WhatsApp number and get AI-powered booking, payments, ticketing, ordering, and customer engagement -- all through conversational flows. Live in 5 countries (US, CA, NG, GH, UK) with multi-currency payment processing across 5 gateways.
See CLAUDE.md for golden rules, pre-change checklists, and deep implementation details.檢視完整 README ↗WhatsApp-first business automation platform. Businesses connect their WhatsApp number and get AI-powered booking, payments, ticketing, ordering, and customer engagement -- all through conversational flows. Live in 5 countries (US, CA, NG, GH, UK) with multi-currency payment processing across 5 gateways.
See CLAUDE.md for golden rules, pre-change checklists, and deep implementation details.
| Layer | Stack |
|---|---|
| Frontend | Next.js 14, React 18, TypeScript, Tailwind CSS |
| Admin Panel | Vite + React 18 (separate app in admin/) |
| Database | Supabase (PostgreSQL + Auth + Storage + Realtime) |
| Meta Cloud API | |
| Payments | Paystack (NG/GH), Stripe (US/GB/CA), Flutterwave, Square, PayPal |
| AI | Anthropic Claude (intent detection + voice transcription) |
| Resend | |
| Monitoring | Sentry + PostHog |
| Rate Limiting | Upstash Redis (in-memory fallback when unconfigured) |
| Deploy | Vercel (4 deployments) |
npm install
cp .env.example .env.local # Fill in required values
npm run dev # http://localhost:3000
# Admin panel (separate app)
cd admin && npm install && npm run dev # http://localhost:8083
app/
api/ # ~150 API routes
dashboard/ # Protected business dashboard pages
(auth)/ # Login, signup, forgot-password
(marketing)/ # Public marketing pages
get-started/ # Onboarding wizard
checkin/ # QR check-in pages (property, events)
lib/
bot/ # WhatsApp bot engine
bot.service.ts # Main orchestrator (~2,500 lines)
flows/ # 17+ conversational flows (executor, step-manifest)
handlers/ # 9 handler modules
channels/ # Channel resolution + message sending
payments/ # Gateway integrations (factory pattern)
capabilities/ # 24+ capability types, tier gating
supabase/ # 3 DB clients (browser, SSR, service)
pdf/ # PDF generation (invoices, receipts, tickets, contracts)
email/ # Email templates + sending
components/
dashboard/ # DashboardProvider, Sidebar, OnboardingChecklist
ui/ # Shared UI primitives
admin/ # Separate Vite admin panel
src/pages/ # 43+ admin pages
src/lib/ # Admin utilities
supabase/
migrations/ # 219 migrations (NNN_description.sql)
functions/ # Edge Functions (cron jobs)
Path alias: @/* maps to project root.
cxcmiqotkowhxinjbytg| Client | Import | Use case |
|---|---|---|
| Browser | createClient() from @/lib/supabase/client | Client components, respects RLS |
| SSR | createClient() from @/lib/supabase/server | Server components, reads cookies |
| Service | createServiceClient() from @/lib/supabase/service | Admin/cron only, bypasses RLS |
Named NNN_description.sql. Run on remote via Management API:
SQL=$(cat supabase/migrations/NNN_file.sql)
curl -s -X POST "https://api.supabase.com/v1/projects/cxcmiqotkowhxinjbytg/database/query" \
-H "Authorization: Bearer $SUPABASE_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg q "$SQL" '{query: $q}')"
See .env.example for the full list. Categories:
| Category | Examples | Notes |
|---|---|---|
| Supabase | NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY | URL and anon key are public; service key is server-only |
META_CLOUD_ACCESS_TOKEN, META_APP_SECRET | Never expose META_APP_SECRET to client | |
| Payments | STRIPE_SECRET_KEY, PAYSTACK_SECRET_KEY | Secret keys are server-only |
| AI | ANTHROPIC_API_KEY | Server-only |
RESEND_API_KEY | Server-only | |
| Analytics | NEXT_PUBLIC_POSTHOG_KEY | Public (browser-bundled) |
| Rate Limiting | UPSTASH_REDIS_REST_URL, UPSTASH_REDIS_REST_TOKEN | Optional; falls back to in-memory |
Rule: Never use NEXT_PUBLIC_ or VITE_ prefix for secret keys. They get bundled into browser JS.
npm run test # 517+ unit tests, Vitest
npm run test:e2e # Playwright smoke tests
npm run certify:local # Full production certification (see below)
Bot-specific testing uses a harness at lib/bot/__tests__/bot-harness.ts with mock sender, mock DB, and conversation fixtures.
Run all verification stages in order — lint, tests, builds, database, Playwright:
npm run certify:local # Full run
npm run certify:local -- --skip-install # Skip npm ci (faster reruns)
npm run certify:local -- --keep-services # Don't stop Supabase after
Requires: Node.js 20+. Optional: Docker (for local Supabase DB tests), Playwright browsers (npx playwright install chromium).
The script refuses to run if NEXT_PUBLIC_SUPABASE_URL points to production.
| Target | Command | URL |
|---|---|---|
| Main app | vercel --prod (from root) | waaiio.com |
| Staging | vercel --prod (staging branch) | staging.waaiio.com |
| Admin | cd admin && vercel --prod | admin.waaiio.com |
| Admin staging | cd admin && vercel --prod (staging) | admin-staging.waaiio.com |
Vercel Pro -- charges per deploy. Always ask before deploying.
Note: Vercel env vars are in the "blowded" project, not "waaiio".
Note: Admin VITE_API_URL must use https://www.waaiio.com (non-www redirects strip POST body).
changelog/unreleased/YYYY-MM-DD-<branch-name>.md (date, files, impact); fragments are collected into CHANGELOG.md before each release (see changelog/README.md)pending, success, failed, refunded (not "completed")pending, confirmed, in_progress, completed, no_show, cancelledbusinesses.payment_gateway overrides country defaultbusiness_id is the partition key; RLS enforces itSUPABASE_SERVICE_ROLE_KEY, META_APP_SECRET, etc.)USING(true) on user-facing tablesowner_id = auth.uid())timingSafeEqual for all token/OTP comparisonsAll payment webhooks follow the same pattern:
timingSafeEqual, reject if secret env var unsetpayment.amountpayment_status is already successpayment_status = 'success'Gateway-specific: Stripe checks amount_total, Paystack checks kobo, Square checks total_money.amount, PayPal checks amount.
Read CLAUDE.md before making changes. Key requirements:
npx next build + npm run test + trace every code pathchangelog/unreleased/ with date, what changed, which files, what could break (CLAUDE.md rule 16)| Task | Steps |
|---|---|
| New dashboard page | Create app/dashboard/{name}/page.tsx, add to Sidebar.tsx with capability gate |
| New bot flow | Create lib/bot/flows/{name}.flow.ts, register in registry.ts |
| New capability | Add to CapabilityId union + CAPABILITIES + CAPABILITY_TIER_REQUIREMENTS in lib/capabilities/types.ts |
| New migration | supabase migration new <name>, rename to NNN_, run via Management API |