Tom's Card Manager is a single program that runs entirely on your own PC. There is nothing to install, no account to create, and nothing to sign up for. Unzip the download to any folder you like — your Documents folder, the Desktop, or a USB stick — and double-click TomCardManager.exe to run it.
TomsCardManager.zip, choose Extract All, and pick a folder. Keep all the files together in that folder.TomCardManager.exe. The main window opens showing the full Pokémon card catalogue — over 20,000 cards across 170+ sets, already loaded.The download already includes the full card catalogue, so you do not need to download anything to get started — just open the app and start marking the cards you own. The catalogue holds the card names and set information; it does not yet know which cards you have. That is what you tell it (see Marking your stock).
Because this is a free app from an independent developer, Windows may show a blue "Windows protected your PC" box the first time you run it. This is normal for new software that is not code-signed. Click More info, then Run anyway. If you would rather check the download first, you can upload the ZIP to a free scanner such as VirusTotal before running it.
The window has three main parts:
Along the bottom, the status bar tells you how many cards are showing and, when some are hidden, which filter is hiding them (see Finding cards).
Everything is driven from the menu bar:
| Menu | What lives there |
|---|---|
| File | Export card list, back up, restore, compact the database, export your inventory, exit. |
| Store | Generate your store page, self-host images, store page settings. |
| Sales | Record sales, undo sales, sales report. |
| Collection | Wishlist, set-completion and trade-list reports. |
| Catalogue | Update online, recheck sets, import a card list, and add / edit / delete your own cards. |
| View | In stock only, Always on top, Sales / Collection mode, Check all. |
| Help | Write debug log, About. |
The app works in two modes, switched under : Sales (stock you are selling, with prices) and Collection (your personal collection, no prices). They are kept completely separate — a card can be in both at once. Most of this guide describes Sales mode; see Collection & trading for the differences.
keeps the window above everything else — useful when you are typing stock in from a binder on your desk and keep clicking away to a browser. The setting is remembered between sessions.
The catalogue is the master list of Pokémon TCG cards — names, set names, card numbers, rarities and picture links. It comes pre-loaded with the full English catalogue — over 20,000 cards across 170+ sets — so you normally do nothing here. Everything to do with it lives under the menu.
downloads any cards that are not in your catalogue yet and adds them. Run it when a new set is released.
Update only ever adds. It never changes or removes your stock, prices, locations, sale history, or the cards you added yourself. It also never changes the details of a card you already have — that is what Recheck is for, below.
An update can take a minute or two and shows a progress box you can cancel. Any cards already added before you cancel are kept, and the status bar tells you how many. If a set fails to download, the app says so and you can simply run Update again to retry.
Card data is occasionally corrected upstream: a misspelled name, a wrong rarity, a picture link that changed. Update cannot pick those up, because Update only adds. Recheck is what does.
A recheck refreshes reference details only — names, rarities, numbers and picture links.
It never changes a card's identity, so nothing you have recorded comes unstuck from its card. It never touches your stock, prices, sale history, locations, Want/Trade flags, the cards you added yourself, or any picture you stored. And it never deletes: if a card has disappeared upstream, the app reports it and leaves it alone. A backup is taken before it starts, and that is not optional — if the backup cannot be written, the recheck does not run.
Update online, Recheck, and the optional step are the only things that reach the internet, and only when you choose them. Card data comes from a free public source on GitHub; images come from the public card-image server. Nothing is ever uploaded, and the app never phones home — there is no telemetry and no version check.
The downloaded catalogue does not have everything. Regional promos, error cards, misprints, sealed oddities, cards from a language the data source does not cover — if you hold it and the catalogue does not list it, you can create it yourself.
Adding more than a handful this way gets old quickly. If you have a card list in a file — a whole set, say — use Importing a card list instead.
A card you add is an ordinary catalogue row. Stock, conditions, prices, locations, Want/Trade flags, exports, reports and the store page all work on it exactly as they do on a downloaded card. There is nothing second-class about it.
Cards you add can carry their own picture — a scan or a phone photo of the card in your hand. Click Choose picture in the card form and pick a JPG, PNG, BMP, GIF or TIFF file.
The app then tidies it up for you:
Pictures are stored inside card_manager.db, not as loose files. There is still exactly one file to back up. They also appear on your generated store page whether or not is switched on — a picture that lives on your own machine has no online source to opt out of.
and work on the selected card. Both are also on the grid's right-click menu. They are greyed out for downloaded cards — a downloaded card would just come back with the next update, so removing it would achieve nothing.
Editing keeps the card's identity. Correct a name or swap the picture and everything attached to that card — stock, prices, locations, sale history — stays attached.
A card with any sale recorded against it cannot be deleted, and the app will say so. Your sales ledger is a record of what actually happened; removing the card would quietly change past totals. Edit the card instead, or set its quantity to zero so it drops out of your stock.
Where a delete is allowed, the app first lists exactly what else will go with it — stock rows, the picture, and so on — then takes a backup, checks that backup is readable, and only then removes everything in a single step. It either all happens or none of it does.
Over time, a card you created by hand may turn up in the downloaded catalogue. looks for that: it compares your cards against downloaded ones by name and number, ignoring capitals, punctuation and leading zeros, and lists any matches it finds.
Nothing is changed and nothing is combined automatically. Your stock, prices, locations and sale history stay exactly where they are, on the card you created. If you would rather use the downloaded card, move the stock across yourself and then delete the one you added — that way nothing is lost to a guess the app made on your behalf.
Adding cards one at a time is fine for a promo or two. When a new set lands and the catalogue does not have it yet, it is not. reads a card list and adds only the cards you do not already have.
It reads:
.csv — comma or tab separated, with a heading row..txt — tab separated, including Excel's "Unicode Text" export..json — a list of cards, in either of the two common shapes.The only thing a file really needs is a column of card names. Set, number, printed total, rarity, card type, language and a picture address are all used when they are there. Headings do not have to match exactly — name, card name and product name all work, and so do set / set name, number / card number, and so on. A column it does not recognise is listed as ignored rather than guessed at.
Then run the same file again. The second time it will say 0 to add, with every card listed as already in your catalogue — which is the whole point of the screen, and the quickest way to satisfy yourself about what it is actually doing before you trust it with a big list.
Each row says one of:
| What will happen | Meaning |
|---|---|
| will be added | Not in your catalogue. Ticked, and will be created. |
| already in your catalogue | You have this card. Named, so you can see which one it matched. Cannot be ticked. |
| skipped — appears earlier in this file | The file lists the same card twice. |
| CHECK — … | Something is worth your eye before importing. The row says what. |
| not imported — … | The row could not be read. The line number and the reason are given. |
A card counts as one you already have only when its set, number and name all agree. All three, because a card reprinted into a later set keeps its original number — matching on name and number alone would throw away every reprint as a duplicate.
Plenty of card lists leave the set out, because whoever made it knew which set it was. The box above the list, Set for cards that don't name one, fills it in. Change it and the whole list re-checks itself immediately, so you can watch cards move between "will be added" and "already in your catalogue" as you get it right.
If you do not know the set, press Scan for set. It compares the cards in the file against every set in your catalogue and shows you what they look like, most likely first, with the share of the file each one accounts for. Pick one and it fills the box in. It never changes anything by itself.
If the scan finds nothing, that is usually good news rather than a failure: it means none of these cards are in your catalogue at all, which is exactly what you would expect from a set you do not have yet. Type the set name into the box and carry on.
One box names one set, so on its own it would file every card from the other sets under that name. The app spots this and says so before you can get it wrong. Press Scan for set and, where it can, Use the sets found — each card that plainly belongs to a set you already hold is given that set, and only the leftovers use the box. The Set column then shows what every row got.
If the file lists picture addresses, a tickbox offers to keep them and names the sites they point at. Leave it on and those cards show pictures like any other; turn it off and they are added with none. Nothing is downloaded during the import either way — a picture is only ever fetched later, when you select that card, exactly as it is for every other card.
It never adds a card you already have, and it never imports a row you have unticked. It takes a backup first, and will not run at all if that backup cannot be written. Every card goes in together or none of them do — if anything fails part-way, nothing is written and your database is left exactly as it was. And it never touches your stock, prices, locations, sale history or any card you already had.
Cards added this way are marked as added by hand, the same as ones you create with . That is what lets you edit or delete them later — something you cannot do to a downloaded card.
Sooner or later the downloaded catalogue will carry the set you imported. will then add its own official copy of those cards, and will not touch yours — so for a while you will have two of each. lists exactly which ones. Delete the imported copies whenever you like, or leave them; nothing breaks either way. Moving any stock across first is worth doing, because deleting a card takes its stock with it.
This is the core of the app: telling it which cards you have. Click any card in the grid, then use the detail panel on the right.
Each variant keeps its own quantities, prices, and location, so a Holo and a Reverse Holo of the same card are tracked separately. Cards you added yourself work exactly the same way.
The panel's Quick Sell button records the sale of one copy at the shown price in a single click — handy for one-off sales. To record several at once, tick the cards in the grid and use (see Recording sales).
If you edit a card and move to another without saving, the app asks whether to Save, Discard, or Cancel — so an edit is never silently lost. If you see that prompt, choose Save to keep your changes.
With 20,000+ cards, the filters are how you get to the one you want. They all combine, so you can narrow down quickly:
| Filter | What it does |
|---|---|
| Set | Show only cards from one set. |
| Search | Type any part of a name, set, number, card ID, or rarity. Multiple words all have to match. |
| Rarity | Show only one rarity (e.g. Rare Holo). |
| Location | Show only cards stored in one location. A card matches if any of its variants is in that location, not just the one the grid happens to be showing. |
| Channel | Filter by sale channel where relevant. |
| In stock only | Under — hide every card you do not currently hold. This is remembered between sessions. |
| Clear filters | Reset Set, Search, Rarity, and Location in one click. (The "In stock only" view is left alone.) |
Click a column heading to sort by it. Use to tick every visible card at once — useful before a bulk export or sale.
When a filter is hiding cards, the status bar names it rather than leaving you guessing — for example "19,231 of 20,444 cards — 1,213 hidden (1,200 by ‘in stock only’, 13 by the search box)". If a card you just added seems to have vanished, that line usually tells you why in one glance. Clear filters, and switching off , bring everything back.
saves what you have ticked in the grid:
Tick nothing and it exports everything you hold. The export follows the mode you are in: prices are included in Sales mode and left out in Collection mode, so the file always matches what is on screen.
The detail panel has an eBay button that opens an eBay search for the selected card in your browser, so you can gauge what it is selling for. Two checkboxes shape the search:
Which eBay site it uses (ebay.com.au, ebay.com, ebay.co.uk, and others) is set under . The default is ebay.com.au.
Tom's Card Manager can build a self-contained web page of your in-stock cards that you upload to your own website — a simple, searchable online store or want-list with no server or database needed.
Open and fill in:
| Setting | Notes |
|---|---|
| Page title | Your store or collection name, shown at the top of the page. |
| Tagline / subtitle | Optional line under the title. Leave blank to hide it. |
| Announcement banner | Optional strip across the top of the page — "On holiday until the 20th", "Free postage this week". Leave blank to hide it. |
| Contact line | How buyers reach you. Leave blank to hide it. |
| Notes / info block | Optional free text (postage, terms, etc.). Leave blank to hide it. |
| Accent colour | The page's highlight colour. Click to change it. |
| eBay site | Which eBay the detail panel's comps button searches. |
| Currency code / symbol | Drives the money display on the page (default AUD / $). |
All of these default to neutral, blank values — the page shows your details, never anyone else's.
Your page title and tagline are also written into the page's title and description tags — which is what Google shows in search results, and what appears when someone pastes your link into Facebook or a chat. Filling them in properly is worth a minute.
index.html, cards.json or images folder, the app names those files and asks before replacing them. See the warning below.index.html and cards.json (plus an images folder if you chose self-host). Upload all of them together to your web host.Generating writes index.html, cards.json and the images folder using those exact names. If your website folder already has a page called index.html, generating into that folder replaces it, and that cannot be undone.
So the first time you publish to a folder that already holds any of those, the app lists exactly which files would be replaced, shows the full path, and asks. No is the default answer — nothing is written and the folder is not remembered. Choose Yes and that folder is approved from then on, so your normal week-to-week publishing never asks again.
You will not see the prompt when you publish into an empty folder, or back into the folder you have already approved. If you ever see it for a folder you publish to every week, take it seriously — it means you have picked a different one.
Cards you added yourself appear on the page like any other, and any picture you gave them is published with them — self-host or not.
A card with no picture at all gets a tidy "No image available" box rather than a broken-image icon.
Generated pages carry a small footer, "Generated with Tom's Card Manager — tomdahne.com". This is how a free tool pays its way — please leave it in place (it is a condition of the licence).
To update the page later, change your stock in the app and Generate again, then re-upload the files. The page is just static files — there is no database on your server to manage. The app remembers the folder you last generated into, so the second time is one click.
Every sale is recorded so you keep a history and your stock stays accurate.
Right-clicking a card in the grid also offers Update Checked Cards Sold and Recent sales for this card.
There is no redo. Reversing a sale puts the stock back and removes that sale from your ledger — putting it back means entering it again by hand. That is why the app names the sale before it does anything, and why No is the default. Read the card name in the box before you click Yes.
The app remembers two folders, separately: the one you generate your store page into, and the one you save reports into. A sales report shows what you paid and what you made — it should not end up in the directory you sync to a public web host, and it won't.
Reports are written under fixed names (sales-report.html, wishlist-report.html, trade-list.html, set-completion.html), so the same check described under The store page applies: the first time you save into a folder that already holds one of those, the app asks before replacing it.
Switch to to track your personal collection separately from your sale stock. Collection entries work the same way (variant, condition, quantity, location) but have no prices — it is what you own, not what you are selling.
The menu produces three HTML reports, each opened in your browser:
| Report | Shows |
|---|---|
| Wishlist report | The cards you have flagged as wanted. |
| Set-completion report | How complete each set is, including secret rares. |
| Trade list | The cards you have flagged as tradable. |
"Complete" is measured against the downloaded catalogue, so a set does not read as 103% full because you added three promos to it. Cards you added yourself are counted and listed separately, so you can still see them.
Everything you enter lives in one file, card_manager.db, next to the program — stock, collection, sales, locations, the cards you added and their pictures. That single file is the thing to protect.
backups folder. Do this regularly, and before anything major.You can also just copy card_manager.db somewhere safe (another drive, cloud folder, USB) at any time the app is closed. That one file is your entire collection, stock, sale history and pictures.
Before anything that rewrites your data — a database upgrade after an update to the app, deleting a card, a recheck, or a compact — the app takes its own backup and verifies it can be read back. If that fails, the operation does not run at all and nothing is changed. Those safety copies go into the same backups folder as the ones you make yourself.
When you delete rows, the database file does not shrink. The space inside it is marked reusable and the app writes new data into it before growing the file again — which is efficient, but it does mean a file that has had a lot of churn can sit larger on disk than the data in it warrants.
hands that space back. It shows you three numbers before doing anything:
Say yes and it takes a backup, rebuilds the file, and reports the size before and after. Nothing is deleted — every card, sale, location and picture is kept exactly as it was.
It needs room to work. Roughly three times the size of your database should be free on that drive while it runs — one copy for the backup, and up to two more for the rebuild. The working space is released when it finishes; the backup is kept on purpose.
It never runs on its own. Compacting only ever happens when you choose it from the menu. If you never use it, nothing about the app changes.
Everything the app uses sits in its own folder, next to the EXE. Nothing is written anywhere else on your PC except the output folder you choose yourself when generating a store page or saving a report.
| Item | What it is |
|---|---|
TomCardManager.exe | The program itself. |
card_manager.db | Your data — catalogue, stock, collection, sales, locations, your own cards and their pictures. Back this up. |
settings.ini | Store-page settings (title, banner, contact, currency, eBay site). |
prefs.ini | Small interface preferences — the toggles you have set, the two output folders the app remembers, and which of those folders you have approved for replacing files in (see The store page). |
backups\ | Timestamped database backups you create, plus the automatic safety copies described above. |
cache\ | Card images downloaded for the detail panel. Safe to delete; it refills. Pictures you added yourself are not here — they are inside the database. |
debug.log | A diagnostic log of what the app did — counts, set names and the folders it wrote to. No prices and no sale figures. The folder paths do include your Windows user name, so glance at it before sending it to anyone. Written while is ticked, which it is by default. Untick it to stop, and delete the file any time. |
| Item | What it is |
|---|---|
index.html | Your store page. This is the file people open. |
cards.json | The card data the page reads. Upload it alongside the page — the page will not work without it. |
images\ | Card images, when self-hosting is on, plus any pictures you added yourself. |
images\_sources.txt | A small index of where each self-hosted image came from, so the next run knows what it already has and does not re-download everything. Harmless to upload; nothing needs it. |
Make sure you extracted the ZIP fully (do not run it from inside the ZIP viewer) and that TomCardManager.exe and its files are together in one folder. If Windows SmartScreen blocked it, see the note under Getting started.
Almost always a filter. Check the status bar — it names what is hiding cards. The usual culprit is , which hides any card you have not recorded stock against yet, including one you have only just created. Click Clear filters and untick In stock only, then search for the card by name.
That means the catalogue is empty — there are no cards at all, not that a filter is hiding them. The download ships with the full catalogue already loaded, so the usual cause is that card_manager.db has been deleted, renamed, or left behind when the app was copied to another folder. Either put the file back next to TomCardManager.exe, restore a backup, or do what the panel suggests and run to download the catalogue fresh.
That prompt appears the first time you publish into a folder that already contains an index.html, cards.json or images folder. It is asking once, on purpose: those are the names the app writes, so publishing there replaces them. Read the path it shows. If it is your store folder, choose Yes and you will not be asked for it again. If the path is not what you expected — your Desktop, your Documents, somebody else's site — choose No; nothing is written and the folder is not remembered.
If a folder you publish to every week suddenly asks, you have almost certainly picked a different folder in the browse box.
Something is stopping the app opening settings.ini — most often another program has it open, or the folder is read-only (running the app from inside a ZIP, or from a locked-down location, will do it). The app tells you the reason rather than quietly falling back to a blank shop, because publishing a store page with someone else's default details is worse than not publishing one. Close whatever has the file open, or move the app folder somewhere you have write access, and try again.
That is normal, and mostly it is the pictures — they live inside the database by design, so there is only ever one file to back up. If you have deleted a lot of cards or pictures and want the space back on disk, use (see above).
All of them show a progress box with a Cancel button. Cancelling is safe — an update keeps the cards already added, a cancelled recheck keeps the sets already done, and a cancelled Generate leaves your existing store page untouched. A recheck of every set downloads one file per set, so several minutes is normal.
If you report a problem, make sure is ticked, reproduce the issue, then send the debug.log file from the app's folder. It records what the app did — counts, set names and the folders it used. There are no prices and no sale figures in it, but the folder paths do include your Windows user name, so have a look before you send it.
Support for this free tool is best-effort, from one developer. Get in touch via the feedback link below — bug reports and feature requests are welcome too.