# Navi PDF To Product Match Matrix

Audit date: 2026-05-05
Reference: `docs/design/Navi_compressed.pdf` and `/Users/start-tech/Downloads/Navi_compressed.pdf`
Repo surfaces checked: `apps/mobile`, `apps/api`, `apps/dashboard`, `apps/website`, `packages/api-client`, `packages/types`, `packages/validators`, `apps/api/prisma/schema.prisma`, and all Markdown files under `docs/`.

Status meanings:

- Yes: present and connected to a real route, API, native action, or guarded access state.
- Partial: exists but is incomplete, simplified, or missing a required backend/dashboard/website connection.
- No: missing.
- Broken: present but not production-safe or does not meet the expected contract.

The API prefix in the current implementation is `/v1`, not `/api`.

| PDF page number | PDF screen name | Mobile screen exists: yes or no | Mobile route exists: yes or no | Main buttons on the screen | Each button action | Is each button connected to a real route or API: yes or no | Required API endpoint | API exists: yes or no | Database model exists: yes or no | Dashboard management page exists: yes or no | Website or marketing page exists: yes or no | Required user role | Permission key | Current problem | Fix required | Priority |
|---:|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Splash | Yes | Yes: `/(auth)/splash` | Auto route | Routes to onboarding, login, or home based on hydrated auth/onboarding state | Yes | `GET /v1/users/me` or local secure session hydrate | Partial: user endpoint exists; splash uses local state | Yes: `User`, `Session` | Partial: no dashboard loading screen | Partial: brand exists, no loading screen | Guest/Auth user | Public/session | Visual is too simple compared with PDF; no initializing label animation | Polish splash visual and add dashboard/website loading brand state | P2 |
| 2 | Onboarding Discover the Emirates | Partial | Yes: `/(auth)/onboarding/1` | Skip, Next | Skip sets guest + routes home; Next routes step 2 | Yes | `GET /v1/onboarding` optional CMS | No | No: `OnboardingPage` missing | No CMS page | Partial: tourist page/home copy exists | Guest | Public | Text exists but image-led design and CMS management are missing | Add image hero, CMS seed/model/API, dashboard content editing | P1 |
| 3 | Onboarding Personal Planner | Partial | Yes: `/(auth)/onboarding/2` | Back, Skip, Next | Back routes step 1; Skip guest home; Next routes step 3 | Yes | `GET /v1/onboarding`, feature flag for trip planner | Partial: `FeatureFlag` model exists; no onboarding API | Partial: `FeatureFlag`; no onboarding page model | No CMS page | Partial: no dedicated planner benefit section | Guest | Public | Planner visual/map missing; content not manageable | Add planner visual, onboarding CMS, website planner section | P1 |
| 4 | Onboarding Services | Partial | Yes: `/(auth)/onboarding/3` | Get Started, Back to intro | Get Started marks onboarded and routes login; Back routes step 2 | Yes | `GET /v1/onboarding` optional CMS | No | No: `OnboardingPage` missing | No CMS page | Partial: services section exists on homepage | Guest | Public | Service visual and partner value prop missing | Add visual, CMS seed, partner/website service section | P1 |
| 5 | Login | Partial | Yes: `/(auth)/login` | Sign In, Continue as guest, Create Account, Forgot Password, Google, Apple, terms/privacy | Sign In calls API; guest routes home; create routes signup; forgot routes reset; Google/Apple missing | Partial: Google/Apple and terms links missing | `POST /v1/auth/login`, `POST /v1/auth/social/google`, `POST /v1/auth/social/apple`, `POST /v1/auth/refresh`, logout, me | Partial: login/refresh exist; social/logout/auth-me aliases missing | Yes: `User`, `UserCredential`, `Session` | Yes: dashboard login exists | No customer login page | Guest | Public | Social buttons are not implemented in mobile; website customer auth missing | Add social provider routes/buttons, logout endpoint, customer login/register pages | P1 |
| 6 | Create Account | Partial | Yes: `/(auth)/signup` | Create Account, Continue as guest, Login, Terms checkbox, Google, Apple | Create calls signup API and routes OTP; guest routes home; login routes login; social missing | Partial | `POST /v1/auth/signup`, `POST /v1/auth/otp/verify`, `POST /v1/auth/otp/request` | Partial: signup/OTP exists; verify-phone/social missing | Yes: `User`, `UserCredential`, `OtpCode`, `Session` | Partial: provider invite/onboarding missing | No customer registration page | Guest | Public | Confirm password, phone split, social signup, website registration missing | Add missing fields, social auth, website registration, provider invite flow | P1 |
| 7 | Home | Partial | Yes: `/(tabs)/home` | Translate, profile icon, search, service tiles, offer banner, See all, featured card taps, Emirates chips, bottom tabs | Translate routes translator; profile routes profile; search/see all/Emirates route discover; service tiles route services/emergency; cards route listing | Yes for current actions | `GET /v1/home`, `GET /v1/listings`, `GET /v1/destinations`, `GET /v1/emirates`, banners/services | Partial: listings/destinations/emirates exist; home/banners/services missing | Partial: catalog exists; no `Banner`/home CMS | Partial: content page exists, no home banner/service management | Partial: homepage exists, not API-backed | Guest | Public; save/book requires user | Home uses real data but not centralized home CMS; dashboard cannot manage banners/service tiles | Add home aggregate API, Banner model, Services CMS, dashboard editor | P1 |
| 8 | Discovery | Partial | Yes: `/(tabs)/discover` | Search input, filters, listing card tap, heart save, destination card tap, bottom tabs | Search filters local data; filters local; card routes detail; heart calls saved API or auth prompt; destination loops to discover | Partial: search is local, destination detail route missing | `GET /v1/search`, `GET /v1/listings`, `GET /v1/destinations`, `GET /v1/categories`, `GET /v1/emirates`, saved APIs | Partial: listings/destinations/emirates/saved exist; search/categories endpoint missing | Partial: `Listing`, `Destination`, `Category`, `SavedItem` exist | Partial: listings/content exist; category/destination CRUD incomplete | Partial: destinations page exists, no search | Guest/Tourist | Public; `saved.*.own` for heart | No backend search; destination card has no detail route | Add search API, category API, destination detail route, dashboard CRUD | P1 |
| 9 | Luxury Stays | Partial | Yes: `/services/stays` | Listing card, Select Room CTA | Card routes listing; CTA routes same listing detail | Partial | `GET /v1/stays`, `GET /v1/stays/:id`, `GET /v1/stays/:id/rooms` | Partial: `GET /v1/listings?kind=STAY`, `GET /v1/listings/:id` exist | Yes: `Listing`, `Room`, `Booking` | Partial: listings page; no room/availability editor | No dedicated stays page | Guest/Tourist/Provider/Admin | Public; `booking.create`; provider listing perms | No dedicated stays API aliases; no date/guest/price filters or availability | Add stays aliases, room selection route, availability/price filters, provider room management | P1 |
| 10 | Experiences | Partial | Yes: `/services/activities` | Filter/listing cards, Book CTA | Cards route listing; Book starts booking only from detail | Partial | `GET /v1/experiences`, `GET /v1/experiences/:id`, `GET /v1/offers` | Partial: listing kind ACTIVITY exists; offers missing | Partial: `Listing`, `Category`; no `Offer` | Partial: listings/content; no offers/coupons | No dedicated experiences page | Guest/Tourist/Provider/Admin | Public; `booking.create`; provider listing perms | No offers, category tiles, availability, detail gallery | Add offers model/API, activity detail/booking dates, dashboard offers | P1 |
| 11 | Taxi Booking | Partial | Yes: `/services/taxi` | Taxi tier cards, Confirm Booking expected | Current card routes listing; detail can create `TAXI_RIDE` booking; no estimate/live states | Partial | `POST /v1/taxi/estimate`, `POST /v1/taxi/book`, taxi status/cancel | No | Partial: `Booking` supports `TAXI_RIDE`; no driver assignment/trip model | No taxi/fleet/driver page | No web taxi page | Tourist/Driver/Admin/Provider | `booking.create`, driver assigned permissions missing | PDF taxi flow is not implemented; no map/pickup/destination/payment | Add Taxi module, estimate/booking/status APIs, driver assignment model, mobile taxi state flow | P0 |
| 12 | Food Ordering | Partial | Yes: `/services/food` | Restaurant cards, filters, expected order/checkout | Current cards route listing only; no menu/cart/checkout | No for ordering | `GET /v1/food/restaurants`, `GET /v1/food/restaurants/:id/menu`, `POST /v1/food/orders` | No | Partial: `Order`; no `OrderItem`, menu/product model | No orders/menu page | No food ordering page | Tourist/Provider/Driver/Admin | `order.create`, provider/driver order perms | Food screen is catalog-only; no menu/cart/order backend | Add Orders module, OrderItem/menu products, mobile cart, dashboard order/menu pages | P0 |
| 13 | Pharmacy Ordering | Partial | Yes: `/services/pharmacy` | Search, Upload Prescription, category cards, product cards, cart | Current listing cards only; compliance note exists; upload/cart missing | No | `GET /v1/pharmacy/items`, `POST /v1/pharmacy/prescriptions`, `POST /v1/pharmacy/orders` | No | Partial: `Order`; no `UploadFile`, prescription/quote model | No pharmacy product/prescription page | No pharmacy page | Tourist/Pharmacy Provider/Admin/Support | `order.create`; upload/prescription perms missing | Prescription flow and private upload storage missing | Add private upload model/API, prescription approval flow, pharmacy order/cart | P0 |
| 14 | Grocery | Partial | Yes: `/services/grocery` | Search, category chips, product add, checkout | Current listing cards only; no products/cart/checkout | No | `GET /v1/grocery/products`, `POST /v1/grocery/orders` | No | Partial: `Order`; no `OrderItem`/product inventory | No grocery inventory/orders page | No grocery page | Tourist/Grocery Provider/Driver/Admin | `order.create`; provider/driver order perms | Product/catalog/cart flow missing; PDF has non-UAE address defect to correct | Add product catalog, cart, order creation, UAE address copy | P0 |
| 15 | SIM Cards | Partial | Yes: `/services/sim` | Provider filters, Choose Plan/Buy Now | Current plan cards route listing; no plan order/activation | No for order | `GET /v1/sim/plans`, `POST /v1/sim/orders`, `GET/PATCH /v1/sim/orders/:id` | No dedicated SIM API; listings support SIM_PLAN | Partial: `Listing`; no activation/order detail | No SIM plan/order page | No SIM landing page | Tourist/SIM Provider/Admin | `order.create`; provider order perms | SIM plans exist as listings only; no eSIM/physical SIM workflow | Add SIM aliases/order model fields/activation status/provider page | P1 |
| 16 | Emergency Numbers | Yes | Yes: `/emergency` | Emergency card tap, Call Now modal, Cancel | Card opens confirm modal; Call opens native dialer; Cancel closes modal | Yes | `GET /v1/emergency`, optional `POST /v1/emergency/location-share` | Partial: list exists; location share missing | Yes: `EmergencyNumber` | No admin emergency CRUD page | No emergency info page | Guest | Public | Works for numbers/dialer; location awareness/share and dashboard management missing | Add location permission/share API, admin CRUD, website emergency page | P1 |
| 17 | Profile | Partial | Yes: `/(tabs)/profile`, `/help`, `/legal/privacy` | Sign In, Create Account, Language, Notifications, Payment Methods, Help, Privacy, Logout | Sign in/signup routes; language toggles local; notifications/payment routes; help opens support info; privacy opens mobile legal screen; logout clears local session | Partial | `GET/PATCH /v1/users/me`, `GET/PATCH /v1/profile`, avatar, sessions, delete | Partial: users/me/access exist; patch/profile/session/delete missing | Partial: `User`, `Session`; no `Profile` model | Partial: users page exists | No customer profile page | Tourist/Premium | `profile.read.own`, `profile.update.own` | Stats/recent activity/profile editing not implemented; full support ticket API still missing | Add Profile model/API, edit profile, sessions/devices, support tickets | P1 |
| 18 | My Destinations | Partial | Yes: `/(tabs)/saved` | Sign In, listing card, destination card, tabs/filters expected | Sign-in routes login; listing routes detail; destination routes discover; no tabs/filters | Partial | `GET/POST/DELETE /v1/saved` | Yes for saved; no analytics | Yes: `SavedItem`; `Trip` exists | No saved analytics page | No saved destination page | Tourist/Premium | `saved.read.own`, `saved.create.own`, `saved.delete.own` | Saved works but lacks PDF tabs/filters/trip tab and destination detail | Add saved/trips tabs, filters, destination route, analytics dashboard | P1 |
| 19 | Image Translator | Yes | Yes: `/translator`, `/translator/history` | Sign In, History, language chips, Camera, Gallery, Translate Image, Delete history | Sign in routes login; History route; chips set state; camera/gallery open native image picker; translate calls API; delete calls API | Yes | `POST /v1/translator/image`, `GET /v1/translator/history`, `DELETE /v1/translator/history/:id` | Yes | Yes: `TranslationJob` | No translator analytics page | Optional web later missing | Tourist/Premium | Currently `profile.read.own`; should become `translator.use.own` | Feature works with mock providers; permission key too generic; no analytics | Add dedicated translator permissions and dashboard analytics; configure real OCR/translation providers | P1 |
| 20 | Trip Planner Step 1 | Partial | Yes: `/trip-planner/1` | Emirates chips, date quick chips, Back, Next | Chips update store; quick chips update dates; Next validates local and routes step 2 | Partial | `POST /v1/trip-planner/draft` | No draft API | Yes: `Trip`, `TripStep` for generated plans | No planner analytics/config page | No web planner flow | Tourist/Premium | `trip.create.own` | Calendar is simplified; no draft persistence | Add draft model/status API or Trip draft flow; real calendar range | P1 |
| 21 | Hotel Detail | Partial | Yes: `/listing/[id]` | Save, Share, Select Room/Book Now, room cards | Save calls saved API; Share opens native share; stay CTA routes room selection; activity/taxi CTA creates booking | Partial | `GET /v1/stays/:id`, `GET /v1/stays/:id/rooms`, reviews/maps | Partial via listings by id with rooms | Yes: `Listing`, `Room`, `Review`; no amenities/map fields | Partial listing page; no room/amenities editor | No hotel detail page | Guest/Tourist/Provider/Admin | Public; `booking.create`; provider listing perms | Amenities/reviews/map preview/sticky price still partial | Add reviews/map/amenities APIs and provider room management | P1 |
| 22 | Trip Planner Step 2 | Yes basic | Yes: `/trip-planner/2` | Party chips, interest chips, Back, Next | Chips update store; Back/Next route | Yes for local flow | `PATCH /v1/trip-planner/draft/:id` | No draft patch | Yes: `Trip` fields exist | No analytics page | No web planner flow | Tourist/Premium | `trip.create.own` | No draft persistence; AI info is static | Add draft patch, preference persistence, advanced premium gates | P2 |
| 23 | Select Room | Partial | Yes: `/rooms/[listingId]` | Room select | Room cards display extracted images; Select creates stay booking and routes bookings | Partial: route and booking are real; quote/date filters missing | `GET /v1/stays/:id/rooms`, `POST /v1/bookings/quote` | Partial: rooms included in listing; booking create exists; quote missing | Yes: `Room`, `Booking`; no quote model needed | No room/availability page | No room page | Tourist/Provider/Admin | `booking.create`; provider listing perms | Dedicated route now exists; quote/date/guest/filter flow still missing | Add quote API, dates/guests, filters, provider room availability | P1 |
| 24 | Trip Planner Step 3 | Partial | Yes: `/trip-planner/3` | Budget chips, pace chips, Generate My Trip, Save for later | Chips update store; Generate calls API; Save for later missing | Partial | `POST /v1/trip-planner/generate`, `POST /v1/trip-planner/save` | Partial: generate exists; save/draft missing | Yes: `Trip`, `TripStep` | No analytics page | No web planner flow | Tourist/Premium | `trip.create.own` | Save for later missing; no draft persistence | Add save draft endpoint and button behavior | P1 |
| 25 | Itinerary Result | Partial | Yes: `/trip-planner/result/[tripId]` | Save to My Destinations, Share, Edit Itinerary, Open Live Map | Save calls saved API; Share opens native share; Edit routes step 1; map opens native maps URL | Partial | `GET/PATCH/DELETE /v1/trip-planner/plans/:id`, saved API | Partial: get/list exist; patch/delete missing | Yes: `Trip`, `TripStep`, `SavedItem` | No analytics page | No shareable itinerary page | Tourist/Premium | `trip.read.own`, `saved.create.own` | Result is UAE-backed and native actions are real; rich edit/delete/shareable web route missing | Add patch/delete and shareable itinerary route | P1 |

## Immediate Release Blockers From Matrix

1. Food, pharmacy, grocery, taxi, and SIM ordering buttons cannot be treated as complete because order/taxi/provider/driver APIs are missing.
2. Select Room now has a dedicated mobile route, but still lacks quote API, date/guest filters, and room availability management.
3. Dashboard cannot manage onboarding pages, banners, home tiles, marketing pages, orders, support tickets, translator analytics, or trip planner analytics.
4. Website lacks most partner/sales pages and customer auth/profile/saved/itinerary pages.
5. Some actions are deliberately real but incomplete: translator uses mock OCR/translation providers locally; payments use mock provider outside production.
