Skip to content

Repository files navigation

MTGA Tracker

Track your Magic: The Gathering Arena games β€” entirely on your machine.

A real-time tracker that tails Arena's Player.log, a SQLite analytics store, and a full React dashboard. No account, no cloud, no uploads: your games, your data, your disk.

License: AGPL-3.0 Python 3.9+ Platforms

πŸ’¬ Join the community on Discord β€” for discussion, bug reports, and feature requests.

Performance Overview dashboard

What it does

Live tracking. One lightweight app β€” menu bar on macOS, system tray on Windows β€” runs everything: it follows your game in real time (casts, draws, lands, combat, life totals, stack resolution), writes every game to the local analytics database, and serves the dashboard. The Live Log is a live Scoreboard page right in the dashboard: both players' life, colors, and deck, the turn clock, session record, today's games, and a play-by-play feed that reads exactly like the per-game timeline β€” no separate window to manage. Prefer a terminal? The same tracker runs as a plain console command.

Deck analytics. Every deck gets a drill-down page tinted with its signature card's art: per-game combat and resource averages for both players, turn-pace and draw-quality summaries, card performance, mulligan results, decklist version history with diffs, land statistics with flood/screw classification, win & loss streaks, per-queue records (BO1/BO3, ranked/unranked, competitive Brawl), Bo3 sideboarding records, and Best Against / Worst Against opponent color highlights.

Game forensics. Each game page reconstructs the match: opening hand and every mulligan (including the card you bottomed), drawn cards with the turn they arrived, draw-quality analysis with statistically-grounded flood/screw detection, a life-total chart, per-seat combat summaries, and the complete event timeline.

Interaction analytics. Every game records what both players did with their interaction: removal and board wipes played (and how many you drew), creatures lost to removal, counter magic β€” including how many counters actually landed versus fizzled β€” bounce, land destruction with replacement rates, token lifecycles, and poison. Cards are classified from their Arena rules text, and a one-time backfill computes these stats for the games you tracked before the feature existed.

Opponent intelligence. Revealed cards identify the opponent's colors, named with community archetype names (Dimir, Jeskai, Mono-Red…), tracked across your history so you can see which matchups actually beat you. Optionally, bring your own AI key (OpenAI, Anthropic, or Gemini) and the tracker names the opponent's actual archetype β€” "Jeskai Control", "Gruul Aggro" β€” after each game.

Brawl, done properly. Commanders are tracked from the opening hand of every Brawl game β€” yours and your opponent's. A dedicated Brawl section on the Overview shows your overall and per-queue record (Historic Brawl, Brawl (Ranked), Standard Brawl) plus Your Commanders and Faced Commanders win-rate tables, because Brawl players think in commanders, not deck names. Brawl rows in Recent Games expand to show the commander-vs-commander matchup with colors. Starting life, 100-card decks, and command-zone recasts are all handled.

Deck Finder. A bundled companion tool that browses current decklists from creators and sites (Moxfield, AetherHub, TCGplayer, magic.gg, MTGO, Untapped) and copies any list straight to your clipboard in Arena import format. Launch it from the menu bar or the dashboard sidebar.

The long game. Match-level records (a Bo3 counts once, like the ladder does), win-rate trends, How Games End with per-reason percentages β€” concedes, damage, decking, poison, timeouts β€” Constructed Ranked lifetime and per-season stats beside the rank chart, session habits and fatigue splits, format breakdowns, and a database health audit that can repair its own inconsistencies. Recorded timelines mean new tracker features retroactively backfill your old games.

Screenshots

Live Log β€” the Scoreboard β€” while you play: both life totals with color pips and deck, the turn and game clock, your live session record, today's finished games, and a play-by-play feed identical to the per-game timeline:

Live Log Scoreboard

Recent Games β€” outcomes, deck and opponent colors (including the colorless diamond), formats, Brawl commander matchups, draw status, and game pace at a glance:

Recent Games

Constructed Ranked β€” lifetime and per-season match records around the ladder chart, with a season selector to replay any climb:

Constructed Ranked stats and ladder chart

Your decks β€” every deck with its signature card, an Aggro/Midrange/Control profile judged from damage pace, win-rate bars, and per-game combat telemetry, searchable and sortable:

Decks table on the Overview

Deck drill-down β€” combat profile, streaks, decklist performance, land statistics:

Deck detail page

Game forensics β€” turn timing, draw quality, combat & resources, life chart, full timeline:

Game detail page

Quick start

Caution

The tracker cannot see your games unless "Detailed Logs" is enabled in MTG Arena. If everything looks fine but no games ever appear, this is almost always why. In Arena: gear icon (top right) β†’ Adjust Options β†’ Account β†’ check "Detailed Logs (Plugin Support)" β†’ restart Arena.

Enable Detailed Logs (Plugin Support) under Account in MTG Arena's options

Install the app (recommended): grab the installer for your OS from the Releases page β€” on Windows, MTGA-Tracker-<version>-setup.exe gives you a Start Menu entry, an Apps & Features uninstaller, and in-place upgrades (a portable -windows.zip is also published); on macOS, a drag-to-Applications DMG. The Deck Finder is bundled inside the app on both platforms β€” one install gets you everything. Or build it yourself β€”

# macOS app / DMG
scripts/build_macos_app.sh          # dist/MTGA Tracker.app
scripts/build_macos_installer.sh    # dist/MTGA-Tracker.dmg
# Windows exe / zip
powershell -ExecutionPolicy Bypass -File scripts\build_windows_app.ps1

Or run from source:

python3 -m venv venv && source venv/bin/activate
pip install -e '.[dev,gui]'
mtga-tracker-app        # tracker + dashboard (with the live Scoreboard), one command

See QUICKSTART.md for the full walkthrough, including the Gatekeeper/SmartScreen note for unsigned alpha builds.

The dashboard

mtga-tracker-app serves and opens it automatically; standalone:

cd ui && npm install && npm run build && cd ..
venv/bin/python -m mtga_tracker.dashboard        # http://127.0.0.1:8765
Route What you get
#/ Overview: metrics, best deck, trends, ranked progress, recent games, decks, opponent meta
#/deck/<name> Deck drill-down: cards, mulligans, versions, land stats, streaks, vs-colors
#/game/<id> Game detail: draw quality, life chart, hands, timeline, notes
#/card/<name> Card drill-down: by-deck performance, repeat draws, opener impact
#/games Every tracked game, filterable (deck, format, opponent colors)
#/audit Database health findings

JSON API: GET /api/snapshot, /api/deck, /api/game, /api/card, /api/cards?q=, /api/games, /api/version β€” the dashboard is read-only except POST /api/game/annotation (your per-game notes and tags).

Port busy? --port 8766. Lost the terminal? lsof -ti tcp:8765 | xargs kill.

Command-line tools

Command Purpose
mtga-tracker Console tracker only
mtga-tracker-app --no-gui Tracker + dashboard without the menu bar
python -m mtga_tracker.db_audit [--repair] Database consistency audit / safe self-repair
python -m mtga_tracker.draw_quality --card "Llanowar Elves" Draw-quality & flood/screw report
python -m mtga_tracker.payload_dump <game_id> Print a game's archived raw payloads as JSON

Ready-made SQL reports live in data/_queries/:

sqlite3 data/mtga_tracker.sqlite3 < data/_queries/WinRateByDeck.sql

AI deck identification (optional)

With an API key, the tracker makes one small request per completed game and names the opponent's deck β€” the Game Detail page shows it as the Opponent Deck Type, falling back to plain colors when there's no guess. The call runs in the background after the game ends, so tracking never waits on it.

Configure it on the dashboard's Settings page (gear icon, top right β€” or the "Settings" menu-bar entry): enable, pick a provider (OpenAI, Anthropic, or Gemini), paste your key, optionally set a model. The Settings page also holds your Deck Finder creators, a tracker-status readout, and the Database Health link. The choice is saved to settings.json at the top level of the project folder (installed builds keep it in the app data folder), and your key is only ever sent to the provider you chose. Without a key the feature simply stays off.

Deck Finder

The Deck Finder now lives right inside the dashboard β€” open it from the "Deck Finder" button at the bottom of the sidebar or the menu bar entry (no separate terminal window anymore). Pick a site (AetherHub, magic.gg, Moxfield, MTGO, TCGplayer, or untapped.gg) and a format, and it lists matching decks in a table tuned to each site β€” win rates and matches for untapped.gg archetypes, event placings for tournament sites, and so on. Open any deck to see its list, then Export to Arena copies it in Arena's import format (or Source opens the original page). "Surprise Me" pulls a random importable deck. Your own featured creators for AetherHub, Moxfield, and TCGplayer are managed on the Settings page (or in deckfinder_config.json at the top level of the project folder). Everything it needs installs with the tracker; no separate setup.

Deck Finder in the dashboard

Export your collection

Arena never exposes your card collection, so the Settings page can read it straight out of the running game's memory and export it as .json, .csv, or .txt β€” ready to import into Moxfield and similar sites. Open Arena's Decks tab once so the collection is loaded, pick a format, and the file downloads when the scan finishes (a copy also lands in the tracker's data folder). On macOS an administrator prompt appears, since reading another app's memory needs elevated access; the game itself is never modified. Everything runs locally β€” no card database is downloaded and nothing leaves your machine.

Export MTGA Collection on the Settings page

The memory-extraction technique is adapted from NthPhantom10's MTGA-collection-exporter β€” full credit to them for working out how to find the collection in Arena's process memory.

What isn't tracked

Some game modes are intentionally excluded from your saved stats, because mixing them into constructed analytics would skew win rates and draw math:

  • Jump In! (Jump_In_* events)
  • Midweek Magic (MWM_* events)
  • Momir and similar novelty modes
  • Welcome Deck Duels (pre-made deck vs pre-made deck)
  • Practice games against Sparky (the Arena bot) β€” this includes bot Color Challenges; Starter Deck Duels against human opponents ARE tracked
  • Games the tracker joined mid-way (no reliable opener/draw data)

These games still display live in the tracker window, with a note that they won't be saved.

Data & privacy

Everything is local SQLite. Stored logs are scrubbed of tokens and personal paths before persistence. The only network traffic is your browser fetching Scryfall card art β€” plus, only when you open the bundled Deck Finder, its requests to the public decklist sites you browse there β€” and, only if you enable AI deck identification, one small request per game to the AI provider you configured. Card identification uses Arena's own local card database (Raw_CardDatabase_*.mtga, discovered automatically under the Steam/Epic install, override with MTGA_DATA_DIR).

Where things live:

  • Arena log β€” ~/Library/Logs/Wizards Of The Coast/MTGA/Player.log (macOS), %APPDATA%\LocalLow\Wizards Of The Coast\MTGA\Player.log (Windows)
  • Source runs β€” data/mtga_tracker.sqlite3, with settings.json and deckfinder_config.json at the top level of the project folder
  • Installed builds β€” ~/Library/Application Support/MTGA Tracker (macOS), %LOCALAPPDATA%\MTGA Tracker (Windows), fully independent of the repo

Don't run the source and installed trackers at the same time, and never copy a live database while a tracker owns it β€” use SQLite's backup API for migrations.

Development

pip install -e '.[dev,gui]'

# Python suite (menu app tests need a display)
venv/bin/python -m pytest tests -q --ignore=tests/test_menu_app.py \
  --deselect "tests/test_log_parser.py::test_find_log_path_error_handling"

# Frontend: tests, types, lint, build (dashboard serves ui/dist β€” rebuild after UI changes)
cd ui && npx vitest run && npx tsc -b && npm run lint && npm run build

# UI development with hot reload (API + Vite side by side)
venv/bin/python -m mtga_tracker.dashboard
cd ui && npm run dev

Layout: src/mtga_tracker/ (tracker mixins, analytics store, dashboard server), ui/ (React/TypeScript dashboard), tests/, packaging/ + scripts/ (PyInstaller builds), docs/. Working on it with an AI agent? Start with AGENTS.md β€” it's kept current on purpose, and it's the only place agent guidance lives.

Documentation

License

Copyright (C) 2026 Travis Patton

Licensed under the GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later) β€” see LICENSE. You may use, modify, and redistribute this software, but any distributed or network-hosted derivative must also publish its source under the same license. For commercial licensing outside these terms, contact the author.

MTGA Tracker is unofficial Fan Content. Not approved/endorsed by Wizards of the Coast. Magic: The Gathering and its logos are trademarks of Wizards of the Coast LLC.

About

Magic: The Gathering Arena tracker for Windows & macOS with live game events and a local analytics dashboard for matches, decks, cards, draws, rank, and turn timing. Includes a bundled Deck Finder/Downloader for discovering and importing Arena decks.

Topics

Resources

Stars

6 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages