尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Thelawalaa serves Banepa's most flavourful chatpate and momo — hygienic, freshly made, and delivered hot to your door within 5km of Godam Chowk for just Nrs 20. Classic, Gilo, Mint & Spicy Ramen chatpate, plus Veg, Chicken & Buff momo.
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
Production-grade multi-role food ordering app for Nepal 🇳🇵 — launching in Banepa–Godam Chowk, built to scale into a franchise brand — Next.js 14 (App Router) + Supabase + Vercel. Cash / QR (eSewa, FonePay) payments are confirmed manually by an admin, who always sees exactly how much to collect; eSewa online checkout is also available, gated behind a super-admin toggle.
Roles: customer (order, track, account) · admin (full console) · super_admin (admin + manage other admins + feature flags) · pos_user (counter terminal) · delivery_driver (mobile portal)檢視完整 README ↗Production-grade multi-role food ordering app for Nepal 🇳🇵 — launching in Banepa–Godam Chowk, built to scale into a franchise brand — Next.js 14 (App Router) + Supabase + Vercel. Cash / QR (eSewa, FonePay) payments are confirmed manually by an admin, who always sees exactly how much to collect; eSewa online checkout is also available, gated behind a super-admin toggle.
Roles: customer (order, track, account) · admin (full console) · super_admin (admin + manage other admins + feature flags) · pos_user (counter terminal) · delivery_driver (mobile portal)
ap-south-1 Mumbai recommended — closest to Nepal).npm i -g supabase
supabase login
supabase link --project-ref <your-project-ref>
supabase db push # applies supabase/migrations/001_initial_schema.sql
Or paste supabase/migrations/001_initial_schema.sql into the SQL Editor and run it, then run supabase/seed.sql.orders and deliveries.https://thelawalaa.comhttps://thelawalaa.com/auth/verify, https://thelawalaa.com/auth/invite, https://thelawalaa.com/auth/forgot-passwordSelf-signup can only ever create customer accounts (by design). To make the first admin:
UPDATE profiles SET role = 'admin' WHERE id = '<your-user-uuid>';
{ "role": "admin" }
Admin promotion is deliberately impossible from the app UI.
Copy .env.example → .env.local and fill in:
| Variable | Where to get it | Exposure |
|---|---|---|
NEXT_PUBLIC_SUPABASE_URL | Supabase → Settings → API | public |
NEXT_PUBLIC_SUPABASE_ANON_KEY | same | public (RLS-guarded) |
SUPABASE_SERVICE_ROLE_KEY | same — never add NEXT_PUBLIC_ | server only |
RESEND_API_KEY | resend.com | server only |
OTP_HMAC_SECRET | openssl rand -hex 32 | server only |
NEXT_PUBLIC_GOOGLE_MAPS_KEY | Google Cloud (Maps Embed) | public, referrer-restricted |
NEXT_PUBLIC_SITE_URL | https://thelawalaa.com | public |
npm install
npm run dev
bom1 in vercel.json).thelawalaa.com domain at Vercel.payment_status: pending — they pay when the food arrives or is picked up.When you're ready for a payment gateway later (eSewa ePay, Khalti, FonePay PSP), the hook point is payment_status in createOrder + a new webhook route — the rest of the app already treats payment_status as server-authoritative.
app_metadata + the profiles table, never in client-settable user metadata. The signup trigger defaults everyone to customer; a DB trigger (profiles_privilege_guard) blocks clients from touching role, is_active, or branch_id on their own row even if a policy is later loosened.audit_logs and promo_codes have zero client read access (no promo enumeration). Admin/POS privileged reads & writes go through server actions using the service-role client (lib/supabase/admin.ts, guarded by import "server-only").requireRole(...), which calls auth.getUser() (JWT verified against the Auth server — getSession() is never trusted) and reads the role from the DB.createOrder re-prices every line server-side, validates address ownership, applies promos atomically (conditional increment — no over-redemption), and generates order numbers from a Postgres sequence.payment_status = 'pending'; only an admin can flip it to paid via markOrderPaid, which records who confirmed it and when (paid_confirmed_by / paid_confirmed_at) and writes an audit-log entry. The admin UI shows a "Collect Rs X" button with the exact amount so nothing is taken on memory. POS counter orders are marked paid immediately (the operator collects at the till). No client path can ever set payment fields.timingSafeEqual, max 3 attempts. Customer phone numbers never appear in driver HTML — the call button fetches a tel: link on demand, and every fetch is audit-logged.next.config.mjs. Login redirect param is sanitized against open redirects. Contact form has a honeypot + per-IP throttle.app/(public)/ landing site (anchor sections)
app/auth/ login, signup, invite, reset, verify
app/account/ customer profile, orders, addresses
app/order/ 3-step order wizard (cash / QR — pay on arrival)
app/track/[orderId]/ realtime order tracking
app/admin/ dashboard, orders, menu, staff, delivery, reports, announcements, settings
app/pos/ tablet POS terminal
app/delivery/ mobile driver portal (OTP delivery confirmation)
app/actions/ ALL mutations (server actions, Zod-validated, audited)
supabase/ migration + seed
Add your logo at public/logo.png (optional — the UI falls back to the gradient wordmark).
The site ships with professional, technically-complete on-page SEO. What's built in:
public/og.png share image) so links unfurl nicely on WhatsApp, Messenger, Facebook, X and iMessage.Organization, WebSite (with sitelinks search box), FoodEstablishment, each branch as a Restaurant with address + geo + hours, the full Menu, and an FAQPage. This is what earns Google's rich results — the business panel, menu, and the expandable FAQ in search.sitemap.xml and robots.txt generated automatically (app/sitemap.ts, app/robots.ts); private areas (admin, POS, delivery, account, tracking) are kept out of the index.theme-color, and display:swap fonts for fast, app-like mobile behaviour.Edit all business facts (branches, phone, socials, keywords) in one place: lib/seo.ts.
Code gets you a technically perfect site; rankings are earned with real-world signals no code can fake. Honestly, no one can guarantee a permanent #1 spot — anyone who promises that is misleading you. To compete for the top legitimately:
NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION / NEXT_PUBLIC_BING_SITE_VERIFICATION.Brand terms ("Thelawalaa", "Thelawala") should rank quickly since the site is the authoritative source. Local terms ("chatpate Banepa", "momo Godam Chowk", "buff momo near me") are very winnable with the Google Business Profile + reviews. As you open new franchise locations, add each as a branch in the admin console and create a Google Business Profile for it — the structured data already supports multiple branches.