尚未检测到更新。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.