- Match page now holds players/match info, turn stats with a turn picker, and the deck lists (My deck · Preview · Opponent); the Deck and Turn tabs are gone. Section heights are draggable and remembered. - History: sortable, resizable columns; deck and commander columns; right-click to show only or hide games with a value, with filter chips; stats tiles (win rate overall, last 10/100, last 7 days, play/draw, average length and turns) that follow the filters. Commanders are backfilled for games recorded before they were stored. - Deck panel shows copies per zone against the deck total (e.g. 2/5). - Preview can be cleared with ✕, a click on the image, or Esc. - Customize menu stays open while toggling; Arrange covers deck sections and turn stats together. - Fix squeezed nav buttons and the header pushing controls off-screen. - Fix known opponent cards being double-counted when also revealed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mtga-assistant
A native Linux deck and game tracker for Magic: The Gathering Arena running under Steam/Proton.
It follows MTGA's Player.log, much like Untapped.gg and other trackers do, and shows:
Two views, switched from the top bar (Ctrl+1 / Ctrl+2):
- Match, from top to bottom (drag the dividers to resize; sizes are remembered):
- You · Match · Opponent: life totals, poison/energy and other player counters, commanders, emblems, hand/library/graveyard counts, turn timer and timeouts, land drops used/allowed, who was on the play, plus the match panel (turn, phase, game number, Bo3 score and draw count, game time).
- Selected turn · Turn · Whole game: what happened in a turn for you, your opponent and in total (cards drawn, spells cast, lands played, creatures died, life gained/lost, damage, discards, mills, exiles, counters, tokens, land drops). The middle panel picks the turn (◀ ▶, or Live to follow the current one).
- My deck · Opponent · Preview: remaining library with draw odds, your zones; the opponent's board, graveyard, exile, cards known to be in their hand or library, and every card seen this match; hover a card for its Scryfall image.
- History: stats (win rate overall, last 10/100 games, last 7 days, on the play/draw, average
length and turns) and a sortable list of every finished game: date, event, deck, commanders,
opponent, both decks' colours, who was on the play, result, turns and length. Click a header to
sort, right-click a cell to show only (or hide) games with that value; the stats follow the
filters. Click a game to open it in the Match view ("Back to live" returns). Games from the
previous MTGA session (
Player-prev.log) are imported on startup.
⚙ Customize shows or hides the match panels, turn stats, deck sections and the preview. Customize → Arrange… reorders (drag, or ↑/↓) and shows/hides the My deck and Opponent sections and the turn stats. Your choices are remembered.
Card names, mana costs and types come from MTGA's own local card database, so they work offline.
Requirements
- MTGA installed through Steam (Proton). The log, install and card DB are auto-detected from your Steam library folders.
- Detailed logs enabled in MTGA: Options → Account → Detailed Logs (Plugin Support).
- uv (
pacman -S uv).
Running
uv run mtga-assistant # follow the live Player.log
uv run mtga-assistant --replay path/to/Player-prev.log --rate 40 # replay a saved log
uv run pytest # tests
Start it before or after MTGA: on startup it reads the existing log to catch up on a match in progress, then follows new lines. When MTGA restarts and replaces the log, the tracker resets.
On Wayland the window's app id is mtga-assistant. For example, to keep it floating on another
workspace in Hyprland:
windowrule = float, class:^(mtga-assistant)$
windowrule = workspace 2, class:^(mtga-assistant)$
Configuration
Optional: ~/.config/mtga-assistant/config.toml
log_path = "/path/to/Player.log" # override auto-detection
mtga_dir = "/path/to/steamapps/common/MTGA"
cache_max_mb = 500 # image cache cap
history_max_mb = 300 # cap for stored game details (summaries are always kept)
Game history lives in ~/.local/share/mtga-assistant/history.db (roughly 20–100 KB per game).
Image cache
Images are downloaded only for cards that actually appear, at Scryfall's normal size (about
60–100 KB each), and stored in ~/.cache/mtga-assistant/images. When the cache passes
cache_max_mb, the least recently viewed images are deleted. Cache → Clear image cache empties it.
Known limitations
- MTGA leaves oversized game-state messages out of the log ("Message summarized because one or more GameStateMessages exceeded the 50 GameObject or 50 Annotation limit"), typically during board wipes. Some zones can then be stale until they next change. The app detects this and shows a warning.
- After a library shuffle, a known card's position in the opponent's library is lost. It stays listed under "Library … known" until it shows up again. If it is drawn without being revealed, it may stay listed.