A local Windows web app for tracking League of Legends matches through the League client's local API. The frontend runs in the browser, the Node.js backend stays local, and data is stored in SQLite on the machine.
- Frontend: React 19, TypeScript, Vite, Tailwind CSS v4, shadcn/ui
- Backend: Node.js, Express, TypeScript,
league-connect - Storage: SQLite with
better-sqlite3 - Monorepo: pnpm workspaces
- Windows
- Node.js
- pnpm
- League of Legends client installed
pnpm installIn development:
pnpm devOu via le script Windows fourni:
start-mayhemtracker.batThis starts:
- the Vite frontend on
http://localhost:5173 - the Express backend on
http://localhost:3001
The Vite proxy automatically routes /api/* and /assets-cache/* to the local backend.
pnpm dev
pnpm dev:client
pnpm dev:server
pnpm build
pnpm test
pnpm test:client
pnpm verify
pnpm db:resetTests use Vitest + Testing Library on the client side.
pnpm test:clientThe currently covered scenarios validate:
- resetting preferences in
Settings - opening a detail view from an interactive table
- expanding the
history/detailflow
By default, local data is written to:
%USERPROFILE%/.mayhemtracker
Main contents:
db/mayhemtracker.sqlite: persistent SQLite databasecache/icons/: disk cache for champion, item, and augment iconsstatic-data/: sync files and Riot metadata
You can override this folder with the MAYHEMTRACKER_STORAGE_DIR environment variable.
GET /api/statusGET /api/league/connectionGET /api/league/authGET /api/league/summonerGET /api/league/gameflowGET /api/system/powershell-testPOST /api/static-data/syncGET /api/static-data/championsGET /api/static-data/augmentsGET /api/static-data/itemsPOST /api/matches/sync-currentGET /api/matchesGET /api/matches/:matchIdDELETE /api/matches/clear
- The application is designed for local-only usage.
league-connectis only used on the backend side.- The frontend only calls local HTTP routes under
/api/.... - The backend also serves the local icon cache through
/assets-cache/.... - If the League client is not open, League routes return a clean JSON error.