Left of now is the past. The weighted line there is recomputed from today's models and today's weights — it is not what the screen said at the time. Shown then is that record, saved every five minutes, and green is your own boat when a track is loaded — the only wind actually measured on the course. The weather stations are not drawn here: the nearest usable one is 28 km away, and three of them disagree by twenty or thirty degrees of pure geography, which would stretch this axis over ground the course never uses. They are in Models → Validation instead, as one zero-centred line each: the error of the forecast at that station's own position. That error is what sets the weights, and zero-centred the three can finally be compared.
Every model's forecast is stored at each fetch and scored later against actual observations. The weight is largest for the model that has been closest over the last few hours, with the emphasis on today.
Below 3 kn the direction is not scored. A vane in two knots does not point, it drifts — two DMI stations 9.6 km apart have read 225° and 115° in the same minute, both in 2 to 3 knots. Scoring against that teaches a bias of tens of degrees from pure noise. The measured speed still counts, and if a whole day stays under the threshold the models simply keep even weights, which is the honest answer.
Positive = the forecast had more wind / was more veered than measured. By model pools every place: which model is closest, wherever it was checked. By station is the weighted forecast's own error at each place we can measure — the same numbers, asked the other way. Because it is an error and not a wind, a station 28 km away and one 42 km away can be read on the same axis. All places count equally in the weights; a model that is right in one place and wrong in another gets a large spread and a small weight, which is the correct answer — it cannot resolve the difference, so it should not be trusted to turn the forecast for the course.
Every single fetch is listed here with its time. While racing the app fetches nothing, so the list stands still — which is exactly the point.
Drop a .vkx or .csv from Vakaros here. The app derives the actual wind direction and current on the course and uses it as an observation in the model weighting.
On Android, once Hodogen is installed on the home screen, you can skip this page entirely: export the session in the Vakaros app and pick Share → Hodogen. The file is handed straight to the analysis, and it works with no coverage.
Open this position in a map ↗ — check it against the chart before you trust it
Without a backend the app only follows the models while it is open. With a backend, Cloudflare polls every fifteen minutes from five in the morning, and the phone pulls the whole day's history in one call.
The boat carries its own tacking angle and polar, and they live on the server — not on this phone. Two crew with two phones sail the same boat, and a new phone should not start by guessing.
The models deliver wind 10 m above the surface. The grid cell is picked over water, not over land, which is decisive for a course a couple of kilometres out.
Drogden Fyr and Nakkehoved Fyr stand in the water. Jægersborg and Sjælsmark stand inland, and a bias learned against them would drag the forecast in over land.
Measured skill and physical resolving power are two different things. A model on a 25 km grid may have been spot on all morning and still be incapable of seeing the sea breeze coming.
Light mode is easier to read in direct sun.
Otherwise the phone blanks the screen in the middle of a start. The lock is released automatically when you switch away from the app, so it does not drain the battery in your pocket.
The service worker is what makes the app open at all without coverage, and what receives a file shared from the Vakaros app. If anything below is red, that is the reason.
The build stamp is set when the app is compiled, and the same stamp goes into the Worker — they are deployed together. Two identical stamps mean the phone is running exactly what your backend serves.