/install pursuit-maps
\r \r
Pursuit Maps Pipeline\r
\r Automated pipeline: ManiaPlanet Feedback + ManiaExchange → Google Sheets.\r \r
Quick Reference\r
\r
Main script: pipeline/pipeline.py in repo tomekdot/pursuit-maps\r
\r
python3 pipeline/pipeline.py # full pipeline\r
python3 pipeline/pipeline.py --action sync # fetch + push new maps + auto-sort\r
python3 pipeline/pipeline.py --action votes # update vote columns only\r
python3 pipeline/pipeline.py --action sort # sort sheet by Uploaded At\r
python3 pipeline/pipeline.py --action report # vote change report\r
python3 pipeline/pipeline.py --action validate # data quality checks\r
```\r
\r
**GAS Web App**: `pipeline/gas-webapp/PursuitMaps.gs` — deploy once in Sheet (Extensions → Apps Script → Deploy as Web App). Accepts HTTP POST from pipeline.\r
\r
## Repo Structure\r
\r
```\r
pursuit-maps/\r
├── pipeline/pipeline.py ← Main entry point (all actions)\r
├── pipeline/gas_runner.py ← HTTP client for GAS\r
├── pipeline/gas-webapp/ ← GAS script (deploy in Sheet)\r
├── data/ ← Cache, history, reports\r
├── docs/ ← Setup guides\r
├── scripts/legacy/ ← Old scripts (reference)\r
└── .github/workflows/pipeline.yml ← Daily 5:00 UTC\r
```\r
\r
## Sheet Columns\r
\r
| Col | Name | Source |\r
|-----|------|--------|\r
| A | # | Auto |\r
| B | Map name | Feedback |\r
| C | Author login | ManiaExchange |\r
| D | Environment | ManiaExchange |\r
| E | Uploaded at | ManiaExchange (ISO 8601 → normalized to YYYY-MM-DD HH:MM:SS) |\r
| F | UID | Feedback |\r
| G | TrackMania\MapType | ManiaExchange |\r
| H | Notes | Manual |\r
| I | YN Rating | Feedback YES/NO section |\r
| J | YN Votes | Feedback YES/NO section |\r
| K | 5-Star Avg | Feedback 5 STARS section |\r
| L | 5-Star Total | Feedback 5 STARS section |\r
\r
## Sorting\r
\r
Sheet is auto-sorted by **Uploaded At (column E) descending** after every sync (newest maps on top).\r
- Column E is formatted as Date (`yyyy-mm-dd hh:mm:ss`) so Sheets treats it as proper date\r
- Manual sort: `python3 pipeline/pipeline.py --action sort` or POST `{"action":"sort"}` to GAS\r
- Sort function handles both Date objects and string dates from MX API\r
\r
## Key API Endpoints\r
\r
- Feedback page: `feedback.prod.live.maniaplanet.com/votes/display/106`\r
- MX API: `tm.mania.exchange/api/maps/get_map_info/id/{UID}` (V1, accepts UID)\r
- Sheet read: gviz API (no auth for public sheets)\r
- Sheet write: GAS Web App (deployed once per user)\r
\r
## Parsing Notes\r
\r
Feed page has TWO separate star rating sections per map card:\r
1. **YES/NO** section: `\x3Ch6>YES/NO\x3C/h6>` → gold span → `rating (count)`\r
2. **5 STARS** section: `\x3Ch6>5 STARS\x3C/h6>` → gold span → `rating (count)`\r
\r
Parse independently. ~80% of maps have 5-Star data but no YES/NO votes.\r
\r
Split HTML at each `\x3Cimg src="...maps/...">` to isolate per-map cards.\r
\r
## Stats\r
\r
- 249 maps total\r
- ~75% indexed on ManiaExchange\r
- 248 thumbnails available (1 HTTP 403)\r
- 4 environments: Valley, Canyon, Stadium, Lagoon\r
- 3 map types: PursuitArena (~80%), GoalHuntArena (~15%), HuntersArena (~5%)\r
- Make sure OpenClaw is installed (local or Docker)
- Run the install command in chat:
/install pursuit-maps - After installation, invoke the skill by name or use
/pursuit-maps - Provide required inputs per the skill's parameter spec and get structured output
What is Pursuit Maps?
TrackMania Pursuit maps pipeline — fetches maps from ManiaPlanet Feedback (star ratings, vote counts), enriches with ManiaExchange data, syncs to Google Shee... It is an AI Agent Skill for Claude Code / OpenClaw, with 30 downloads so far.
How do I install Pursuit Maps?
Run "/install pursuit-maps" in the OpenClaw or Claude Code chat to install it in one step — no extra setup required.
Is Pursuit Maps free?
Yes, Pursuit Maps is completely free, licensed under MIT-0. You can download, install and use it at no cost.
Which platforms does Pursuit Maps support?
Pursuit Maps is cross-platform and runs anywhere OpenClaw / Claude Code is available (cross-platform).
Who created Pursuit Maps?
It is built and maintained by tomekdot (@tomekdot); the current version is v2.0.0.