- Built A working mobile app for the Bucharest metro: tickets, the code at the gate and trip planning.
- Owned Product, flows, interface, brand and front-end, end to end. Self-initiated.
- Try it The live app. To try a purchase, choose Explore the demo when it asks you to sign in: a demo account I keep for reviewers.
The start
This is what buying a subscription looks like today, on the operator's own site.
A desktop site squeezed onto a phone, a sign-up that asks for your national ID number, and fares posted as a picture of a table. None of it is about the trains, which are fine. It's about the few screens between you and the gate. I wanted to see how short I could make them.
I also wanted a flow for moving an existing magnetic card onto the phone. Then I remembered the gates don't read QR codes yet either, so I kept to what could plausibly ship first and left the card for later.
The app
Open it on the platform and the first thing you see is your code for the gate. It sits behind two closed train doors, because it carries your name and you don't want it on screen for the whole carriage. Tap, the doors slide open, scan.
The call: one code at a time. With a subscription and a few trips for a friend, you would carry two codes, and scanning the wrong one spends a trip the subscription already covers. So home shows the subscription, and a switch turns the card green when you spend a trip instead. The subscription code also works offline underground, which is why it stays the default.
Planning works the way people think. You don't type a station, you type "Arcul de Triumf", the way you would in Google Maps or Bolt, and it works out which station to walk to and when the next real train leaves. "Piata Romana" without diacritics still finds Piața Romană.
Prices are open to everyone. The app only asks you to sign in when you buy, and a subscription carries your name and nothing else: no national ID number, no card from a counter.
The call: paid now, valid now. The ticket lives in the account, not on a plastic card, so it works the second you pay, not the next morning. Apple Pay and Google Pay come first, because you are already holding the phone you pay with.
The build
It's a PWA: a website that installs like an app, so there is no store and nothing to download. Routes come from the official timetable, the public GTFS feed, and the planner searches the real departures, not "two minutes per station". Accounts and tickets live in Supabase, and payments run in a sandbox.
The first version came together fast with AI, and it looked like it: generic cards on top of Mantine, and the real operator's name on every screen. Most of the work after that was making it its own. I treated it as a new company, renamed it and gave it a brand, then themed Mantine with my own tokens so it reads as Metro79 and not as a component library.
The name is 1979, the year the first line opened. The symbol is the pair of closed doors from the gate screen, and the gap between them is the gap between the 7 and the 9. The type is Atkinson Hyperlegible, designed for readers with low vision, because older riders are part of the audience.
It works in Romanian and English, light and dark, and every text and colour pair is checked for contrast automatically on every change.
Now
It's live and it works end to end, but nobody rides with it yet. Next I want to hand it to five riders, two of them over 65 and one who doesn't speak Romanian, and time them from opening the app to the code on screen. The goal is under a minute.
Getting it to the real gates is a conversation with Metrorex, not more screens.
Metro79 is an unofficial concept, not affiliated with Metrorex. Payments are simulated.


Easter eggs