Scarabhold
A Yu-Gi-Oh! Trading Card Game price tracker with archetype pages and a banlist watch.
The third site in the same family, this time for Yu-Gi-Oh!, with two angles neither of its siblings has: Archetype pages that total up the cost of collecting an entire named card family, and a Banlist Watch that tracks which cards are Forbidden or Limited and when that changed.
The data source here is unusually convenient: the entire card catalog comes back from a single bulk request, rather than the per-card or per-set fetch loop the sibling sites need, with tournament-legality and multi-vendor pricing already included per card. Every harvest run snapshots each card's price by vendor and day, so day-over-day diffing drives Gainers/Losers and Trends pages without any extra bookkeeping. Because the API only ever exposes the current banlist, not a history of changes, Banlist Watch is built by comparing each run's banlist status against the previous run's and logging every card that changed — a real, dated change feed built from repeated snapshots rather than a feed the API provides directly. Archetype and curated collection pages share one general-purpose hub template rather than forking near-duplicate ones. Every card image is self-hosted rather than hotlinked, and each card exposes a small embeddable price-chart widget that other sites can drop in, matching the mechanism its sibling sites use.
The set data had a hidden trap. Each card lists a per-card code for every printing it has appeared in, and that code looks like a set identifier but isn't one — grouping by it directly produced thousands of bogus one-card "sets" before the real set prefix was identified and used instead. A subtler bug came from how the template engine treats missing values: an undefined variable isn't the same as a real empty value, so a page for a set with no computed cost yet was rendering a false "$0.00" instead of hiding the box, until the check was corrected to treat "undefined" and "empty" as the same thing. Two more surfaced after the initial deploy: a missing page was quietly returning success instead of a real not-found response, caught and fixed post-launch, and the embeddable price widget didn't work as a genuine third-party embed until cross-origin access was explicitly enabled and re-tested from an actual separate page, not just by checking it against the site's own domain.