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.
π¬ Join the community on Discord β for discussion, bug reports, and feature requests.
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.
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:
Recent Games β outcomes, deck and opponent colors (including the colorless diamond), formats, Brawl commander matchups, draw status, and game pace at a glance:
Constructed Ranked β lifetime and per-season match records around the ladder chart, with a season selector to replay any climb:
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:
Deck drill-down β combat profile, streaks, decklist performance, land statistics:
Game forensics β turn timing, draw quality, combat & resources, life chart, full timeline:
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.
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.ps1Or 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 commandSee QUICKSTART.md for the full walkthrough, including the Gatekeeper/SmartScreen note for unsigned alpha builds.
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 | 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.sqlWith 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.
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.
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.
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.
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.
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, withsettings.jsonanddeckfinder_config.jsonat 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.
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 devLayout: 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.
- QUICKSTART.md β install and first run
- docs/RELEASE_PLAN.md β packaging, GitHub Releases, alpha checklist
- docs/OVERLAY_TRACKER_PLAN.md β planned in-game overlay
- docs/MTGA_LOG_FORMAT.md β how Arena's log actually works
- docs/MTGA_INSTALL_DISCOVERY.md β plan for finding Arena's card DB in standalone/non-default installs
- docs/TROUBLESHOOTING.md β seat detection and log issues
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.









