{"id":50181548,"url":"https://github.com/estetika101/pacefinderapp","last_synced_at":"2026-05-25T07:01:14.222Z","repository":{"id":355076180,"uuid":"1226236932","full_name":"Estetika101/pacefinderapp","owner":"Estetika101","description":"Self-hosted UDP telemetry capture and live dashboard for Forza Motorsport. Records every session, browse by circuit, AI coaching with your own Anthropic key. Runs on anything.","archived":false,"fork":false,"pushed_at":"2026-05-23T23:15:52.000Z","size":1517,"stargazers_count":0,"open_issues_count":15,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-23T23:19:05.830Z","etag":null,"topics":["dashboard","forza","forza-motorsport","motorsport","open-source","python","raspberry-pi","sim-racing","telemetry","udp"],"latest_commit_sha":null,"homepage":"https://pacefinder.app","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Estetika101.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE.md","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-01T06:13:34.000Z","updated_at":"2026-05-23T23:09:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Estetika101/pacefinderapp","commit_stats":null,"previous_names":["estetika101/simtelemetry","estetika101/pacefinderapp"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/Estetika101/pacefinderapp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Estetika101%2Fpacefinderapp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Estetika101%2Fpacefinderapp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Estetika101%2Fpacefinderapp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Estetika101%2Fpacefinderapp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Estetika101","download_url":"https://codeload.github.com/Estetika101/pacefinderapp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Estetika101%2Fpacefinderapp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33464012,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T06:32:55.349Z","status":"ssl_error","status_checked_at":"2026-05-25T06:32:35.322Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dashboard","forza","forza-motorsport","motorsport","open-source","python","raspberry-pi","sim-racing","telemetry","udp"],"created_at":"2026-05-25T07:01:11.644Z","updated_at":"2026-05-25T07:01:14.209Z","avatar_url":"https://github.com/Estetika101.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Pacefinder\n\n[![License: MIT](https://img.shields.io/badge/license-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![Python 3.9+](https://img.shields.io/badge/python-3.9+-blue.svg)](https://www.python.org/downloads/)\n[![Latest tag](https://img.shields.io/github/v/tag/Estetika101/pacefinderapp?label=version)](https://github.com/Estetika101/pacefinderapp/tags)\n\nRecords UDP telemetry from Forza Motorsport. Saves every session automatically and serves a live dashboard and analysis tools to any device on your network.\n\nStart a race. It records. Stop racing. It stops.\n\nRuns on any always-on machine — Mac, Windows, Linux, Raspberry Pi. Pure Python 3.9+, one external dependency (`anthropic`, only needed for AI coaching).\n\n**[pacefinder.app](https://pacefinder.app)**\n\n---\n\n## What's included\n\n**Always on, no configuration required:**\n- **Live dashboard** — speed, throttle, brake, rear slip, tyre temps streamed to any device at 10Hz\n- **Session recording** — every session archived automatically to disk and SQLite\n- **Session history** — browse by game, circuit, and date with lap trends and career KPIs\n- **Lap comparison** — compare any lap against your personal best or theoretical best\n\n**Optional — bring your own Anthropic API key:**\n- **Spotter** — post-race AI coaching based on your actual telemetry and historical baseline at each circuit. Add your key in the setup page at `http://localhost:8000/setup`. Costs pennies per session.\n\n---\n\n## Ports\n\n| Game | UDP Port |\n|------|----------|\n| Forza Motorsport | 5300 |\n\nListens for both Forza Motorsport (2023) and Forza Horizon 5 — auto-detected by packet size.\n\n\u003e **Roadmap:** ACC and F1 support are coming soon. Parser code is in tree but not bound at startup until the Forza experience is rock-solid.\n\n---\n\n## Install\n\nPacefinder ships through four channels — pick the one that matches your machine.\n\n| Platform | Channel | How |\n|---|---|---|\n| **macOS** | TestFlight (App Store beta) | Request access via [pacefinder.app](https://pacefinder.app#install). Apple emails an invite; install the **TestFlight** app from the App Store, accept the invite, click **Install**. Auto-updates. |\n| **Linux x64** | AppImage | Download `Pacefinder-*-x86_64.AppImage` from the latest [Release](https://github.com/Estetika101/pacefinderapp/releases). `chmod +x Pacefinder-*.AppImage \u0026\u0026 ./Pacefinder-*.AppImage`. |\n| **Linux ARM (Raspberry Pi)** | AppImage | Download `Pacefinder-*-aarch64.AppImage` from the latest [Release](https://github.com/Estetika101/pacefinderapp/releases). Same `chmod +x` flow. Pi 4 / Pi 5 only — Pi 3 is 32-bit. |\n| **Docker** (any OS) | GHCR | `docker run -p 5300:5300/udp -p 8000:8000 -v $(pwd)/data:/data ghcr.io/estetika101/pacefinder:latest` |\n| **All** (power-user) | `git clone` + Python | See **Quick Start** below. Used by the Pi systemd service and for development. |\n\nAll channels resolve to the same listener — same UDP port, same dashboard at `http://localhost:8000`.\n\n---\n\n## Quick Start (from source)\n\n**Mac / Linux / Pi**\n```bash\ngit clone https://github.com/Estetika101/pacefinderapp\ncd pacefinderapp\npip install -r requirements.txt   # one dep: platformdirs\npython3 listener.py\n```\n\n**Windows**\n```\ngit clone https://github.com/Estetika101/pacefinderapp\ncd pacefinderapp\npip install -r requirements.txt\npython listener.py\n```\nPython 3.9+ required — download from [python.org/downloads](https://python.org/downloads). Check \"Add Python to PATH\" during install.\n\nOpen `http://localhost:8000` and point your game's Data Out to this machine's IP.\n\nFull setup guide at [pacefinder.app](https://pacefinder.app#install)\n\n---\n\n## Auto-start\n\n### Mac\n```bash\nbash install-mac.sh\n```\nInstalls a launchd service that starts Pacefinder on login and restarts it if it crashes.\nLogs: `~/Library/Logs/pacefinder.log`\n\n### Linux / Pi\n```bash\nsudo cp pacefinder.service /etc/systemd/system/\nsudo systemctl daemon-reload\nsudo systemctl enable pacefinder\nsudo systemctl start pacefinder\n```\n\n\u003e **Already installed under the old `simtelemetry` name?** Migrate with:\n\u003e ```bash\n\u003e sudo systemctl stop simtelemetry\n\u003e sudo systemctl disable simtelemetry\n\u003e sudo rm /etc/systemd/system/simtelemetry.service\n\u003e sudo cp pacefinder.service /etc/systemd/system/\n\u003e sudo systemctl daemon-reload\n\u003e sudo systemctl enable pacefinder\n\u003e sudo systemctl start pacefinder\n\u003e ```\n\n### Windows\nOpen Task Scheduler → Create Basic Task → Trigger: At log on → Action: Start `pythonw.exe C:\\path\\to\\listener.py`.\n\n---\n\n## Game Setup\n\n### Forza Motorsport\nSettings → HUD and Gameplay → Data Out\n- Data Out: **ON**\n- Data Out IP Address: this machine's IP\n- Data Out IP Port: **5300**\n- Data Out Packet Format: **Car Dash**\n\n### Forza Horizon 5\nSettings → HUD and Gameplay → Data Out\n- Data Out: **ON**\n- Data Out IP Address: this machine's IP\n- Data Out IP Port: **5300**\n\n(Same port as Forza Motorsport — packet format is auto-detected.)\n\n---\n\n## Data Captured\n\n- Speed, throttle %, brake %, clutch %, gear, RPM, steering\n- All 4 tyre slip ratios and angles (RL/RR especially useful for traction analysis)\n- Tyre temps (FL/FR/RL/RR), and tyre wear in Forza Horizon 5\n- Suspension travel, wheel rotation speeds\n- Lateral / longitudinal G-forces\n- Boost, fuel, best/last/current lap time\n- Car ordinal, class, performance index, drivetrain\n- Track ordinal (Forza Horizon 5 only — auto-resolved to track name)\n\n---\n\n## File Structure\n\n```\n{storage_path}/\n  simtelemetry.db           ← SQLite (sessions + AI coaching cache)\n  raw/                      ← raw UDP packet archives (.bin)\n  sessions/\n    \u003csession_id\u003e.json       ← session summary + lap times\n    \u003csession_id\u003e_laps.json  ← full per-sample lap data\n  logs/\n    listener.log\n```\n\nDefault storage path is `./data/`. Change it in the setup page or edit `simtelemetry.config.json`.\n\n---\n\n## Running as a Background Service (Linux / Pi)\n\n```bash\nsudo cp pacefinder.service /etc/systemd/system/\nsudo systemctl daemon-reload\nsudo systemctl enable pacefinder\nsudo systemctl start pacefinder\n```\n\nCheck status: `sudo systemctl status pacefinder`\n\n---\n\n## Replay \u0026 Analysis\n\nRe-parse a raw `.bin` archive without the listener running:\n\n```bash\n# Per-lap summary (auto-detects game)\npython3 replay.py path/to/archive.bin --summary\n\n# Export as CSV\npython3 replay.py archive.bin --csv \u003e session.csv\n\n# Export as JSON\npython3 replay.py archive.bin \u003e session.json\n```\n\n---\n\n## Troubleshooting\n\n**No data received:**\n- Confirm game Data Out IP matches this machine's IP\n- Check firewall: `sudo ufw allow 5300/udp`\n- Verify with: `sudo tcpdump -i any udp port 5300`\n\n**Port already in use:**\n```bash\nsudo lsof -i :5300\n```\n\n**Service not starting:**\n```bash\nsudo journalctl -u pacefinder -f\n```\n\n---\n\n## License\n\nMIT — read it, run it, fork it.\n\n## Acknowledgements\n\nThe bundled Forza car ordinal database (`data/fm8_cars.csv`) is sourced from\n[bluemanos/forza-motorsport-car-track-ordinal](https://github.com/bluemanos/forza-motorsport-car-track-ordinal).\nSee [`NOTICE.md`](NOTICE.md) for the full attribution list.\n\n---\n\n*Forza Motorsport is a trademark of Microsoft. Pacefinder is not affiliated with Microsoft.*\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Festetika101%2Fpacefinderapp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Festetika101%2Fpacefinderapp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Festetika101%2Fpacefinderapp/lists"}