Backend kecil untuk mengirim market alert atau announcement RetroPick ke Telegram dan Discord.
npm install
copy .env.example .env
npm startIsi .env dengan token Telegram, chat id Telegram, webhook Discord, dan BROADCAST_SECRET.
Supabase opsional tapi direkomendasikan untuk deploy. Kalau SUPABASE_URL dan
SUPABASE_SERVICE_ROLE_KEY diisi, duplicate log dan delivery log otomatis disimpan
di Supabase. Kalau kosong, app fallback ke file lokal data/*.json.
SUPABASE_URL=https://your-project.supabase.co
SUPABASE_SERVICE_ROLE_KEY=replace_this
SUPABASE_DELIVERIES_TABLE=signal_deliveriesJalankan schema di Supabase SQL Editor:
-- supabase/schema.sqlPakai service role key hanya di backend/server env, jangan pernah taruh di frontend.
Market dan news memakai bot/webhook terpisah:
TELEGRAM_MARKET_BOT_TOKEN=replace_this
TELEGRAM_MARKET_CHAT_ID=@RetroPickMarket
TELEGRAM_MARKET_THREAD_ID=2
TELEGRAM_NEWS_BOT_TOKEN=replace_this
TELEGRAM_NEWS_CHAT_ID=@RetroPickMarket
TELEGRAM_NEWS_THREAD_ID=replace_this
DISCORD_MARKET_WEBHOOK_URL=replace_this
DISCORD_NEWS_WEBHOOK_URL=replace_this
TELEGRAM_DISABLE_WEB_PAGE_PREVIEW=true
TELEGRAM_MARKET_DISABLE_WEB_PAGE_PREVIEW=true
TELEGRAM_NEWS_DISABLE_WEB_PAGE_PREVIEW=falseUntuk Telegram group dengan forum topic, isi juga thread id:
TELEGRAM_MARKET_THREAD_ID=2Angka 2 berasal dari link topic seperti https://t.me/RetroPickMarket/2.
GET /healthPOST /test/telegramPOST /test/discordPOST /broadcast/marketPOST /broadcast/announcementGET /news/fetchGET /news/categoriesPOST /broadcast/newsPOST /jobs/news/latestPOST /market/broadcastGET /market/fetchPOST /market/jobs/latestPOST /market/test/telegramPOST /market/test/discordGET /market/logsPOST /news/broadcastPOST /news/jobs/latestPOST /news/test/telegramPOST /news/test/discordGET /news/logsGET /logs/newsGET /logs/market
Admin dashboard lokal:
http://localhost:4174/admin.html
Endpoint lama /broadcast/*, /jobs/news/latest, dan /logs/* masih dipertahankan sebagai alias kompatibilitas. Untuk flow baru, pakai endpoint /market/* dan /news/*.
External market source MVP:
MARKET_SOURCES=worldcup,polymarket
MARKET_MIN_RELEVANCE_SCORE=1
WORLD_CUP_SOURCE_URL=https://www.fifa.com/en/tournaments/mens/worldcup/canadamexicousa2026
WORLD_CUP_MARKET_TEAMS=Japan,United States,Mexico,Canada,Argentina,Brazil,France,England,Spain,Portugal,Germany,NetherlandsWorld Cup markets follow the launch playbook: use progression/path and group qualification markets, not match-winner, exact-score, player props, injury/referee, or live in-play markets. Resolution source is FIFA official standings, bracket records, and match results.
Preview market luar:
curl "http://127.0.0.1:4174/market/fetch?limit=3&category=crypto" \
-H "X-Retropick-Secret: <BROADCAST_SECRET>"Broadcast market luar yang belum pernah dikirim:
curl -X POST http://127.0.0.1:4174/market/jobs/latest \
-H "Content-Type: application/json" \
-H "X-Retropick-Secret: <BROADCAST_SECRET>" \
-d "{\"limit\":3,\"category\":\"crypto\",\"platforms\":[\"telegram\",\"discord\"]}"Semua endpoint POST membutuhkan header:
X-Retropick-Secret: <BROADCAST_SECRET>curl -X POST http://127.0.0.1:4174/broadcast/market \
-H "Content-Type: application/json" \
-H "X-Retropick-Secret: <BROADCAST_SECRET>" \
-d "{\"marketId\":\"btc-100k-q4\",\"title\":\"Will Bitcoin hit $100K before Q4 2026?\",\"category\":\"Crypto & Finance\",\"marketType\":\"Direction\",\"url\":\"https://retropick-v1.vercel.app/app/markets/btc-100k-q4\",\"platforms\":[\"telegram\",\"discord\"]}"Konfigurasi sumber berita di .env:
NEWS_SOURCES=https://www.coindesk.com/arc/outboundfeeds/rss/,https://techcrunch.com/feed/,https://www.nasa.gov/technology/feed/,https://science.nasa.gov/feed/earth-observatory/natural-events
NEWS_KEYWORDS=bitcoin,btc,ethereum,eth,crypto,defi,etf,cpi,inflation,fed,interest rate,unemployment,gdp,recession,stock,earnings,valuation,ai,artificial intelligence,openai,anthropic,nvidia,benchmark,nasa,science,climate,weather,temperature,rainfall,flood,storm,drought,wildfireAmbil berita terbaru tanpa mengirim:
curl "http://127.0.0.1:4174/news/fetch?limit=3" \
-H "X-Retropick-Secret: <BROADCAST_SECRET>"Filter kategori RetroPick:
curl "http://127.0.0.1:4174/news/fetch?limit=3&category=crypto" \
-H "X-Retropick-Secret: <BROADCAST_SECRET>"Kategori yang tersedia:
cryptoeconomicsfinancialstech_scienceclimate
Cron otomatis bisa dinyalakan lewat .env:
ENABLE_NEWS_CRON=true
ENABLE_MARKET_CRON=trueDefault jadwal:
- News: 2 berita terbaru setiap 60 menit
- Market: 1 market brief terbaru setiap 60 menit
- Daily cap: maksimal 48 news dan 24 market per hari, dihitung timezone UTC+7
Setting cron eksplisit:
CRON_NEWS_SCHEDULE=0 * * * *
CRON_NEWS_CATEGORY=all
CRON_NEWS_LIMIT=2
DAILY_NEWS_LIMIT=48
CRON_MARKET_SCHEDULE=0 * * * *
CRON_MARKET_CATEGORY=all
CRON_MARKET_LIMIT=1
DAILY_MARKET_LIMIT=24
DAILY_CAP_TIMEZONE_OFFSET_HOURS=7Kirim satu berita manual:
curl -X POST http://127.0.0.1:4174/broadcast/news \
-H "Content-Type: application/json" \
-H "X-Retropick-Secret: <BROADCAST_SECRET>" \
-d "{\"title\":\"Bitcoin ETF inflows rise\",\"summary\":\"Market sentiment may shift as traders watch ETF demand.\",\"source\":\"CoinDesk\",\"category\":\"Crypto & Macro\",\"url\":\"https://example.com/news\",\"platforms\":[\"telegram\",\"discord\"]}"Fetch RSS lalu broadcast berita yang belum pernah dikirim:
curl -X POST http://127.0.0.1:4174/jobs/news/latest \
-H "Content-Type: application/json" \
-H "X-Retropick-Secret: <BROADCAST_SECRET>" \
-d "{\"limit\":3,\"category\":\"crypto\",\"platforms\":[\"telegram\",\"discord\"]}"