Suggestion scoring is fully offline (tribal/mechanic/archetype/mana-base signals derived at ingest, no external synergy database), with an "unusual picks" mode that surfaces underappreciated cards instead of staples. The deck page's top panels now use a CSS grid so wide windows don't waste horizontal space. Library's bulk add-to-deck can clobber existing deck quantities, so it now offers an undo (snackbar + command palette, the latter with no timeout) that restores each card's prior state exactly. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
mtgc — Personal Magic: The Gathering Library Catalog
A desktop app (Tauri v2 + React) for cataloging your MTG collection: rapid fuzzy card entry, rich criteria search (colors, commander color-identity compatibility, mana value, type/subtype/keyword), and deck organization with per-card deck membership. Built so the eventual mobile port is cheap — all logic lives in a platform-agnostic Rust core.
Architecture
src/ React + TypeScript UI (swappable presentation)
src-tauri/ Tauri v2 shell — exposes the core as typed commands
crates/mtgc-core/ Pure Rust: db, fuzzy search, filters, decks, ingester
Two SQLite databases, joined at runtime via ATTACH:
reference.db— read-only card data built from Scryfall bulk. Bulky, re-downloadable per device, not synced.library.db— your owned cards + decks. Small, portable, the file you sync (drop it in Syncthing/Dropbox/Nextcloud). Point the app at it via Choose library file….
Both default to the OS app-data dir (e.g. ~/.local/share/com.garrettmills.mtgc/).
First-time setup
./scripts/devel-setup.sh # Tauri system libs (webkit2gtk/gtk3) + Tauri CLI
npm install # frontend deps
Why GTK3, not GTK4? Tauri v2's Linux backend (
wry/tao) hard-depends on GTK3 +webkit2gtk-4.1; there's no GTK4/webkitgtk-6.0 option yet. GTK4 support is tracked upstream but unmerged with no ETA: tauri#7335, tao#1104, wry#1228. Revisit once Tauri ships GTK4 support (likely Tauri v3).
Run
cargo tauri dev # launches the desktop app (dev mode)
On first launch, click Download card data — it fetches the Scryfall
Oracle Cards + Default Cards bulk (~a few hundred MB) and builds
reference.db. After that the app is fully offline.
You can also build the card database from the command line:
cargo run -p mtgc-core --bin mtgc-ingest -- /path/to/reference.db
Production build
Build an optimized app with the frontend embedded into the executable:
./scripts/devel-setup.sh # once, if not already done
cargo tauri build
Outputs (under the workspace target/release/):
target/release/mtgc— the standalone executable. The web UI and all app logic are baked into this one file. It dynamically links the system WebKit/GTK libraries (webkit2gtk4.1,gtk3), so those must be present on the machine that runs it — they are on any modern desktop Linux and are installed bydevel-setup.sh.target/release/bundle/rpm/*.rpmand.../deb/*.deb— native installers (Fedora / Debian-based) that add a menu entry and icon.
Useful variants:
cargo tauri build --no-bundle # only the bare target/release/mtgc binary
Notes:
- The
mtgcbinary is a single file but relies on the system WebKit/GTK libs being present (installed bydevel-setup.sh). - The binary does not embed card data — first run still downloads the Scryfall
bulk into the OS app-data dir, and your synced
library.dblives there by default (override with Choose library file…). - The
[profile.release]settings inCargo.toml(strip + LTO) make the release build take a few minutes but keep the binary small.
Using it
- Add Cards — type a name (typos OK); ↑/↓ then Enter adds a copy.
- Library — filter owned cards by name, colors, commander identity (color identity ⊆ chosen), mana value range, type/subtype/keyword, or deck. Hover a row's thumbnail for a full-size preview that tracks the cursor. Rows show which decks a card is in and a warning (⚠) when it's assigned to more decks than you own. Toggle List / Tiles (top-right) to switch between the table and a grid of full card images; the choice is remembered.
- Deck contents offer the same List / Tiles toggle and hover previews.
- Decks — create decks and assign owned cards; set per-deck quantities.
Develop / test
cargo test -p mtgc-core # core unit tests (db, search, filters, decks, ingest)
npm run build # typecheck + build frontend
cargo build # build everything incl. the desktop app
Mobile (future)
The core and frontend are platform-agnostic; cargo tauri icon already emitted
iOS/Android icon sets. Porting is adding tauri ios / tauri android targets —
only reference-data provisioning differs (download on-device).
Branding
The logo is an original pirate-ship silhouette in the terracotta brand color
(#C8553D) — a nod to the MTG card "Pirate Ship", not a reproduction of its
art. Source: src-tauri/icons/logo-source.svg. To regenerate the full
platform icon set after editing it:
cargo tauri icon src-tauri/icons/logo-source.svg