Real-time US–Mexico border crossing wait times with hourly forecasts, built as a cross-platform mobile app.
Drivers approaching the border have to guess which crossing will be fastest. Official CBP data is published but scattered and not predictive. BorderPulse ingests that data, fits hourly forecasts per lane type, and surfaces the result as a native-feeling app — wait times on a map, a trend chart that blends recent observations with a forecast, and a best-time-to-cross suggestion.
- Forecast chart — custom SVG chart with a monotone-cubic interpolation so the blend between observed history and predicted future reads as a single line. Tap any point for the value, p25/p75 range, and confidence tier.
- Best time to cross — per-crossing suggestion ranks the next several hours by predicted wait and confidence, falling back gracefully when historical coverage is thin.
- Map + list views — crossings plotted on a Mapbox basemap, or browsed as cards with favorites pinned.
- Localized — full EN/ES via
i18next, driven by the device locale. - Dark-first — custom theme tokens, DM Sans / Outfit type pairing.
- Strict TypeScript, no
any—tsc --noEmitis clean.
| Layer | Choice |
|---|---|
| Runtime | Expo SDK 54, React Native 0.81, React 19, New Architecture |
| Navigation | Expo Router (typed routes) |
| Server state | TanStack Query |
| Charts | react-native-svg (hand-rolled — no chart library) |
| Maps | react-native-maps + Mapbox tiles |
| i18n | i18next + react-i18next |
| Icons | lucide-react-native |
app/ Expo Router routes (tabs + crossing detail)
components/ Reusable UI — CrossingCard, WaitTimeChart, etc.
hooks/ Query hooks wrapping the API
lib/ API client, shared types, timezone helpers
theme/ Color tokens, typography
assets/ Icons, splash, fonts
npm install
cp .env.example .env # fill in API URL + Mapbox token
npm run ios # or: android, webnpm start— Expo dev servernpm run ios/android/web— platform-specific launchnpm run typecheck— strict TS checknpm run format— Prettier
Built solo as a portfolio project. Backend (ingest + forecasting) lives in a separate repo.