Technical Guide

Technical guide

This page will document how the app calculates wave data, filters surf spots, and combines buoy, wind, and tide information.

Sections will be added here over time as the forecast logic is documented.

Swell Timing

How swell travel time is estimated from a buoy

The app estimates swell timing by treating the swell as a moving line of energy in deep water. It uses the buoy location, the destination shoreline target, and the swell period reported by the buoy.

First, the swell period is converted into an approximate deep-water group speed:

group speed (knots) ≈ 1.515 × swell period (seconds)

Next, the app converts the swell “from” direction into a travel direction by adding 180 degrees. That travel vector is compared against the line from the buoy to the coastline target.

Instead of only using straight-line distance, the app projects the buoy-to-target vector onto the swell travel axis. That produces a signed distance:

signed distance = dot(target - buoy, unitVector(travelDirection))

Travel time is then estimated by dividing that signed distance by the swell group speed:

arrival hours = signed distance / group speed

A positive result means the swell line has not reached the target yet. A negative result means that the swell line has already passed the target. That is why an east or southeast swell can show as “past Hanalei Bay” when viewed from a northwest buoy.

Pseudocode

travelDirection = swellFromDirection + 180
groupSpeedKnots = 1.515 * swellPeriodSeconds
signedDistance = dot(targetVectorFromBuoy, unitVector(travelDirection))
arrivalHours = signedDistance / groupSpeedKnots

Swell speed by period

These are the approximate deep-water group speeds used by the app when estimating travel time from a buoy.

Swell periodGroup speedApprox mph
8s12.1 kt13.9 mph
10s15.1 kt17.4 mph
12s18.2 kt20.9 mph
14s21.2 kt24.4 mph
16s24.2 kt27.9 mph
18s27.3 kt31.4 mph

Buoy Power

How buoy power and wave height are estimated

Buoy power in the app is a calibrated energy-style score based on swell height and swell period from the buoy. It is designed to feel closer to the Surfline-style power values used elsewhere in the forecast, while still using a simple local formula.

The calculation starts with the idea that swell energy rises faster than height alone, so height is squared and then weighted by period:

buoy power = 1.23 × swell height² × swell period

In the formula above:

  • swell height is in feet
  • swell period is in seconds
  • the `1.23` factor is a calibration constant

This means buoy power is not a direct physics unit like watts or kilowatts. It is a surf-forecast scoring metric that increases strongly with both size and period.

Height matters most because it is squared. Period still matters a lot, but it grows linearly, which keeps the result from becoming as explosive as a more heavily weighted power formula.

Wave height uses a different idea. Instead of squaring height, it starts with the buoy swell height and applies a gentler period multiplier to estimate an offshore-to-surf face-height style number.

estimated wave face height = swell height × clamp((period / 8)^0.5, 0.9, 2.0)

This keeps wave-height growth more moderate than power and a bit more conservative overall. Longer period still increases the estimate, but not nearly as sharply as a squared-energy style score.

Pseudocode

if swellHeightFeet == null or swellPeriodSeconds == null:
  return null

buoyPower = 1.23 * swellHeightFeet * swellHeightFeet * swellPeriodSeconds

Wave Height Pseudocode

if swellHeightFeet == null or swellPeriodSeconds == null:
  return null

periodMultiplier = (swellPeriodSeconds / 8)^0.5
clampedMultiplier = clamp(periodMultiplier, 0.9, 2.0)
estimatedWaveFaceHeight = swellHeightFeet * clampedMultiplier

Example buoy power and wave-height values

These examples use the same formulas documented in this section so you can compare how power and estimated face height scale differently.

Buoy swellCalculationPowerEst. wave face height
2.0 ft @ 8s1.23 × 2.0² × 839.42.0 ft
2.5 ft @ 12s1.23 × 2.5² × 1292.33.1 ft
3.5 ft @ 8s1.23 × 3.5² × 8120.53.5 ft
4.0 ft @ 10s1.23 × 4.0² × 10196.84.5 ft
4.9 ft @ 14.8s1.23 × 4.9² × 14.8437.16.7 ft
5.4 ft @ 8s1.23 × 5.4² × 8286.95.4 ft
6.0 ft @ 12s1.23 × 6.0² × 12531.47.3 ft
6.5 ft @ 8s1.23 × 6.5² × 8415.76.5 ft
8.0 ft @ 18s1.23 × 8.0² × 181417.012.0 ft
7.8 ft @ 9s1.23 × 7.8² × 9673.58.3 ft
10.0 ft @ 16s1.23 × 10.0² × 161968.014.1 ft
12.0 ft @ 18s1.23 × 12.0² × 183188.218.0 ft
18.0 ft @ 20s1.23 × 18.0² × 207970.428.5 ft

This buoy power score is best used as a relative measure of swell energy. Higher numbers mean more potential surf energy at the buoy, but they do not directly guarantee a specific breaking wave height at the beach.

The estimated wave-height value is intended to be a more intuitive surf-facing number than power. It is still a heuristic and should be treated as a generic offshore-to-surf estimate, not a spot-specific breaking-wave model.

Direction, refraction, island shadowing, and local bathymetry still determine how much of that energy actually turns into surf at a given spot and how big the final breaking waves appear.