What's changed β and, more to the point, what each change buys you. β marks the payoff.
The idea in one line
Seven independent weather models forecast tomorrow's high; we compare that to what Polymarket charges for each temperature bucket, and surface the bets where the models and the market disagree β with an honest read on when that gap is opportunity and when it's a trap.
17 Jul 2026 β command center: portfolio, P&L, sell & settle
- πΌ Portfolio & P&L NEW β the Control tab now shows your net position per market with cost basis, a
live mark-to-market for open positions, and realized P&L once settled. β at a glance: what you hold, what
it's worth, and how you're doing.
- Settlement fills the record NEW β mark a resolved market won/lost (or Auto-settle, which only
acts when the price is unambiguous) and the ledger's outcome + P&L columns fill in. β the trade log finally answers
βdid it work,β not just βwhat did I buy.β
- Sell / close positions NEW β a real SELL order to exit early, behind the same arming + kill switch, with
realized P&L logged against average cost (correct even with partial sells). β you're no longer locked in until
resolution.
- Everything in one place NEW β the Control tab became a command center: connection/setup, arm/disarm, trial
buy, send the top proposal, and the portfolio with per-row settle/sell β plus matching CLI (
positions, settle,
sell). β run the whole operation from a single screen.
16 Jul 2026 β going live, safely (trading transparency, phase 4)
- Two-key ignition (arming) NEW β a real order now needs both keys: base LIVE (mode + key + no STOP
file) and a deliberate, time-limited arm you confirm by typing
ARM LIVE. Arming expires on its own, so the
system is never left hot, and an independent preflight re-checks it right before the order. β LIVE can't happen by
accident, and never stays on longer than you said.
- The whole go-live process, documented in the app NEW β the π‘οΈ Control tab now has an Arm/Disarm panel with a
live countdown, a step-by-step of exactly how a forecast becomes a real order, and a setup checklist mirroring
autotrade.py doctor.
β you can read and see the entire path before you dare to switch it on.
- Connect your Polymarket account, structured NEW β a
doctor command and a π Check Polymarket
connection button run a read-only handshake and report, β/β, whether the client, key and authentication are in place (plus the allowance
reminder). New SETUP.md walks zero-to-a-real-order. β no guesswork about what's connected.
- π§ͺ Trial buy NEW β one tiny real order (hard-capped ~$3) to prove signing, allowance and execution actually
work β skipping the strategy rules but keeping every safety gate. The result confirms the exact data used and which rules ran.
β prove the plumbing before you trust the strategy.
- Clear βwhat / price / whyβ trade log NEW β the Auto tab now shows every logged buy: what, at what price, in
which mode (PAPER/LIVE), the order id/status, and why β the rule in force, the win%, the net edge, and whether the market agreed. The
ledger stores all of it in a complete, self-migrating schema. β a full, honest record of every trade.
16 Jul 2026 β live control panel (trading transparency, phase 3)
- π‘οΈ Control tab NEW β a new tab that reads your local engine live: a big TEST/LIVE indicator, a
connection light, and a one-line bottom line β can a real order go out right now, yes or no β with the reasons why not.
β you can see the exact safety state at a glance before you ever arm it.
- Safety tiles NEW β key loaded, kill switch, auth scheme, per-bet & per-day caps, and real money spent
today, each as its own tile. β nothing hidden; every gate that guards a real order is on screen.
- Recent activity NEW β the panel streams the latest rows from
audit_log.jsonl (via a new
auth-gated GET /audit endpoint): every alert, login denial, lockout and order, newest first, auto-refreshing every 5s.
β a live, honest record of what the engine is actually doing.
16 Jul 2026 β hardened login (trading transparency, phase 2)
- Hashed passwords NEW β the local server's password is now stored as a PBKDF2-HMAC-SHA256 hash
(200k iterations, random salt), never in plaintext. Set it with
python autotrade.py set-password.
β even if someone reads your .env, the password isn't in it.
- Constant-time checks + lockout NEW β username and password are compared in constant time
(
hmac.compare_digest), and after repeated failed logins a client is locked out for a cooldown. β brute
force is slowed and can't be timed.
- The login is clearly explained NEW β the Live-trade panel now says in plain words that the
Server username / password is a lock on your own local server, not your Polymarket or wallet login, and where to set it.
/status also reports the active auth_scheme (hash / plaintext / off). β no more guessing
which credentials the fields want.
16 Jul 2026 β even later (trading transparency, phase 1)
- One server, one truth NEW β there is now exactly one HTTP server for trading:
autotrade.py
(with login, TEST/LIVE mode, and a status endpoint). polymarket_clob.py became a pure library and no longer opens a
second server on the same port. β no more ambiguity about what's actually running when you send an alert.
- Live status endpoint + banner NEW β
GET /status (and python autotrade.py status)
reports the current mode, whether a signing key is loaded, whether the kill switch is engaged, the hard caps, and how much real money was
spent today β with a single can_trade_live bottom line. β the control panel (next phase) reads this;
you can already see, at a glance, that nothing can trade by accident.
- Audit trail NEW β every alert, every rejected login and every decision/order is appended to
audit_log.jsonl (never the key or password). β full, replayable proof of exactly what the system did.
- Documentation now tells the truth NEW β the old handoff notes claimed real execution was an unbuilt
stub. It isn't β
submit_real_order() is implemented and can place real orders. All docs were corrected and consolidated into a
new authoritative EXECUTION.md. β you can trust the docs before you dare to switch it on.
16 Jul 2026 β later
- Structured, flexible rules panel NEW β the Auto tab's rules are now a schema-driven config: every rule
and assumption (min edge, min win%, price room, min fillable depth, reject-phantom, market-agrees, bankroll, Kelly fraction, max
stake, max bets/day, daily budget) is grouped and typed, with presets (Conservative / Balanced / Aggressive), export / import
as JSON, and reset β all saved per browser. Adding a rule is one schema entry. Each rejected bet also shows why it didn't pass.
- π€ Auto tab β propose, don't execute NEW β a rule engine that turns the live analysis into a
sized bet proposal you review and place yourself. It applies your strict rules (min net edge, min real fillable depth, market
must agree, not phantom, ΒΌ-Kelly sizing, per-day count + risk-budget caps β all editable and saved) and shows only the bets that pass
β often none, which is the point. A paper ledger replays the forward Yes log through the same rules to check the automated
strategy would have made money (accruing from today). It never signs an order or moves money β the trigger stays human; the
"place β" link just opens the market for you. The tab also carries the executor spec for full auto-execution β deliberately the
one part not built into the app (money-moving, legal & hot-wallet risk): that's a component you'd own, with its own independent
rule re-checks, limit-orders-only, a hardware-wallet key, hard caps and a kill switch.
- Real order-book depth NEW β the liquidity check is no longer a heuristic. For each predicted bucket
the app now pulls the actual Polymarket order book (CLOB) and shows how many dollars are fillable within 3Β’ of the ask
(β€ $1.9k), so a tempting price on an empty book reads as β dead, not as value. A single best-ask can hide that only, say, $58 is
available near it while the rest of the book sits far away β now you see it. This is what backs the phantom-edge filter.
- Forward Yes P&L log started NEW β the daily logger now also records a straight Buy-Yes on the
predicted bucket at the live Yes price and settles it against the recorded high. Hit-rate is backfilled from history (28% β exact-bucket
Yes is genuinely hard); real profit/loss accrues from today forward (historical Yes prices don't exist), which is what will make
the Yes track record provable over the coming weeks rather than just a hit-rate.
- Dashboard readability & polish NEW β the No-bet dashboard's "All picks" table now has: a
Simple / Advanced column toggle (Simple shows the actionable columns, Advanced adds Mean Β· yr Β· Cost Β· Calibration; saved per
browser), one legend above the table plus a "how to read a row" line, an "Edge & win% assume the forecast is right" note, and
a ? on every column. Visually: the edge is now a heat-map β greenβneutralβred on the number itself, so the best bets
glow (fitting, for a HeatCheck); a thin bar behind each win% makes the size scannable; and calm live states β skeleton rows
while loading, a tidy empty state, and a soft "updated" pulse on refresh. Nothing removed β the existing tabular numbers, sticky
header, flag pills and card-based Top 5 were already in place.
- Phantom edges flagged and demoted NEW β a tempting "+90 pts" edge is worthless if you can't actually
fill it. Every bet is now liquidity-checked: if the order book is dead (no real bid, a leftover ask) or the market has piled
into a different bucket (so the cheap price means your reading is behind, not that there's value), the edge is struck through,
flagged β , and pushed down the list so it can never top the table as fake value β and the Yes-price cell shows a β dead / ~ thin marker.
β the last source of "too good to be true" numbers is closed; what rises to the top is edge you can actually take.
- Honest, self-adjusting win chances NEW β three upgrades to the odds themselves: (1) the win% is now
calibrated β its uncertainty comes from the model's real recent error at each station, not the raw ensemble (which is
systematically over-confident), so a "94%" you're shown is one you can trust; (2) a nowcast β the odds tighten as the day
actually peaks, because once the recording has topped out the outcome is near-certain; (3) the chosen model is bias-corrected
by how warm/cold it has run locally. Plus a β flag when the prediction sits on a bucket edge (a coin-flip with the neighbour).
β fewer tempting-but-fake edges, sharper real ones.
- π― "Buy" alert NEW β a green badge (and a count above the table) when today's peak is effectively in,
the market agrees on the bucket, and the Yes is still 30β90Β’ β a near-decided outcome the market hasn't fully priced. It deliberately
stays quiet on the look-alike traps (a cheap price where the market settled on a different bucket means your reading is behind,
not that there's value).
16 Jul 2026
A big update, in plain terms below. (Some steps here replaced earlier ones from the same day β this describes what the app does now.)
βοΈ New: a "Today's Yes" page
- The whole new page NEW β the dashboard finds No bets (temperatures the market thinks are likely but the models don't). The new Today's Yes page does the opposite for today: for each city it shows the predicted high next to the live price of betting Yes that the day lands in that temperature bucket, plus the model's win chance, the value (edge) and a suggested stake. β one screen to spot where a cheap "Yes" actually has the forecast behind it.
- Every city Polymarket runs, grouped by region NEW β all 51 daily-temperature cities (from New York to Wellington), sorted into regions with one-click "select a whole region", and a little note per region showing when its cities peak in Norwegian time β so you see at a glance which part of the world is still in play today.
π― Sharper, checkable predictions
- Best local forecaster picks the number NEW β the predicted high now comes from the one weather model that has actually been most accurate at that exact city over the last two weeks (ECMWF wins most of the world; a few US cities lean on the American models). β you're trusting the forecaster with the best local track record, not a blur of all of them.
- You can check the number yourself NEW β every row links straight to the exact forecast chart behind the prediction and to the exact station the market settles on. And the prediction is never allowed to sit below the highest temperature already recorded today.
- Honest, live timing NEW β the table shows when today peaks (local time and Norwegian time), refreshes on its own every minute, and never shows a made-up peak: once the day has clearly topped out it says so, and when the recording confirms the forecast's timing you get a π peak agree signal that the day's high is in.
π A track record you can inspect
- History tab NEW β pick any city and it replays the last 10 days and scores two things: how often the Yes bet would have won (did the predicted bucket actually contain the day's high) and how close the predicted peak time was, with a day-by-day breakdown. β proof, rebuilt from real data every day, of how good the calls have been. (It's a hit-rate, not profit β historical prices aren't available.)
π‘οΈ Fewer silent mistakes
- Right settlement source per city, and kept right NEW β each market settles on its own named source: 44 cities use Wunderground, three (Moscow, Istanbul, Tel Aviv) use NOAA, and Hong Kong uses its own observatory. The app now reads the correct source for each β and two safety nets keep it that way: a loud β source flag on any row where the app's source disagrees with what the market names, and an automated daily check that goes red if any city ever drifts, even when nobody's looking. β the kind of quiet mistake that had Moscow reading the wrong feed can't happen unnoticed again.
π Easier to read
- Simple by default, Advanced on tap NEW β a Simple / Advanced switch: Simple shows just the essentials (city, prediction, price, value, status), Advanced adds every extra column (timing, lock-tracking, per-station history). Your choice is remembered.
- Guided, not cluttered NEW β the best bets are highlighted at the top, there's one colour key above the table, a ? on every column explains it in plain language, and all the technical "how it's calculated" text is tucked into tidy expandable sections under the table. Nothing was removed β just organised.
13 Jul 2026
π― Sharper bets
- Ensemble as the centre + more forecasters NEW β the bet's centre is now the median of 100+ ensemble members (a wild model is 1-in-100, not 1-in-8), JMA and regional high-res (KNMI/DMI in Europe) join the reference pool, and chronically-wrong models are skill-trimmed per city. β the meanβmedian gap on hard cities (the LA marine layer) no longer skews the bet; the logger logs the same centre so calibration stays honest.
- Accuracy by region NEW β a new table scores each model's real average miss across US / Europe / Asia. β see who to trust where: GFS wins the US, ICON wins Europe. yr is now logged so it joins this over time.
- Real ensemble probabilities NEW β the win% now comes from 100+ actual forecast runs (how many land in each bucket), not a bell-curve around the median. β honest odds on the lopsided days a smooth curve gets wrong β exactly the days the market misprices.
- Bias correction per city β the raw forecast is nudged by how far the models have actually missed at that exact airport. β you stop walking into the same trap twice: cold-biased cities like Seoul & Shanghai get pulled toward reality instead of quietly losing.
- Honest win-odds β the win% now uses each city's real spread of past misses, not the models' over-confident agreement. β a "94%" you can actually trust.
- Net edge β every edge is shown after a fee/slippage cost. β the number that survives the real market.
- ΒΌ-Kelly stake β a bankroll-aware bet size. β a concrete "how much" that grows the pot without one bad day wiping it out.
- Min. profit filter β hide everything below your return threshold.
- Forecast stability β flags days where the forecast is still swinging between model runs.
- Diversification β effective number of independent bets, so correlated same-day bets aren't oversized.
- NWS/NBM β the US National Weather Service's post-processed forecast joins the blend for US cities.
π Easier to read
- Wunderground resolution source NEW β the recorded true-high now comes from Wunderground, the exact source Polymarket names, with IEM METAR as cross-check. Each city's detail shows the live recorded high so far.
- History as tabs β Track record & True history in one tabbed panel, with a colour-coded bias-trend bar and a walk-forward P&L-by-segment breakdown.
- Theme switcher β βΎ Dark Β· β System Β· β Light in the top bar.
- Full visual redesign β dark palette, Space Grotesk + IBM Plex fonts, mono tabular numbers, sticky header, segmented Day (up to 5 days ahead) & margin, city chips, Top 5 as cards.
- ? help icons + Guide β every term and number in plain language.
π‘οΈ More trustworthy
- Calibration scorecard β realised win-rate vs price paid, per band, plus a Brier score (and model-Brier as new bets accrue). The honest answer to "is the edge real?"
- "Too early to conclude" guard β the logger refuses to declare profit until β₯10 settled days.
- Aligned logger β the daily log now bets the way the dashboard recommends (bias-corrected, bucket-based margin, model win% logged).
- Unit tests + cleaner codebase.
π¨ Design & clarity
- Rebrand to HeatCheck NEW β new name + tagline "When you want to get the temperature right", in the header, hero and browser tab.
- "What's computed" notes NEW β a short calc note now sits in front of every table (Top 5, All picks, Stability, History, Calibration, Accuracy), so you know what's calculated and adjusted before you read the numbers.
- The accent has one job β saturated orange only on the primary action and the selected Day/Margin; links, chips and highlights use a quieter tone, so the eye sees a clear priority.
- Sticky section rail β a second app-bar row jumps to any section and highlights the one you're in.
- Monochrome section icons replacing the emoji headings; one keyboard-focus ring on everything clickable.
- Higher contrast in light mode β dark "ink" colours for text/pills so agree/differ and win% are readable (WCAG AA in both themes).
- Tidier system β one control language across all panels, an even city-chip grid, sticky table headers with a faint zebra, consolidated radii, and one currency ($). The long changelog moved to this page; the intro is one sentence with a "How it's calculated" fold.
The 10-point roadmap β all live
- β
#1 Ensemble distribution Β· β
#2 NWS/NBM Β· β
#3 exact station-max (Wunderground + bias) Β· β
#4 calibration scorecard + model Brier Β· β
#5 skill-weighted estimate
- β
#6 net edge Β· β
#7 ΒΌ-Kelly sizing Β· β
#8 diversification/correlation Β· β
#9 walk-forward P&L by segment Β· β
#10 Wunderground source + automated cloud logger