The served forecast, scored every night.
As of 2026-10-18, with station data through 2026-10-17. What is scored is the 7-day weather outlook this site showed readers, saved each hour the page was opened (from 2026-09-20). For each day and lead the earliest outlook issued that day is used; for lead 0 (the same day) it must be issued by 6 am, before the day's high. Each outlook is compared with what the on-site station recorded on 26 settled days, 2026-09-21 to 2026-10-17. The site's outlook runs 7 days, leads 0 to 6; there is no lead-7 forecast to score.
Two baselines that use no weather model are scored on the same days. Persistence forecasts the value the station recorded on the last full day before the outlook was issued. Climatology forecasts the station's average for that time of year (a 15-day window from other years of its record since November 2023; for rain, the median). Skill is 1 minus the forecast's error divided by the baseline's error: above zero the forecast beats the baseline, at zero it ties, below zero the baseline is better. The small range under each skill value is a 95% bootstrap interval over days; green where the whole range is above zero, red where it is below.
Where it beats the baselines, and where it does not
- High temperature: beats persistence at every lead, with the whole 95% interval above zero at 1, 3 and 5 days; does not beat climatology at 2 to 6 days.
- Low temperature: beats persistence at every lead, with the whole 95% interval above zero at 2 and 4 days; does not beat climatology at 3 days.
- Peak gust: does not beat persistence at 0 to 1, 3 and 6 days; does not beat climatology at any lead.
- Rain amount: beats persistence at every lead, with the whole 95% interval above zero at 3 to 5 days; does not beat climatology at 2 days; with the whole 95% interval above zero at 4 days.
- Rain day (yes/no at 1 mm): the forecast's hit rate is above all three baselines at 0 to 5 days, and ties or trails the best baseline at 6 days.
High temperature (°F, mean absolute error)
| Lead (days) | Days | Forecast | Bias | Persistence | Skill vs persistence | Climatology | Skill vs climatology |
|---|---|---|---|---|---|---|---|
| 0 | 26 | 2.31 | -0.9 | 2.56 | +0.09 -0.27 to +0.29 | 2.80 | +0.17 -0.40 to +0.49 |
| 1 | 26 | 2.63 | -1.1 | 3.25 | +0.20 +0.02 to +0.30 | 2.80 | +0.06 -0.60 to +0.40 |
| 2 | 25 | 3.60 | -1.6 | 4.14 | +0.12 -0.16 to +0.27 | 2.86 | -0.26 -1.09 to +0.17 |
| 3 | 24 | 3.35 | 0.5 | 4.18 | +0.26 +0.11 to +0.39 | 2.89 | -0.16 -0.67 to +0.17 |
| 4 | 23 | 3.57 | 0.5 | 4.69 | +0.21 -0.07 to +0.36 | 2.85 | -0.25 -0.88 to +0.09 |
| 5 | 22 | 3.42 | 0.5 | 4.72 | +0.25 +0.05 to +0.39 | 2.86 | -0.19 -0.86 to +0.16 |
| 6 | 21 | 3.52 | 0.7 | 4.49 | +0.18 -0.06 to +0.34 | 2.87 | -0.23 -0.80 to +0.11 |
Low temperature (°F, mean absolute error)
| Lead (days) | Days | Forecast | Bias | Persistence | Skill vs persistence | Climatology | Skill vs climatology |
|---|---|---|---|---|---|---|---|
| 0 | 26 | 0.77 | 0.1 | 0.89 | +0.11 -0.11 to +0.25 | 0.89 | +0.14 -0.25 to +0.40 |
| 1 | 26 | 0.73 | 0.0 | 0.92 | +0.18 -0.01 to +0.34 | 0.89 | +0.18 -0.15 to +0.40 |
| 2 | 25 | 0.80 | -0.0 | 1.10 | +0.25 +0.09 to +0.39 | 0.88 | +0.09 -0.26 to +0.34 |
| 3 | 24 | 0.93 | -0.1 | 1.07 | +0.11 -0.13 to +0.30 | 0.88 | -0.06 -0.52 to +0.20 |
| 4 | 23 | 0.81 | -0.1 | 1.14 | +0.27 +0.11 to +0.41 | 0.88 | +0.08 -0.28 to +0.31 |
| 5 | 22 | 0.85 | 0.1 | 1.00 | +0.17 -0.06 to +0.32 | 0.90 | +0.06 -0.41 to +0.35 |
| 6 | 21 | 0.76 | 0.0 | 0.88 | +0.10 -0.29 to +0.35 | 0.93 | +0.19 -0.15 to +0.40 |
Peak gust (kt, mean absolute error)
| Lead (days) | Days | Forecast | Bias | Persistence | Skill vs persistence | Climatology | Skill vs climatology |
|---|---|---|---|---|---|---|---|
| 0 | 26 | 3.28 | 2.5 | 2.84 | -0.20 -1.08 to +0.30 | 2.05 | -0.60 -1.43 to -0.02 |
| 1 | 26 | 3.66 | 2.2 | 3.08 | -0.15 -0.66 to +0.22 | 2.05 | -0.79 -1.45 to -0.29 |
| 2 | 25 | 2.51 | 1.1 | 3.40 | +0.27 -0.01 to +0.48 | 2.02 | -0.24 -0.63 to +0.01 |
| 3 | 24 | 3.48 | 2.0 | 3.53 | +0.00 -0.76 to +0.52 | 2.09 | -0.67 -1.82 to +0.07 |
| 4 | 23 | 2.24 | 0.7 | 2.96 | +0.25 -0.13 to +0.48 | 1.90 | -0.18 -0.75 to +0.19 |
| 5 | 22 | 2.49 | 1.0 | 3.03 | +0.15 -0.27 to +0.50 | 1.64 | -0.52 -1.45 to -0.02 |
| 6 | 21 | 3.00 | 1.7 | 2.64 | -0.18 -1.35 to +0.43 | 1.68 | -0.78 -1.86 to -0.02 |
Rain amount (mm, mean absolute error)
| Lead (days) | Days | Forecast | Bias | Persistence | Skill vs persistence | Climatology | Skill vs climatology |
|---|---|---|---|---|---|---|---|
| 0 | 24 | 6.43 | 1.9 | 8.25 | +0.20 -0.75 to +0.57 | 8.11 | +0.21 -0.84 to +0.56 |
| 1 | 23 | 7.57 | 2.4 | 12.81 | +0.42 -0.17 to +0.71 | 8.45 | +0.10 -0.98 to +0.51 |
| 2 | 22 | 11.21 | 6.1 | 11.70 | +0.07 -1.25 to +0.64 | 8.69 | -0.29 -2.15 to +0.36 |
| 3 | 21 | 6.10 | -1.3 | 13.87 | +0.62 +0.25 to +0.82 | 9.04 | +0.33 -0.26 to +0.60 |
| 4 | 20 | 6.44 | -1.6 | 15.46 | +0.60 +0.35 to +0.79 | 9.43 | +0.32 +0.01 to +0.50 |
| 5 | 19 | 5.49 | 1.1 | 16.42 | +0.66 +0.40 to +0.84 | 9.84 | +0.44 -0.26 to +0.73 |
| 6 | 18 | 8.60 | 0.7 | 16.35 | +0.45 -0.02 to +0.68 | 10.36 | +0.17 -0.65 to +0.48 |
Rain day (yes/no at 1 mm, days called right)
| Lead (days) | Wet days | Forecast | Always dry | Persistence | Climatology |
|---|---|---|---|---|---|
| 0 | 15 | 17 of 24 | 9 of 24 | 16 of 23 | 15 of 24 |
| 1 | 14 | 16 of 23 | 9 of 23 | 11 of 22 | 14 of 23 |
| 2 | 13 | 14 of 22 | 9 of 22 | 10 of 21 | 13 of 22 |
| 3 | 13 | 15 of 21 | 8 of 21 | 11 of 20 | 13 of 21 |
| 4 | 13 | 17 of 20 | 7 of 20 | 10 of 19 | 13 of 20 |
| 5 | 13 | 15 of 19 | 6 of 19 | 8 of 18 | 13 of 19 |
| 6 | 12 | 12 of 18 | 6 of 18 | 9 of 17 | 12 of 18 |
The raw model, for comparison.
Before the site picked its sources variable by variable, it served the Open-Meteo default blend. That raw forecast, the archived same-day run for the village grid point, is still scored every night as a comparator: 98 settled days, 2026-07-07 to 2026-10-16, against the same two baselines. Persistence here uses the previous day in this ledger.
| Variable | Days | Raw model MAE | Persistence | Skill vs persistence | Climatology | Skill vs climatology |
|---|---|---|---|---|---|---|
| High temperature (°F) | 90 | 2.46 | 1.95 | -0.25 -0.62 to +0.01 | 2.34 | -0.05 -0.31 to +0.15 |
| Low temperature (°F) | 90 | 1.57 | 1.45 | -0.09 -0.35 to +0.13 | 1.43 | -0.10 -0.29 to +0.06 |
| Rain amount (mm) | 98 | 4.88 | 5.54 | +0.13 -0.21 to +0.35 | 4.28 | -0.14 -0.63 to +0.15 |
Rain day (yes/no at 1 mm): the raw model called 66 of 98 days right; always-dry 62 of 98, persistence 61 of 94, climatology 58 of 98.
Days with thin station coverage are left out (4 of 102 ledger rows: 2026-07-14, 2026-07-15, 2026-07-17, 2026-10-06); temperatures start 2026-07-18. The raw model's grid point moved on 2026-09-14 (from 17.5897°, -101.4317° to 17.8375°, -101.7606°).
Five worst raw-model rain misses
| Date | Station (mm) | Forecast (mm) | Error (mm) |
|---|---|---|---|
| 2026-07-29 | 39.1 | 2.5 | 36.6 |
| 2026-09-29 | 3.7 | 31.9 | 28.2 |
| 2026-10-09 | 50.9 | 24.6 | 26.3 |
| 2026-08-16 | 0 | 22 | 22 |
| 2026-09-30 | 24.8 | 41.9 | 17.1 |
Surf calls, owner-rated.
The surf engine publishes a 1-to-10 quality call. The table sets every day the owner rated or described against the engine's call for that day, taken only from the words logged at the time. Days with no logged engine score show a dash; nothing is filled in after the fact. 4 days have both a numeric owner rating and an engine score. That is too few to say whether the surf call beats guessing, so no surf accuracy score is given.
| Date | Owner's words | Owner rating | Engine call | Out of sample |
|---|---|---|---|---|
| 2026-05-31 morning | Massive but fat. | 3/10 | 2/10 | no |
| 2026-06-01 day | Mon was unsurfable. | unrideable | 4/10 | no |
| 2026-06-02 day | Tue was unsurfable. | unrideable | 9/10 | no |
| 2026-06-03 day | 30-min glassy window between 8-9am. | 5/10 | 5/10 | no |
| 2026-06-03 forecast-only | finally looks surfable today. | surfable | 5/10 | no |
| 2026-06-07 day | “pretty good and held throughout the day.” | whole-wave | — | no |
| 2026-06-08 day | “today is wild, unsurfable and messy stormy conditions.” | unrideable | — | no |
| 2026-09-15 day | “last tuesday and wednesday were great. tuesday the wind held all day and the shape was perfect.” | whole-wave, perfect | — | no |
| 2026-09-16 day | “great” | whole-wave | — | no |
| 2026-09-19 day | “saturday was very good too.” | whole-wave, very good | — | no |
| 2026-09-21 morning | “looking pretty wonky out there right now. glassy and wonky.” | wonky | 4/10 | no |
| 2026-09-22 late morning | “still looking pretty glassy right now and is looking more lined up.” | 5/10 | 1/10 | no |
| 2026-09-26 morning | “the waves this morning were really good. clean, good shape” | 7.5/10 | 3/10 | no |
| 2026-10-12 afternoon | “its looking cleaner now. not great shape but cleaner” | cleaner, not great shape | — | yes |
| 2026-10-12 midday | “right now it looks big and messy” | 3/10 | — | yes |
| 2026-10-12 morning | “this morning looked glassy but a lot of water” | 8/10 | — | yes |
| 2026-10-14 late morning | “the wind picked up at 10am today and made the waves choppy and lots of current” | choppy, lots of current | — | yes |
| 2026-10-15 morning | “today was really good but degraded a bit at 11:15am when the wind came up” | really good | — | yes |
| 2026-10-17 early morning (~07:00) | “right now its sunny out. the waves are big and powerful but nothing crazy” | big and powerful but nothing crazy | — | yes |
The June surf audit: too few days to judge.
In June 2026 the surf engine's 1-to-10 call could be checked against a logged surf verdict on only 3 days. Three days cannot say whether the surf call beats guessing, so no accuracy score is shown for it. Since 2026-09-27 the site stores every surf call it serves, by lead, so each day the owner rates from now on can be scored against the call that was on the page. A surf score will be published once at least 20 such days exist.
Breaking down each miss.
Three misses traceable through the engine:
| Date | Engine Q | Actual condition | Grade error | Attributed rule | Status |
|---|---|---|---|---|---|
| 2026-05-31 | 2 | shoulder-only (surfable) | +5 vs ideal |
Engine under-scored: mixed-trains penalty (std=1.17s) fired correctly for the chaotic day-level water, but the shoulder of the wave was still rideable. The engine has no "shoulder-rideable" sub-call — it scores the whole day, not the shoulder of the break.
No snapshot — heuristic attribution |
|
| 2026-06-02 | 9 | unrideable | −6 vs ideal |
Wave-power penalty set too leniently. Wave power was around 30 kW/m (roughly equivalent to an 8–9 ft swell at 14+ seconds — beyond what Saladita can handle cleanly). The engine's penalty only triggered at ≥25 kW/m (−2 points), which was not enough to cancel the bonuses awarded for a favorable swell direction (+3 for 200°) and long period (+1.5 for 14s+). The threshold needed to be lower (≤20 kW/m to trigger a −3 penalty) to flag that the size-plus-period combination produces walling closeouts at Saladita, not peeling rides.
Not fixed — the wave-power penalty was retired on 2026-09-27 under the size-neutral rule; this day would score high again. Open. |
|
| 2026-06-08 | — | unrideable (blown, stormy) | — |
No storm proximity feature existed. Tropical Storm Boris (~270 km southeast of Saladita) created onshore chaotic conditions. Standard weather apps flagged the storm; the engine had no National Hurricane Center advisory feed at all. This is a feature gap — not a miscalibrated threshold, but a completely missing input. No engine snapshot exists for this date; the miss was reported by the user and confirmed by the storm track record.
Fixed 2026-06-08 |
The two large misses had different causes. On June 2 a rule existed with the wrong threshold; on June 8 no storm input existed at all. The storm input was added on 2026-06-08. The wave-power penalty behind the June 2 miss was retired on 2026-09-27, so that day would still score high today.