- 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>
87 lines
4.3 KiB
Markdown
87 lines
4.3 KiB
Markdown
# 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](https://scryfall.com) 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](https://docs.astral.sh/uv/) (`pacman -S uv`).
|
||
|
||
## Running
|
||
|
||
```sh
|
||
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`
|
||
|
||
```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.
|