README.md

February 22, 2026 · View on GitHub

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

CardLocationProtocolAndroidiOSmacOSWeb
Beijing Municipal CardBeijing, ChinaISO 7816
City UnionChinaISO 7816
EdyJapanFeliCa
EZ-LinkSingaporeCEPAS
Kartu Multi TripJakarta, IndonesiaFeliCa
KomuterLinkMalaysiaClassic 🔒✅¹
NETS FlashPaySingaporeCEPAS
OctopusHong KongFeliCa
One Card All PassSouth KoreaISO 7816
Shanghai Public Transportation CardShanghai, ChinaISO 7816
Shenzhen TongShenzhen, ChinaISO 7816
Suica / ICOCA / PASMOJapanFeliCa
T-moneySouth KoreaISO 7816
T-UnionChinaISO 7816
Touch 'n GoMalaysiaClassic 🔒✅¹
Wuhan TongWuhan, ChinaISO 7816

Australia & New Zealand

CardLocationProtocolAndroidiOSmacOSWeb
Adelaide MetrocardAdelaide, SADESFire
BUSITWaikato, NZClassic 🔒✅¹
Manly Fast FerrySydney, NSWClassic 🔒✅¹
MetrocardChristchurch, NZClassic 🔒✅¹
MykiMelbourne, VICDESFire
OpalSydney, NSWDESFire
Otago GoCardOtago, NZClassic 🔒✅¹
SeqGoQueenslandClassic 🔒✅¹
SmartRideRotorua, NZClassic 🔒✅¹
SmartRiderPerth, WAClassic 🔒✅¹
SnapperWellington, NZISO 7816

Europe

CardLocationProtocolAndroidiOSmacOSWeb
BonobusCadiz, SpainClassic 🔒✅¹
Carta MobilePisa, ItalyISO 7816 (Calypso)
EnvibusSophia Antipolis, FranceISO 7816 (Calypso)
HSLHelsinki, FinlandDESFire
KorriGoBrittany, FranceISO 7816 (Calypso)
LeapDublin, IrelandDESFire
Lisboa VivaLisbon, PortugalISO 7816 (Calypso)
MobibBrussels, BelgiumISO 7816 (Calypso)
NavigoParis, FranceISO 7816 (Calypso)
OuRAGrenoble, FranceISO 7816 (Calypso)
OV-chipkaartNetherlandsClassic 🔒 / Ultralight✅³
OysterLondon, UKClassic 🔒✅¹
Pass PassHauts-de-France, FranceISO 7816 (Calypso)
PastelToulouse, FranceISO 7816 (Calypso)
RejsekortDenmarkClassic 🔒✅¹
RicaricaMiMilan, ItalyClassic 🔒✅¹
SLaccessStockholm, SwedenClassic 🔒✅¹
TaMMontpellier, FranceISO 7816 (Calypso)
TampereTampere, FinlandDESFire
Tartu BusTartu, EstoniaClassic 🔒✅¹
TransGirondeGironde, FranceISO 7816 (Calypso)
VästtrafikGothenburg, SwedenClassic 🔒✅¹
Venezia UnicaVenice, ItalyISO 7816 (Calypso)
WalttiFinlandDESFire
WarsawWarsaw, PolandClassic 🔒✅¹

Middle East & Africa

CardLocationProtocolAndroidiOSmacOSWeb
GautrainGauteng, South AfricaClassic 🔒✅¹
HafilatAbu Dhabi, UAEDESFire
Metro QQatarClassic 🔒✅¹
RavKavIsraelISO 7816 (Calypso)

North America

CardLocationProtocolAndroidiOSmacOSWeb
Charlie CardBoston, MAClassic 🔒✅¹
ClipperSan Francisco, CADESFire / Ultralight
CompassVancouver, CanadaUltralight
LAX TAPLos Angeles, CAClassic 🔒✅¹
MSP GoToMinneapolis, MNClassic 🔒✅¹
OpusMontreal, CanadaISO 7816 (Calypso)
ORCASeattle, WADESFire
VentraChicago, ILUltralight

Russia & Former Soviet Union

CardLocationProtocolAndroidiOSmacOSWeb
Crimea Trolleybus CardCrimeaClassic 🔒✅¹
EkartaYekaterinburg, RussiaClassic 🔒✅¹
Electronic BarnaulBarnaul, RussiaClassic 🔒✅¹
KazanKazan, RussiaClassic 🔒✅¹
Kirov transport cardKirov, RussiaClassic 🔒✅¹
Krasnodar ETKKrasnodar, RussiaClassic 🔒✅¹
Kyiv DigitalKyiv, UkraineClassic 🔒✅¹
Kyiv MetroKyiv, UkraineClassic 🔒✅¹
MetroMoneyTbilisi, GeorgiaClassic 🔒✅¹
OMKAOmsk, RussiaClassic 🔒✅¹
Orenburg EKGOrenburg, RussiaClassic 🔒✅¹
Parus school cardCrimeaClassic 🔒✅¹
Penza transport cardPenza, RussiaClassic 🔒✅¹
PodorozhnikSt. Petersburg, RussiaClassic 🔒✅¹
Samara ETKSamara, RussiaClassic 🔒✅¹
SitiCardNizhniy Novgorod, RussiaClassic 🔒✅¹
SitiCard (Vladimir)Vladimir, RussiaClassic 🔒✅¹
StrizhIzhevsk, RussiaClassic 🔒✅¹
TroikaMoscow, RussiaClassic 🔒 / Ultralight✅³
YarGorYaroslavl, RussiaClassic 🔒✅¹
Yaroslavl ETKYaroslavl, RussiaClassic 🔒✅¹
Yoshkar-Ola transport cardYoshkar-Ola, RussiaClassic 🔒✅¹
Zolotaya KoronaRussiaClassic 🔒✅¹

South America

CardLocationProtocolAndroidiOSmacOSWeb
Bilhete ÚnicoSão Paulo, BrazilClassic 🔒✅¹
Bip!Santiago, ChileClassic 🔒✅¹

Taiwan

CardLocationProtocolAndroidiOSmacOSWeb
EasyCardTaipeiClassic 🔒 / DESFire✅⁴

Identification Only (Serial Number)

These cards can be detected and identified, but their data is locked or not stored on-card:

CardLocationProtocolReasonAndroidiOSmacOSWeb
AT HOPAuckland, NZDESFireLocked
HoloOahu, HIDESFireNot stored on card
Istanbul KartIstanbul, TurkeyDESFireLocked
Nextfare DESFireVariousDESFireLocked
NolDubai, UAEDESFireLocked
NorticScandinaviaDESFireLocked
PrestoOntario, CanadaDESFireLocked
StrelkaMoscow Region, RussiaClassic 🔒Locked✅¹
Sun CardOrlando, FLClassic 🔒Locked✅¹
TPFFribourg, SwitzerlandDESFireLocked
TriMet HopPortland, ORDESFireNot stored on card

Platform Compatibility

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

PlatformUSBBluetooth
AndroidYesYes
iOSYes
macOSYes
WebYesYes

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
CommandDescription
make androidBuild Android debug APK
make android-installBuild and install on connected Android device (via adb)
make iosBuild iOS app for physical device
make ios-simBuild iOS app for simulator
make ios-installBuild and install on connected iOS device (auto-detects device)
make desktopRun macOS desktop app (experimental)
make webBuild web app (experimental, WebAssembly)
make web-runRun web app dev server with hot reload
make testRun all tests
make cleanClean 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/>.