A Pokémon collection tracker powered by Renaiss valuations and marketplace data.
Scan a slab, browse complete English series, organize cards across multiple collections, and compare your portfolio with live Renaiss market signals.
Built for the Renaiss Hackathon 2026.
- Live demo: add the public Vercel URL before submitting
- Demo video: add the final video URL before submitting
- Hackathon summary: HACKATHON_SUBMISSION.md
- Architecture: docs/architecture.md
- Add cards 4 ways — scan a slab photo (multi-pass OCR runs locally in the browser), look up a PSA cert number via the Renaiss API, search the Renaiss catalog by name, or enter manually. Every path always produces a result: if no market match is found you can save the card from the scanned label data and match it later.
- Renaiss-first valuation — every card is valued through the Renaiss Index where possible, with Pokémon TCG API as a labeled fallback. Confidence tiers (HIGH / MEDIUM / UNKNOWN) and valuation sources are shown on every card so you always know where a number came from.
- One-click Renaiss Sync — re-match an entire collection against the Renaiss Index: refreshes prices, upgrades manual entries to Renaiss-tracked cards, and updates marketplace status, with per-card progress.
- Live marketplace report — the Market page shows cards listed for sale on renaiss.xyz/marketplace right now: total ask value, median ask vs FMV, undervalued listings, and an ask-vs-FMV chart. Auto-refreshes every 60 seconds.
- Portfolio analytics — per-collection value, P&L, grade breakdown, Renaiss coverage %, and filters by grade / source / marketplace status.
| Integration | How |
|---|---|
Renaiss Index API (api.renaissos.com/v1/search) |
card search, cert lookup, valuation + confidence tiers |
| Renaiss marketplace (renaiss.xyz) | live listings parsed server-side from the marketplace RSC payload (ask price in USDT-18dp, FMV in cents) |
Renaiss indices (/v1/indices, /v1/cards/featured, /v1/trades/recent) |
market panels, featured cards, recent trades |
| Renaiss coverage model | every owned card tracks renaissCardId, marketplace status, and valuation freshness |
Next.js 16 (App Router) · React 19 · Tailwind 4 · Recharts · Tesseract.js (client-side OCR) · localStorage persistence (no account needed).
Runtime code is separated by execution boundary: browser-safe API clients in lib/api, local persistence in lib/client, pure business logic in lib/domain, and credentials/proxy controls in lib/server. See docs/architecture.md for the complete dependency rules.
npm install
cp .env.example .env.local
npm run devOpen http://localhost:3000.
Optional .env.local keys:
RENAISS_API_KEY= # from the Renaiss hackathon dev tools
RENAISS_API_SECRET=
POKEMON_PRICE_TRACKER_API_KEY= # optional fallback pricing
Never commit .env.local. The app works without private keys too: Renaiss routes degrade gracefully and the UI labels fallback data.
git clone <repository-url>
cd psa-tracker
npm ci
cp .env.example .env.local
npm run devOpen http://localhost:3000. No account or database setup is required because the MVP stores collections locally in the browser.
npm run security:scan
npm run typecheck
npm run build
npm run test:e2e
npm audit --omit=devThe latest repository scan receipts are under docs/security-scan/.
/collections— create a collection (or use the default)./scanner— try all four add paths:- Scan slab: upload a photo of a PSA slab; multi-pass OCR reads the label, then confirm the match (results are ranked by the card number read off the label).
- Add by Cert #: paste a PSA cert number → exact Renaiss lookup.
- Search Renaiss: type a card name (e.g. "Charizard").
- Manual Entry: fallback form.
/portfolio/<collection>— press ⟳ Sync with Renaiss and watch coverage/prices update; check the Renaiss Coverage tab./cards— the live renaiss.xyz marketplace report: stats, best deals vs FMV, and listings that link back to the marketplace.
- Data is stored in
localStorageby design — the MVP is a zero-signup local tracker; sync/auth is the obvious next step. - Renaiss valuation is labeled beta throughout the UI; fallback and manual values are labeled separately so data provenance is always visible.
- The portfolio value chart reconstructs history from when cards were added; per-day price snapshots are on the roadmap.
- API credentials remain in server-only environment variables.
- Browser requests use same-origin API routes rather than exposing provider secrets.
- Uploaded slab images and collection data stay in the user's browser for this MVP.
- Security headers and automated repository checks run in GitHub Actions.
Released under the MIT License.