Skip to main content
Hundo Hunter
M · METHODOLOGY
UPDATED 2026-05-28

How we source live event data

LeekDuck → ScrapedDuck → our API, with 1-hour refresh, Postgres translation cache, and graceful fallback.

SHORT ANSWER

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.

THE DATA PATH

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.

THE REFRESH PIPELINE
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.

GRACEFUL-DEGRADATION GUARANTEES

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.
WHY WE DO NOT SCRAPE LEEKDUCK DIRECTLY

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.

· TOOLS THAT USE THIS METHODOLOGY
OTHER METHODOLOGY ARTICLES