Bring your Hot Wheels id Race Portal back to life!
An open-source tool to connect to the Hot Wheels id Race Portal after Mattel discontinued the official app on January 1, 2024. We reverse-engineered the Bluetooth protocol so you can track speeds, lap times, and build your car collection again.
Redline ID is an independent, community project and is not affiliated with, endorsed by, or sponsored by Mattel, Inc. "Hot Wheels" and "Hot Wheels id" are trademarks of Mattel, Inc., used here only to describe the discontinued hardware this tool works with.
Redline ID is a fork of
mtxmiller/hotwheels-portalthat has grown into two ways to bring your portal back to life:
- π± A native iOS app (React Native + Expo) β a polished speedometer, a lap-timing Race Mode, and a live BLE event log, running on a real iPhone. Jump to the iOS app β
- π₯οΈ The original Python terminal tools (the reference implementation) β live dashboard, lap race game, and the reverse-engineering toolkit. Jump to the terminal tools β
π Building on it? See the Architecture Overview Β· Decision Records (ADRs) Β· Roadmap Β· BLE & Protocol port. The reverse-engineered BLE protocol is in PROTOCOL.md.
The Hot Wheels id portal, reborn as a native iPhone app. The current build ships a full tabbed experience (Speed, Race, Garage, History, More), plus car-identify and detail flows on top.
![]() Speed tab Live gauge, best speed, recent passes, and quick portal controls. |
![]() π Race Mode Race setup, lap targets, and the new race-night lineup queue controls. |
Current UI captured from the iOS Simulator (iPhone 17 Pro, July 2026).
Current app surfaces:
- Speed tab β Connect to a portal and track live passes with the animated gauge, best speed, pass log, and demo-mode fallback.
- π Race tab β Run timed lap races (5 / 10 / 15 / 20), get per-lap/live stats + results, and use the new race-night lineup queue for turn rotation.
- Garage tab β Persistent car collection with best speed/lap/race stats and per-car detail.
- History tab β Durable session history with race/pass rollups and drill-in details.
- More tab β Achievements, raw Live portal event log, and Settings (units, calibration, player profile, haptics, reduce motion, demo defaults).
- Identify flow β Catalog-backed manual identify picker for car details, including casting coverage messaging ("identify once, label matching copies").
Under the hood it speaks both portal firmwares β the legacy open control service and the
modern, encrypted MPID protocol (ECDH key exchange) β through the shared
@redlineid/protocol TypeScript port.
Expo Go can't load this app (it ships a native BLE module), so you need a development build. On a Mac with Xcode the fastest, no-cost path is:
cd apps/mobile
npx expo run:ios --device # local dev build on a free Apple ID, installs on the phoneThen tap Connect portal, power on the portal, and roll a car through the gate. No hardware?
Flip the home screen to Demo, or run npx expo start --web, to explore the UI with simulated
passes. The full runbook β EAS cloud builds, the Simulator profile, and signing notes β is in
docs/guides/ios-dev-build.md.
π¨βπ©βπ§ Handing the iPad to kids? Lock it to just this app with iOS Guided Access. There's one Bluetooth quirk to set up first (otherwise the speedometer can go dead and iOS may refuse to start Guided Access) β the one-minute fix is in the Guided Access / kiosk guide.
We've fully reverse-engineered the BLE protocol! See PROTOCOL.md for details.
Key discoveries:
- Device advertises as
HWiD - 3 BLE services for auth, data transfer, and control
- Car detection via NFC UID (6 bytes)
- Speed data as IEEE 754 float32
- Full NDEF records with Mattel car IDs
There are two transports in the wild, and which one your portal speaks depends on its firmware:
- Legacy (
PROTOCOL.md, fw ~1.2.5): theβ¦-000c"Portal Control" service exposes the car/speed/serial characteristics openly, no authentication. The classic tools (monitor.py,dashboard.py) read these directly. - Modern / MPID (
PROTOCOL_NEW.md, e.g. fw 1.0.9): there is noβ¦-000cservice. The same telemetry is delivered as an encrypted Protocol Buffers stream after an ECDH (P-256) key exchange on the auth service. Crucially, the portal authenticates itself to the app but does not authenticate the client, so no Mattel secret is needed β everything required is in the 136-byte factory token the portal hands out. Implemented inhwportal/mpid.py; run it withmpid_monitor.py.
The modern-protocol reverse-engineering,
PROTOCOL_NEW.md,HWiD.proto,hwportal/mpid.py, and thetools/RE scripts are the work of Mitch Capper (@mitchcapper) (modern_protocol_support branch, MIT), vendored here with attribution. Offline correctness is re-verified in this repo viapython/tools/test_mpid.py.
HotWheelsID/
βββ apps/
β βββ mobile/ # iOS app (Expo/React Native): speedometer, Race Mode, live BLE log
βββ packages/
β βββ protocol/ # @redlineid/protocol β shared TS BLE protocol port (+ tests)
βββ python/ # Original Python reference tools (documented above)
β βββ hwportal/ # Library: constants.py (BLE UUIDs), portal.py (client)
β β βββ mpid.py # Modern-firmware MPID transport (ECDH + AES-CTR + protobuf)
β βββ dashboard.py # Live terminal dashboard
β βββ race_mode.py # Lap race game
β βββ portal_app.py # Event monitor
β βββ scanner.py # BLE scanner
β βββ monitor.py # Raw event monitor (legacy β¦-000c firmware)
β βββ mpid_monitor.py # Live monitor for modern (MPID) firmware
β βββ diag_portal.py # GATT diagnostic (control-service / auth-gate verdict)
β βββ HWiD.proto # Protobuf schema for the modern application layer
β βββ PROTOCOL_NEW.md # Modern (MPID) protocol spec
β βββ tools/ # RE tooling + offline test suite (test_mpid.py)
β βββ requirements.txt
βββ docs/ # Architecture notes, ADRs, and the roadmap
βββ PROTOCOL.md # Canonical reverse-engineered BLE protocol (legacy firmware)
βββ package.json # npm workspaces root
βββ tsconfig.base.json # Shared TypeScript config
The TypeScript side uses npm workspaces (Node 20+). From the repo root:
npm install # install every workspace (apps/* and packages/*)
npm run typecheck # typecheck all workspaces (protocol + mobile)
npm test # run all workspace tests
npm run test:protocol # just the @redlineid/protocol unit testspackages/protocol (@redlineid/protocol) is a pure
TypeScript port of the BLE protocol β UUIDs, typed events, and byte decoders β
with no React Native or UI dependencies. It is unit-tested against the sample
vectors in PROTOCOL.md.
apps/mobile is the Expo (Expo Router) app β see π± iOS App
above for the current surface tour and how to run it on a device. It now has a five-tab shell
(index speed, race, garage, history, more) plus pushed detail screens (live,
settings, achievements, identify, and per-car/session details), and it decodes both portal
firmwares through @redlineid/protocol.
Preview in a browser (no device or Xcode needed β fastest way to see the UI):
cd apps/mobile && npx expo start --webThe home screen auto-runs simulated passes in demo mode, so the gauge animates with zero
hardware. Real Bluetooth needs a development build on a physical iPhone (npx expo run:ios --device); the Live portal screen shows a clear notice on web/the Simulator (no BLE radio
there). The full runbook β EAS cloud builds, the Simulator profile, and signing notes β is in
docs/guides/ios-dev-build.md (EAS profiles live in
apps/mobile/eas.json). See also
ADR-0011. To put the app in family/friends' hands
over TestFlight, follow the
iOS TestFlight & distribution runbook.
The full, phased plan toward the attractive UI and the installable iOS app lives in docs/ROADMAP.md. Status of the original Python tooling:
- BLE connection and event monitoring
- Car detection (NFC UID, serial)
- Speed tracking
- Live dashboard with speedometer
- Lap race game mode with leaderboard
- Persistent car database
- Car collection/garage view
- Achievement system
- Full automatic car identity enrichment from Mattel ID / catalog data (in progress; manual catalog identify flow is shipped)
The iOS app is already running on-device β a live BLE speedometer, Race Mode, and a raw event log (see π± iOS App). It is also installed through TestFlight and has been used to run a full race end-to-end. The remaining work is tracked in the Roadmap and ADRs, with current focus on richer car identity and other Phase 5 depth work; Android parity is explicitly backlogged until test hardware exists.
We'd love your help! Here's how:
- Got a Portal? Run the tools and share interesting findings
- Know BLE/NFC? Help decode remaining protocol mysteries
- Want features? Check the issues and submit PRs
Mattel discontinued the Hot Wheels id app on January 1, 2024, leaving thousands of Race Portals as paperweights. This project aims to restore functionality through reverse engineering, letting Hot Wheels fans continue to enjoy their hardware. This fork is because my children wanted an ipad app. Also the Portal firmware is different on our device and required significant work to decrypt beyond the original project.
If this project helped bring your Hot Wheels Portal back to life, consider supporting development:
- β Star this repository
- π Report issues and suggest features
MIT License - see LICENSE for details.
This project is not affiliated with Mattel or Hot Wheels. It's a community effort to restore functionality to discontinued hardware. Hot Wheels is a trademark of Mattel, Inc.

