Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions docs/guides/ios-testflight.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,24 @@ Each tester installs the **TestFlight** app from the App Store, accepts the invi
Redline ID. Remind them: **Bluetooth + a physical portal** are required for live telemetry β€”
without a portal they'll see the demo/mock mode.

### App metadata URLs

For the TestFlight **Test Information** page (and a future App Store listing), the project
ships a small public site (source in [`site/`](../../site)), served by GitHub Pages from the
`gh-pages` branch:

- **Privacy Policy URL:** <https://burkben.github.io/HotWheelsID/privacy/>
- **Marketing URL:** <https://burkben.github.io/HotWheelsID/>

Both are optional for TestFlight but required for a public App Store release. Edit the page
content under `site/` (the canonical policy text lives in
[`docs/legal/privacy-policy.md`](../legal/privacy-policy.md)); publish changes by pushing the
`site/` subtree to the `gh-pages` branch root:

```bash
git push origin "$(git subtree split --prefix site main):refs/heads/gh-pages" --force
```

---

## Step 5 β€” Android parity (optional)
Expand Down
36 changes: 24 additions & 12 deletions docs/legal/privacy-policy.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,52 @@
# Privacy Policy β€” Redline ID

_Last updated: 2026-06-15_
_Last updated: 2026-06-20_

Redline ID ("the app") is a free, open-source utility that connects over Bluetooth
Low Energy (BLE) to a discontinued toy car race portal and shows live speed and lap
times. This policy explains what the app does β€” and does not do β€” with your data.

## Summary

**Redline ID does not collect, store, transmit, or share any personal information.**
Everything the app does happens locally on your device.
**Redline ID does not collect, transmit, or share any personal information.** The app
has no account, no analytics, no ads, and makes no network requests. Any data the app
saves is stored only on your own device.

## Data we collect

**None.** The app has no account system, no analytics, no advertising, no crash
reporting, and makes no network requests. We operate no servers and never receive
any data from the app.

## Information processed on your device
## Information stored on your device

To function, the app processes the following **entirely on your device, in memory**.
None of it leaves your phone, and none of it is written to permanent storage:
To work β€” and to remember your races between sessions β€” the app saves the following in
a private database **on your device only**. None of it leaves your phone, and none of
it is sent to us or any third party:

- **Bluetooth data from the portal** β€” when you connect, the app reads the car
identifier, speed, and lap events broadcast by the portal hardware over BLE. This
is used only to drive the on-screen speedometer, race timer, and event log.
- **Race details you enter** β€” a player name and lap count you type for Race Mode are
held in memory for the current session and are cleared when you close the app.
- **Garage** β€” cars are recognized by the identifier their id chip broadcasts over
Bluetooth, along with any nickname you give them and simple stats such as top speed
and number of passes.
- **Race history** β€” race sessions and the speed and lap/timing events recorded during
them, so you can review past runs.
- **Achievements** β€” which in-app achievements you have unlocked.
- **Settings** β€” your preferences, such as speed units (mph/km/h), speed calibration,
and whether haptics are enabled.
- **Live Bluetooth data** β€” while connected, the app reads the car identifier, speed,
and lap events broadcast by the portal hardware to drive the on-screen speedometer,
race timer, and event log.

The app requests Bluetooth permission solely to communicate with the race portal. It
does not use location, contacts, the camera, the microphone, or any other personal
data, and it does not use Bluetooth to determine your location.

You can permanently remove all stored data at any time by deleting the app from your
device.

## Data sharing

We do not sell, rent, share, or disclose any data, because we never collect any.
We do not sell, rent, share, or disclose any data, because we never collect or receive
any. All app data stays on your device.

## Children's privacy

Expand Down
Empty file added site/.nojekyll
Empty file.
Binary file added site/assets/favicon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added site/assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
274 changes: 274 additions & 0 deletions site/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,274 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Redline ID β€” Live telemetry for the Hot Wheels id Race Portal</title>
<meta
name="description"
content="Redline ID turns your iPhone into a live dashboard for the Hot Wheels id Race Portal β€” real-time speed, race timing, a garage of your cars, history, and achievements. No account, no tracking; everything stays on your device."
/>
<link rel="icon" href="assets/favicon.png" type="image/png" />
<meta property="og:title" content="Redline ID" />
<meta
property="og:description"
content="Live telemetry for the Hot Wheels id Race Portal. No account, no tracking β€” everything stays on your device."
/>
<meta property="og:type" content="website" />
<style>
:root {
--bg: #0b0f1a;
--surface: #111827;
--surface-alt: #0f1626;
--border: #1e2a44;
--text: #ffffff;
--text-secondary: #8aa0c6;
--text-muted: #6b7a99;
--accent: #ff7a1a;
--accent-blue: #26c6ff;
--danger: #ef4444;
}
* {
box-sizing: border-box;
}
html {
-webkit-text-size-adjust: 100%;
}
body {
margin: 0;
background: var(--bg);
color: var(--text);
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
Helvetica, Arial, sans-serif;
line-height: 1.6;
}
a {
color: var(--accent-blue);
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
.wrap {
max-width: 880px;
margin: 0 auto;
padding: 0 24px;
}
header.hero {
text-align: center;
padding: 88px 0 56px;
background: radial-gradient(
1200px 480px at 50% -10%,
rgba(255, 122, 26, 0.16),
transparent 60%
),
radial-gradient(
900px 420px at 50% 0%,
rgba(38, 198, 255, 0.1),
transparent 55%
);
}
.logo {
width: 96px;
height: 96px;
border-radius: 22px;
margin: 0 auto 22px;
display: block;
box-shadow: 0 14px 40px rgba(0, 0, 0, 0.55),
0 0 0 1px rgba(255, 255, 255, 0.04);
}
h1 {
font-size: clamp(40px, 8vw, 68px);
line-height: 1.02;
margin: 0 0 14px;
letter-spacing: -0.02em;
font-weight: 800;
background: linear-gradient(95deg, #ffb070, var(--accent) 45%, var(--danger));
-webkit-background-clip: text;
background-clip: text;
color: transparent;
}
.tagline {
font-size: clamp(18px, 3.4vw, 23px);
color: var(--text-secondary);
max-width: 620px;
margin: 0 auto 30px;
}
.cta {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 13px 22px;
border-radius: 999px;
font-weight: 700;
font-size: 16px;
margin: 6px;
}
.cta-primary {
background: var(--accent);
color: #1a1206;
}
.cta-primary:hover {
background: #ff8c3a;
text-decoration: none;
}
.cta-secondary {
background: var(--surface);
color: var(--text);
border: 1px solid var(--border);
}
.cta-secondary:hover {
border-color: var(--accent-blue);
text-decoration: none;
}
section {
padding: 26px 0;
}
h2 {
font-size: 14px;
text-transform: uppercase;
letter-spacing: 0.12em;
color: var(--text-muted);
margin: 0 0 18px;
font-weight: 700;
}
.features {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 16px;
list-style: none;
padding: 0;
margin: 0;
}
.feature {
background: var(--surface);
border: 1px solid var(--border);
border-radius: 16px;
padding: 20px;
}
.feature h3 {
margin: 0 0 6px;
font-size: 17px;
}
.feature p {
margin: 0;
color: var(--text-secondary);
font-size: 15px;
}
.dot {
display: inline-block;
width: 9px;
height: 9px;
border-radius: 999px;
margin-right: 9px;
vertical-align: middle;
}
.privacy-card {
background: linear-gradient(180deg, var(--surface), var(--surface-alt));
border: 1px solid var(--border);
border-radius: 18px;
padding: 26px;
}
.privacy-card p {
margin: 0 0 14px;
color: var(--text-secondary);
}
footer {
border-top: 1px solid var(--border);
margin-top: 40px;
padding: 30px 0 60px;
color: var(--text-muted);
font-size: 13px;
text-align: center;
}
footer p {
margin: 6px 0;
}
</style>
</head>
<body>
<header class="hero">
<div class="wrap">
<img class="logo" src="assets/icon.png" alt="Redline ID app icon" />
<h1>Redline ID</h1>
<p class="tagline">
Turn your iPhone into a live dashboard for the Hot Wheels&nbsp;id Race
Portal β€” real-time speed, race timing, and a garage that remembers every
car.
</p>
<a class="cta cta-primary" href="https://github.com/burkben/HotWheelsID"
>View on GitHub</a
>
<a class="cta cta-secondary" href="privacy/">Privacy Policy</a>
</div>
</header>

<main class="wrap">
<section>
<h2>What it does</h2>
<ul class="features">
<li class="feature">
<h3><span class="dot" style="background:#ff7a1a"></span>Live speedometer</h3>
<p>
Connects over Bluetooth and shows each car's speed in real time on an
animated gauge.
</p>
</li>
<li class="feature">
<h3><span class="dot" style="background:#26c6ff"></span>Race mode</h3>
<p>Time multi-lap races and see results, lap splits, and the fastest pass.</p>
</li>
<li class="feature">
<h3><span class="dot" style="background:#22c55e"></span>Garage</h3>
<p>
Each car is recognized by its id chip; give it a nickname and track its
personal bests.
</p>
</li>
<li class="feature">
<h3><span class="dot" style="background:#eab308"></span>History</h3>
<p>Every run is saved on-device so you can revisit past sessions and speeds.</p>
</li>
<li class="feature">
<h3><span class="dot" style="background:#ef4444"></span>Achievements</h3>
<p>Unlock milestones as you race, hit top speeds, and grow your garage.</p>
</li>
<li class="feature">
<h3><span class="dot" style="background:#8aa0c6"></span>Yours to share</h3>
<p>
Share a race result or session summary, and switch between mph and km/h
with custom calibration.
</p>
</li>
</ul>
</section>

<section>
<h2>Privacy first</h2>
<div class="privacy-card">
<p>
Redline ID has no account, no analytics, no ads, and makes no network
requests. Bluetooth is used only to talk to the race portal. Everything the
app saves β€” your garage, history, achievements, and settings β€” stays on your
device and is never sent anywhere.
</p>
<a href="privacy/">Read the full privacy policy β†’</a>
</div>
</section>
</main>

<footer>
<div class="wrap">
<p>
<a href="https://github.com/burkben/HotWheelsID">GitHub</a> Β·
<a href="privacy/">Privacy</a> Β·
<a href="https://github.com/burkben/HotWheelsID/issues">Support</a>
</p>
<p>
Redline ID is an independent, community-built project. It is not affiliated
with, endorsed by, or sponsored by Mattel,&nbsp;Inc. or any of its brands.
</p>
</div>
</footer>
</body>
</html>
Loading
Loading