№ 04 / 2026 v0.4 · live
All systems stable

Document — Architecture report 2026 · 04 · 30

Panaliz.

Betting analysis framework

A two-direction ingestion system that pairs Telegram tipster predictions with live Melbet odds, then resolves GREEN/YELLOW/RED verdicts via three-model consensus.

I. Live system status

— Updated: 12:45 UTC
pm2 · 0
mcp-server
63 MB · fork
pm2 · 1
tl-scraper
92 MB · http
pm2 · 2
tl-panaliz
87 MB · agent
pm2 · 3
telegram-backend
125 MB · :4300
pm2 · 4
telegram-user-bridge
77 MB · ALL mode
Hetzner ingestion
982
total messages — from Telegram channels
Predictions extracted
45
AI-classified actionable picks
Active demo bets
04
UEFA Europa / Conference League — pending

II. Architecture — two directions

On the left, the Hetzner server ingests Telegram. On the right, local Windows watches Melbet's live market. They meet at /api/analyses.

Ingestion Analysis Storage Action / bet Verdict
Hetzner root@178.104.62.194 · NBG1
Telegram channels
Personal user session — 60+ subscribed channels
@GoldenMonkey1 · MTProto layer 198
telegram-user-bridge
node.js

MTProto event listener — every channel post is POSTed to the intake URL. Current mode: BRIDGE_MODE=ALL

// bridge.js
client.addEventHandler(handleMessage,
  new NewMessage({ chats: [...] }));
postIntake(payload) // → :4300
telegram-backend
AI classifier

Reads each message, decides if it is a prediction — extracts home/away/market/pick/odds.

95%
spam reject
4.6%
prediction
0.96
avg conf
JSON storage
/api/analyses
Caddy reverse proxy → :4300 → public HTTPS
⤷ messages.json
⤷ analyses.json
⤷ proposals.json
Local Windows C:\analiz · Python 3.12
Melbet live feed
scraper.py — VA=1/VI virtual filter
10s
/service-api/LiveFeed/Get1x2_VZip
SQLite — melbet.sqlite
3 098 K snapshot
58
live
510
upcoming
21 653
finished
3-layer agent
Panaliz v3

Planner (6h) → Analyst (Ensemble) → Monitor (5m). Verdict by collective reasoning of three models.

glm-5.129 calls · p99 366s
deepseek-v3.221 calls · p99 574s
minimax-m2.721 calls · p99 64s
server_predictions.py
verifier

Fuzzy-matches API picks to local fixtures, calculates hit rate, ranks top tipsters.

demo_bets — pending
tg_pred_id linked
Rayo Vallecano vs RC Strasbourg@1.34
Shakhtar Donetsk vs Crystal Palace@1.32
SC Braga vs SC Freiburg@1.39
Nottingham Forest vs Aston Villa@1.35
Stake / Potential 786 / 1 060

III. Three-layer agent

01
Layer 1 · planner.py

Planner

«The Scout»

Every 6 hours, screens live + upcoming matches and selects 0–3 candidates with low LLM cost.

Cycle6h
Scanned192
Picked2
02
Layer 2 · analyst.py

Analyst

«The Analyst»

Runs Panaliz v3 SKILL's 8 steps for every selected match. Three models with equal weight — verdict by consensus.

Models3 ensemble
thinkhigh
timeout420s
retry2× backoff
03
Layer 3 · monitor.py

Monitor

«The Watch»

Checks each pending demo bet every 5 minutes. Decides HOLD / CASH_OUT / ADJUST based on live odds shifts and current score.

Cycle5m
Cash-outstake × 0.7
LLM90s timeout

IV. Decision logic

Consensus is not a sentiment algorithm. It is the clean count of three opinions.

def _pick_consensus(opinions):
    if all_failed: return YELLOW
    counts = Counter(o.verdict
        for o in opinions if o.verdict)
    top, n = counts.most_common(1)[0]
    if n >= 2: return top      # majority
    return YELLOW              # split → caution
GREEN
BET — Auto demo bet 2%

≥2 models agree on «BET», Panaliz 8-step discount rules pass, odds × probability > 1.10. Best bet → auto-written to demo_bets.

3%
real frequency
YELLOW
MAYBE — no bet

Three models disagree (split vote) — caution by default. Also returned when verdict cannot be extracted (never silent-flips to RED).

65%
real frequency
RED
DON'T BET — fallback rule

≥2 models agree on «DON'T BET», or discount rules fail (friendly, dead rubber, relegation zone). Decision: skip.

12%
real frequency

V. Performance snapshot

Test suite
92/92
all green
THOMAS INFO 🇨🇦🇨🇦
66.7%
hit rate (3 settled)
Bankroll
9 820
98.2% of 10 000
Last 24h
137
messages · 5 predictions

Top tipster — composite score

hr·0.5 + log(vol)·0.3 + conf·0.2
1
THOMAS INFO 🇨🇦🇨🇦
25 pred · 2W 1L · conf 0.96
0.826
2
𝙋𝙊𝙒𝙀𝙍 𝙋𝙇𝘼𝙔 ⚽
21 pred · 0 settled · conf 0.96
0.726
3
Golden Rule Bets ⚽️
11 pred · 0 settled · conf 0.96
0.671
4
Miss Prudence Tipstar
6 pred · 0 settled · conf 0.95
0.619
5
Value Any Time | Betting
2 pred · 0 settled · conf 0.97
0.545

Lessons learned

5 postmortem
bet#1 · CASHED_OUT
[data]

High-coefficient (2.915) Over taken without prior form/H2H check — insufficient data.

bet#3 · CASHED_OUT
[form]

Cremonese in Serie A's lower bracket — Over 4.0 line too high. League goal average ≪ 4.

bet#4 · CASHED_OUT
[cashout_decision]

Coef 4.34 — implied prob 23%. Required deeper analysis before entering such low-probability bet.

All postmortems append to data/lessons_learned.md and feed into the next analysis's Panaliz prompt automatically. A loss is information — information is leverage.

VI. Server processes — pm2

id 0 · root
mcp-server

Model Context Protocol — internal coordinator that exposes every tool to the agents.

/opt/transferlogger/agents
v1.0.0 · fork · 63 MB
id 1 · scraper
tl-scraper

Melbet HTTP polling — fixtures and odds forwarded to intake. --http mode.

scraper-mcp-server/dist/index.js
v1.0.0 · fork · 92 MB
id 2 · agent
tl-panaliz

Server-side Panaliz worker — automatically analyzes detected predictions.

/opt/transferlogger/agents
v1.0.0 · fork · 87 MB
id 3 · classifier
telegram-backend

AI message classifier — isPrediction flag + market/odds extraction. /api/* endpoint.

/root/telegram-intake-app/backend
v0.1.0 · fork · 125 MB · :4300
id 4 · bridge BRIDGE_MODE=ALL
telegram-user-bridge

MTProto session listener (Naidan's personal account). Listens to all subscribed channels and POSTs to localhost:4300/api/intake/telegram. Backend handles spam/prediction triage.

/root/telegram-user-bridge/bridge.js v0.1.0 · 77 MB · gramJS 2.26.21

VII. Betting data sources

15+ data feed

Beyond Telegram tipsters, we can cross-check odds across many bookmakers and use sharp money signals + prediction models.

🔑 With API keys we can automatically pull data from these sources and pair them with Melbet's live odds for more reliable value bets. The list below shows integrable options.

⚽ Bookmakers · Live odds feed

Melbet
active

Currently the main source — live + line feed scrape, 10s polling.

/service-api/LiveFeed/Get1x2_VZip
Pinnacle Sports
api key

Sharp money benchmark — pro bettors' true market. Low-margin odds.

api.pinnacle.com/v1/odds
Betfair Exchange
api key

Peer-to-peer exchange — back/lay liquidity = market sentiment.

api.betfair.com/exchange/betting
Bet365
scrape

Mainstream public odds — no public API, requires scraping.

via 3rd-party scraper
1xBet
scrape

Asian markets, handicap, same backend as Melbet.

/LiveFeed/Get1x2_VZip
SBOBET
api key

Asian Handicap reference — handicap pricing standard.

via affiliate API

🔁 Odds aggregators · multi-bookmaker in one place

The Odds API
api key · 500/мес free

Live odds JSON API for 40+ bookmakers — historical also available.

api.the-odds-api.com
OddsPortal
scrape

Historical odds movement — calculate closing line value.

oddsportal.com
Oddschecker
scrape

UK markets average. See which bookmaker has the highest tip.

oddschecker.com

📊 Statistics · fixtures · history

API-FOOTBALL
api key · 100/өдөр free

1100+ leagues, fixture/lineup/h2h/standing — already used on the server.

v3.football.api-sports.io
SofaScore API
private

Live score, advanced stats (xG, attack momentum) — undocumented JSON.

sofascore.com/api/v1
FootyStats
api key

League goal averages, BTTS %, Over/Under tendency — key for value bets.

footystats.org/api
Soccerway
scrape

Form table, head-to-head — especially for small leagues.

soccerway.com
Forebet
scrape

Statistical prediction baseline — to validate our model against.

forebet.com
SportsRadar
api key · paid

Pro-grade live data — most sportsbooks are fed by this.

api.sportradar.com
🔑 API key — extra capability
expandable

To enable any of the sources above, write the matching API key in the `.env` file. For example Pinnacle (sharp benchmark), API-FOOTBALL (fixture/h2h), The Odds API (multi-book), SofaScore (advanced stats) — adding them lets us:

# .env (жишээ)
ODDS_API_KEY=...
APIFOOTBALL_KEY=...
PINNACLE_USERNAME=...
PINNACLE_PASSWORD=...
SOFASCORE_TOKEN=...
FOOTYSTATS_KEY=...