chameleon
Rango
Chameleon Ultra AI Copilot — read, crack, dump, analyze, emulate and clone RFID cards through natural language, with safety gates and a host-side card library.
Prerequisites · Quick start · Other harnesses · MCP tools · Coverage · Development
Chameleon Ultra — image © RfidResearchGroup
Rango turns a Chameleon Ultra into an agent-driven RFID copilot. It is only the AI layer: the official Chameleon Ultra CLI is not vendored into this repo — clone it separately; Rango locates and drives it in-process (see Prerequisites).
Two ways to use it:
Kimi Code plugin (best experience) — an MCP server + skill + analysis subagent; the Kimi Code agent operates the device for you.
Standalone AI shell — an enhanced REPL around the stock CLI where
?talks to an LLM (Moonshot/Kimi API or any OpenAI-compatible endpoint).
Architecture
flowchart LR
U(["You — natural language"]) --> A["Agent harness<br/>Kimi Code · Claude Code · Codex · OpenCode"]
SK["SKILL.md<br/>workflows · safety gates · coaching"] -. guides .-> A
A -->|"MCP over stdio"| M["chameleon MCP server<br/>16 tools · one persistent serial owner"]
M --> S["ai_shell<br/>bridge · ops · library · dictionaries · analyze"]
S --> C["official Chameleon Ultra CLI<br/>fetched · unmodified · not vendored"]
C -->|"USB serial"| D(["Chameleon Ultra"])Prerequisites
git clone https://github.com/fedroraddict/rango rango && cd rango
scripts/install-cli.sh # fetches the stock upstream CLI into ../ChameleonUltra
# (git clone, with a codeload tarball fallback when
# github.com is unreachable)
uv sync
scripts/setup-plugin.sh # writes plugin/.rango-root so the MCP launcher still
# finds this repo after /plugins install copies plugin/The installer is idempotent and prints what it did. If you keep the upstream checkout
somewhere else, pass the path (scripts/install-cli.sh /path/to/ChameleonUltra) and set
export CHAMELEON_SOFTWARE=/path/to/ChameleonUltra/software.
Requires Python ≥ 3.10, uv, and the device on a data-capable USB-C cable.
Quick start
# Standalone AI shell (stock CLI commands pass through; '? ...' asks the AI)
cd rango && uv run python -m ai_shell
# needs MOONSHOT_API_KEY (or another OpenAI-compatible endpoint in
# ~/.chameleon_ai/config.toml) for AI features; plain CLI works without it
# Kimi Code plugin
# in Kimi Code: /plugins install <this-repo>/plugin then /reloadUse from Codex, Claude Code, OpenCode
The MCP server is a standard stdio server — not Kimi-only. Per-harness config snippets
and install notes live in adapters/: Claude Code (.mcp.json /
claude mcp add + drop-in skill and agent), Codex CLI ([mcp_servers.chameleon] +
skill with stripped frontmatter), OpenCode (opencode.json + converted agent file).
MCP tools (16)
Tool | Purpose |
| Execute any official CLI command. Read-only runs directly; writes/attacks require |
| One-call snapshot: firmware, battery, active slot, per-slot summary — the pre-flight check |
| Exact syntax of one command / the full command tree |
| Host card library ( |
| Composite: library card → free device slot, verified order (type → eload → block0 → enable → nick), auto free-slot pick |
| Offline dump analysis (raw |
| Mifare key dictionaries ( |
What the copilot layer adds
Pre-flight ritual — workflows start with
chameleon_state; gated steps are announced first.Detection coaching — failed scans trigger placement guidance, HF/LF alternation, app cross-check — not silent retry loops.
Key-recovery decision tree — default dictionary → targeted dictionary built from a web search of the card system's known keys →
hf mf autopwn→ manual PRNG attacks (darkside / nested / senested / hardnested, with expected durations) → last resort: mfkey32v2 reader-side recovery (hf mf elog --decrypt).Library-first model (mirrors the CU GUI's Saved Cards): dumps get user-chosen names in the library; slots are working memory.
Slot discipline — list first, prefer free slots, ask before overwriting, always name, always enable (
(disabled)slots don't emulate), persist withhw slot store.Collaboration modes — copilot (confirm each gated step) or autopilot (approve a stated workflow once).
hw dfu,hw factory_reset, and physical-card writes always get their own confirmation.Offline analysis subagent (
card-analyst) for deep dump inspection.
Card coverage
Band | Families |
HF | Mifare Classic (full attack suite) · Ultralight/NTAG (incl. |
LF | EM410x · EM4x05 · HID Prox · ioProx · PAC/Stanley · Viking · Jablotron · IDTECK · T5577 writing · raw |
Known quirks (verified on hardware)
hf mf fchk --dicis a no-op stub in some upstream builds — pass keys positionally (dict_showexists for this).Serial desync (frame-error flood / connect timeout) happens if the process holding the port is killed mid-connection — unplug/replug the device;
hw disconnectbefore reloading the plugin.A slot that starts as
(disabled)undefmust behw slot enabled after loading or it won't emulate.The CLI tokenizes with a plain whitespace split — never quote arguments (
hw slot nick ... -n bike, not-n "bike", or the quotes become part of the nick) and keep paths space-free.
Development
cd rango
uv run ruff check ai_shell/ plugin/mcp/ # lint
uv run python -m ai_shell.selfcheck # cited commands exist in the real CLI tree,
# gate semantics, simulated /plugins install boot
uv run python -m ai_shell.test_analyze # dump-analyzer regression testsCI runs the same three gates on every push and PR (see .github/workflows/ci.yml).
Layout: ai_shell/ wrapper library · plugin/ Kimi Code plugin
(see plugin/README.md) · scripts/ upstream-CLI installer + plugin
setup · adapters/ other-harness configs (see adapters/README.md)
· AGENTS.md contributor/agent notes.
Credits
Everything device-side — the Chameleon Ultra firmware and the official CLI that Rango
drives — comes from
RfidResearchGroup/ChameleonUltra,
© its authors (see its AUTHORS.md). Rango is only the AI copilot layer on top: it
contains no upstream code, and the CLI is fetched by scripts/install-cli.sh and used
unmodified.
Also standing on:
the Proxmark3 community — known-key and MAD AID conventions (
mad.jsoncan be dropped into~/.chameleon_ai/dicts/);NXP's MF1S50YYX datasheet — the access-bits and value-block decode tables in
ai_shell/analyze.pyfollow it;the Model Context Protocol — the interface every supported agent harness speaks;
Kimi Code — the plugin format and the default LLM endpoint for the standalone shell.
License & responsible use
Rango itself is MIT. The upstream Chameleon Ultra CLI is a separate project under GPL-3.0 — fetched, not vendored — so its license governs the CLI, not this repo. Operate only on cards and devices you own or are explicitly authorized to test.