ai-startup-skills
创业公司做 AI 产品的 7 步 Agent Skill 合集:验证 → BP → 政策 → 路演 → 获客 → 定价 → 注册。
Translation pending
SakayNa is a web and mobile-based emergency transport and response management system designed to improve coordination, dispatching, and public safety in Toledo City.
OtherGitHub @VanCyrilBalloriOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗SakayNa is an Expo / React Native transport-coordination app for Toledo City. It has separate Resident, Driver, Dispatcher, and Admin workflows, built on Firebase Authentication and Cloud Firestore.
The app talks to Firestore directly. There is no separate backend server to run or deploy.
PRODUCT.mddevelopment profile in eas.json). Expo Go is not enough: Google sign-in and
direct phone calls need the development build.You do not need: the Firebase CLI, Java, the Firebase emulator, or a billing/Blaze plan.
npm install
.env below). For Google sign-in on Android, the
app's SHA-1 fingerprint must also be added to the Android app in the Firebase project settings.firestore.rules and click Publish..envCreate a file named .env in the project root with these 10 values:
EXPO_PUBLIC_FIREBASE_API_KEY=...
EXPO_PUBLIC_FIREBASE_AUTH_DOMAIN=<project-id>.firebaseapp.com
EXPO_PUBLIC_FIREBASE_PROJECT_ID=<project-id>
EXPO_PUBLIC_FIREBASE_STORAGE_BUCKET=... (copy it from the Firebase config; new projects use <project-id>.firebasestorage.app)
EXPO_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=...
EXPO_PUBLIC_FIREBASE_APP_ID=...
EXPO_PUBLIC_FIREBASE_MEASUREMENT_ID=...
EXPO_PUBLIC_GOOGLE_WEB_CLIENT_ID=...
EXPO_PUBLIC_CLOUDINARY_CLOUD_NAME=...
EXPO_PUBLIC_CLOUDINARY_UPLOAD_PRESET=...
The Cloudinary values are needed for resident registration and driver applications (photo uploads).
Restart the dev server after creating or editing .env. The same values must also be saved in
expo.dev (for EAS builds) and in Vercel (for the website), because .env is never uploaded.
In the Firebase console, for each test user: Authentication → Add user (email + password),
copy its UID, then create a Firestore document at users/{that-UID}:
| Document | Fields |
|---|---|
users/{admin} | role: "Admin", accountStatus: "Active", fullName, email, barangay, createdAt |
users/{dispatcher} | role: "Dispatcher", accountStatus: "Active", fullName, email, createdAt, and optional phoneNumber (the number a resident's phone calls after an emergency alert; without it: operationalPhone, then the office number) |
users/{resident} | role: "Resident", accountStatus: "Active", fullName, email, barangay, phone, phoneNumber, createdAt |
users/{driver} | role: "Driver", accountStatus: "Approved", fullName, email, barangay, createdAt |
After the first Admin exists, more Dispatchers can be made in the app instead: Admin → Operations → Add Dispatcher (name, email, phone, barangay, temporary password). The Admin stays logged in. The new Dispatcher logs in with the temporary password, then sets their own with Forgot password? on the login screen.
Each Admin reviews only the residents and drivers of their own barangay, so every Admin needs a
barangay (spelled exactly like the list in lib/barangays.js). New residents and drivers don't need
seeding: they sign up in the app and wait as Pending until that barangay's Admin approves them.
Then one vehicle at vehicles/{auto-id}:
name: "City Ambulance 1", type: "Ambulance", plateNumber: "ABC 1234",
ownerType: "City/Barangay Vehicle", status: "Available", createdAt
(The users/{uid} document ID must exactly match the Authentication UID.)
createdAt must be added with Firestore's timestamp type (not string or number). The Admin
console orders these collections by createdAt, and Firestore silently excludes documents that are
missing the field — a seeded account without it will not appear in the Admin dashboard at all.
npx expo start
Press w for the browser, or open the SakayNa development build on the phone and scan the QR code
(phone on the same Wi-Fi).
| Role | Profile state | Lands on |
|---|---|---|
| Resident | accountStatus: "Active" | /resident-home |
| Resident | Pending / Rejected | /resident-home, with a banner; cannot send emergency alerts or transport requests |
| Anyone | signed in, no profile yet | /choose-role (Resident or Driver form) |
| Driver | Pending / Rejected | /driver-status |
| Driver | Approved | /driver-home |
| Dispatcher | accountStatus: "Active" | /dispatcher-home |
| Admin | accountStatus: "Active" | /admin-home |
| Collection | Purpose |
|---|---|
users | Profiles, roles, account state. Drivers also have their duty status (dutyStatus: Off duty, Available, On break, On a run) and presence (is the app open) |
transportRequests | Resident transport requests. purpose: Medical / Health, Community / Personal Trip, or Other. timing: asap or scheduled (with scheduledFor, 1 hour to 7 days ahead). Emergencies use callSessions, not this form. A dispatcher can also create one from an emergency alert they answered (requestType: "Emergency Request", emergencyType, emergencyAlertId, createdBy; firestore.rules checks the alert). Emergency form Part A (2026-10-05): 1–50 patients in passengerCount; emergencyTypeOther, approximateAge, conscious, breathing, incidentDetails; facts/text copied to additionalNotes for existing APKs. Medical, Accident / injury, Fire-related and Pregnancy / labor use purpose Medical / Health; Other uses Other. |
driverAssignments | Dispatcher-to-driver assignments. Status Assigned, In Progress, Completed, Cancelled, or Unable (the driver sent "I can't do this ride": an inability report with the reason, shown to the dispatcher and in the admin's Duty Records). Old "Declined" ones are kept (older APKs can still decline) |
dutyRecords | Driver time card lines: punch in / out, break start / end, run start / end, with Firestore's time. Never edited or deleted. The admin's Duty Records (DTR) are worked out from these |
driverLocations | One document per driver (id = their uid): last known location (latitude, longitude, step, at), saved only when the driver taps Punch in, Accept, En route, Arrived or Picked up. Each step replaces it; Punch out erases it. Only dispatchers can read it (for "Show on map") |
callSessions | In-app emergency alerts (the red Emergency button). After the dispatcher submits the Emergency request form: linkedRequestId, linkedRequestReference, emergencyType |
residentVerifications | Resident proof-of-residency photo link, for the barangay Admin's review |
Centralized names, roles, statuses, and priorities live in constants/app.js.
/driver-home.Commit and test first (git status must be clean). The exact step-by-step commands are in
CLAUDE.md.
main branch. Work happens on master,
so copy master onto main (fast-forward) and push main. Everything on master goes live.eas build --profile preview --platform android. Testers uninstall the
old app and install the new APK.firestore.rules, publish it — either paste it into
Firestore → Rules → Publish in the Firebase console, or run
firebase deploy --only firestore:rules --project <project-id> (needs the Firebase CLI). Rules go
live right away, for every app version at once..env.functions/ folder was removed.Known-Issue.md.Driver_Applications | Driver applications + document photo links, for the barangay Admin's review |
vehicles | City and barangay vehicle records (drivers do not register vehicles) |
driverSchedules | Old driver work-hours windows. No longer used by the app since the duty status (Oct 2026); kept |
vehicleChecklists | Old pre-trip vehicle checks. No longer asked before Accept since the driver home restyle (Oct 2026); kept |
activityLogs, vehicleMaintenance, staffInvitations, deletionRequests, systemSettings | Admin bookkeeping |