Offline tools and research for understanding your own Yoto NFC cards — a
decoder for Flipper Zero .nfc dumps, structural analysis of the yoto.io
activation URLs, and a small cross-platform GUI dumper (PC/SC, Proxmark3, or
Flipper import).
Personal-hardware only · offline-first · no offensive tooling. See Ethics & scope.
Yoto cards are plain NXP MIFARE Ultralight / Ultralight EV1 NFC tags. Each
holds an NDEF URI record pointing at https://yoto.io/<cardId>?<token>, which
the Yoto player/app resolves to decide what to play. This project:
- Decodes Flipper
.nfcdumps to that URL, fully offline. - Characterises the URL structure (cardId + token) and documents, from first principles, how those URLs are generated — and shows they are server-minted and not forgeable offline.
- Ships a GUI dumper to read your own cards into
.nfcfiles and decode them, with tokens redacted by default.
It is a personal reverse-engineering / documentation project, not a way to clone or defeat anything.
# 1) Decode Flipper .nfc dumps to their yoto.io URLs (offline)
python3 tools/yoto_decode.py samples # try it on the synthetic sample
python3 tools/yoto_decode.py yoto_cards --json decoded/cards.json --csv decoded/cards.csv
# 2) Structural analysis of the codes (aggregate-only; prints no full token)
python3 tools/token_analyze.py # segment layout / markers
python3 tools/url_patterns.py # keyspace / entropy
python3 tools/code_probe.py # reencode / math / checksum battery
# 3) GUI dumper (reads your own cards -> .nfc, decodes, tokens redacted)
python3 dumper/yoto_dumper.py # see dumper/README.mdEverything runs on stock Python 3 (Tkinter for the GUI). Optional extras:
pyscard (ACR122U reader), pillow (cover thumbnails), pyinstaller
(standalone build).
- Offline decoder (
tools/yoto_decode.py) — parses the tag/NDEF/URI layers. - Analysis battery —
token_analyze.py,url_patterns.py,derivation_test.py,code_probe.py: segment masks, keyspace/entropy, keyed-derivation tests, re-encode/timestamp/checksum probes. All aggregate-only (never print a full token). - GUI dumper (
dumper/) — Tkinter app; backends: PC/SC (ACR122U), Proxmark3 (RDV4/Iceman), and Flipper.nfcimport. Choosable destination, mass-dump mode, auto-naming, Yoto/Dark themes, opt-in online title/cover-art lookup. Packaged with PyInstaller (hidden console + icon). privacy_check.py— fails if a full card token ever leaks into a shareable file.
yoto.io/<cardId>?<token>: <cardId> is the server-assigned 5-char content id;
<token> is a server-minted, UID-independent, cardId-scoped access token that
is required to resolve the card and is not forgeable offline (0 of ~784
guessed URLs were ever valid; cardId/token are mutually independent; no counter,
timestamp, or checksum structure). The only fixed bytes are format markers
(84/0xF3; an older-generation 00/0xD3 marker). Full write-up:
docs/card-format.md.
tools/ Offline decoder + analysis tools (+ privacy_check.py)
dumper/ Cross-platform GUI dumper (see dumper/README.md)
flipper/ Yoto Scanner FAP — Flipper Zero app (see flipper/yoto_scanner/)
docs/ card-format.md (format + findings)
samples/ SYNTHETIC sample dump for demos (no real data)
(The tools/build_catalog.py visual-catalog builder ships too; its output
catalog/ holds your own card scans and stays local — it isn't in the public repo.)
Decoded yoto.io/<id>?<token> URLs contain per-card tokens that act like
secrets. This repository ships only synthetic sample data — real card
dumps and their tokens are personal and are not included. If you use these
tools on your own cards:
- Keep your dumps and
decoded/output local; treat the tokens as secrets. - Run
python3 tools/privacy_check.pybefore sharing anything. - The GUI redacts tokens on screen by default.
Publishing this repo? Read docs/PUBLISHING.md first —
a working copy that has processed real cards must be sanitised (and its git
history rebuilt) before going public.
- Analysis of your own hardware only.
- Offline-first: the decoder and analysis never touch the network. The only networked feature is an explicitly opt-in title/cover-art lookup that contacts Yoto's own resolver directly.
- No offensive tooling: no cloning-for-fraud, no service disruption, no auth-bypass probing of Yoto's platform. Recon is limited to public docs.
Not affiliated with or endorsed by Yoto. "Yoto" is a trademark of its owner.
MIT © 2026 Jona.