How we source live event data
LeekDuck → ScrapedDuck → our API, with 1-hour refresh, Postgres translation cache, and graceful fallback.
Live events come from ScrapedDuck — an open feed that scrapes LeekDuck's official event posts. We re-fetch hourly, translate via Gemini Flash and cache forever in Postgres, and gracefully degrade to English on translation failure.
LeekDuck is the de facto canonical source for PoGo event news — their team posts within minutes of any official Niantic announcement. ScrapedDuck is an open data project that scrapes LeekDuck's events feed into structured JSON and hosts it on GitHub Pages.
Our /api/events route pulls the ScrapedDuck JSON every hour, normalizes it into our internal Event shape, and serves the locale-translated variant to clients based on the ?locale= query.
1. Hourly cron → fetch https://scraped-duck.github.io/events.json 2. Diff against last snapshot → identify new + changed events 3. For each new event × each of 10 locales → call Gemini Flash for translation 4. INSERT into event_translations table ON CONFLICT DO NOTHING 5. Bust the /api/events?locale=* cache
Translations are immutable once written — event copy does not change post-publication. Cost ceiling: ~50 new events/week × 9 non-en locales × ~$0.0002 per call = ~$0.10/month.
On translation failure (rate limit, network), we fall through to source English. The user gets the event, just untranslated.
The events page must never fail just because the data pipeline does:
- ▸If ScrapedDuck is down → serve the last cached JSON from Postgres (up to 24h stale).
- ▸If Postgres is down → serve a static fallback shipped with the build.
- ▸If Gemini translation fails for a single locale → serve English in that locale, log the failure, retry on next cron.
- ▸If a single event has malformed dates → drop just that event, serve the rest.
ScrapedDuck has a stable contract (a JSON file shape), is updated by a community team we coordinate with, and is rate-limited friendly. Hitting LeekDuck directly would require parsing HTML that may change without notice and would add load on their server.
If ScrapedDuck were ever to disappear, we have a direct LeekDuck scraper fallback at scripts/scrape-leekduck.ts but have never had to enable it.
How Hundo Hunter solves the CP formula backward to find IVs.
How Hundo Hunter ranks the top 12 counters for every raid boss.
How Hundo Hunter curates the top-12 picks per league.
How Hundo Hunter computes the hundo and floor CP for every raid catch.
How Hundo Hunter assigns S / A+ / A / B / C tiers to attackers.
How Hundo Hunter maps the in-game appraisal stat bars to exact 0-15 IVs.
The DPS × Effectiveness × Bulk formula behind every counter list on Hundo Hunter.
The 91% IV threshold, XL-relevance check, and per-species candy economics behind every Pinap recommendation.
Per-level CPM math, Lucky halving, Best Buddy stack, and why our estimates can differ from in-game by 1-2%.
ASC API + ct= campaign tokens, per-source attribution, and zero personal data on the install funnel.
Where the "mons" / "the game" convention applies, where the trademarked name is allowed, and why.
Vercel Analytics, no personal tracking, opt-in email only, and stateless HMAC unsubscribes.