All work

Metro79

2026PublicProduct designer, self-initiated

The Bucharest metro on your phone. Buy a subscription, walk through the gate with one QR code and plan the trip on the official timetable.

I ride the Bucharest metro most days. One evening I tried to renew my subscription on my phone, and the site sent me to a ticket office first. When I got it working online, it said the subscription would start tomorrow.

So I built the app I wanted instead. This is how it came together.

A Metro79 platform strip: the five metro line colours run into a large 79, with One code for all five lines in Romanian and English
  • 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 doors open over the subscription code. The switch spends a trip instead.

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ă.

A landmark in, real departures out.

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.

Every price is open. The account comes with the ticket.

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.

Ten trips, one sheet, and a receipt that waits for you.

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.

Tools used

Next project

Keep exploring

Plum ReactDesign system owner2026Password