[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80623":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":12,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":14,"compositeScore":17,"rankGlobal":9,"rankLanguage":9,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":9,"pushedAt":9,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":15,"starSnapshotCount":15,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},80623,"fh6-virtual_tcu","Forza-Love\u002Ffh6-virtual_tcu","Forza-Love","An external adaptive transmission controller that reads FH6 telemetry and automatically shifts gears based on driving style, throttle input, RPM, speed and brake pressure.",null,"Python",66,4,51,1,0,15,2.1,"GNU Affero General Public License v3.0",false,"main",true,[],"2026-06-12 02:04:04","# Virtual TCU — Forza Horizon 6\n\n\u003Cdiv align=\"center\">\n\n[![Release](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fv\u002Frelease\u002FForza-Love\u002Ffh6-virtual_tcu?label=release&sort=semver)](https:\u002F\u002Fgithub.com\u002FForza-Love\u002Ffh6-virtual_tcu\u002Freleases)\n[![CI](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Factions\u002Fworkflow\u002Fstatus\u002FForza-Love\u002Ffh6-virtual_tcu\u002Fci.yml?branch=main&label=CI)](https:\u002F\u002Fgithub.com\u002FForza-Love\u002Ffh6-virtual_tcu\u002Factions\u002Fworkflows\u002Fci.yml)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Flicense\u002FForza-Love\u002Ffh6-virtual_tcu)](LICENSE)\n[![Discord](https:\u002F\u002Fimg.shields.io\u002Fdiscord\u002F1508360305712037988?label=Discord&color=5865F2)](https:\u002F\u002Fdiscordapp.com\u002Finvite\u002Fghj3PGe9)\n[![GitHub stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002FForza-Love\u002Ffh6-virtual_tcu?style=social)](https:\u002F\u002Fgithub.com\u002FForza-Love\u002Ffh6-virtual_tcu\u002Fstargazers)\n\n\u003Cbr>\n\n[![Windows](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fplatform-Windows%2010%2F11-0078D6?logo=windows&logoColor=white)](#quick-start)\n[![Node.js](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-%3E%3D24.0.0-339933?logo=node.js&logoColor=white)](package.json)\n[![pnpm](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpnpm-10.33-F69220?logo=pnpm&logoColor=white)](package.json)\n[![Python](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-%3E%3D3.12-3776AB?logo=python&logoColor=white)](pyproject.toml)\n[![Vue](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fvue-3.5-4FC08D?logo=vuedotjs&logoColor=white)](apps\u002Fdashboard\u002Fpackage.json)\n[![Electron](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Felectron-42-47848F?logo=electron&logoColor=white)](package.json)\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-5.9-3178C6?logo=typescript&logoColor=white)](package.json)\n[![Ruff](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FRuff-lint%20%2B%20format-D7FF64?logo=ruff&logoColor=black)](pyproject.toml)\n\n\u003Cbr>\n\n[![FH6](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fgame-Forza%20Horizon%206-E10600?logo=xbox&logoColor=white)](#forza-horizon-6--in-game-setup-one-time)\n[![i18n](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fi18n-en%20%7C%20zh--CN-22c55e)](apps\u002Fdashboard\u002F)\n[![ViGEm](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Foutput-keyboard%20%7C%20gamepad-64748b)](#3-gamepad-mode-optional)\n\n**English · [简体中文](README.zh-CN.md)**\n\n\u003C\u002Fdiv>\n\n> This project's core functionality is provided by **Insightful**, maintained for the [**Forza Mods**](https:\u002F\u002Fdiscord.gg\u002Fforzamods) Discord community.\n\nAn external adaptive transmission controller for *Forza Horizon 6*. It reads real-time UDP telemetry from the game, decides when to shift based on driving style, throttle, RPM, speed, and brake input, and injects shift commands — **keyboard keys** (E\u002FQ) or **virtual gamepad buttons** (B\u002FX) via ViGEmBus.\n\n**v13** ships as a Windows tray app (Electron) with a floating HUD and auto-update. The live telemetry dashboard runs in your browser at **http:\u002F\u002F127.0.0.1:8765** (English \u002F 简体中文). A portable Python-only build is still available for users who prefer no Electron.\n\n| | |\n| :-- | :-- |\n| 🚗 **5 drive modes** | Comfort · Dynamic · Race · Drift · Off-road |\n| 🧠 **Per-car learning** | Gear ratios, power curve, rev limiter, sport index |\n| 📡 **60 Hz TCU loop** | UDP telemetry in → shift logic → keyboard \u002F gamepad out |\n| 🖥️ **Desktop shell** | Tray app, Settings window, floating HUD, browser dashboard |\n| 🔄 **One-click updates** | `electron-updater` ships Electron + Python backend together |\n\n```mermaid\nflowchart LR\n  FH6[\"Forza Horizon 6\"] -->|\"UDP :5555\"| TCU[\"Virtual TCU\\n(Python)\"]\n  TCU -->|\"E\u002FQ or B\u002FX\"| FH6\n  TCU -->|\"WS :8765\"| UI[\"Dashboard \u002F HUD\\n(Vue + Electron)\"]\n```\n\n---\n\n## Quick start\n\n| I want to… | Use |\n|------------|-----|\n| Play — tray app, HUD overlay & auto-update | [Download Electron installer](#download--use-electron-installer) |\n| Play — Python backend only, no Electron | [Download backend-only zip](#download--use-backend-only-zip) |\n| Develop or run from this repo | [Run from source](#run-from-source) |\n| Change the Vue UI | [apps\u002Fdashboard\u002FREADME.md](apps\u002Fdashboard\u002FREADME.md) |\n\n**Platform:** Windows 10 \u002F 11 only. Run as **Administrator** (required for global key injection).\n\n---\n\n## Download & use (Electron installer)\n\nRecommended for most users. Single installer that bundles the Python backend, provides a **Settings** window for configuration, a **read-only browser dashboard** for live telemetry, an optional **HUD overlay**, and **auto-update**.\n\n### 1. Download\n\nOpen **[GitHub Releases](https:\u002F\u002Fgithub.com\u002FForza-Love\u002Ffh6-virtual_tcu\u002Freleases)** and download the latest `VirtualTCU-*-win64.exe`.\n\n### 2. Install & launch\n\nRun the installer (Administrator is requested on launch). It registers a Start Menu \u002F desktop shortcut and creates a **system tray icon** on first start.\n\nOn launch the app:\n\n1. Starts the bundled Python backend in the background.\n2. Opens the **Settings** window (drive modes, tuning, network, stats, updater, etc.).\n3. Keeps running in the tray when you close the Settings window.\n\n**Tray menu:**\n\n| Item | Action |\n|------|--------|\n| **Settings** | Open \u002F focus the Settings window |\n| **Open Dashboard in Browser** | Open the live telemetry dashboard (`http:\u002F\u002F127.0.0.1:8765`) |\n| **Toggle HUD** | Show \u002F hide the floating overlay (gear \u002F mode \u002F RPM \u002F speed) |\n| **Restart Backend** | Restart the Python backend without quitting the app |\n| **Quit** | Exit completely |\n\nLeft-click the tray icon also opens **Settings**.\n\n**Auto-update** checks GitHub Releases shortly after launch and downloads new versions in the background. The full Electron + Python bundle updates as one package (see **About** tab in Settings).\n\n### 3. Gamepad mode (optional)\n\nBy default, the TCU injects keyboard keys (**E** upshift \u002F **Q** downshift). If you prefer virtual controller buttons instead (no keyboard bindings needed), switch to gamepad mode in **Settings → Extras → Output mode**.\n\nGamepad mode requires the **[ViGEmBus](https:\u002F\u002Fgithub.com\u002FForza-Love\u002Ffh6-virtual_tcu\u002Fraw\u002Fmain\u002Fdriver\u002FViGEmBusSetup_x64.msi) driver** — a one-time system install:\n\n1. Download `ViGEmBus_Setup_*.exe` from the link above.\n2. Run as Administrator → accept the UAC prompt → install.\n3. **Reboot Windows** (required — the driver won't work until after restart).\n4. Launch Virtual TCU, open Settings → Extras, switch **Output mode** to **Gamepad**, set your preferred buttons (default: **B** upshift \u002F **X** downshift), and click **Save & Restart Backend**.\n\n> **Already have Steam, DS4Windows, or reWASD?** Those tools bundle ViGEmBus — you may already have it. If switching to gamepad mode prints an error in the console, install the driver from the link above.\n\n> **Driver missing?** The TCU automatically falls back to keyboard mode and persists the setting so you won't hit the error again on next launch.\n\n### 4. Play\n\nConfigure FH6 once ([in-game setup](#forza-horizon-6--in-game-setup-one-time)), then:\n\n1. Open **Settings** → pick a drive mode and adjust options as needed.\n2. Tray → **Open Dashboard in Browser** (or the button on the Settings **Overview** tab) for the live view.\n3. Optionally tray → **Toggle HUD** for the in-game overlay.\n4. Start a race — the dashboard and HUD go **live** when telemetry arrives.\n\n### 5. Quit\n\nTray icon → **Quit**.\n\n### Where Electron data is stored\n\nThe bundled backend saves config, profiles, and logs next to `VirtualTCU.exe` inside the install's `resources\u002Fbackend\u002F` folder (portable-style). If that folder is not writable (e.g. under `C:\\Program Files\\`), data falls back to **`%APPDATA%\\VirtualTCU\\`**.\n\n| Item | Default (Electron) |\n|------|---------------------|\n| Settings | `resources\\backend\\tcu_config.json` or `%APPDATA%\\VirtualTCU\\tcu_config.json` |\n| Per-car profiles | same folder \u002F `tcu_profiles.json` |\n| Telemetry replay logs | same folder \u002F `logs\\` |\n| Crash log (if startup fails) | same folder \u002F `crash.log` |\n\n---\n\n## Download & use (backend-only zip)\n\nFor users who want the original portable layout without Electron, HUD, or auto-update. The dashboard opens in your default browser and includes full settings (not view-only).\n\n### 1. Download\n\n`VirtualTCU-Backend-*-win64.zip` from **[GitHub Releases](https:\u002F\u002Fgithub.com\u002FForza-Love\u002Ffh6-virtual_tcu\u002Freleases)**.\n\n### 2. Extract\n\n```\nVirtualTCU-Backend-13.0.x-win64\u002F\n├── Launch VirtualTCU.bat    ← optional launcher (recommended)\n└── VirtualTCU\u002F\n    ├── VirtualTCU.exe\n    └── _internal\u002F           ← required; do not delete or move exe alone\n```\n\n### 3. Start\n\nRight-click **`Launch VirtualTCU.bat`** or **`VirtualTCU\\VirtualTCU.exe`** → **Run as administrator**. A console opens; the browser may auto-open **http:\u002F\u002F127.0.0.1:8765**.\n\n### 4. Quit\n\nFocus the **console window** and press **`Ctrl + C`**, then close it. (**Do not** use **Q** — that's the in-game downshift key.)\n\n### Where backend-only data is stored\n\nRelease builds save config, profiles, and logs **in the same folder as `VirtualTCU.exe`** (portable-style):\n\n```\nVirtualTCU\u002F\n├── VirtualTCU.exe\n├── _internal\u002F\n├── tcu_config.json\n├── tcu_profiles.json\n├── logs\u002F\n│   └── tcu_replay_*.bin.gz\n└── .tcu_last_run\n```\n\nIf the install folder is not writable (e.g. `C:\\Program Files\\`), data falls back to **`%APPDATA%\\VirtualTCU\\`** (the console shows which path is used on startup).\n\n| Item | Default (Release) |\n|------|-------------------|\n| Settings | `VirtualTCU\\tcu_config.json` |\n| Per-car profiles | `VirtualTCU\\tcu_profiles.json` |\n| Telemetry replay logs | `VirtualTCU\\logs\\` |\n| Crash log (if startup fails) | same folder as above \u002F `crash.log` |\n\n### Telemetry recording\n\n**Electron users:** start \u002F stop logging from the **Settings** window (Overview or sidebar controls).\n\n**Backend-only users:** use the Web UI sidebar — **Start logging (events)** or **Start logging (all)**, drive in FH6, then **Stop**.\n\n| Mode | What it records |\n|------|-----------------|\n| **Events** | Shift moments + short buffer (~0.5 MB typical) |\n| **All** | Every telemetry packet while recording (up to 10 MB auto-stop) |\n\nFiles are named `tcu_replay_YYYYMMDD_HHMMSS.bin.gz` (gzip binary replay, not plain `.log`).\n\n---\n\n## Run from source\n\nFor developers or anyone running from a git clone.\n\n### Prerequisites\n\n| Tool | Version | Notes |\n|------|---------|-------|\n| Python | 3.10+ | [Download](https:\u002F\u002Fwww.python.org\u002Fdownloads\u002F) — check **Add Python to PATH** |\n| Node.js | 18+ | Required for Vue dashboard build and Electron shell |\n\n### One-time setup\n\nOpen **Administrator** Command Prompt or PowerShell:\n\n```bash\ncd path\\to\\virtualTCU\npip install -r requirements.txt\n\ncd apps\u002Fdashboard\npnpm install\npnpm build\ncd ..\u002F..\n```\n\n`pnpm build` writes the dashboard to `virtual_tcu\u002Fweb\u002Fdist\u002F`. Without it, the backend returns HTTP **503** instead of the UI.\n\n### Option A — Electron shell (recommended)\n\n```bash\ncd apps\u002Felectron\npnpm install\npnpm dev\n```\n\nOr from the repo root: `packaging\\dev-electron.bat`\n\nThis launches the full Electron app, spawning `python -m virtual_tcu --backend-only` automatically. Re-runs reuse the PyInstaller exe at `dist\u002FVirtualTCU\u002F` if present (set `TCU_USE_FROZEN_BACKEND=1` to force it in dev).\n\n### Option B — Python backend only (browser UI)\n\n```bash\ncd path\\to\\virtualTCU\npython -m virtual_tcu\n```\n\n(`python virtual_tcu.py` also works.) Open **http:\u002F\u002F127.0.0.1:8765**, launch FH6, enter a race. Quit with **`Ctrl + C`**.\n\n### Where source-run data is stored\n\nWhen running from source, config \u002F profiles \u002F logs use the **project directory** (current working directory):\n\n```\nvirtualTCU\u002F\n├── tcu_config.json\n├── tcu_profiles.json\n└── logs\u002F\n    └── tcu_replay_*.bin.gz\n```\n\n### Frontend dev (optional)\n\nTerminal 1 — backend:\n\n```bash\npython -m virtual_tcu\n```\n\nTerminal 2 — Vite hot reload:\n\n```bash\ncd apps\u002Fdashboard\npnpm dev\n```\n\nOpen **http:\u002F\u002F127.0.0.1:5173** (proxies WebSocket to port 8765). See [apps\u002Fdashboard\u002FREADME.md](apps\u002Fdashboard\u002FREADME.md).\n\n### Code quality (monorepo)\n\nThe repo uses a pnpm workspace at the root. After `pnpm install`:\n\n| Command | Purpose |\n|---------|---------|\n| `pnpm lint` | ESLint (TS\u002FVue) + Ruff (Python) |\n| `pnpm lint:py` | Ruff check on `virtual_tcu\u002F` |\n| `pnpm format` | Prettier + Ruff format |\n| `pnpm format:py` | Ruff format on `virtual_tcu\u002F` |\n| `pnpm typecheck` | `vue-tsc` across workspace packages |\n\nInstall Python dev tools (Ruff) with `uv sync --group dev` or `pip install -r requirements-dev.txt`. Run `pnpm lint:py` before submitting Python changes.\n\n### Build a Release locally (maintainers)\n\n```bash\n# 1. Vue dashboard\ncd apps\u002Fdashboard && pnpm install && pnpm build && cd ..\u002F..\n\n# 2. Python backend (PyInstaller onedir → dist\u002FVirtualTCU\u002F)\npip install pyinstaller\npyinstaller virtual_tcu.spec --noconfirm\n\n# 3. Electron installer (NSIS → apps\u002Felectron\u002Frelease\u002FVirtualTCU-*-win64.exe)\ncd apps\u002Felectron && pnpm install && pnpm package\n```\n\nPush a `v*` tag to trigger CI, which produces both the Electron installer (`VirtualTCU-*-win64.exe` + `latest.yml`) and the backend-only zip (`VirtualTCU-Backend-*-win64.zip`).\n\n---\n\n## Drive Modes\n\n| Mode | Behavior |\n|------|----------|\n| **COMFORT** | Eco-friendly shifts, early upshifts, cruise efficiency at stable speeds |\n| **DYNAMIC** | Audi-style: higher RPM hold, strict rev-matching downshifts |\n| **RACE** | Track-focused: near-redline upshifts, aggressive engine braking |\n| **DRIFT** | Holds RPM in the power band, reduces unwanted downshifts mid-slide |\n| **OFFROAD** | Tuned for low grip and uneven terrain |\n| **MANUAL** | TCU disabled — you shift yourself |\n\n**F9** (global hotkey, works while Forza is in focus) cycles through modes. **F8** toggles logging. Both can be changed in Settings \u002F the Web UI.\n\n---\n\n## Forza Horizon 6 — In-Game Setup (one-time)\n\n### 1. Transmission\n\n**Settings → Difficulty → Transmission → MANUAL (No Clutch)**\n\n### 2. Keyboard shift bindings\n\n**Settings → Controls → Keyboard**:\n\n| Action | Key |\n|--------|-----|\n| Shift Up | **E** |\n| Shift Down | **Q** |\n\n> Controller or wheel paddle bindings can stay **active at the same time**. The TCU only injects **E** \u002F **Q** and does not take over throttle, steering, or other axes.\n\n### 3. Telemetry Data Out\n\n**Settings → HUD and Gameplay → Data Out**:\n\n| Option | Value |\n|--------|-------|\n| Data Out | **ON** |\n| IP Address | `127.0.0.1` |\n| Port | `5555` |\n| Packet Format | **Car Dash** (324 bytes) |\n\n> If you change the UDP port in Virtual TCU network settings, update FH6 to match.\n\n---\n\n## Desktop app (Electron)\n\n| Window | Purpose |\n|--------|---------|\n| **Settings** | Full configuration — drive modes, sliders, hotkeys, network, stats, shift history, profile import\u002Fexport, auto-update |\n| **Browser dashboard** | Read-only live view — gear, RPM chart, G-meter, session stats (opened via tray or Settings) |\n| **HUD overlay** | Minimal always-on-top overlay — gear, mode, RPM bar, speed, shift hint; supports click-through |\n\nClosing the Settings window hides it; the app keeps running in the tray until you choose **Quit**.\n\n---\n\n## Web Dashboard\n\nWhen connected, the browser dashboard shows:\n\n- **Gear \u002F speed \u002F RPM** — large gear readout, 20-segment RPM LED bar\n- **Live chart** — RPM, throttle, brake, and speed over time with shift markers\n- **G-meter** — lateral \u002F longitudinal G ball with grip usage\n- **Pedals & inputs** — throttle, brake, clutch percentages\n- **TCU state** — cruising, kickdown, engine braking, airborne \u002F yaw locks, etc.\n- **Turbo \u002F engine** — boost (bar), power (kW), torque (Nm)\n- **Stats & shift history** — session counters, peaks, and recent shift log (right panel)\n- **Learning sidebar** — sport index, power-curve \u002F ratio calibration status\n\nIn the **Electron** build the browser page is **view-only** (footer reminds you to use the desktop Settings app for configuration and logging). The **backend-only** build exposes full settings in the Web UI.\n\nSwitch UI language in the page header (English \u002F 简体中文).\n\n---\n\n## Network settings\n\nAvailable in the Electron **Settings** window and the backend-only Web UI:\n\n| Setting | Default | Notes |\n|---------|---------|-------|\n| Web bind address | `127.0.0.1` | Set to `0.0.0.0` to allow LAN access from other devices on your network |\n| Web port | `8765` | Dashboard HTTP \u002F WebSocket port |\n| UDP port | `5555` | Must match FH6 Data Out port |\n\nClick **Apply** to save. The backend hot-reloads bindings; if the web port changes, reopen the dashboard at the new URL shown in Settings.\n\n---\n\n## Project layout (brief)\n\n```\nvirtualTCU\u002F\n├── virtual_tcu.py          # entry → virtual_tcu.app\n├── virtual_tcu\u002F            # Python backend package\n├── apps\u002Fdashboard\u002F         # Vue 3 + Tailwind v4 + Naive UI dashboard (served at :8765)\n├── apps\u002Felectron\u002F          # Electron shell (tray, Settings, HUD, auto-update)\n│   ├── src\u002Fmain\u002Findex.ts   # spawns backend, lifecycle, tray, IPC, autoUpdater\n│   ├── src\u002Fsettings-renderer\u002F  # Settings window (Naive UI)\n│   ├── src\u002Fhud-renderer\u002F   # frameless transparent HUD overlay\n│   ├── src\u002Fpreload\u002F        # main + hud preload scripts\n│   └── electron-builder.yml\n├── packaging\u002F              # Launch VirtualTCU.bat, dev-electron.bat\n├── virtual_tcu.spec        # PyInstaller spec (onedir → dist\u002FVirtualTCU\u002F)\n└── .github\u002Fworkflows\u002F      # Release CI (Vue → PyInstaller → electron-builder)\n```\n\n---\n\n## Troubleshooting\n\n### Electron app starts but dashboard won't open\n\n- Tray → **Open Dashboard in Browser**, or Settings → **Overview** → open dashboard.\n- Confirm the backend is ready (Settings shows **live** \u002F **standby**, not **disconnected**).\n- Tray → **Restart Backend** if the backend crashed.\n\n### Release exe flashes and closes (backend-only zip)\n\n- Extract the **full** zip — exe needs `_internal\u002F` beside it.\n- Close other TCU instances (`python -m virtual_tcu` or another `VirtualTCU.exe`) — ports **5555** \u002F **8765** are single-use per instance.\n- Run from cmd: `cd path\\to\\VirtualTCU` then `VirtualTCU.exe` (failed builds pause with an error).\n- Check **`crash.log`** in the data folder shown at startup (exe dir or `%APPDATA%\\VirtualTCU\\`).\n\n### Port already in use\n\n- Only one backend should run at a time. Quit other Virtual TCU instances or change ports in network settings.\n\n### Recording started but no log file found\n\n- Logs live in the backend data folder (`logs\\` next to `VirtualTCU.exe` or `%APPDATA%\\VirtualTCU\\logs\\`).\n- Click **Stop** before looking — the gzip file is finalized on stop.\n- Use **All** mode and drive in a race with Data Out ON; **Events** mode only writes meaningful data around shifts.\n- Look for `tcu_replay_*.bin.gz`, not `.log`.\n\n### Dashboard offline \u002F waiting for Forza\n\n- Data Out **ON**, port **5555**, **Car Dash** format.\n- Must be **in a race** (no telemetry in menus).\n\n### TCU does not shift\n\n- Forza keyboard: Shift Up = **E**, Shift Down = **Q**.\n- Run as **Administrator**.\n\n### F9 \u002F F8 hotkeys do nothing\n\n- Close apps that may capture those keys (Discord overlay, MSI Afterburner, etc.).\n\n### Wrong gear or speed\n\n- FH6 **324-byte Car Dash** only — not FH5 or Forza Motorsport.\n\n### Auto-update does nothing\n\n- Auto-update only runs in the **packaged** Electron installer, not in `npm run dev`.\n- Check the **About** tab in Settings for update status.\n\n### Gamepad mode not working\n\n- Install the **[ViGEmBus](https:\u002F\u002Fgithub.com\u002FForza-Love\u002Ffh6-virtual_tcu\u002Fraw\u002Fmain\u002Fdriver\u002FViGEmBusSetup_x64.msi) driver** → reboot Windows.\n- If you already installed it, make sure you rebooted after installation.\n- Switch output mode to **Keyboard** in Settings → Extras if you don't want to install the driver.\n- The TCU automatically falls back to keyboard mode if the driver is missing.\n\n---\n\n## Notes\n\n- Works with any FH6 car — shift points auto-calibrate from telemetry max RPM.\n- **Reverse protection** — no automatic shifts in reverse.\n- **Low-speed protection** — no automatic shifts below ~12 km\u002Fh.\n- Only sends **E** \u002F **Q** keyboard events; does not modify controller inputs.\n\n---\n\n## Tested on\n\n- Windows 11\n- Steam edition of Forza Horizon 6\n- Xbox Elite Series 2 controller\n\nTelemetry based on the reverse-engineered FH6 **324-byte Car Dash** packet (confirmed via live diagnostics).\n","这是一个为《极限竞速：地平线6》设计的外部自适应变速控制器，能够根据驾驶风格、油门输入、转速、速度和刹车压力自动换挡。项目采用Python编写，通过读取游戏中的实时UDP遥测数据来决定最佳换挡时机，并通过模拟键盘按键或虚拟手柄按钮发送换挡指令。支持五种驾驶模式（舒适、动态、赛车、漂移、越野），并且能够针对每辆车的学习其齿轮比、功率曲线、转速限制器等特性，以优化换挡逻辑。该工具适用于希望在游戏过程中获得更流畅、更智能换挡体验的玩家，特别是那些追求极致性能表现的专业级赛车游戏玩家。此外，它还提供了一个Web界面显示实时遥测数据，便于用户监控车辆状态。",2,"2026-06-11 04:01:25","CREATED_QUERY"]