Tracker for Romeopro's GipsyTeam thread: bankroll progress, session history, and the full post feed around the marathon.
Live site: romeo.fish
- React 18 + Vite
- Static deployment on Vercel
- GitHub Actions scraper for forum updates
- Claude API for bankroll screenshot extraction and Romeo post translations
- Compact JSON payloads with client-side caching
npm ci
npm run dev
npm run build
npm run test
npm run checkScraper commands:
npm run scrape
npm run scrape:dry-run
npm run scrape:no-push
npm run scrape:full
npm run scrape:reextract
npm run scrape:translateLeaderboard probes:
npm run leaderboards:ggwf
npm run leaderboards:coinleaderboards:ggwf fetches the public GGWF leaderboard group and searches the
default Romeo candidate nick R Romanovskyi. leaderboards:coin checks the
public CoinPoker CoinMasters leaderboard page for the known Romeo aliases. Both
commands are diagnostic only; they do not write app data unless --write is
passed.
For the app widget:
npm run leaderboards:ggwf -- --write data/leaderboards.jsonnpm run dev and npm run build automatically copy data/*.json into public/data so local builds work without hitting GitHub raw URLs.
Main application files:
src/App.jsx— primary UI composition, charts, feed, and topic viewssrc/hooks/usePostsData.js— loading, polling, new-post detection, refresh flowsrc/hooks/usePersistentState.js— typedlocalStoragepersistence wrappersrc/storage.js— public data loader, cache, compact payload expansionsrc/i18n.js— UI dictionary and date helperssrc/utils.js— formatting, chart helpers, and bankroll history deduplication
The app is still a single-screen SPA, but state handling and data loading are no longer buried directly inside App.jsx.
Runtime data is resolved from multiple sources:
VITE_DATA_BASE_URLif explicitly configured- Same-origin
/data/*files generated during local builds raw.githubusercontent.com/<repo>/main/data/*
The client compares meta.lastUpdated across successful sources and keeps the freshest payload instead of trusting the first response. That avoids stale Vercel assets when code deploys and scraper commits move at different cadences.
Vercel uses scripts/vercel-ignore-build.mjs as its ignored build step. Data-only scraper and leaderboard commits are skipped on Vercel because the deployed client can read fresher JSON directly from GitHub raw; source, dependency, config, and public asset changes still build normally.
The scraper lives in scripts/scrape.mjs.
Modes:
normal— scan recent pages, add new posts, refresh recent likesfull— full thread scan, refresh likes across the whole datasetreextract— rebuild bankroll history from Romeo screenshot poststranslate— backfill missing English and Spanish translations
Safety switches:
--dry-run/SCRAPE_DRY_RUN=1— hit the forum and compute changes without writing files or running git--no-push/SCRAPE_NO_PUSH=1— update localdata/*.jsonfiles but skip git pull / commit / push
GitHub Actions:
- every 5 minutes:
normal - every 12 hours:
full - manual dispatch:
normal,full,reextract, ortranslate
Translation helpers are isolated in scripts/lib/translation.mjs so scraper-specific API logic is no longer mixed into the forum parsing flow.
data/posts.json— full post payloaddata/posts.min.json— compact payload used by the clientdata/meta.json— bankroll summary, scraper metadata, bankroll historydata/leaderboards.json— GGWF leaderboard snapshot used by the leaderboard widget
- Fork the repo.
- Connect it to Vercel.
- Add
ANTHROPIC_API_KEYif you want screenshot extraction and translations. - Keep scraper automation on
main; do feature work on separate branches.
There is no application backend in this repo. The deployed app is static and reads JSON data produced by the scraper.