Skip to content


Michael Farrell edited this page Nov 25, 2019 · 173 revisions


100% Production rollout in Google Play Store (2019-11-25).

Beta rollout in Google Play Store (2019-11-02).


100% Production rollout in Google Play Store (2019-07-28).

Known issues


100% Production rollout in Google Play Store (2019-07-11).

Minor release to fix issue in v2.9.41:

  • Removes broken "copy all" / "share all" buttons from Card List screen. You can still copy and share single cards, and save either a single or all cards.

See 2.9.41 notes below for complete changes since 2.9.40 and release notes.


Replaced by 2.9.42.

Known issues

Singapore CEPAS

Some Singapore (CEPAS) cards are not detected by Android. This is caused by a combination of bugs in the card firmware and Android. This appears to primarily impact NETS FlashPay cards, but some EZ-Link cards (eg: Singapore Tourist Pass) are also impacted.

Cards with this bug have two detectable symptoms:

  1. When using Metrodroid: holding the card to a device does not read at all, and there is no audible indication that a card was detected. However, there is communication between the card and the device (which can be detected with an ISO 14443B sniffer).

    The same symptom can be seen in NXP TagInfo with reader mode off.

  2. When using NXP TagInfo with reader mode on: when holding the card to a device, TagInfo will detect the same card repeatedly (about once per second).

In some devices (eg: Google Pixel 3a), trying to read one of these cards can crash the NFC stack on the phone. Fixing it requires either turning NFC off and then on again, using another app (which implements reader mode), or rebooting the device.

It might be possible to work around this issue in Metrodroid by implementing reader mode, which gives more direct control of the NFC controller (preventing Android from triggering these bugs in the card). However, this requires significant changes to Metrodroid to implement.


The Oyster card reader shows transaction event date and time, but does not show what they are or how much they cost. This reader is still under active development.

Second-generation cards (issued after 2009-12, which have a "D" in the printed lower-left corner of the card) are fully locked DESFire cards with no readable sectors.

This also does not work with ITSO-compatible travelcards, even if you have loaded a TfL season ticket on the card.


The EMV card reader does not read transactions from all bank cards -- this is a limitation of the card itself.

Merchant identification is generally not available.


Minor release to fix issues in v2.9.38 and v2.9.39.


Replaced by v2.9.40. Minor release to fix issues in v2.9.38.


Replaced by v2.9.40.




Backend / API changes:


  • Timezone support added for most cards. You can now optionally display the time of your trip in your local timezone.
  • Clipper: Fix issue where travel times were incorrect by 2.5 minutes.
  • Opal: Fix incorrect travel times on daylight savings time change days.
  • New icon, which has adaptive shapes on Android O and later. The new icon will also display on older versions of Android, but won't adapt in shape.
  • New transport mode icons, from NotoEmoji, which use vectors.
  • New station database format (MdST), which reduces on-disk size and removes the need to copy the stop database into the cache.
  • Some larger card images have been converted to JPEG to reduce size.
  • Android Support Library now only includes needed components, to reduce size.
  • Android 5.0 and later: When using a screen reader, Metrodroid can now provide hints to it about what language station names are written in using LocaleSpan. This improves the pronunciation of place names, particularly in Japanese. This works with Google Talkback.
  • Many accessibility improvements.


  • Adds experimental support for Metrocard (Christchurch) :new_zealand:
  • Adds generic reader for ERG cards on MIFARE Classic, based on the Manly Fast Ferry reader.
  • Opal: Handle unknown status 0xc (tap on rejected).
  • ReadingTagActivity: The "reading card" screen now shows what it is doing. MIFARE Classic really is that slow.
  • Fixes some internationalisation issues (hard-coded strings).
  • Fixes obfuscation flags not always updating.
  • Fixes button sizing issue on main screen.
  • Fixes build issue for F-Droid.

Card reader changes:

  • MIFARE Classic: Now tries the "other key" for a sector with a known key on file, in case you got Key A/B mixed up. Now picking Key A or B only sets the priority with which it attempts first authentication (which is consistent with the behaviour when "other" keys are tried. The Key A/B setting is only really useful when permission bits locked down for one of the known keys (see page 11 and 12 of the datasheet), and you get a successful authentication but permission bits say the sector or some of the blocks are not readable.
  • MIFARE Classic: Use the standard Android check for MIFARE Classic on the about screen. The previous check incorrectly reported the Google Pixel 2 and Lenovo P2 as not supporting MIFARE Classic, but the cards would still work. See Issue #40 for details.
  • MIFARE DESFire, MIFARE Ultralight: Fully locked cards now show a special message (like MIFARE Classic).
  • MIFARE Ultralight C/EV1: Fixes "IOException" message when viewing (fully or partially) locked cards.
  • MIFARE Ultralight C/EV1: Cards are now read to their full length.

API changes:

  • Most classes have moved to the namespace.
  • Trip.getTimestamp and Trip.getExitTimestamp have been replaced by Trip.getStartTimestamp and Trip.getEndTimestamp. TripCompat provides a workaround for providers that haven't yet been migrated.
  • Trip.getRouteName, Trip.get{Start,End}Station{,Name}?, and Trip.get{,Short}AgencyName now have stub implementations so providers that don't support these fields no longer need to explicitly stub it out.


  • Adds Obfuscation Mode.
  • CEPAS: Fix a crash with some unknown card format (likely from France).
  • Mifare Classic: Fix a crash when viewing raw details when the card has been moved out of the field.
  • Cubic Nextfare MFC: Support negative balances, handle balances better when version field overflows, hide null records.
  • Go card: Add new stop IDs.
  • Allows more mime types in card importer.
  • Removes "Save to USB Storage" (which saves to a fixed location) option, which has been replaced with "Save to File" (which uses a file browser) for some time now.
  • Updates Leaflet to 1.2.0.


  • Adds support for SmartRider (WA, Australia).
  • Adds translations in Dutch thanks to @Vistaus, French thanks to @Albirew, Hebrew thanks to @steets250
  • MyWay: Auto-detect card by common key, which works on cards scanned with v2.9.31 and later.
  • MFC: Make key available in ClassicSector.


  • Cubic Nextfare MFC: Implement card expiry date (fixes #24), fixes subscription parser issue (fixes #28).
  • Bilhete Único: Disable by default to avoid false positives with other agencies using Fudan Microelectronics FM11RF08 cards (#27).
  • Transit Access Pass: Unknown Metro Bus routes now display the route ID.
  • Adds support for MyWay (ACT, Australia), can be enabled in preferences.
  • Work around an issue with reading MIFARE Classic cards present on HTC One M7, M8 and Sony Xperia Z with Android 5.x, as well as Galaxy Nexus with CyanogenMod 13.
  • Improves detection of MIFARE Classic support to work around some vendor bugs.
  • Fixes an authentication bug affecting Mifare Classic cards using MIFARE Application Directory or NFC Forum keys in slot A.
  • Fix a permissions issue affecting some new installs on Android 6 and later.
  • Clean up and improvement of extras Python scripts.


  • Improve reliability authenticating with Mifare Classic cards.
  • Adds support for Octopus (Hong Kong), Shenzhen Tong and Transit Access Pass (Los Angeles, CA, US).
  • Adds a generic reader for Cubic Nextfare MFC (based on Go card reader).
  • Export to USB Storage now allows you to pick a location on Android 4.4 (KitKat) and later.
  • Go card: Fares are now retrieved from the card, so should work with all stations. Added 7 extra stations. Now detects Adult and Concession cards.
  • Turned on Proguard to reduce binary size.
  • can now work when feed_info.txt is missing from the archive.
  • now emits a per-card label attribute, which Metrodroid handles, to make differential card analysis much easier.


  • Now requires Android 4.1 (API Level 16). Map display was broken on earlier versions.
  • Added support for viewing raw FeliCa data.
  • Added support for Mifare Ultralight, including raw data.
  • Fixed an issue where 2 trips in the same month, different days, but same day of week, with no other trips between them, would not show the date header on the earlier trip (Issue #15)
  • Go card: Added 11 extra stops, thanks to data donations from Brisbane Coder Club.
  • Go card: Implement fare calculation, with some limitations.
  • Added option for custom tile server URLs on map displays.
  • Added support for FeliCa to


  • Farebot M is now Metrodroid.
  • Implemented support for reading the card number from Myki (Melbourne, AU).
  • Last digit of Go Card (Brisbane, AU) is now read.
  • Improved handling of Mifare DESFire cards, including adding support for value files.
  • Fixed support for NETS Flashpay (Singapore) cards which are also credit cards (patch by @chrisplus).
  • Japanese translation improved greatly (thanks to @naofum).
  • Trips and Refills are now combined into History for all cards.
  • Google Maps have been replaced by Leaflet and StackPtr tiles.
  • nfc-felica-lib no longer included as a static JAR, and is now a submodule.


  • Update Google Play Services to a version just requiring the Maps component, significantly reducing size and permissions.


  • Fix an issue where notes were jumbled for the Supported Cards list.


Not released on Google Play Store.

  • Added basic support for Go card (Brisbane and South East Queensland, AU). Requires encryption keys (which are unique to each card) and device with Mifare Classic support. Limited stop support.
  • Added card identification support for Adelaide Metrocard, AT HOP and Myki.
  • Fixed importing individual cards from XML files.
  • In the map view, the start of the trip is now the green marker, and the end of the trip is now the red marker. Previously, this was reversed.
  • Redesigned the supported card list to be more intuitive.
  • Refactored code for support databases (Felica, Go card, OVC).

Development tools, in extras folder of source repository (not included on Play Store / APK release):

  • New tools: compile_stops_from_gtfs, mfcdump_to_farebotxml
  • farebotxml_to_files: now supports individual card exports
  • find_in_bitfield: now shows positions relative in record
  • stops-dot-farebot-m: New site for reporting unknown stops, used for Go card.


Current prod version on Google Play

  • Minor bug fixes and refactoring.
  • Crashlytics and Fabric (application performance monitoring) have been removed.

2.9.22 (beta only)

  • Add support for Manly Fast Ferry (Sydney, AU). Requires encryption keys (which are unique to each card) and device with Mifare Classic support.
  • Clipper: Add Oakland Airport transfer station from upstream pull request.
  • Added About screen, so now you can see what version you are running. (Issue #3)
  • Changed "Supported Cards" list to be in alphabetical order.
  • Date and time formatting used in the application now obeys system settings. (Issue #5)
  • Detects an absence of Mifare Classic hardware support, and reports this in the "Supported Cards" list and About screen. (Issue #4)
  • Improved Mifare Classic key management. Keys no longer need to be in the correct order, and if a card uses the same key for all sectors, it only needs to be included once.
  • Fixed an issue where the back button did not always work on the License screen.
  • Reduced the size of the card images by about 1MB.

Development tools, in extras folder of source repository (not included on Play Store / APK release):

  • Added, a tool to create binary files of card dumps from Farebot.
  • Added, a tool to find integers in an unknown bitfield.
  • Added, a tool to "compile" a text file with a newline-separated list of keys to Farebot's binary format.

2.9.21 (first forked version, beta only)

  • Add support for Opal (Sydney, AU)
  • Builds on current Android Studio
  • Handles fully locked cards better by throwing an error which indicates the status more clearly
  • Fix up some licensing issues
You can’t perform that action at this time.