Work Case study
Cardhouse
A sports card portfolio tracker: what a collection holds, and what it is worth.
- Next.js
- React.js
- TypeScript
- PostgreSQL
- Prisma
- Auth.js
- Tailwind CSS
01
The Idea
A collection is a portfolio whether or not anyone treats it as one. Cardhouse tracks what a collection contains and estimates what it is worth from comparable sales, rather than from a single headline price.
02
Technical Decisions
A trimmed mean, not a median
Valuation uses a recency-weighted trimmed mean of comparable sales. A median returns a price that was actually observed, so a tight cluster of comps produces a flat, stepped chart that looks broken.
The data source never falls back silently
The market-data provider switch refuses to fall back from live data to the demo catalogue. A valuation that quietly changes source is worse than one that fails loudly.
03
Challenges
Sold prices are the hard part. eBay retired the completed-items search in February 2025, and the API that replaced it for sold data is a limited-release product that is not open to new individual developers. Active listings and image search are available; historical sale prices are not.
So the app is built against the real API surface that does exist, and every price in the current build comes from a demo catalogue that is labelled as such in the interface.
Nothing in the demo build is presented as a real market price. Live valuations wait on a sold-comp source that can actually be obtained.