PUBG's full telemetry (the event file behind scores, multi-kills, etc.) lands up to ~30 min after a match ends, while the basic stats (kills, placement, damage) are there right away. Now a just-played match shows up on its session board immediately with those basic stats and a pulsing "⏳ WAITING FOR TELEMETRY" tag, instead of looking broken or hiding. It stays out of the score standings until telemetry completes, and the SCAN button tells you how many matches are still processing so you know to scan again.
#047
FEATURESCAN FOR NEW GAMES
JUL 12
New "↻ SCAN FOR NEW GAMES" button on the home dashboard. Tap it after playing to pull the latest matches on demand — no need to leave the collector running 24/7. The board refreshes the moment new games land (and any locked bets flip to READY). Runs in the background so a big session won't hang the page.
#046
FIXJULY GAMES RESTORED
JUL 12
The stats bot went dark after Jun 30 and missed every July session, so the board was stuck on June. Backfilled all the missing July matches (telemetry + scores re-run through the algorithm) and hardened the bot's loop so it can't silently die on an unexpected error again.
JUNE 2026
#045
DESIGNVISUAL POLISH PASS
JUN 26
A design audit drove a round of polish across the board: the match recap now shows a clean "DID NOT PLAY" tile instead of a wall of zeros for anyone who sat a game out, the placement number is color-tiered (gold win / green top-5 / gunmetal else), the bets page finally uses the full width on desktop with side-by-side slips, empty session sections read as designed states instead of looking broken, the records grid colors mean something now, the maps selector got a cyan tactical active state, and a few mobile alignment nits (weapon table, combat debrief headers) are fixed.
#044
FIXSTABILITY SWEEP — 11 BUGS
JUN 26
A full multi-agent review of the app surfaced and fixed 11 verified bugs: two more connection leaks of the kind that took the site down (player profile + session/match boards), the new-patch badge that had gone dead, a crash on bad /compare links, a betting edge case where a forgotten bet could bind to the wrong night's match, plus the session-report scores now obey the score-not-kills ranking rule. No data touched.
New-patch badgestuck at #40auto-tracks latest
Profile / boardscould leak connsalways released
#043
FIXBETS — STUCK "WAITING FOR BOT" FIX
JUN 22
Bets placed while a match was already live attached to the NEXT match instead of the one being played, so they sat locked through the whole game and looked stuck. A bet now binds to the match whose END is after you placed it — the game you're in, or the next to finish from the lobby. Telemetry-collected matches still flip the slip green to reveal.
Bet binds tonext match to STARTmatch you're playing
#042
BALANCEBETS — ODDS REBALANCE
JUN 16
The old 10×/20×/30× ladder paid out absurdly — a stake-15 Hard win returned +450. Scaled down to a tighter bracket that keeps bets meaningful without breaking the bank.
Easy odds10×2×
Med odds20×3×
Hard odds30×4×
Chicken dinner30×4×
Max win+450+45
Stakes (5/10/15) and the payout formula are unchanged — HIT = +stake × (odds − 1), MISS = −stake. The moonshot gold highlight in the UI ladder now points to 4× (was 30×).
#041
FIXLOCK-UNTIL-SYNCED SETTLEMENT
JUN 16
Root-cause fix for the off-by-one mis-settlement bug — all 25 bets from last night were attached to the wrong match. Replaced the fuzzy "latest match in DB" lookup with a deterministic per-bet binding that waits for full telemetry before revealing results.
Root cause: settlement used to grab "the latest match in the DB," which lagged ~2 min behind real time. Every bet ended up attached to the previous match. New model: each bet is bound at placement to the oldest match whose start (played_at − duration) is after the bet was placed — the match the squad is actually in the lobby for.
RED LOCKED → GREEN READY — a bet now shows as locked (red) until the bot fully collects its bound match (telemetry_processed=1), then flips to green READY. Tap the green slip to reveal the result inline and verify the code↔match link. No peeking, then bailing — cancel is only allowed while a bet is still LOCKED.
Global MATCH FINISHED button removed — the "SETTLE ROUND" button is gone; settlement is now per-bet (tap the green slip). A batch settle-round endpoint is kept as an admin/mop-up path but is no longer the primary flow.
Rankings untouched — payouts still live in their own pool and never touch match_scores.score.
Updated in: bets.py (new find_bound_match / settle_bet), web_app.py (new /api/bets/settle/<id> route).
#040
DESIGNBETS EVERYWHERE
JUN 10
Bet history now follows you across the whole site — every page that shows stats also shows the bets behind them.
3 new BETS sections — /player/<name> lists that player's settled bets (up to 30), /session/<date> shows bets attached to that session's matches, /season/<month> shows the whole month. One shared builder keeps the styling identical on all three.
Summary header per section — total P/L color-coded (green up / red down) plus a NH/NM hits-misses tally, so net bet performance reads at a glance.
8 surfaces, one code — the same #XXXX bet code now appears on home Bets Feed, /bets feed, the match page's BETS ON THIS MATCH section, player profile, session board, and season board — visually verify exactly which match any bet settled against.
Rankings untouched — bet payouts live in their own pool, displayed alongside but never mixed into match_scores. Leaderboards and champion races are exactly as the algo computes them.
Updated in: web_app.py.
#039
NEWTHE SLIP — BETS REDESIGN + MULTI-BET
JUN 10
Full Warriors Bets redesign — designed and built by Fable (Claude). The /bets page is now a proper sportsbook slip, and you can ride more than one bet at a time.
Multi-bet — up to 3 pending bets per player per match, each on a different prop. Enforced in the app and guaranteed at the DB level by a unique index on pending (player, prop) — no race can ever double-book a prop. "+ ADD ANOTHER BET" prompt appears while you're riding fewer than 3.
The Slip — new cockpit header (brand + live MM:SS state chip + 4-player segmented avatars), slip composer with PICK / LINE / STAKE field rows, payout strip with a perforated ticket tear, and a gold LOCK BET button — animated MOONSHOT variant when you're chasing 30×. Active bets stack as compact cards with a ✕ cancel.
Bottom-drawer prop sheet — slide-up sheet with COMBAT / PLACEMENT / SPECIAL tabs and a 2-column card grid; props you've already taken grey out. Emoji icons replaced with 8 crisp SVG icons (crosshair, head, bolt, skull, grenade, car, podium, crown).
8 props, flat odds — Kills, Headshot Kills, Multi-Kill, Squad Wipe, Grenade Kill, Roadkill, Finish Place, Chicken Dinner. Everything repeatable is tiered Easy / Med / Hard at flat 10× / 20× / 30× (only Chicken Dinner stays binary — you can't get two). Stakes rebalanced to 5 / 10 / 15 pts, and each stake button shows its full outcome ladder: +profit / −stake right on the button.
CANCEL BET — buyer's remorse path: full stake refund while the bet is pending and the next match hasn't started. The moment a match begins the cancel window slams shut — no bailing on a losing bet mid-match.
Bet codes — every bet gets a 4-char public code at placement (e.g. #Q2V4, no confusable O/0/I/1). Toast on lock, gold badge on the active card, and the match page gains a BETS ON THIS MATCH section — settlement is visually verifiable end to end.
Window + settlement polish — OPEN lobby countdown extended 2:00 → 5:00; settlement is now batch-order-independent and uses the match's true recorded duration instead of a 35-min assumption; the home entry card subtitle now reads the real terms (flat 10/20/30 · up to 3 bets).
Site-wide speed overhaul plus two bet-settlement bugs squashed. Slow routes went from 2.5–3.5s to ~0.67s — measured in production: home 2.5–3.5s → 0.67s, session board 2.7s → 0.67s.
Connection pool was effectively disabled. The pool was created with minconn=0 — psycopg2 only returns a conn to the free list while the pool is below minconn, so every release CLOSED the connection and every query paid a fresh ~1.3s TLS handshake. Now minconn=4 keeps 4 hot conns ready — checkouts are instant.
Session board parallelized — /session/<date> ran 7–8 queries one after another; now they fan out across 8 threads, each on its own pool conn (incl. the trailing match_scores query folded into the fan-out). Home page bets feed cut from 4 sequential active-bet lookups to a single batched query.
Skip, not void — bets placed mid-session no longer VOID when a prior in-flight match lands first. Settlement now skips that match and keeps the bet pending until a match that genuinely started after placement lands. The 3 wrongly-voided bets were restored and re-settled against the right match: Pesso MISS −25 / Shiba HIT +28 / royobe HIT +27.
Real match-start estimate — match start was derived as end − max(time_survived, 35 min), treating every match as 35 minutes; lobby bets before short matches (early squad wipe) got skipped wrongly. Now uses MAX(time_survived) across all 4 squad members + 60s buffer — much closer to real match length.
Double-bet race closed — two simultaneous bet placements could both pass the "no active bet" check and create 2 pending bets. A unique partial index on pending bets per player now makes the DB reject the second one, surfaced as the normal "already has a pending bet" error.
Clearer bet-window banners — PAUSED is now a green "BET WINDOW OPEN · READY · attaches to your next match" (was a confusing gray "SESSION PAUSED"), and MATCH LIVE now says "bet now attaches to the NEXT match · safe" — the old red "bet voids" warning is gone since skip-not-void made it inaccurate.
Updated in: db.py, web_app.py, bets.py.
#037
NEWWARRIORS BETS
JUN 9
Sportsbook-style moneyline betting on the next match — live on the home page and at /bets.
3-step bet flow per next match: pick a prop → pick difficulty (tiered) or skip (binary) → pick stake (15 / 25 / 35 pts). Odds = 1 / P(stat ≥ threshold | career history), capped at 15×.
4 props v1 — Kills tiered Easy 2+ / Med 4+ / Hard 6+; Headshot Kills tiered Easy 1+ / Med 2+ / Hard 3+; Multi-Kill binary; Squad Wipe binary moonshot (15× cap).
Payout HIT = +stake × (odds − 1). MISS = −stake. Bet pool is independent of match_scores — the algo is untouched.
Anti-cheat — a bet voids at settlement if placed after match start (derived from played_at − max(time_survived, 35 min)). 1 pending bet per player at a time; 12 h auto-expiry.
Bet-window scope — OPEN (real countdown <5 min to lobby close) / MATCH LIVE (5–35 min, ticking elapsed, red risk warning) / PAUSED (>35 min gap). Countdown anchors to Date.now() and ticks locally — no extra API polls.
Settlement hook fires in data_collector.py after each match_scores cache write — walks pending bets FIFO and settles against the actual stat values.
Bets Feed on the home page — two sections under the entry card: ACTIVE · SETTLES NEXT MATCH (gold LIVE badge per pending bet) and RECENT RESULTS (last 8 settled, color-coded HIT / MISS / VOID with payout). Section auto-hides when empty.
New files: bets.py. Updated in: data_collector.py, web_app.py (5 new API endpoints + home page entry card + feed).
#036
DESIGNSTATUS BAR REDESIGN
JUN 9
Home page status pills fused into a single segmented status bar — wraps cleanly on narrow phones.
4 pills (bot / api / players / patch) replaced by one rounded container with 1px dividers. Equal-flex cells on narrow phones — no wrapping, no jitter.
Bot cell gets a min-width to prevent row jitter when the label cycles SCANNING ↔ STOPPED ↔ STARTING. State now driven by class toggles (.off / .busy / .maint / .down) instead of inline style mutations in updateBotUI / api-status / player-count.
Updated in: web_app.py.
MAY 2026
#035
RELIABILITYARCHIVE & BACKFILL FIXES
MAY 26
Follow-up fixes to the telemetry archive system and backfill script shipped alongside the home page work.
Archive commit fixed — archive_telemetry was relying on the downstream process_telemetry commit; if processing raised, the archive row rolled back silently. Now commits inline.
Backfill date filter fixed — was comparing mismatched timestamp string formats. Now uses the canonical SUBSTRING(played_at, 1, 10) pattern. Backfill also skips matches past PUBG's 14-day retention window instead of attempting dead fetches.
Archive write ~3× faster — gzip compress level 6 → 1. Output is ~10% larger but write time drops significantly with no impact on storage math.
The AVG STATS PER GAME table on the home page got two upgrades.
Score/G is now the leading column — the most important single number finally has a home in the averages table.
The table now appears twice: MAY 2026 (current month, as before) and a new ALL TIME twin below it — no date filter, full career averages. Makes it easy to see whether a player is riding a hot month or just consistent overall.
Fixed a mobile layout bug where the new column count clashed with a stale @media override, causing the last visible cell to wrap to a second row.
Updated in: web_app.py.
#033
NEWRACE TO 2026 BOARD
MAY 26
New section on the home page: a session-wins leaderboard spanning the full year. Ranks every player by total YTD session wins with a per-month trail of small cells showing which months they took.
Current standings: Pesso 11 · royobe 9 · ShibaRy 7 · Pinto 0. Pinto's empty row fades back so it doesn't compete visually with active rows.
Tied months show a dashed gold accent instead of a single winner cell. Month labels (JAN / FEB / MAR …) sit in the column-header row above the trail, not inside each player row.
Player names auto-trimmed via short_name() — SHIBARY2127 displays as SHIBARY. The #1 rank glyph is softened so the gold avatar remains the visual hero.
Updated in: web_app.py.
#032
RELIABILITYTELEMETRY ARCHIVE
MAY 26
Raw match telemetry is now permanently stored in Postgres before processing — algo changes can backfill all archived matches instead of being capped at PUBG's 14-day API window.
New telemetry_archive(match_id, telemetry_gz, size_bytes, archived_at) table. Full event stream gzipped on write (~80% compression, ≈1 MB per match).
Archive write is best-effort — a failure logs and skips, never blocking match ingest. Idempotent: duplicate ingests are silently ignored.
Backfill script (backfill_telemetry.py) catches matches still inside the 14-day window at deploy time. Anything older stays unarchived — PUBG's upstream telemetry is already gone.
Storage cost for a 4-player squad: ~1.5 GB / year. This is what makes future algo updates like v3.4 (solo-engagement range) and v3.5 (head/limb damage) retroactively recomputable — no more forward-only limitation.
Updated in: data_collector.py. New file: backfill_telemetry.py.
#031
BALANCELOOTING POINTS RETIRED
MAY 5
Algo v3.6 — two luck-of-the-drop scoring items removed. Telemetry still tracks the events for historical curiosity; no new matches will earn points from them.
Fastest Looter+3 pts / occurrence0 (OFF)
Care Pkg First+6 pts / occurrence0 (OFF)
Forward-only — old cached match_scores retain any previously earned points. New matches won't add them. UI award blocks (LOOTING SPEED, CARE PACKAGES panels) removed from all board templates.
Algo v3.5 — damage scoring is now body-part aware. The baseline (+1 per 50 dmg) applies to all damage as before, with two new additive terms on top.
Head damage1× (baseline only)2× (+1 per 50 head dmg bonus)
Limb damage1× (baseline only)0.5× (−1 per 100 limb dmg penalty)
Torso / pelvis1× — unchanged1× — unchanged
Example — mid-range headshot kill: 100 dmg (60 head + 40 limb).
Kill +12 · baseline +2 · head bonus +1.2 · limb penalty −0.4 · range +4 · HS-kill +6 = 24.8 pts (was 24 pts pre-v3.5).
Forward-only — old matches default damage_head_dealt / damage_limb_dealt to 0, so they continue scoring baseline-only damage. April standings are not affected.
Updated in: algo.md, data_collector.py, report_generator.py. New deliverable: scoring_reference_card.html → assets/scoring_reference_card.png.
APRIL 2026
#029
NEWAPRIL RECAP DELIVERABLES
MAY 5
Three standalone HTML deliverables built for the April close-out, each rendered to a shareable PNG.
Champion plate — Pesso19 W·02 back-to-back title card in V2 editorial style (april_champion_plate_v2.html → assets/april_pesso_champion_whatsapp.png).
Race to title — cumulative algo-score race chart for the full April calendar (april_race_to_title.html → assets/april_race_to_title.png).
Visual language across all three: gold-on-charcoal V2 editorial — Playfair italic + Orbitron + Teko/Cinzel, hairline gold rules, gold rivets, no AI photography, no shine sweeps.
#028
BALANCESOLO ENGAGEMENT THRESHOLD
MAY 1
Algo v3.4 — the solo engagement penalty (−2 pts) now triggers when a player stays >400m from all teammates for 30+ seconds, up from 80m. The old threshold was firing on normal squad spread during mid-game rotations; 400m only catches real intentional splits.
Threshold80m400m
Forward-only — historical match scores are unchanged. PUBG telemetry expires after 14 days and is not archived locally, so retroactive recompute of the full back-catalog is not possible.
The 12-month champion grid tiles were fully redesigned. The old "champion plate with nails" layout is replaced by a V2 editorial style.
Masthead layout: Champion label + month/year in top row, separated by a hairline gold rule.
Headline number is the algo score (rounded), rendered in large italic Playfair Display — kills moved to the compressed stat row alongside damage / matches / sessions.
Automatic streak ribbon: when a player wins consecutive months, the tile shows W·02 BACK-TO-BACK, W·03 THREE-PEAT, or W·N N× CONSECUTIVE. Single-month wins show no ribbon.
Playfair Display italic added to the dashboard font import (dashboard + compare-players pages).
#026
NEWSCORE-BASED MONTHLY LEADERS
APR 12
Monthly champions and current month leader now determined by total score instead of kills. The sessions header shows the month name, match/session count, and the current points leader with their avatar — updates live as scores change.
#025
NEWMOBILE SQUAD BANNER
APR 10
Squad banner cards now use a sparkline row layout on mobile — scores, streaks, and trends stack cleanly on small screens. Fixed horizontal scroll overflow.
#024
NEWGLASS BADGE ICONS
APR 10
Streak badges upgraded to a glass style — transparent background, white border, and backdrop blur. Refined badge sizing for tap targets. Ice crack animations now crawl slowly across cold cards. Fire flames repositioned for cleaner alignment.
#023
NEW15-GAME SCORING & STREAK POPUP
APR 10
Streak calculation now uses the last 15 individual games instead of 4-session averages — more responsive to recent performance. Tap a streak badge to see a per-match bar graph with trend slope. Code simplified with extracted helpers and module-level constants.
#022
NEWSCORE CACHING
APR 10
Match scores are now cached in the database after each match — no more recalculating on every page load.
All pages load faster. Backfilled all 54 existing matches.
#021
NEWSTREAK SYSTEM
APR 10
Squad banner cards show hot/cold streaks based on the last 4 sessions using full algorithm scores.
On Fire = flames + embers.
Heating Up = amber glow.
Cold = ice cracks + frost.
Away = greyed out (missed last session).
Tap the glass badge icon to see a per-match progress graph with trend slope.
#020
NEWSQUAD BANNER REDESIGN
APR 10
Homepage player cards redesigned — 4-column vertical layout with rounded-square avatars and colored top borders.
Maps page fixed: locked panning bounds so the map stays anchored to the screen instead of drifting off.
#019
NEWDUO CLUTCH
APR 9
When 2 teammates go down, the surviving duo enters Clutch Mode.
Every kill and damage they deal from that point is tracked and scored separately.
+3
PER CLUTCH KILL
+10
CLUTCH WIN BONUS
#018
BALANCESQUAD BONDING REBALANCE
APR 9
Bonding gave everyone free +15 pts. Halved both multipliers.
Near Teammate+0.2/1%+0.1/1%
Lone Wolf-0.2/1%-0.1/1%
#016
FEATUREBLUE CHIP RECALL
MAR 31
Full recall tracking: blue chip pickup from deathbox or station, chip usage to bring back teammates.
+3/+5
CHIP PICKUP
+5
CHIP USE (RECALL)
#015
FEATURESEASON LEADERBOARD
MAR 30
Full stats grid on the homepage: kills, damage, knocks, assists, and per-game averages for each player.
MARCH 2026
#013
FEATURECHAMPIONS BOARD
MAR 27
Collapsible monthly Champions Board on the homepage. Top scorer for each session displayed with gold treatment.
#012
DESIGNMOBILE OVERHAUL
MAR 26
Every screen fully responsive on phone. Event cards, score grids, match links, H2H layout, and nav bar all rebuilt for mobile.