Changelog
41 releases · 264 changes
September 2026
- New
You can now import a CSV exported from Pitchstack or another collection tracker into any collection you own, or into a new one. Choose which of the file's counts get imported — owned, wanted, spare-for-trade, or several of them added together, so a card your file lists as two owned and one spare comes in as three — and see exactly what will be added or topped up before anything is written, with anything we could not match to a card listed rather than silently skipped. A file that writes `Marvel` in its finish column rather than a treatment column still lands on the Marvel printing, not the plain cold foil beside it, and `Marvel` or `MV` written in a treatment column is read as the Full Art treatment it is rather than coming back as a word we do not know. Lines the file itself got wrong — an unreadable count, price, date or set number, a condition or finish we do not recognise, a row that does not line up — are named too, with the line and the text we could not read, so nothing goes missing without saying so. A file whose condition column is filled in on some rows but not others keeps the Condition field, now labelled for exactly that job — the rows that leave it blank come in at the condition you pick there and the preview counts them, rather than Near Mint arriving without anyone mentioning it. The same goes for anything that comes across but not whole: a note too long to keep and a count with a fraction in it are both named with their line, rather than quietly arriving shortened. A file that carries two columns for the same thing — a `Quantity` and a `Qty` — says which of the two we read and which we ignored, so a blank first column never quietly wins. A column simply headed `Product`, `Printing` or `Identifier` is read row by row, by what each cell holds rather than by the column's name: a tracker that puts card *names* under `Product` still imports through its set numbers, instead of every row coming back as a product we have never heard of — and those names are kept and checked, so a set number that slipped a row or lost a digit comes back as the wrong card for that number rather than importing something else under your card's name. A column that is ids on some rows and names on others gets both, each row as what it holds, so one row can never change how another is read, and we say once for the file which way its rows went. If your file has both a `Product` and an `Identifier` column, neither of them speaks for the row: whichever cell actually holds a name is the one read as one, so another tracker's codes under `Product` beside real card names under `Identifier` keeps the names rather than the column that happens to come first winning them. Two cells on one row holding two *different* names are a row naming two cards, and that is listed as unmatched instead of matched to whichever we saw first. A tracker that puts its own product or printing codes under `Product` or `Printing` — which are written much the way ours are — imports through its set numbers too: those values are set aside, the rows are matched on the rest of what they say, and we tell you once for each column that the file was read that way instead of returning thousands of rows as ids we have never heard of. Only a row with nothing else to go on is left out for it. That holds for a code that *resolves* as well as one that misses: another tracker's code can happen to spell one of ours exactly, so an id is only used when everything else the row names agrees with it — the other id, the set number, the set code, the card name, the pitch, and the language, finish and edition your file filled in — and one that turns out to name a different card, or the same card in a finish or language your row never asked for, is set aside the same way a code we have never seen is. Where a file carries both of those one-word columns and the two ids name different cards, neither of them is set aside for the other: unless something else on the row agrees with one of them — its set number, its card name — the row is listed as unmatched saying its columns do not all name one printing, rather than importing whichever of the two guesses we happened to read second. Under an unmistakable `Product ID` or `Printing ID` column we do not choose between them at all: a row whose ids, set number, set code, card name, pitch, finish, language and edition are not all one printing is listed as unmatched saying so, so you can fix the file rather than find out later which of them we guessed. A row we did match by its id but that asks for a treatment the id does not carry is marked probable rather than exact, the same as everywhere else. Your file's `Card ID` and its `Card name` are both checked now, rather than whichever one we reached first: a row carrying one card's id beside another card's name — an old export, or a name column that has slipped out of line — is listed as unmatched instead of quietly importing one of the two. A card id or name read out of a one-word column still gives way to the one your file spelled out, and we say once for the file that it did. The two faces of a double-faced card are not a disagreement: an id for the whole card beside either face's name still matches. Your `Set code` is checked against your set number the same way: a row giving a complete code like `MST095` beside a set code naming another set is left out and named with its line and both cells, instead of importing into one set and being listed under the other. Your `Set code` is checked against the set the row actually lands in, not only against your set number: two reprints of one card are two different products, so a `Product ID` for one of them beside a set code naming the other is listed as unmatched rather than importing the reprint you did not ask for — and a code that spells two sets agrees with either half. A promo whose number is only ever written as the second half of such a code — a set code of `FUN` beside a set number of `001` — imports on that number rather than coming back as a set number we have never heard of, and it does so whether or not the row also carries a product or printing id. Your `Pitch` is checked the same way: a set number that has slipped a row up a spreadsheet lands on a real printing of a different card, and where your file says red and that card is blue, the row comes back as the wrong card for that number instead of importing as an exact match. A blank pitch says nothing and agrees with anything, and a card with no pitch at all — a piece of equipment, a weapon — agrees with `none` and not with a colour. A cell of a few thousand characters is refused outright rather than read from its first part: a quantity of `1` followed by a thousand spaces and an `x` is reported with its line instead of quietly importing one copy, and the same goes for an over-padded set number or date. A note is the one exception — it still imports, shortened, with what was left off named as before. That holds even when the number already has a good row above it: two rows claiming one set number for two different cards are kept apart, so the misnumbered one is listed on its own as unmatched with its own copies instead of being added to the card above it. The same goes for any two rows that agree on the one thing they are grouped by and disagree on something else — one product id naming two different printings, one product id under two different set codes, or one set number written twice in two finishes — while a row that simply leaves a column blank still counts as agreeing. That holds however little a row says and whatever order the rows come in — a row giving only an identifier and a row giving only a name are never taken for one card just because neither contradicts the other, and a name that could belong to either of two cards at that number is left for the match to settle rather than guessed onto one of them. A double-faced card your file lists once per face still counts once, and a card your file names twice — once by identifier, once by identifier and name — still counts once even when the file carries no set numbers at all. A card whose name carries an accent is matched whether or not your file spells the accent, so `Potion of Deja Vu` lands on the same card as `Potion of Déjà Vu`. Language names read the same way: `Maori` finds the Māori printing whether or not your file spells the macron. Prices are read the way your file writes them, `12,50` and `1,234.50` and `1.234,50` and `1 234,50` alike, and one we cannot settle either way is named rather than turned into an amount you never wrote — including a space or an apostrophe that groups something other than thousands, so `12 34` is reported instead of quietly becoming 1,234, in a count column as well as a price one. A price below zero is named rather than imported, however your file writes the minus, so `($12.50)`, `12.50-` and `12.50 CR` can no longer arrive as money you never spent. The same holds for your own export's split lots: two rows for one card in one condition add their copies together under the first row's note, price and date, and we name the second line and every value that moved — the ones it named that could not come across, and the ones it left blank that its copies now take from the first row, so three copies bought at $12.50 followed by two the file priced at nothing cannot quietly become five at $12.50. If a file you choose cannot be read from your device — or is turned away for being too big, too long, too wide or not a collection export at all — the one you already had stays loaded, counts and all, and the message says which file you still have, so trying a replacement can never cost you the work you had done on the file you have. Importing into a brand-new collection creates it as you leave the form, and the importer holds still for that moment — Cancel, Escape and clicking away all wait — so you can never end up with an empty collection you walked away from and a file you have to choose all over again. The same is true one step later: if it lands while you are looking at what will be added, Import waits, the totals catch up to the new answer, and only then does it let you send them. A Pitchstack JSON export still works from the same Import button: a snapshot dropped there goes straight to the restore flow with your file already chosen. Choosing a file takes you straight to the next step rather than asking you to press Continue on a screen with nothing left to answer, and what we read out of it — the file's name, its rows and sets and counts, and anything that was left out — is shown there, beside the choices it should inform. The destination picker marks each collection with its type icon instead of spelling the type out after the name, and Review stays out of reach, saying why, while the file, the counts you have chosen and the destination leave nothing that could be imported. Review goes straight to what will be written: every row we could place is imported, and the rows we could not — the ones nothing in the card database matched, and the ones that matched more than one printing and need your file to say which — are counted there with the rest of what was left out, one press away from a copy of all of them with their line numbers and reasons.collections
- Improved
When a bulk import cannot finish, the reason is now written for you rather than copied from the server. A refused permission, an expired sign-in, a collection that is no longer there, a busy server and a connection that never reached us each read differently and each say what to do next — instead of a line naming internal fields and ids that only made sense in a log. How many cards were added, how many were topped up and how many failed is unchanged, and Retry still sends only the failed cards and cannot add a card twice.collections
- Improved
Bulk add now imports one product in one language, rather than a whole set code at once. Sets that were printed more than once — Welcome to Rathe and its Unlimited reprint, History Pack 1 and its Black Label, Part the Mistveil and its Gold Pack — are listed separately, so importing Welcome to Rathe adds its 431 cards instead of both editions' 862. A Language field sits beside the product and offers only the languages that product was actually printed in, and Add to collection on a set page now asks which edition you mean before it plans anything.collections
- Fixed
Choosing a second deck file while the first is still being read now always leaves you with the one you picked last, rather than whichever finished loading first.decks
- Fixed
Leaving while a snapshot restore is finishing now leaves you where you went — on mobile, going to another screen or pulling the sheet back down; on the web, pressing Back out of the Restore dialog. Nothing pulls you into the restored collection a moment later, and the collection is still there when you go looking for it. A restore that *fails* after you have gone is just as quiet — the message about it no longer appears over whatever you moved on to. Importing a deck on the web behaves the same way: leaving mid-import no longer drops you into the new deck, which is waiting in your list either way — including while it says "Preparing deck", which is the part of the wait long enough to change your mind in.collections
- Fixed
When a snapshot you picked to restore cannot be read, or the restore itself fails, the message now opens over the form instead of pushing it around. The file you chose stays where it was — including when you were swapping in a replacement and it was the replacement that could not be read, in which case the snapshot you already had stays selected and the message says so. The same holds for a replacement we simply cannot restore, such as a CSV or an empty file: your loaded snapshot stays selected rather than the form emptying itself behind a message about a file you never got. A failed restore can be tried again from the message.collections
- Fixed
Importing a decklist that spells a card without its accent now finds the card. `Potion of Deja Vu` and `Jarl Vetreidi` match the same cards as `Potion of Déjà Vu` and `Jarl Vetreiði`, in either direction, rather than being reported as cards we do not have.decks
- New
You can now add a whole batch of cards to a collection at once. Open a collection you own, choose Add cards, and press Bulk add to pull in an entire set — narrowed by rarity, foiling, class and type, at the number of copies you want — or paste a list of set printing ids like `WTR215`, `3x ARC077`, or `WTR001-RF`. The language comes from the set itself, so there is nothing extra to pick. A preview shows exactly what will be added before anything is written, including the cards it will skip because you already have enough copies. Set pages have an "Add to collection" action that opens the same importer right there, with the set already chosen, your collection to pick, and — for a set printed in more than one language — which release you own. The form keeps one size and one shape while it loads, so nothing shifts under you as the set comes in. If one of the filter lists cannot be read, that picker says so and offers to try again instead of quietly offering nothing — and the rest of the import still works.collections
- Improved
A finished Organised Play event whose results have not been processed yet now says so. Instead of a column of empty standings, hero share, matchup and decklist panels, the event shows a single "Analysis in-progress" notice until the data arrives.events
- Improved
In the bulk importer, the choice of what to do with a card you already own is now a single two-position switch, styled like the From a set / From a list switch above it, instead of two separate buttons. It starts on "Add this many more", on the left; pick "Top up to this many" when you want the import to only fill gaps.collections
- Improved
The bulk importer's preview now reads like the form it came from. Three figures at the top say how many copies will be added, how many cards are new and how many are topped up, and beneath them every choice you made — the set, each narrowing, copies, condition and what happens to cards you already own — is listed under the same labels the form used, so you can check it before pressing Import. It used to be a single sentence floating in the middle of the box. A warning about a collection or import limit now states the limit in one line instead of two, so two of them at once still fit the dialog, and when the collection is nearly full it tells you how many slots you have left in it.collections
- Improved
A selected filter chip now turns red when you hover or focus it, so it is clear that pressing it removes that choice. This applies to the bulk import filters as well as the card search and collection filter dialogs.filters
- Improved
When a bulk import cannot finish, the message now tells you plainly how many cards were added, how many were topped up, and how many failed, along with the reason the server gave. It previously said only that the request had failed, with a status code in place of an explanation. Retry still sends just the failed cards and cannot add a card twice.collections
- Fixed
The widest dialogs no longer stretch to the edges of your browser. Add cards on a collection, Add cards on a deck, and Track pulled cards on a set page all used to run the full width of the window with only a hair of margin, however large your screen was. They now settle at a comfortable width on desktop and still use the whole screen on a phone.ui
- Fixed
The bulk import form no longer shifts under you. Switching between From a set and From a list used to move the tabs, the Copies and Condition row, and the duplicate-handling choice up and down, and choosing a rarity, foiling, class or type grew the form as its chips appeared. Both panes now share one steady region, and each filter holds its chosen values inside its own field, where they scroll sideways instead of adding a row, so nothing moves as you narrow the import. Changing from one set to another no longer flashes "Reading this set" in every filter; the filters simply pause until the new set is ready, and the rarity and foiling you already chose keep their names instead of briefly shrinking to a code, and the form no longer nudges up and back while the new set is read.collections
- Fixed
Filter dropdowns inside a dialog can be scrolled again. The Set list in the bulk importer, and the searchable lists in the card search and collection filter dialogs, stopped after the first screen of options because the dialog's scroll lock swallowed the wheel; the list now scrolls with the wheel and by touch. The Set list also shows every set: it used to stop at 120 and report the rest as "9 more", which hid the sets after Uprising, and when a long list is still cut short the note now says how many are shown of how many.filters
- Fixed
Bulk adding cards to a collection works again. Importing from a set or from a pasted list failed the moment you pressed Import and reported every card as failed; the import now runs through to the end.collections
- Fixed
Dialogs opened while the footer is on screen no longer show the footer painted over them. The footer sat above every dialog's dimmed backdrop and could cover the bottom of the dialog itself; it now stays underneath.shell
- Fixed
Menus that open near the bottom of a page no longer disappear behind the footer. A collection's Columns menu, a card's legality key, and a deck's version picker used to be cut off by the footer or the bottom toolbar when the page was scrolled to the end; they now open on top of everything else on the page.collections
- Fixed
Hover explanations near the bottom of a page no longer open underneath the footer. The note explaining why a control is unavailable, the keyboard-shortcuts hint in the top bar, and a profile badge's name were drawn inside the page, so the footer or the detail toolbar could cut them in half; they now float above everything on the page.shell
August 2026