New here? Start with this.
The Form Book does two honest things, kept firmly apart:
The rule for both: nothing ships unless it still works on races the model never saw — and we show you every idea we rejected, not just the wins. Tap any i for a plain-English explanation of a term.
Today
Every race at every meeting, in time order — the whole day at a glance, next race highlighted. Each race is read through two separate lenses, kept in their own columns so they never blur together:
🩺 Health — the runner most at risk of not completing (a welfare/injury signal, jumps only). 💷 Bet — whether the race is each-way territory where our edge lives. A race can flag one, both, or neither — blank is honest, not a gap.
The card, live
Welfare Watch
In plain English: this is an early-warning list of the jumps horses most likely not to get round today — to pull up, fall, or be pulled up. It is not saying a horse is injured, and it can't tell you one will be — nobody can know that in advance. It's a "keep an eye on these" list for owners, trainers and vets, scored from the ground, the horse's age, its own record of falls, and how sound its yard and its sire tend to be. After they run, we check which flagged horses actually failed to finish — and keep an honest score of how often the warning was right.
The horses this model flags highest-risk fail to complete 26.4% of the time, versus 10.5% for the lowest — validated on 149,000 held-out jumps runs it never saw (2023–26), ranked cleanly across all ten risk bands.
Welfare report card — the model reviews itself
Today's watch-list — highest risk first
| Runner | Risk | Score | Why flagged |
|---|
What drives the score
Ground
Heavy and soft ground tires horses and brings on falls.
Age
Older horses are more fragile and slower to recover.
Own history
A horse that has pulled up or fallen tends to again.
The yard
Some trainers' horses fail far more often — and it persists.
Sire
Soundness is heritable — some sire lines throw more non-finishers.
Damsire
The broodmare-sire line adds a further soundness signal.
Track record — does the flag actually come true?
| Flag | Runs | Failed to complete | vs field |
|---|
Jumps vs Flat — the flag across both codes
Day by day — every flag graded on the result
| Date | Flags | Graded | HIGH DNF | Field DNF |
|---|
The flag's actual calls — named, right and wrong
On the Up Live from the form book
Not who won last time — who's trending. Yards whose strike-rate is climbing well above their own season, and young horses whose form figures are improving run on run. A real snapshot from the form book — the deployed site refreshes it nightly on the rig.
Yards on the up
| Trainer | Runs (30d) | Strike | Season | Trend |
|---|
Horses on the up
| Horse | Age | Last 4 | Figure trend | Note |
|---|
Betting Watch
Most tipping sites sell you the favourite dressed up as a system. We tested whether any public-data model can beat the win market for profit — properly, out of sample, eight different ways including a full gradient-boosting model. It can't. So we don't pretend. What's below is the one edge that survived the tests.
Nightly report card — the system reviews itself
Today's picks — live
Every day, graded — tap a day to open it
Staking model
Before you back anything, see what it would actually achieve. Set your stake, place-strike and odds, and the model shows the edge, the real spread of outcomes over a run, and the bank you need to survive the losing streaks. It's the honest financial picture — small edge, high variance, grind over volume.
How £1 each-way actually works
“£1 each-way” = £2 out of your pocket — £1 on the win, £1 on the place. They're two separate bets stapled together:
- The win £1 pays only if it wins. On a sharp market that part roughly breaks even over time — don't expect profit there.
- The place £1 pays if it finishes placed (2nd–4th, depending on field size). This is where our edge lives.
Worked example — our 31 graded bets, at £1 e/w (£62 staked):
| Place side (£31 of the stake) | +27% | ≈ £39 back → about +£8 profit |
| Win side (£31 of the stake) | ~flat / down | on a sharp market → about −£9 |
| Net — full each-way | −2% | about −£1 overall |
Model the outcomes
Race Card
The whole day, the way you'd read a racecard — grouped by meeting, then race by race, with every runner and the information we hold on each: form, official & Racing Post ratings, weight, draw, jockey and trainer. This is the reference view — the full field, nothing hidden.
Every runner now carries our 🩺 non-completion risk score . On the jumps a flag means a real chance of pulling up or falling. On the Flat the same flag is relative — non-completion is rare there (~0.3% of runners), so a flag marks a horse elevated against other Flat runners, not a horse in danger of falling. Both are validated out of sample (jumps ×1.76, Flat ×8.25).
Today's meetings
Explore
Ask the form book about anyone. Type a trainer, a horse or a sire — see their record, then follow the threads: a trainer's horses → click a horse → its runs and breeding → click its sire → every foal it has thrown. Millions of runs, all cross-linked, like Wikipedia for racing.
Local AI vs Cloud
Where the thinking comes from — and whether we can bring it fully in-house. The master plan below is tonight's synthesis: the cloud engine reports, Qwen gives its second opinion, and the two are reconciled into one call — flagging anything Qwen caught that we're not already acting on. Underneath are the two sides in full (cloud analysis, then Qwen's take) so you can see the working. The engine stays on the cloud analysis until something better overtakes it; nothing changes a live setting without the back-test bar and your sign-off.
💷 Betting — what we're thinking
🩺 Welfare — what we're thinking
🤖 Local AI (Qwen) — its take
Knowledge — everything on the board
Every factor we've discussed — nothing dropped, including the ones that do nothing for a bet. Because a dud for betting is often gold for welfare: age has no betting signal at all, yet it's one of the strongest injury predictors we hold. So each factor carries two honest verdicts — one for betting, one for welfare/injury — and the nulls stay on the record so we never re-chase a mirage.
Database — the raw material & method
Nothing here is asserted — it's derived. This is the raw material we hold, every factor we've tested with its honest verdict, and the one rule that decides whether a pattern is real or just noise. If a number's on this site, you can see where it came from.
What we hold
| Data | Have it? | What's actually there |
|---|---|---|
| Trainers | ✓ | Every runner; rolling 14-day + career strike-rate & profit pre-computed |
| Jockeys | ✓ | Every ride; form + profit + claiming allowance |
| Owners | ✓ | ~100% of rows; 98k distinct owners, with change-of-owner history |
| Pulled up / fell | ✓ | PU 65,832 · Fell 15,681 · Unseated 9,527 — the injury signal |
| Surgery / medical history | ◑ | Wind ops, gelding, dated medical notes — but not clinical injury records (that's the vets') |
| The full pre-race card | ✓ | 60+ fields: spotlight, comments, ratings, going, draw, headgear, last run |
| The money (Betfair) | ✓ | Pre-race drift, in-running highs/lows, BSP, volumes |
| Breeding (sire / damsire) | ✓ | Full pedigree line — predicts soundness (not winning) |
| Every horse's full history | ✓ | All prior runs + record by course / going / distance |
Welfare factors — validated
| Factor | Verdict | Effect on not-completing |
|---|---|---|
| Ground softness | validated | Good 14.2% → Soft 18.1% → Heavy 20.5% |
| Age (older) | validated | young 12.7% → prime 16.4% → 9yo+ 20.8% |
| Its own prior falls / pull-ups | validated | never 13.5% → 1–2: 17.9% → 3+: 21.7% |
| The yard (trainer DNF-rate) | validated | high yards 22.6% vs low 13.4% · persists corr 0.64 |
| Sire (progeny soundness) | validated | heritable · persists corr 0.48 |
| Damsire | validated | further soundness signal · persists corr 0.38 |
Betting factors — place value
| Factor | Verdict | What we found |
|---|---|---|
| Most-raced third (relative mileage) | validated | +11% place-ROI; fit horses place reliably; holds out of sample |
| Field size 16–19 runners | validated | +10% vs break-even in 20+ fields, at extra-place terms |
| Proven on the ground / class drop | weak | small, consistent, tiny samples — watching |
| Recent form · hot yard · course form · age | priced in | no edge for betting — the market already knows (age still matters for welfare!) |
The testing list — worked through
| Variable | Have it? | Status | What the test found |
|---|---|---|---|
| Weather — temp / wind / rain | ✓ | tested | joined a free weather API (90 courses): temperature = noise; wind real (+6.5pt) but race-level so it diluted the flag — held out; rain ≈ going, already in |
| Weight carried (jockey + kit) | ✓ | tested | absolute lbs = noise (confounds the code); RELATIVE weight works — bottom-weight fails to complete +2pt |
| Horse bodyweight | ✗ | no data | confirmed absent from the UK jumps form — a dead end unless a source starts carrying it |
| Owner record | ✓ | tested | a real 10.5pt DNF signal — but 0.61-correlated with the yard; scored, it double-counts the trainer (lift 1.76→1.73) — held out |
| Draw · days-since-run · jockey place-strike · run-after-layoff | ✓ | tested | all tested OOS: draw n/a on jumps · freshness diluted the flag (held out) · jockey priced-in · layoff = freshness |