← All work

mobile · February 2026

Parkingio

A React Native parking finder for Tbilisi: explore 18 locations on an interactive Google map or searchable list, compare availability, rates, capacity, and hours, then route to a selected spot. The public Expo MVP uses local mock auth and simulated availability so the complete flow works without a backend.

Tornike Kalandadze — software engineer & technical lead, client delivery since 2019 · Tbilisi (GMT+4)

Problem

Finding parking is a spatial decision made under time pressure. A driver needs location, availability, price, opening hours, and a route in one thumb-first flow; a portfolio demo also needs to remain usable without private backend credentials or infrastructure.

Approach

Built one Expo Router app around a shared, typed parking model. A reducer-backed ParkingContext feeds an interactive Google map, searchable list, reusable spot detail sheet, refresh flow, and route hand-off. Foreground location, Haversine distance, Google Directions, and a polyline fallback handle the spatial layer. Local service and auth adapters keep the public demo self-contained while leaving clear replacement seams for production APIs.

Impact

Shipped the complete discovery → compare → inspect → route journey as a public Expo web build, backed by five current device captures in the repository. The MVP proves the product and interaction model without pretending its seeded availability or local identity layer are production services.

Through every lens

02 · Mobile

One Expo codebase handles location, map control, parking search, spot details, synced selections, and directions with a local polyline fallback.

Built with

React Native 0.81 · Expo 54 · TypeScript · Expo Router · React Native Maps · Google Maps Directions API · React Native Paper · AsyncStorage

Notes

From map to route

Parkingio puts the decision on one screen: where a parking area is, whether it has room, what it costs, when it is open, and how to get there. Eighteen typed Tbilisi locations feed both an availability-coded Google map and a searchable list. Selecting a result opens the same detail model from either surface, and the route action carries that selection back to the map for turn-by-turn directions.

Mobile behavior, not just mobile styling

The app requests foreground location permission, recenters the map on the user, calculates straight-line distance with the Haversine formula, and watches location changes while the app is active. Google Directions draws the driving route; if that request fails, the map falls back to a local polyline so the interaction still has a legible failure state. Expo Router owns navigation, while reducer-backed React contexts keep parking selection, loading, refresh, and auth state consistent across map, list, detail, and profile screens.

An honest demo boundary

This is a portfolio MVP, not a claim of municipal real-time infrastructure. Parking records are seeded locally and the service slightly varies availability when it refreshes to demonstrate changing states. Authentication is a clearly marked AsyncStorage-backed mock, so visitors can try the app without a server account. The next production step is replacing those two adapters with real identity and a live parking feed; the interface and state boundaries are already separated for that swap.

The Expo web build is public on Vercel. Use any demo email and a password of at least six characters to enter the app.

Contact sheet