尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
An Uber-style ride app for New Providence: riders book and track trips, drivers accept and run them, and admins
approve drivers, handle safety reports and pay drivers out. Vue 3 + Vite + Tailwind on the front end, Supabase
(Postgres, auth, storage, realtime) for data, Stripe for payments, Vercel serverless functions in api/.
Without Supabase keys the app runs in demo mode (sample data, no backend) so you can click through every screen.檢視完整 README ↗An Uber-style ride app for New Providence: riders book and track trips, drivers accept and run them, and admins
approve drivers, handle safety reports and pay drivers out. Vue 3 + Vite + Tailwind on the front end, Supabase
(Postgres, auth, storage, realtime) for data, Vercel serverless functions in api/. Every trip is paid in cash to
the driver at drop-off; RideUp's share comes off drivers' balances (Admin › Payouts).
Without Supabase keys the app runs in demo mode (sample data, no backend) so you can click through every screen.
Riders
/book?from=airport&to=cable-beach, places in src/lib/places.js)./track/<token>, no login needed), optional pickup PIN, report a problem,
emergency call (919).Drivers
Admins (/admin, needs the admin role)
npm install
supabase-schema.sql, then everything in
supabase/migrations/ (001 … 021). Each migration can be re-run safely.update auth.users set raw_app_meta_data = coalesce(raw_app_meta_data, '{}'::jsonb) || '{"role":"admin"}'::jsonb
where email = '[email protected]';
Log out and back in for it to take effect. After that, add the rest of the team from Admin → Team.https://YOUR_DOMAIN/reset-password, https://YOUR_DOMAIN/set-password, https://YOUR_DOMAIN/driver/apply,
https://YOUR_DOMAIN/book (or simply https://YOUR_DOMAIN/**).Create an API key in Google Cloud with Maps JavaScript API, Places API, Geocoding API and Directions API enabled. Restrict it to your domain (it ships in the browser) and set a budget alert.
cp .env.example .env
.env.example explains every value. For Vercel, add the same variables under Settings → Environment Variables:
| Variable | Needed for |
|---|---|
VITE_SUPABASE_URL, VITE_SUPABASE_ANON_KEY | the app (leave empty for demo mode) |
VITE_GOOGLE_MAPS_API_KEY | maps, address search, routes |
SUPABASE_SERVICE_ROLE_KEY | every protected /api/* route (they refuse to run without it) |
CRON_SECRET | the every-minute job below |
CANCEL_GRACE_SECONDS, FREE_WAIT_SECONDS | when a cancellation counts as late, and free waiting at pickup before a no-show (defaults 2 min, 5 min); set VITE_CANCEL_GRACE_SECONDS / VITE_FREE_WAIT_SECONDS to match |
RESEND_API_KEY, EMAIL_FROM | optional: receipts, refund and unpaid-fare emails, driver approval emails |
VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY, VAPID_SUBJECT, VITE_VAPID_PUBLIC_KEY | optional: push notifications (npx web-push generate-vapid-keys) |
APNS_KEY, APNS_KEY_ID, APNS_TEAM_ID, APNS_BUNDLE_ID, APNS_PRODUCTION | optional: push in the App Store app (see MOBILE_APP.md) |
FCM_SERVICE_ACCOUNT | optional: push in the Google Play app (Firebase service-account JSON; see MOBILE_APP.md) |
APP_URL | optional: link base for emails (default https://rideupnassau.com) |
VITE_SENTRY_DSN, SENTRY_DSN | optional: error reports to Sentry (see Monitoring) |
VITE_META_PIXEL_ID | optional: Meta Pixel for Instagram / Facebook ads (page views, prices seen, sign-ups, booked rides) |
VITE_GOOGLE_TAG_ID, VITE_GOOGLE_ADS_BOOKING_SEND_TO | optional: Google tag (Ads AW-…, GA4 G-…, comma-separated) and the Ads conversion for a booked ride (AW-…/label) |
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN, TWILIO_FROM | optional: texts to passengers when a rider books for someone else |
Optional features stay switched off until their keys are set; nothing breaks without them.
/api/dispatch-scheduled must be called every minute with Authorization: Bearer $CRON_SECRET (Vercel Cron on the
Pro plan sends it automatically; Supabase pg_cron + pg_net or any external pinger also works). Each run:
/api/health and the admin pages check.Before launch, work through LAUNCH_CHECKLIST.md.
Without it, scheduled rides never dispatch and stale requests and online statuses linger. The admin pages show a red warning when it hasn't run for 5 minutes.
https://rideupnassau.com/api/health. It returns 200 when the database answers and the every-minute job ran in the
last 5 minutes, and 503 with the reason otherwise. Set it to check every minute and alert you by SMS/email.VITE_SENTRY_DSN (app crashes on riders' and
drivers' phones) and SENTRY_DSN (server errors) in Vercel, using the same DSN for both. Reports carry the user id and page,
never names or phone numbers.Riders pay the driver in cash at drop-off; there are no card payments, holds, card tips, split fares or cancellation
fees. Guests book with a name and mobile number. Two late cancellations or missed pickups in 30 days, or a driver's
unpaid-fare report, pause booking for the rider and their other accounts on the same phone (riders.cash_blocked,
migrations 019 and 021); an admin turns it back on in Users. Refunds are given as RideUp credit. Drivers keep the
cash, so RideUp's 30% (less RideUp-funded discounts) comes off their balance; record cash they hand over in Payouts.
Every pull request runs CI (.github/workflows/ci.yml): unit tests and the build, the browser tests in demo
mode, and a Postgres job that applies the schema and every migration to a fresh database, re-runs the newest
migration, and checks the money and safety rules in supabase/tests/money_rules.sql (fares, busy pricing, stops,
promos and abuse checks, referrals, incentives, refunds, check-ins, who can see what, account deletion, cash
payments and the booking pause).
npm run dev # http://localhost:5173 (demo mode without .env)
npm test # unit tests: pricing, cancellation rules, auth helpers, API helpers
npx playwright test # end-to-end tests in e2e/ (runs against the dev server)
npm run build # production build into dist/
Fares are computed in two places that must agree: src/lib/pricing.js (shown to riders) and the
guard_rides_insert trigger (what the rider pays). tests/pricing.test.js pins the expected values.
src/pages/rider, src/pages/driver, src/pages/admin: the three apps; src/components: shared pieces.src/lib: auth (useAuth), driver session (useDriver), pricing, policy, push, settings, helpers.api/: serverless functions. To stay within Vercel's 12-function Hobby limit, every endpoint the app calls runs
in one function, api/[action].js, which hands /api/<action> to api/_routes/<action>.js (trips:
authorize-ride (confirm), capture-payment ("Cash collected"), cancel-ride, cash-unpaid; notifications:
trip-event, notify-driver). The cron (dispatch-scheduled) and csp-report are separate functions.
Files and folders starting with _ are shared code, not functions. Add new endpoints to api/_routes/ and
register them in api/[action].js; tests/router.test.js fails if the app calls an unregistered route or the
function count goes over 12.supabase/migrations/: database rules (row-level security, guard triggers, RPCs). Clients can't change fares,
payments, ratings they don't own, driver approval or protected ride fields.AUDIT.md, AUDIT_V2.md: audits and what was fixed.