I had a problem. I got into Magic: The Gathering fast, and it is a hobby that piles up physical objects. A few hundred packs in, I had lost track of what I owned and which of it was worth anything. So I built Binder to get a handle on it, pairing the physical cards with digital scanned copies so I could track the collection and what it was worth over time.
1.7%
of the way to break-even
at the current pace, break-even lands around 2081
I also wanted to learn Swift
I know myself well enough to know I finish things I care about and abandon things I do not. So the hobby was the vehicle. It started as a price lookup and very little else, then over the following months it grew camera scanning, collections and decks and wishlists, a deck builder that scores Commander decks against the official power brackets, a life counter, and price tracking, all of it running against live Scryfall data. I built every part of it, from the data model out to the last screen, and learned Swift, data modeling, and API work by getting each of them wrong first. It was also the first thing I built mostly by prompting rather than typing, which taught me more about feeding a model the right context than it did about syntax.
It is on the App Store as MTG Binder, a free 2.7 MB download rated 5.0 across 8 reviews. Feel free to download it and give me another one ;)
A card is in more than one place at once
My first data model gave each card one home. You scanned a card, it went into your collection, and that was where it lived.
Then decks arrived. A card I wanted in a deck was already sitting in my collection, and I still wanted it on the wishlist because I wanted a second copy. One card, three honest answers, and a model that could only hold one of them. I had built a card as a thing that sits somewhere, when a card is really a thing that turns up in several places at once.
The fix was to stop treating collections, decks, and wishlists as three different features. Each one is a named group of cards with a color on it. Same shape underneath, different label on top. A card can appear in as many of those groups as it needs to, and none of them is the real one.
Rebuilding around that is what made the rest of the app possible, and it is also a bill I am still paying. Every feature that touches a group, deck formats and wishlist alerts included, has to work through that one shared idea instead of something purpose-built. I would make the same call again. I would just rather have made it before I had to unpick the first one.
What my friends made me rebuild
I handed it to friends and other players, which is where the useful feedback came from, and where I found out my ideas about how people would use it were roughly half right.
The scanner went first. I had built it to take one card at a time, which is fine for one card. Anyone holding an actual pile was diving in and out of scan mode over and over, and they told me so. It became a batch scanner that logs a whole stack in one pass. OCR still misreads a name often enough that I kept manual search as a fallback instead of trusting a scan blindly.
Prices went next. I was showing people a number and expecting them to take it on faith, and what they wanted was to see where it came from. Linking out to the marketplace the price was pulled from turned out to be the fix. TCGplayer runs an affiliate program, so the link that answers where a number came from is the same link that earns the $3.79. I did not set out to monetize price provenance. Players asked for a reference and the reference happened to pay.
Last was getting data back out. People wanted their collection in a spreadsheet, partly to move it between tools and partly because they had their own tracking and were not about to abandon it for my app. There is a CSV export now, and a TCGplayer Mass Entry export that copies a quantity-and-name list to the clipboard and opens the bulk-add page with it.
One complaint I solved on my own terms. Two Commander decks can both be legal, both run 100 cards, and play nothing alike at the table, so the app scores a deck 1 through 5 by looking for Game Changers, tutors, extra-turn effects, mass land destruction, and a table of roughly 90 known infinite combos. I maintain that table by hand, which means it goes quietly stale every time a new set prints.
Some product thoughts
Hasbro says more than 50 million people have played Magic across 150 countries. In 2025 the game brought in $1.7 billion, up 59% in a year, inside a company that made $4.7 billion in total.
Almost none of that money touches Binder. Hasbro sells sealed product: packs, boxes, precons. Binder sells nothing. It works on the cards already in your house, and nobody publishes a number for that side of the hobby. The closest public figure I found is the $295 million eBay paid for TCGplayer in 2022, and that buys the storefront, not the cards going through it.
Which leaves me guessing at my own market. Whatever it is, it is some fraction of that 50 million, the people who own enough cards to lose track of them and still care what they are worth. I cannot size that group and I have not found anyone who has. What I do know is that a 59% year means the pile in everyone's house got bigger.
What I'd like to work on next
You pay shipping on every card you buy online, even when the one you want is already sitting in a binder a few streets away.
So the next thing I want to build is location. A collection would know roughly where it is, Binder would show you cards inside a radius you pick, and it would put you in touch with whoever is holding one so the two of you can trade or sell without either of you paying to mail anything.
That runs directly into the part of the app I like most. Binder collects nothing today, has no accounts, and says so on its store page. Radius search needs some of that to change. How much has to change, and whether the trade is worth making, is the part I have not worked out yet.





