Fujimod
브라우저에서 카메라 펌웨어를 시험하고 Fujimod SD 부팅 파일을 만든다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.