Route Zero
Pokémon TCG Collection & Deck-Building Toolkit
Route Zero is a full-stack web app for Pokémon TCG collectors: search the live card catalog, track a private binder and wishlist, estimate collection value, and build decks only from cards you actually own.
The live app is public; the source repository is private.
The Problem
Collectors juggle binders, wishlists, and deck lists across spreadsheets or apps that don’t connect "what I own" to "what I can put in a deck" — and third-party card APIs make naive browsing expensive.
The Solution
Route Zero is a private binder: search the official-style catalog, track owned cards and a wishlist, see set progress and estimated market value, and build decks only from inventory.
The Results
Shipped a deployable, multi-route product — auth, search, collection, wishlist, decks, theming, and value tracking — shaped by real engineering constraints: third-party rate limits, hydrating external card IDs on read, and progressive, streamed UX so the app stays responsive even when the catalog API is slow.
Technology Stack
My Role & Contributions
Sole builder — designed and shipped the full product end-to-end over one focused week, following a real product loop: auth → search → collection → decks, then hardening. Built email/password auth and Vercel hosting, live catalog search with series/set filtering, streamed SSR with skeleton loading so the shell paints while the catalog fetches, a collection binder with quantity controls and set-completion tracking, a wishlist that "obtains" cards into the binder, owned-only deck building, and a light/dark/system theme. Later hardened the app against real-world constraints: evaluated alternate pricing APIs after rate limits killed hobby-tier plans, added in-memory caching (cards ~1 hour, sets ~6 hours), switched search to fire only on user query instead of free browsing, and added orphan-record cleanup when the upstream provider changed its card ID scheme.
Key Technical Decisions
- Store IDs, hydrate later — the database holds card IDs only; full card data is fetched from the API on read (batched and cached).
- In-memory caching — cards cached ~1 hour, sets ~6 hours, to cut repeat API calls.
- Streaming SSR — collection/search routes return promises; the UI renders with {#await} blocks and skeletons instead of blocking on slow third-party responses.
- Slim pricing — stores a single marketPrice per card instead of bulky TCGPlayer price blobs.
- Owned-only decks — deck quantity for a card can never exceed the quantity actually owned.
- Binder progress — set-completion percentage is computed from official set totals versus unique owned cards.
- Serverless-friendly Prisma — small connection pool with TLS, tuned for hosted Postgres in a serverless deployment.
Project Showcase
Take a closer look at the key features and interface design of the application.

Interested in Working Together?
Let's discuss how I can help bring your next project to life.
Get In Touch