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

  1. Clone the repo
    git clone https://github.com/codebutler/farebot.git
    cd farebot
    
  2. Build & run (Android)
    make android-install   # installs on a connected device via ADB
    
  3. Build & run (iOS)
    make ios-install       # installs on a physical iPhone
    
  4. Build & serve web
    make web-run
    
  5. 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

  1. Fork the repository.
  2. Create a feature branch.
  3. Add/modify code; run make test.
  4. 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.

Original Article: View Original

Share this article