Inspiration
Pokémon TCG collecting has become increasingly competitive in Canada. Popular products can sell out quickly, leaving collectors with reseller prices—or no clear record of when the fair-price buying opportunity appeared.
Most stock trackers react only after a product is listed, when demand is already at its highest. Sometimes the alert arrives after the product has sold out.
PokéStock Canada started with a different question: can official release news and other public signals help Canadian collectors prepare before the buying window opens?
What it does
PokéStock Canada collects official Pokémon news, permitted public feeds, and dated Canadian retail observations. Official product confirmation starts the Release radar, allowing collectors to begin monitoring before a product becomes available to buy.
For upcoming products, PokéStock presents a Canadian availability outlook based on official dates, regional retail activity, and comparable product launches. In our seven-product historical sample, Pokémon Center availability followed the official reveal by a median of 13 days, with an observed range of 0–41 days.
This historical pattern helps identify when collectors should pay closer attention, but it is never presented as a guaranteed release date.
Products move through clear active states:
- Product confirmed: an official source confirms the product, but its Canadian buying date is unknown.
- Prepare: available evidence suggests that the buying window may be approaching.
- Live now: a dated Canadian source confirms that buying has opened.
- Restock watch: a dated source explicitly announces another buying opportunity.
Only Canadian evidence can trigger a Live now alert. Global or US availability can provide useful context, but it cannot be treated as proof that a product is available in Canada.
After an opportunity closes, its first-seen Canadian listing date, observed retail price, availability result, source, and last-check date remain in a separate Canadian availability record.
PokéStock is information-only. It does not automate purchases, bypass queues, defeat retailer protections, or guarantee inventory.
How we built it
The frontend is a responsive static application built with semantic HTML, CSS, and vanilla JavaScript. It can be deployed directly through GitHub Pages without a separate application server.
A Node.js pipeline reads curated JSON sources and permitted RSS or Atom metadata. It normalizes signals, validates URLs and dates, connects different product-name variations, and calculates deterministic watch-state transitions.
These deterministic rules remain authoritative. For example, a global “available now” post cannot trigger a Canadian Live now state, and weaker evidence cannot overwrite a stronger Canadian storefront observation.
GPT-5.6 is an optional local reasoning layer. It converts unstructured publication metadata into strict structured records and produces evidence-based Canadian buying outlooks. GPT does not browse for or invent source links—the connectors supply every link, and deterministic code validates the model output.
GPT results are cached using a content fingerprint, so unchanged publications do not require another paid model call.
The public GitHub Actions workflow intentionally runs without an OpenAI API key. It can process curated evidence, run the complete test suite, update website snapshots when signal states change, and optionally send change-only notifications without consuming OpenAI credits.
This gives the project two operating modes:
- A zero-API-cost hosted demonstration using validated snapshots and cached interpretations.
- An optional local GPT-5.6 mode for analyzing new, unstructured release signals.
Challenges we ran into
The hardest problem was separating three dates that are often treated as the same event:
- The official product release date.
- The first Canadian listing or preorder date.
- The latest availability observation.
A product with a September release date can become available for preorder in July. At the same time, a launch announcement does not prove that inventory remains available the following day.
Another challenge was regional evidence. A global or US “available now” announcement is useful context, but it cannot confirm Canadian availability. We added deterministic transition rules so weaker international evidence cannot overwrite a stronger Canadian observation.
Retail websites also use bot protection and rapidly changing storefronts. PokéStock therefore avoids aggressive scraping, queue bypassing, and purchase automation. The proof of concept relies on permitted feeds, official announcements, source-linked observations, and explicit freshness timestamps.
Forecast communication was another important challenge. Collectors want a useful conclusion, but an estimated date must not look like an official announcement. The interface therefore presents a best-estimate Canadian buying window while keeping confirmed dates, model estimates, and historical observations clearly separated.
Accomplishments that we're proud of
- Built a working source-to-dashboard release intelligence pipeline.
- Defined Release radar around official product confirmation instead of waiting for a stock listing.
- Analyzed seven recent product waves and identified a 13-day median between official reveal and Pokémon Center availability.
- Demonstrated Canada-focused buying outlooks for the 30th Celebration product wave.
- Preserved an auditable history from announcement through Canadian listing and sellout.
- Added strict regional safeguards so global availability cannot create a false Canadian alert.
- Prevented sold-out observations from becoming Restock watch alerts without explicit restock evidence.
- Added filtering, sorting, watchlists, official product imagery, and dated availability records.
- Added 21 automated tests covering normalization, GPT output validation, forecasts, state transitions, regional safeguards, and catalog behavior.
- Built a zero-API-cost hosted mode while keeping GPT-5.6 available as an optional local demonstration.
- Deployed the project through GitHub Pages with scheduled GitHub Actions updates.
What we learned
The most valuable collector alert is often not “in stock now.” It is “this product is officially confirmed, and historical timing suggests that the buying window is worth monitoring.”
Early preparation can be more useful than reacting after demand reaches the storefront.
We also learned that LLMs work best here as a constrained reasoning component—not as the source of truth. Connectors supply the links, structured evidence supplies the facts, GPT explains relationships and estimates a buying window, and deterministic rules control availability states.
Regional accuracy and information freshness are just as important as discovering a product. A correct announcement can still create a misleading alert if it refers to another country or describes inventory that has already sold out.
What's next for PokéStock Canada
- Add more permitted Canadian retailer and distributor feeds.
- Build a larger historical dataset for product-family timing comparisons.
- Measure forecast accuracy against actual Canadian first-listing dates.
- Add verified Discord and email alerts for meaningful state changes.
- Improve product entity matching across regional naming differences.
- Add a human-review queue for uncertain or conflicting signals.
- Support community-submitted Canadian stock observations with source verification.
- Expand beyond the cold-start 30th Celebration catalog.
- Explore personalized watchlists and product-specific notification preferences.
Demo
Watch the narrated 2K walkthrough:
Try the live project:
https://hansun103.github.io/pokestock-canada/
View the source code:
Log in or sign up for Devpost to join the conversation.