QR passes · one codebase, three platforms
Buying a ticket in Costa Rica too often means Instagram DMs, a bank transfer, and a screenshot as proof. Planora puts discovery, tiered checkout and a verifiable QR pass in one place — and it is my frontend playground: one codebase, three platforms, and a design identity of its own.
Planora is an event ticketing MVP built with a partner; I own the front end and product design. One Expo SDK 57 / TypeScript codebase ships to iOS, Android and web through Expo Router, with per-platform map engines (react-native-maps on native, Leaflet on web). The ticket wallet renders perforated QR stubs with boarding countdowns, haptics and a secure per-ticket token; organizers get event creation with a live pass preview and real-time check-in. The interface is a self-built design system — 47 components on NativeWind tokens, light and dark — under a named art direction, SEÑAL. While the Flask/PostgreSQL backend lands, the whole app runs on a typed mock layer that mirrors the future API contract.
Expo Router serves iOS, Android and web from a single TypeScript codebase — with per-platform choices where it matters: react-native-maps on native, Leaflet on web, haptics only where hands can feel them.
The design system has an identity, not just tokens: pixel display type, hard shadows, near-pure black and white with one signal green. 47 components on NativeWind tokens, light and dark, so every screen speaks the same language.
The backend is not ready — by design, that never blocked the product. A typed mock layer mirrors the future Flask API contract, so flows, states and screens ship and get tested today; swapping in the real API is a transport change, not a rewrite.