BeamNG.Earth
A 1:1 scale streamed Earth for BeamNG.drive: real elevation and satellite imagery, floating origin, LOD streaming from a companion server
翻译准备中
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Find out why you won or lost. Turnpoint looks up any League of Legends player by Riot ID and breaks each game down minute by minute: each team's chance to win, your lead over the enemy in your role, and the turning points that decided it.
Live site: https://league-web-app.vercel.app · How the numbers work: /how-it-works
/player/kr/Faker-KR1./api/mcp: Claude and other AI apps can look players up and read the analyzer's results (docs/mcp.md).The analyzer is the core of the project. The full research and design is in docs/match-analyzer.md.
Why compare to the opponent in your role? They're at roughly the same rank, on the same patch, in the same game, and it's how analysts talk about laning. For a wider view, Insights compares you with games sampled from every rank (npm run benchmarks).
All three are logistic regression trained offline on saved games, written from scratch in TypeScript (gradient descent, no ML library) and checked with 5-fold cross-validation. The site ships only the learned weights as JSON, so a prediction is a few multiplications.
| Model | Reads | Gives | Checked on |
|---|---|---|---|
| Win chance (docs) | Both teams' gold, XP, kills, towers, inhibitors, dragons, grubs, Herald, Atakhan, Baron and Elder at each minute | Each team's chance to win at that minute | Trained on 18,178 ranked games, Iron to Challenger. Today's accuracy figures include each game's final minutes, when the winner is nearly certain, so they flatter the model. How it works shows them with that warning until a fairer evaluation replaces them (why) |
| Game score (docs) | Ten stats per player (KDA, kill participation, damage share, CS, vision...), compared with the player's role | A 0 to 100 percentile among players in that role | Picks the winning side from stats alone 81% of the time on 35,326 games it didn't train on |
| Phase ratings (docs) | The same recipe, on each player's stats in one phase of the game | Early, mid and late game ratings | Cross-validated on 1,923 Oceania ranked games (fewer last long enough for mid and late): picks the winner 62% of the time from the early game alone, 73% from mid and 81% from late |
The win chance's learned weights are worth a look: kills and towers are worth almost nothing on their own, because the gold they pay is already in the gold lead. docs/win-chance.md walks through one real minute of a game by hand. Win chance only ever runs on finished games, since Riot's policy doesn't allow predictions during a live game.
| Technology | Role | Why |
|---|---|---|
| Next.js 16 (App Router) + TypeScript | UI and server code | One codebase for pages and server logic. Server components keep the Riot API key off the browser. |
| Tailwind CSS 4 | Styling | Dark and light themes from one set of design tokens. |
| Supabase Postgres + Drizzle ORM | Match cache, profiles, notes, rate limit counts | Matches never change once played, so storing them avoids refetching and keeps the site inside Riot's rate limits. |
| Supabase Auth | Google and Discord sign-in | Sign-in without storing any passwords. |
| Riot Games API | Player and match data | The official source for accounts, ranks, matches and timelines. |
| Claude API + MCP | Recaps, Ask, and the MCP server | Claude writes from the analyzer's tested numbers instead of the raw match. |
| Vitest, Playwright + axe | Unit, golden, browser and accessibility tests | Fast tests for the pure analyzer; a real browser check of every preview deploy. |
| GitHub Actions |
Everything runs on free tiers except the Claude API, which is pay per use: Ask stops at $20 a month for the whole site, and each account can write 20 recaps a day.
flowchart LR
U[Browser] -->|search Riot ID| N
AI[Claude and other<br/>AI apps] -->|MCP, /api/mcp| N
subgraph V[Vercel]
N[Next.js app<br/>server components<br/>and server actions]
A[Analyzer and models<br/>pure TypeScript]
Q[Rate-limited<br/>Riot client]
N --> A
N --> Q
end
Q -->|account, summoner,<br/>league, match-v5| R[(Riot Games API)]
N <-->|matches, timelines,<br/>profiles, notes| DB[(Supabase<br/>Postgres)]
N <-->|Google and<br/>Discord sign-in| AU[Supabase Auth]
T[Training scripts<br/>npm run train-*] -->|saved games| DB
T -->|model weights<br/>JSON| A
N -->|recaps and Ask| CL[Claude API]
N -.->|errors| S[Sentry]
N -.->|champion and<br/>item images| DD[Data Dragon CDN]
Key design decisions
server-only, and a custom ESLint rule keeps Riot hosts out of every other folder.429.ARCHITECTURE.md walks through what happens when you open a match, the caching rules, the rate limiter and the known limits. The data model is in docs/SCOPE.md and the tables in docs/database.md.
src/
app/ Next.js routes (App Router)
page.tsx Home page with the search form
player/[region]/[riotId]/ Player profile, with Insights, Champions, Log and Ask tabs
match/[matchId]/ Match analysis page (Summary and Deep dive tabs)
api/mcp/ The MCP server
how-it-works/ How the analyzer and models work, for players
privacy/, terms/ Legal pages
components/ React components; ui/ holds small shared pieces
db/ Drizzle schema, connection and cache freshness rules
lib/ Plain TypeScript helpers, most with a .test.ts beside them
analyzer/ The match analyzer, replay and models (pure functions)
riot/ Server-only Riot API client and rate limiter
mcp/ Tools shared by the MCP server and Ask
*-store.ts Load and save data: Postgres first, Riot when missing
drizzle/ Generated SQL migrations
scripts/ Benchmark collection, model training and data checks
e2e/ Playwright smoke test and accessibility scan
eslint-rules/ Project lint rules (server-only secrets, Riot hosts, colors)
docs/ Design and research docs, and decision records in adr/
The file-by-file map is in ARCHITECTURE.md.
.nvmrc and package.json)git clone https://github.com/Jaspyplayz/League-Web-App.git
cd League-Web-App
npm install
cp .env.example .env.local # then fill in .env.local (at least RIOT_API_KEY)
npm run db:migrate # only if you set DATABASE_URL_DIRECT
npm run dev
Open http://localhost:3000. Features whose keys are missing hide themselves: no Supabase values means no "Sign in", no Anthropic key means no "Write recap".
.env.local is ignored by git, so keys are never committed. Development keys expire every 24 hours; regenerate one in the portal when requests start failing. docs/SETUP.md walks through every variable, the database and fixes for Windows PowerShell.
| Command | What it does |
|---|---|
npm run dev | Start the dev server |
npm run lint | ESLint, plus the project's own rules in eslint-rules/ |
npm run typecheck | TypeScript type check |
npm test | Unit tests (Vitest), including golden tests on four real games |
npm run test:e2e | Playwright smoke test and accessibility scan |
npm run build | Production build |
npm run train-win-chance / train-score / train-phase-score | Retrain a model on saved games |
npm run benchmarks | Collect games from every rank for Insights' comparisons |
GitHub Actions runs lint, type check, tests and a production build on every pull request and every push to main, and dependency review checks new packages for known vulnerabilities. When Vercel finishes a preview deploy, the smoke test opens it in a real browser and runs an axe accessibility scan in both themes, which fails on any error.
About 90 test files cover Riot ID parsing and region routing, the Riot client (errors, retries, rate limits), cache freshness, and every part of the analyzer: finding your opponent, labeling deaths, turning points, objectives, jungle pathing, the replay, trends, rank comparisons and all three models.
Turnpoint is built with Claude Code as a pair programmer. Every change goes through a pull request with a plain-language summary, CI, a preview deploy and, for anything beyond docs, a review by a separate reviewer agent before merging. Riskier changes (database, sign-in, anything that spends API money) also get a second model's review and a manual test of the preview. The process, and the reasons behind it, are in docs/workflow.md and the decision records.
| Doc | What's in it |
|---|---|
| ARCHITECTURE.md | How the pieces fit together, with diagrams |
| docs/match-analyzer.md | The analyzer's research and design |
| docs/win-chance.md, docs/game-score.md, docs/phase-ratings.md | The three models: features, training and how good they are |
| docs/replay.md, docs/tempo.md | The replay and the jungle tempo study |
| docs/match-recap.md, docs/ask.md, docs/mcp.md | The AI features and their cost limits |
| docs/database.md, docs/SCOPE.md | Tables, migrations and the data model |
| docs/SETUP.md |
Turnpoint isn't endorsed by Riot Games and doesn't reflect the views or opinions of Riot Games or anyone officially involved in producing or managing Riot Games properties. Riot Games and all associated properties are trademarks or registered trademarks of Riot Games, Inc.
Built by Jasper (@Jaspyplayz), a second-year student at the University of Toronto.
Released under the MIT License.
| CI |
| Lint, type check, test and build on every pull request, plus dependency review. |
| Vercel | Hosting and analytics | Automatic deploys from main and a preview link for every pull request. |
| Sentry | Error tracking | Reports crashes on the live site with the exact error and stack trace. |
| Hand-written SVG | Charts | The curves are simple enough that a chart library wasn't worth the extra JavaScript. |
| Setup on a new computer |