Skip to content

codebutler/farebot

Repository files navigation

FareBot

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)

Download

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

Card Location Protocol Android iOS macOS Web
Beijing Municipal Card Beijing, China ISO 7816
City Union China ISO 7816
Edy Japan FeliCa
EZ-Link Singapore CEPAS
Kartu Multi Trip Jakarta, Indonesia FeliCa
KomuterLink Malaysia Classic 🔒 ✅¹
NETS FlashPay Singapore CEPAS
Octopus Hong Kong FeliCa
One Card All Pass South Korea ISO 7816
Shanghai Public Transportation Card Shanghai, China ISO 7816
Shenzhen Tong Shenzhen, China ISO 7816
Suica / ICOCA / PASMO Japan FeliCa
T-money South Korea ISO 7816
T-Union China ISO 7816
Touch 'n Go Malaysia Classic 🔒 ✅¹
Wuhan Tong Wuhan, China ISO 7816

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

Russia & Former Soviet Union

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

Platform Compatibility

Protocol Android iOS macOS Web
CEPAS
FeliCa
ISO 7816
MIFARE Classic ✅¹
MIFARE DESFire
MIFARE Ultralight
NFC-V / Vicinity ✅²

¹ 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/>.

About

Read data from public transit cards using your NFC Android phone!

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 30