Loading
Loading
Every spot page scores live ocean data against that spot’s hand-curated profile. The weights, thresholds and limits below are the ones running in the code right now.
The BaliSurf.co forecast pulls live marine and weather data from Open-Meteo, scores five weighted factors — swell size, wind, swell direction, swell period and tide — against each spot’s hand-curated profile, applies hard caps for fatal flaws, and bands the result into a 0–100 rating calibrated to that one break.
Two free, open APIs and one dataset we maintain ourselves. No proprietary feed, no cameras.
Every rating starts with Open-Meteo’s marine model, queried at each spot’s coordinates. It tells us what the ocean is doing: the height, period and direction of the total wave field, the swell component and the wind-wave component, plus sea surface temperature and an hourly sea-level series that drives our tide chart. Open-Meteo’s weather model adds the wind — speed, direction and gusts at 10 m — and air temperature.
Both are free, open-data models. We pay for no proprietary feed and run no cameras; what we add is the third source below — a hand-curated profile for every spot we cover, built and maintained in our own dataset, not scraped from anywhere. The model tells us what the open ocean is doing. It does not know your reef. That gap is why we calibrate every spot by hand — and why you should still look at the water before you paddle out.
The state of the ocean at the spot’s coordinates.
What the air is doing over the lineup.
Our own dataset — maintained by hand, not scraped.
All times in Bali time (WITA, fixed UTC+8 — no DST ambiguity) · The dashboard re-fetches the latest model data every 15 minutes.
The same swell is a different wave on a different reef — so the score is never generic.
A 6 ft swell at 14 s from the SW is a very different proposition at Uluwatu than at a windswell beach break — and our engine rates it differently, on purpose. Each of the95 published spots carries a profile: the swell directions that wrap into the lineup, the size range the wave actually handles, the wind directions that groom it, and the tides it tolerates. Live data is scored against that profile, never against a one-size-fits-all template.
We use Uluwatu as the worked example for the rest of this page because its profile exercises every part of the engine — including the low-tide safety rule.
Five factors, five fixed weights. The table is the whole recipe; the sections below are the math inside each factor.
| Factor | Weight | What it measures |
|---|---|---|
| Swell size | 30% | Period-adjusted effective size vs this spot’s best-size window |
| Wind | 25% | Angle to this spot’s own offshore directions, with calm and gust handling |
| Swell direction | 20% | Whether the swell is actually wrapping into this lineup |
| Swell period | 15% | Windswell to groundswell, scored from 5 s to 14 s |
| Tide | 10% | Current stage vs this spot’s preferred tides |
The five weights, in proportion
Period-adjusted effective size vs this spot’s best-size window
Angle to this spot’s own offshore directions, with calm and gust handling
Whether the swell is actually wrapping into this lineup
Windswell to groundswell, scored from 5 s to 14 s
Current stage vs this spot’s preferred tides
Graceful degradation: when wind or tide data is unavailable, that factor is dropped and the remaining weights renormalize. If swell size itself is unavailable, we fall back to a simple generic rating from wave height and period, and the dashboard drops the factor breakdown rather than showing a calibrated one. When data is thin, we say less, not more.
Raw height undersells long-period swell, so we score an effective size: height × clamp((period ÷ 11 s)^0.4, 0.75, 1.3) — the period exponent borrowed from the Komar–Gaughan breaker relation, clamped, with 11 s as neutral. 4 ft at 16 s breaks bigger than 4 ft at 8 s, and the score knows it. Inside the spot’s best-size window the factor is perfect. Below the window the penalty is steep and superlinear — (effective ÷ window minimum)^1.5 — because underpowered reefs don’t break at all. Above the window the slide is gentler and linear, reaching zero at twice the window maximum.
We measure the angle between the live wind and the spot’s nearest offshore direction. Within 45° it scores as full offshore (1.0); out to 90° it’s cross-off (0.7); from there to 135° cross-on (0.4); beyond that, onshore (0.15). Gusty days score off max(speed, 75% of gusts) — a gusty “light” wind behaves like its gusts. Under 5 km/h the air is glassy and scores 0.9 regardless of direction, blending to the full directional effect by 20 km/h. Nuking offshore over 25 km/h tapers back down — past a point it just blows the wave apart.
Each profile names the swell directions that wrap into the lineup. Live swell within ±22.5° of a named direction scores full; from there the score slides linearly to zero at 90° off — at which point the spot is shadowed and the swell simply isn’t arriving. This is the factor that most often separates two breaks a few kilometres apart on the same morning.
Period scores linearly from 5 s (zero) to 14 s (full). We label 13 s and up long-period groundswell, 9–13 s mid-period, and under 9 s windswell. Period also feeds the effective-size math above, so a long-period pulse is credited twice — once here, and once in how big it actually breaks.
We classify the current stage — low, mid or high — from today’s actual tidal range, not fixed heights. The factor scores full inside the spot’s preferred stages and never drops below a 0.2 floor: tide modulates a session, it rarely kills one. A rising (pushing) tide earns a +0.1 bonus, since incoming water over the reef usually helps. Spots marked as working on all tides score full automatically. There is one exception, covered next.
A weighted average can hide a fatal flaw — four good numbers burying one terrible one. Three hard caps stop that.
Swell arriving 90° or more off the spot’s window isn’t wrapping in, no matter how clean the wind is.
Capped at Poor (39)When the size factor falls under 0.35 — far too small, or badly maxed out — the day can’t rate above average.
Capped at Fair (54)When the wind factor falls under 0.25, the surface is wrecked even if the swell underneath is perfect.
Capped at Good (69)The flat override. If neither the raw wave height nor the period-adjusted effective size reaches 1.5 ft, the rating is Flat — regardless of how offshore the wind is. A perfectly groomed 1 ft is still 1 ft.
The safety zero. At a spot whose profile carries a low-tide warning and that doesn’t work on low tide, a low tide scores the tide factor zero, and the dashboard shows the warning verbatim — at Uluwatu, “Shallow reef at low tide”. This hard zero applies only to spots with a low-tide warning; everywhere else the 0.2 tide floor holds.
The 0–100 score lands in one of four bands — plus one override that outranks them all.
Epic (80 and up) means the spot is near its hand-tuned optimum — rare by design. Good (60–79) is worth rearranging your morning. Fair (40–59) is surfable but compromised on at least one factor. Poor (under 40) means at least one factor is badly wrong.
One honest note: Epic at a mellow beach break and Epic at Uluwatu are different waves. The score is calibrated per spot, not across spots.
Live model sea level first; a published harmonic method only when the live data isn’t there.
The tide chart is 24 hourly sea-level values from the marine model, covering today in WITA. We add a fixed 1.4 m offset so heights read against the Benoa Harbor chart datum — the same chart-datum scale local tide tables use, rather than oscillating around zero.
Used only when live sea level is unavailable: we compute the curve ourselves from 10 harmonic constituents — M2, S2, N2, K2, K1, O1, P1, Q1, M4 and MS4 — using a simplified harmonic method with approximate Benoa Harbor constants. It’s a rough approximation good for stage and trend, and we’d rather show that, labeled, than a blank chart.
Either way, these are model heights anchored to one reference station — not harbor-master tables for your exact reef.
This is the part most forecast sites bury. We’d rather you know exactly where the numbers stop.
The model reports offshore swell. Refraction, focusing and bathymetry can make the wave you paddle into bigger or smaller than the number on the dashboard.
Bali has no public buoy network we can check the model against, so any model bias goes uncorrected. We publish the method instead of pretending the gap isn’t there.
Heights are model sea level plus a single Benoa Harbor datum offset. Fine for stage and trend; not survey-grade for your specific reef.
The score is a screening tool built from five factors and hand-curated profiles. It is never safety advice.
Look at the water. Talk to locals. The score gets you to the right cliff at the right time; your eyes make the final call.
Straight answers about the engine, its coverage, and its blind spots.
It is a different tool. We have no cameras, no proprietary nearshore model and no buoy network. What we offer instead is per-spot calibration across 95 Bali breaks and a fully published method — every weight and threshold on this page is the live code.
The model reports open-ocean swell, not what breaks on your reef — refraction and bathymetry change the wave on the way in. Model steps are hourly while wind shifts by the minute, and the dashboard re-fetches every 15 minutes. The factor breakdown shows which factor scored low, so you can judge whether it matters at your spot today.
We rate 95 published spots across every Bali region, each with a hand-curated profile of its swell window, offshore wind directions, tide preferences and size range. Browse the full list on our spots page.
Browse all 95 spots →Each spot is scored against its own profile — its swell window, its offshore wind directions, its preferred tide stages and its best size range. The same ocean can be on for one reef and shadowed or blown out for the next, so neighbouring spots can sit in different bands at the same hour.
We drop what we cannot verify. Missing wind or tide data removes that factor and renormalizes the remaining weights, so the score still reflects what we know. If swell size itself is unavailable, we fall back to a simple generic rating from wave height and period, and the dashboard drops the factor breakdown rather than faking a calibrated one.
Yes. The weights are 30/25/20/15/10, the band thresholds are 80/60/40, the caps are 39/54/69, the flat override fires when both raw wave height and effective size are under 1.5 ft, and the tide chart adds a 1.4 m Benoa Harbor datum offset — all on this page. If a live number ever disagrees with this page, that is a bug — tell us.
Every spot page runs this exact engine on live data, with score, factor breakdown, caps and tide chart.
Browse all 95 spots or jump to the worked example: Uluwatu live conditions
Methodology last updated: 2026-06-11