尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Appointment-booking SaaS. One Expo codebase → Android app, iOS app and an installable web app (PWA). Backend: Supabase.
Project rules: CLAUDE.md. Docs: docs/. Feature state: context/.
• Node 20+ (tested on Node 24) and npm
• iOS: macOS with Xcode + an iOS simulator
• Android: Android Studio with an emulator (or a device with USB debugging)
• Supabase CLI (brew install supabase/tap/supabase) for migrations and Edge Functions
The app runs without any keys. Missing values only log one dev warning ([env] Missing: …) and backend calls are disabled.檢視完整 README ↗Appointment-booking SaaS. One Expo codebase → Android app, iOS app and an installable web app (PWA). Backend: Supabase.
Project rules: CLAUDE.md. Docs: docs/. Feature state: context/.
brew install supabase/tap/supabase) for migrations and Edge Functionsnpm install
cp .env.example .env # then fill in the values (see below)
The app runs without any keys. Missing values only log one dev warning ([env] Missing: …) and backend calls are disabled.
| Variable | What it is |
|---|---|
EXPO_PUBLIC_SUPABASE_URL | Supabase project URL (Project Settings → API) |
EXPO_PUBLIC_SUPABASE_ANON_KEY | Supabase anon / publishable key |
EXPO_PUBLIC_VAPID_PUBLIC_KEY | Web Push public key (PWA notifications) |
EXPO_PUBLIC_SITE_URL | The one origin (landing, app, business pages). Default: https://wapee.online |
EXPO_PUBLIC_* values are bundled into the app and are public. Never put secrets in .env.
Server secrets (Twilio, Resend, VAPID private key, service role) live only in Edge Function secrets; their names are listed in supabase/functions/.env.example.
Validation lives in src/config/env.ts. After changing .env, restart the dev server.
The app uses native libraries that are not in Expo Go, so native runs use a development build.
# iOS simulator (first run builds the native app; later runs are fast)
npm run ios
# Android emulator or connected device
npm run android
# Web (dev server, opens the browser)
npm run web
# Dev server only (for an already installed development build)
npm start
If port 8081 is busy: npx expo start --port 8090 (or npx expo run:ios --port 8090).
| Script | Does |
|---|---|
npm start | Expo dev server |
npm run web | Dev server + web |
npm run ios | Build + run the iOS development build (expo run:ios) |
npm run android | Build + run the Android development build (expo run:android) |
npm run lint | ESLint, zero warnings allowed |
npm run typecheck | tsc --noEmit (TypeScript strict) |
npm run format | Prettier write (format:check to only check) |
npm run build:web | Static web export to dist/ (PWA) |
npm run manifest | Regenerate public/manifest.json from src/config/brand.ts (runs automatically before start/web/build:web) |
supabase/ was created with supabase init and is not linked to a project yet.
supabase link --project-ref <ref>
supabase db push # apply migrations in supabase/migrations
supabase gen types typescript --project-id <ref> > src/lib/supabase/database.types.ts
See CLAUDE.md §3. Short version: app/ = routes only, src/features/<feature>/ = feature logic, src/lib/ = shared infrastructure (theme, query, supabase, i18n, time, money), src/components/ = shared UI.