A Telegram channel posts whenever a whale places a bet on Polymarket, but never says whether the bet paid off. This is the missing scoreboard, and it can copy the signals that hold up.

What it does#

Every signal is saved the moment it arrives, matched to the real Polymarket market, then resolved once that market settles. A dashboard shows which whales are actually good and what a given strategy would have returned. Signals passing a filter can be traded automatically.

The harder question is whether a tip is fast enough to be worth acting on. By the time you see the post, the price has moved. Slippage is measured on every signal, so “is copy-trading viable here?” gets answered with data.

How it’s built#

Python: three processes over one SQLite database (a Telethon listener, a scheduled resolver, a Streamlit dashboard), plus a FastAPI backend and a React/TypeScript frontend for trading controls. Runs on a Raspberry Pi under systemd. ~10k lines, 206 tests, all offline.

Decisions worth noting#

  • Separate processes. The listener never blocks on an external API, so a flaky Polymarket endpoint can’t cost you messages.
  • Idempotent everywhere. Re-running any stage is a no-op on data it has already seen, so crashes and restarts are safe.
  • One state machine. pending → open → resolved / unmatched / voided. Only resolved bets count toward win rates.
  • Leak-free backtest. A whale’s record at any moment uses only bets that had already settled by then. Easy to get wrong, and getting it wrong makes any strategy look brilliant.
  • Layered trading safety. Kill switch, a hard position cap that lives in an env file rather than the UI, and auto-shutoff after repeated failed orders.

Working end to end on live signals. Live trading is built but gated behind manual opt-in; current work is replacing the Streamlit dashboard with the React frontend.