Skip to content
Dylan Fitzpatrick
← All work

projects

Card Vault: a price tracker that updates itself

A collection tracker for Pokémon and sports cards that reprices itself every morning from real sold prices, and runs entirely on free tiers.

Role
Design and build
When
2026-09
Tools
Claude Code, Next.js, Postgres, Vercel
AI
Claude Code

What it does

Card Vault tracks what a card collection is worth. Add a card and its price updates automatically every morning, with no spreadsheets and no manual lookups.

Raw Pokémon cards are priced from live market data. Graded and sports cards are priced from sold listings, because an asking price is only what someone hopes to get.

Card Vault on a phone: the dashboard with collection value, the collection grid, and a graded card's detail page
Dashboard, collection and card detail. It installs to the home screen as a PWA. Shown with demo data.

Pricing you can trust

Every graded card shows the sales behind its price. If a listing isn't really your card, like a damaged copy or a different grade, untick it and the value recalculates straight away.

A PSA 8 Charizard card page with its value history and a list of recent eBay sales, one of them unticked
The price is the median of the sales listed. The damaged outlier is unticked, so it doesn't drag the value down.

Designed around the data, not just the screens

Pricing data is messy, so the product gives the collector the final say:

  • Untick a sale that isn't really your card, and the value recalculates straight away.
  • Set your own value for anything unusual, and the daily updates leave it alone.
  • Bulk import a collection from a CSV template. Pokémon rows are matched to live prices automatically.

Adding one card is a search, not a form. Type a name and pick the exact printing from real card art. The set, number and year fill themselves in, and the card is linked to live prices.

The Add a card screen with a search for Gengar showing every printing as card images
Pick the exact printing by its art, not by guessing set codes.

A constraint worth designing for: free

Every service it runs on stops at its limit instead of charging. That constraint shaped the product: photos are resized in the browser before upload, the day's pricing work is split across several scheduled jobs, and a settings page shows today's usage against each limit.

The free-tier usage panel showing sold-sale rows, eBay searches and photo storage against their daily limits
Today's usage against each free tier, so a limit is never a surprise.