A few days ago I put a small Android app called Leap Reader on the Google Play store.
It does one simple thing. You tap your Leap Card against the back of your phone, and it shows you your balance and your recent journeys. (For anyone outside Ireland, Leap Card is the card we use to tap on and off buses, the Luas, DART and trains.)
That’s more or less it. It can’t top up your card, you don’t need an account, and it doesn’t track you.
So why build it?
The official app stopped working
Back in the summer, the official Leap Top-Up app stopped reading my card.
I wasn’t the only one. There were a few threads on r/ireland from people with the same problem, and Pixel owners seemed to be hit especially hard. My guess was that Pixels got the latest version of Android first. That turned out to be roughly right: the NTA later confirmed that the Android 17 update in late June broke the NFC reading the app relies on, for a lot of phones.
So I couldn’t check my balance on my phone. And I wondered how hard it would be to build something that could.
A weekend experiment
In my last article, The Year I Started Building Software, I wrote about building Shape.ink with the help of AI. I don’t write the code myself. I describe what I want, review what comes back, test it, and keep making product decisions along the way.
I was curious whether the same approach would work for a native Android app. And one that has to talk to a chip on a card, which seemed like a step up from a web app.
Reading a Leap Card turned out to be trickier than I expected. But with Codex and Claude Code, I was able to work through the research other people have published on how these cards work, and build my own version from scratch.
Over one weekend in July I had a rough version reading my own card on my phone. When my balance first showed up on the screen, that felt like a small victory.
Then came the part I enjoy most, i.e. the design. Your balance sits on a virtual card at the top. Your recent journeys are grouped underneath, with the Dublin Bus, Luas or Irish Rail logo beside each one so you can tell them apart at a glance. If you’ve tapped on recently, there’s an estimated TFI 90 countdown. And when the card is read, a little frog does a jump. (I’ll let you work out why it’s a frog.)
The official app was fixed in early August. But by then I was enjoying this far too much to stop 🙂
Then I needed other people’s cards
In that last article I said the bottleneck has moved from building the thing to owning the quality. This project proved it again.
AI could help me write the code to read a card in a weekend. But I only had a couple of Leap Cards to test with. Student cards, child cards, visitor cards, TaxSaver cards etc. don’t always store things the same way, and you can’t really know what a piece of data means until you see it on a real card.
Google also requires new developers to run a closed test with 12 testers for 14 days before an app can go public. So in August I roped in friends and family, and asked for volunteers on LinkedIn and X.
Thanks to everyone who helped out. Their cards turned up things I would never have spotted on my own, like certain operators’ fares showing up as zero.
Tap to Open
In October I added a setting called tap-to-open.
With it switched on, you don’t need to open Leap Reader at all. Unlock your phone, tap your card on the back, and your balance appears.
Most of the time I only want to know one thing: is there enough on the card to get me home? Now a tap is enough to answer that. It’s off by default, so you’ll need to turn it on in the About screen first.
A few things worth knowing
It’s read-only. It can’t top up, change your balance, or alter anything on your card.
It’s private. No account, no sign-in, no ads, no analytics. Your balance and journeys aren’t sent to me and aren’t saved on your phone. They only stay there while the app is open. To unlock the card, the app sends the minimum technical information needed to TFI’s card service, and nothing else.
It’s independent. Leap Reader isn’t made by, affiliated with, or endorsed by TFI or the NTA.
It’s Android only, for now. You need a phone with NFC (most recent ones have it), a physical Leap Card, and an internet connection while the card is being read.
Thirteen years later
My first Android app was Happy Shapes, a shapes game for preschoolers that I made back in 2013 without writing any code. (Back then, I used a visual coding tool called Construct.)
Thirteen years on, I still haven’t written the code myself! But this time it’s a native app that reads an encrypted smart card. The tools have come a long way!
If you have an Android phone and a Leap Card, I’d love you to give it a try. I’d especially like to hear from anyone with a student, visitor or TaxSaver card. If your card doesn’t read properly, the app should tell you so rather than show you something wrong. Either way, if anything looks off, let me know.