FareBot
Read your remaining balance, recent trips, and other information from contactless public transit cards using your NFC-enabled device.
FareBot runs on:
- Android — built-in NFC (6.0+)
- iOS — built-in NFC (iPhone 7+)
- macOS (experimental) — PC/SC smart card readers or PN533 USB NFC readers
- Web (experimental) — PN533 USB NFC readers (Chrome/Edge/Opera)
Written By
Thanks To
[!NOTE]
Huge thanks to the Metrodroid project, a fork of FareBot that added support for many additional transit systems. All features as of v3.1.0 (04a603ba) have been backported.
Supported Cards
Asia
Australia & New Zealand
| Card |
Location |
Protocol |
Android |
iOS |
macOS |
Web |
| Adelaide Metrocard |
Adelaide, SA |
DESFire |
✅ |
✅ |
✅ |
✅ |
| BUSIT |
Waikato, NZ |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Manly Fast Ferry |
Sydney, NSW |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Metrocard |
Christchurch, NZ |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Myki |
Melbourne, VIC |
DESFire |
✅ |
✅ |
✅ |
✅ |
| Opal |
Sydney, NSW |
DESFire |
✅ |
✅ |
✅ |
✅ |
| Otago GoCard |
Otago, NZ |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| SeqGo |
Queensland |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| SmartRide |
Rotorua, NZ |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| SmartRider |
Perth, WA |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Snapper |
Wellington, NZ |
ISO 7816 |
✅ |
✅ |
✅ |
✅ |
Europe
| Card |
Location |
Protocol |
Android |
iOS |
macOS |
Web |
| Bonobus |
Cadiz, Spain |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Carta Mobile |
Pisa, Italy |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Envibus |
Sophia Antipolis, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| HSL |
Helsinki, Finland |
DESFire |
✅ |
✅ |
✅ |
✅ |
| KorriGo |
Brittany, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Leap |
Dublin, Ireland |
DESFire |
✅ |
✅ |
✅ |
✅ |
| Lisboa Viva |
Lisbon, Portugal |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Mobib |
Brussels, Belgium |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Navigo |
Paris, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| OuRA |
Grenoble, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| OV-chipkaart |
Netherlands |
Classic 🔒 / Ultralight |
✅ |
✅³ |
✅ |
✅ |
| Oyster |
London, UK |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Pass Pass |
Hauts-de-France, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Pastel |
Toulouse, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Rejsekort |
Denmark |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| RicaricaMi |
Milan, Italy |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| SLaccess |
Stockholm, Sweden |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| TaM |
Montpellier, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Tampere |
Tampere, Finland |
DESFire |
✅ |
✅ |
✅ |
✅ |
| Tartu Bus |
Tartu, Estonia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| TransGironde |
Gironde, France |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Västtrafik |
Gothenburg, Sweden |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Venezia Unica |
Venice, Italy |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| Waltti |
Finland |
DESFire |
✅ |
✅ |
✅ |
✅ |
| Warsaw |
Warsaw, Poland |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
Middle East & Africa
| Card |
Location |
Protocol |
Android |
iOS |
macOS |
Web |
| Gautrain |
Gauteng, South Africa |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Hafilat |
Abu Dhabi, UAE |
DESFire |
✅ |
✅ |
✅ |
✅ |
| Metro Q |
Qatar |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| RavKav |
Israel |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
North America
| Card |
Location |
Protocol |
Android |
iOS |
macOS |
Web |
| Charlie Card |
Boston, MA |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Clipper |
San Francisco, CA |
DESFire / Ultralight |
✅ |
✅ |
✅ |
✅ |
| Compass |
Vancouver, Canada |
Ultralight |
✅ |
✅ |
✅ |
✅ |
| LAX TAP |
Los Angeles, CA |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| MSP GoTo |
Minneapolis, MN |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Opus |
Montreal, Canada |
ISO 7816 (Calypso) |
✅ |
✅ |
✅ |
✅ |
| ORCA |
Seattle, WA |
DESFire |
✅ |
✅ |
✅ |
✅ |
| Ventra |
Chicago, IL |
Ultralight |
✅ |
✅ |
✅ |
✅ |
| Card |
Location |
Protocol |
Android |
iOS |
macOS |
Web |
| Crimea Trolleybus Card |
Crimea |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Ekarta |
Yekaterinburg, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Electronic Barnaul |
Barnaul, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Kazan |
Kazan, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Kirov transport card |
Kirov, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Krasnodar ETK |
Krasnodar, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Kyiv Digital |
Kyiv, Ukraine |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Kyiv Metro |
Kyiv, Ukraine |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| MetroMoney |
Tbilisi, Georgia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| OMKA |
Omsk, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Orenburg EKG |
Orenburg, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Parus school card |
Crimea |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Penza transport card |
Penza, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Podorozhnik |
St. Petersburg, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Samara ETK |
Samara, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| SitiCard |
Nizhniy Novgorod, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| SitiCard (Vladimir) |
Vladimir, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Strizh |
Izhevsk, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Troika |
Moscow, Russia |
Classic 🔒 / Ultralight |
✅ |
✅³ |
✅ |
✅ |
| YarGor |
Yaroslavl, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Yaroslavl ETK |
Yaroslavl, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Yoshkar-Ola transport card |
Yoshkar-Ola, Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Zolotaya Korona |
Russia |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
South America
| Card |
Location |
Protocol |
Android |
iOS |
macOS |
Web |
| Bilhete Único |
São Paulo, Brazil |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
| Bip! |
Santiago, Chile |
Classic 🔒 |
✅¹ |
❌ |
✅ |
✅ |
Taiwan
| Card |
Location |
Protocol |
Android |
iOS |
macOS |
Web |
| EasyCard |
Taipei |
Classic 🔒 / DESFire |
✅ |
✅⁴ |
✅ |
✅ |
Identification Only (Serial Number)
These cards can be detected and identified, but their data is locked or not stored on-card:
| Card |
Location |
Protocol |
Reason |
Android |
iOS |
macOS |
Web |
| AT HOP |
Auckland, NZ |
DESFire |
Locked |
✅ |
✅ |
✅ |
✅ |
| Holo |
Oahu, HI |
DESFire |
Not stored on card |
✅ |
✅ |
✅ |
✅ |
| Istanbul Kart |
Istanbul, Turkey |
DESFire |
Locked |
✅ |
✅ |
✅ |
✅ |
| Nextfare DESFire |
Various |
DESFire |
Locked |
✅ |
✅ |
✅ |
✅ |
| Nol |
Dubai, UAE |
DESFire |
Locked |
✅ |
✅ |
✅ |
✅ |
| Nortic |
Scandinavia |
DESFire |
Locked |
✅ |
✅ |
✅ |
✅ |
| Presto |
Ontario, Canada |
DESFire |
Locked |
✅ |
✅ |
✅ |
✅ |
| Strelka |
Moscow Region, Russia |
Classic 🔒 |
Locked |
✅¹ |
❌ |
✅ |
✅ |
| Sun Card |
Orlando, FL |
Classic 🔒 |
Locked |
✅¹ |
❌ |
✅ |
✅ |
| TPF |
Fribourg, Switzerland |
DESFire |
Locked |
✅ |
✅ |
✅ |
✅ |
| TriMet Hop |
Portland, OR |
DESFire |
Not stored on card |
✅ |
✅ |
✅ |
✅ |
¹ Requires NXP NFC chip — most Samsung and some other Android devices use non-NXP controllers and cannot read MIFARE Classic.
² PC/SC readers only. PN533-based USB readers do not support NFC-V.
³ Ultralight variant only.
⁴ DESFire variant only.
🔒 Requires encryption keys — see Cards Requiring Keys.
Cards Requiring Keys
Some MIFARE Classic cards require encryption keys to read. You can obtain keys using a Flipper Zero, Proxmark3, or MFOC. These include:
- Bilhete Único
- Charlie Card
- EasyCard (older MIFARE Classic variant)
- OV-chipkaart
- Oyster
- And most other MIFARE Classic-based cards
Flipper Zero Integration
FareBot supports connecting to a Flipper Zero to browse and import NFC card dumps and MIFARE Classic key dictionaries.
| Platform |
USB |
Bluetooth |
| Android |
Yes |
Yes |
| iOS |
— |
Yes |
| macOS |
Yes |
— |
| Web |
Yes |
Yes |
From the home screen menu, tap Flipper Zero to connect via USB serial or Bluetooth Low Energy, browse the /ext/nfc file system, select card dump files (.nfc), and import them into your card history. You can also import the Flipper user key dictionary (mf_classic_dict_user.nfc) into the app's global key store, which is used as a fallback when reading MIFARE Classic cards.
Building
$ git clone https://github.com/codebutler/farebot.git
$ cd farebot
$ make # show all targets
| Command |
Description |
make android |
Build Android debug APK |
make android-install |
Build and install on connected Android device (via adb) |
make ios |
Build iOS app for physical device |
make ios-sim |
Build iOS app for simulator |
make ios-install |
Build and install on connected iOS device (auto-detects device) |
make desktop |
Run macOS desktop app (experimental) |
make web |
Build web app (experimental, WebAssembly) |
make web-run |
Run web app dev server with hot reload |
make test |
Run all tests |
make clean |
Clean all build artifacts |
A development container is available for sandboxed development with Claude Code.
Tech Stack
Project Structure
base/ — Core utilities, MDST reader, ByteArray extensions
card/ — Shared card abstractions
card/*/ — Card protocol implementations (classic, desfire, felica, etc.)
transit/ — Shared transit abstractions (Trip, Station, TransitInfo, etc.)
transit/*/ — Transit system implementations (one per system)
flipper/ — Flipper Zero integration (RPC client, transport abstractions, parsers)
app/ — KMP app framework (UI, ViewModels, DI, platform code)
app/android/ — Android app shell (Activities, manifest, resources)
app/ios/ — iOS app shell (Swift entry point, assets, config)
app/desktop/ — macOS desktop app (experimental, PC/SC + PN533 + RC-S956 USB NFC)
app/web/ — Web app (experimental, WebAssembly via Kotlin/Wasm)
License
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.