FareBot: Open Source NFC Transit Reader for Android, iOS, Web
What is FareBot?
FareBot (github.com/codebutler/farebot) is an open‑source, Kotlin Multiplatform app that lets you read and inspect data stored on contactless public‑transport smart cards. It is written in pure Kotlin with Compose Multiplatform and runs on
- Android – Native NFC API
- iOS – CoreNFC
- macOS – PC/SC or PN533 USB readers (experimental)
- Web – WebAssembly + WebUSB (experimental)
The app supports a wide array of card standards (ISO 7816, CEPAS, FeliCa, DESFire, MIFARE Classic, MIFARE Ultralight, NFC‑V) and reads cards from 80+ transit systems across Asia, Europe, North America and beyond.
Why it matters for developers
- Modern Tooling – Uses Gradle KTS, Kotlin 2.3.0, Compose, DI with Koin, Kotlin x serialization, and more.
- Full‑Stack Documentation – The repo contains a living README, code comments, and a dev‑container powered by Claude Code for sandboxed experimentation.
- Contribution Friendly – All code is MIT/GPL‑free, and the PR process is straightforward.
Key Features
| Feature | Description |
|---|---|
| Card Discovery | Scans for NFC tags and lists available card types. |
| Full Card Dump | Reads all EF files and presents raw data, timestamps, and balance. |
| Multi‑Platform UI | Compose UI shared between mobile, macOS, and web. |
| Extensible System Registry | Add new transit systems in a single “registry” file. |
| WebAssembly Demo | Experimental web build that reads cards via PN533 USB reader on Chrome/Edge. |
| Dev‑container | Docker‑based environment pre‑loaded with Java 21, Gradle, and Claude Code. |
Supported Cards (Spot‑light Examples)
- Japan – Suica, Pasmo, Octopus, Edy
- Singapore – EZ‑Link, NETS FlashPay, Octopus
- Germany – VDV‑Bus, VVS
- UK – Oyster, TfL cards (limited MIFARE support)
- US – Clipper, Ventra, ORCA (DESFire)
The full list is documented in the README; the repo even handles card‑specific quirks like MIFARE Classic encryption keys.
Quick Start
- Clone the repo
git clone https://github.com/codebutler/farebot.git cd farebot - Build & run (Android)
make android-install # installs on a connected device via ADB - Build & run (iOS)
make ios-install # installs on a physical iPhone - Build & serve web
make web-run - Run tests
make test
Tip: The dev‑container (
.devcontainer/) gives you a sandboxed editor where you can run Claude Code or experiment with the repo without risk.
Contribution Flow
- Fork the repository.
- Create a feature branch.
- Add/modify code; run
make test. - Submit a pull request.
All contributors are acknowledged in the Contributors section. The repo has over 30 contributors and 1 k+ stars, showing a vibrant community.
License & Community
FareBot is released under the GPL‑3.0 license – free to use, modify, and redistribute, provided the derivative works remain under the same license. The project welcomes contributions via GitHub PRs, issues, or adding new transit‑system adapters.
Takeaway: If you’re building an NFC‑enabled transit app, or simply want to learn how a production‑grade Kotlin Multiplatform codebase is structured, FareBot is a must‑read. Its combination of real‑world card support, experimental web capabilities, and a fully documented repo makes it an exemplary open‑source reference.