The Web Application
Burningswell’s forecasts live in a web application you open in an ordinary browser (see Getting Started). No account is needed to browse — the home page, the spot directory, the search, the forecast map, and every public spot page are open to everyone. Signing in adds the personal layer: a history of the sessions you log, the statistics built from them, and access to private spots that have been shared with you.
This chapter tours the pages and what each is for. See Forecasts and Spots, for how to read what a spot page shows you.
Every page shares the same frame. The header at the top carries the brand, which leads home, the search and the site’s destinations: ‘Spots’, ‘Places’, ‘Map’, ‘Sessions’, ‘Stats’, and ‘Account’ once you are signed in or ‘Sign in’ before; the page you are on is marked. On a phone the header keeps only the brand and a search button, and a tab bar along the bottom of the screen carries ‘Spots’, ‘Map’, ‘Sessions’ and ‘More’. ‘More’ opens a sheet with everything else: ‘Places’, ‘Compare’, ‘Boards’, ‘Stats’ and ‘Documentation’ to browse, your language, units and theme as settings, the workspaces you belong to if any, and ‘Account’ or ‘Sign in’. The site footer closes every page with its columns of links, the data credits and a bar carrying the same three settings: the language, the units and the theme. On the forecast pages the header draws no units or theme control of its own; the footer’s bar and the ‘More’ sheet are where you change them.
The data credits name each forecast model whose figures the page printed, in the wording its licence asks for: ‘NOAA GFS-Wave (Public Domain)’; ‘ECMWF IFS-WAM, based on data and products of the European Centre for Medium-Range Weather Forecasts (CC BY 4.0)’; ‘DWD GWAM’ and ‘DWD EWAM’ with the source note ‘data basis: Deutscher Wetterdienst, own processing’; ‘Météo-France MFWAM (Licence Ouverte Etalab 2.0)’; and the Mediterranean model’s ‘Generated using E.U. Copernicus Marine Service Information’. A figure from the ensemble credits each model that reported at the break, since the ensemble is their median. A page that prints a sky or an air temperature also credits ‘NOAA GFS (Public Domain)’ as its weather data. A page whose figures name no single model, such as a list of spots, credits the models switched on for the ensemble. ECMWF publishes its data without warranty and accepts no liability for errors or omissions in it or for its use.
Setting up: the welcome flow
Setup lives at /welcome, and it needs an account. The home page
offers it once, as a ‘Follow a spot to make this yours’ reminder
with a ‘Pick my spots’ link, to a signed-in account that follows no
spots, whether or not it skipped setup; otherwise, open the address. Setup asks
three questions, one step each — /welcome/units,
/welcome/spots and /welcome/board — and ends on a
verdict at /welcome/done. None of the steps blocks anything, all
of them are changeable later, and every one can be skipped.
Every step, the card that offers to
pick up where you left off and the one reminder to pick spots
read in your language — the one your account holds, or the one your
browser asked for; the copy quoted below is the English face.
Setup is a focused page, like signing in: no tab bar and no site footer, the brand and ‘Skip setup’ in the header on every step, and the language line under the column. On a phone or a tablet a line over the step says where you are, ‘Step 2 of 4 · Your spots’, over a bar for each step; on a wide screen a ‘Setting up’ rail beside the step names the four, with a tick on each finished one. The rail shows what you answered under each step — ‘English · metric’, the first three spots you follow, ‘Skipped’ for a step you passed over — and a finished step’s name in it is a link back to its page. Steps 2 and 3 carry ‘Back’ to the step before: on the line over the step on a phone or a tablet, and at the start of the buttons under it on a wide screen. Going back loses nothing, since every answer is already on your account. ‘Skip setup’ works with or without JavaScript.
- Language, units & location. The step asks three things, each
on its own card, and saves each answer the moment you give it.
The first card offers the four languages, English · Español · Français · Português, each written in itself, with the one the page arrived in chosen. Until you pick one it says ‘From your browser’; the language is then the one your browser asked for. Tap another and the page comes back in it at once, saying ‘Chosen by you’; every word after that, on every device you sign in on, follows the choice. Pressing ‘Continue’ without touching it keeps the language shown, so the guess is confirmed by moving on. This is the same setting as
Languageon your account page.The second card is units: metric or imperial, each shown as the same sample line written both ways (‘1.6 m · 14 s · 18 km/h · 19°C’ or ‘5.2 ft · 14 s · 11 mph · 66°F’). A tap saves it and the card says ‘Units saved.’ Period stays in seconds and board volume in litres either way. This is the same setting as
Unitson your account page; an account set to UK units there sees neither card chosen, and keeps UK until it picks one here.The third card, ‘Where do you surf?’, holds ‘Use my location’, which moves you to the next step ordered by distance, and a search box: type a region and press Enter to go to the next step with that search. Under them it asks how the product should use your location, with two answers: ‘This device only’ — located on each visit, the position kept in that browser and never on our side — and ‘Ask each time’, the default, which locates you only when you press ‘Use my location’. The answer is the same setting as
Locationon your account page, which also offers ‘Never’; an account set to ‘Never’ sees neither card chosen here. - Your spots. Follow the breaks you surf. You can let the
browser locate you once to order the list by distance, or search any
spot, region or country: type it and press Enter — the same search the
header offers. Each break is the row the rest of the site draws for a
spot: its flag and name, which links to the spot, its stars and the
word for the conditions right now, the kind of break, where it is and
how far away, the air and sea temperatures, the wave height, period and
direction, and the wind with its speed; a heart at the end of the row
follows or unfollows it at once. The choice is informed rather than a
name-recognition test, and a break the forecast does not score says
‘listed, never scored’ and shows no figures, never a plausible
zero.
The card over the list says what it is and how many it holds: ‘Near you’ with ‘7 within 50 km · 3 followed’ after locating — 50 km is how far the step looks, and it lists the nearest eight while the number counts every spot within that distance — ‘Matches’ with ‘1 spot · 3 followed’ after a search, where the number counts every spot the search matches, not only the rows it lists, or ‘Your spots’ with the followed count. A search that finds nothing says ‘Nothing matched’ with what you typed, and suggests a region or a country. Without a position, and with no spots followed yet, the step shows ‘No problem --- where do you surf?’ with the search, four regions to start from and ‘Try my location again’; located with nothing within 50 km, it counts ‘0 within 50 km’ over the search and the regions. The position is used for that one screen only, so ‘Back’ from step 3 to this step shows it un-located. ‘Continue with 3’ keeps your choice and moves on; ‘skip this step’, under it, moves on without following anything, while ‘Skip setup’ in the header leaves setup altogether.
- Your first board. Optional. Add the board you ride most —
its name, its shape, its colour and, if you know them, the numbers
printed on its stringer — and it is pre-selected every time you log a
session. The drawing at the head of the card redraws as you fill the
boxes, and the shapes are a group of six you can also walk with the
arrow keys. ‘Add board and continue’ saves it and opens the
closing screen; ‘I'll do this later’, under it, moves on without a
board. The whole quiver — fin setups, retiring a board, and which one
your log says suits tomorrow — lives in ‘Boards’, under your
account (see Your quiver); this is its first row.
Come back to this step once it is answered and it shows the board it added — its drawing, its name, its type and its dimensions — with ‘Change’ and ‘Continue’. ‘Change’ opens the same form filled in; ‘Save and continue’ saves over that board, and ‘Cancel’ goes back without saving. Setup never adds a second default board: if your account already had one when you reached this step, the board you type here joins your quiver beside it and your default stays as it was.
- Done. ‘You're set’, with a line of what was set up (‘3 spots followed, metric units, 1 board in the quiver.’), then a real verdict: under ‘Right now’, the best of the spots you follow, drawn as one spot row — its stars, its place, the air and the sea, its reading and its wind with its speed — that opens the spot. It is the spot whose wind is best right now, among those the forecast scores, judged from the same forecast summary that draws its row. ‘Open my spots’ takes you home. If you follow no spot, the line ends ‘No spots followed yet.’ and the screen says ‘Nothing to report yet’, with ‘Pick my spots’ to go back to the picker and ‘Go to the home page’; if the forecast does not cover the spots you follow yet, it says that instead. It never names a spot it has no forecast for.
Your location is used once and never stored. It orders one screen; what your account keeps is the spots you chose, not where you were standing when you chose them. The ‘Use my location’ button on the first step asks the browser for a position and hands it to the next step inside your browser — it is never written into the address, so the page you land on can be bookmarked or shared without carrying it — and that step sends it to us exactly once, to order the picker by distance. No cookie is set and nothing is remembered: come back to setup later and it starts un-located. If the browser refuses or cannot answer, the picker opens on its search and its region chips instead: ‘Portugal’, ‘Cornwall’, ‘Bali’ and ‘Hawaii’, each listing the spots in that place, and the card counting every spot the place holds.
You can leave at any point. Every answer is saved as you
give it, and opening /welcome again, on any device, leads to the
first step you have not answered rather than starting over. The first
sign-in of an account that has not finished or skipped setup opens it,
once (see Signing in and creating an account). After that, while
setup is unfinished, the home page shows a ‘Pick up where you left
off’ card above its lists: what is already saved, how many steps are
left (‘One optional step left.’ when only the board is), the four
steps with the next one marked, ‘Continue setup’, which opens that
step, and ‘Don't ask again’.
Pressing ‘Skip setup’ in the header, or ‘Don't ask again’ on the card, takes you home and ends setup: it is not offered again and the card is gone. If you then follow no spot, the home page shows one reminder, once: ‘Follow a spot to make this yours’, with ‘Pick my spots’, which opens the spot picker, and ‘Dismiss’. It does not come back, whether you dismiss it or not.
The home page
Opening the application lands you on the home page, and the page opens with an answer rather than a list: ‘Go to Mundaka.’ names the best-rated break you can reach — among those near you, or, before you have shared a location, among the spots you follow — over what its forecast says.
Under the sentence, ‘Ranked for’ offers three tabs: ‘Now’ ranks every list on the page by each break’s forecast for the present moment, ‘Today’ by the best of each break’s own today, and ‘This week’ by each break’s best day of its coming week. The sentence, the two cards and every list follow the tab together. With JavaScript available the page changes in place; without it each tab is an ordinary link, and ‘/?horizon=today’ or ‘/?horizon=week’ opens the page ranked that way.
Beside the sentence sit two cards, the same two at every width, and they never name the same break. The first names the top break for the tab: ‘Best right now’, ‘Best today’, or ‘Best this week’ with the day it falls on. The second, under ‘Now’ and ‘Today’, is the best week among the other breaks (‘Best this week · Sat’); under ‘This week’ it is the runner-up (‘Next best this week · Fri’). A card whose answer the forecast cannot supply is left out. A phone shows the cards one above the other, a tablet side by side, a desktop beside the sentence, where each card also says how far away its break is.
At desktop width two buttons sit under the tabs: ‘Open the forecast’, which opens the named break’s page, and ‘Compare nearby’, which opens the three best-rated breaks near you side by side on the compare page (see Comparing spots). ‘Compare nearby’ is there only when at least two breaks near you are rated. On a phone the band ends with the search field, since the phone’s top bar carries none.
Signed in with setup unfinished, a card above the sections offers to pick it up where you left off; signed in following no spot, a reminder there offers the spot picker once (see Setting up: the welcome flow, above).
Under it the page is a set of lists, each a card. On a phone they run in one column — ‘Your spots’, ‘Near you’, ‘This weekend’, ‘Swell arriving’, ‘Famous right now’ — each heading standing over its card. From a tablet up the wider column holds ‘Near you’, ‘This weekend’ and ‘Famous right now’, each heading inside its card, and a narrower column beside it holds ‘Your spots’, ‘Swell arriving’ and, at desktop width, ‘Recently viewed’.
Each list shows a page at a time and ends in a pager: ‘1–4 of 32’ and two arrows, the count being the list’s own. ‘Near you’ and ‘Famous right now’ show four rows a page on a phone, six on a tablet and eight on a desktop, where they run as two columns of four; ‘Your spots’ shows three and ‘Recently viewed’ two at every width. An arrow fetches the next or the previous page in place. When a phone turns or a window widens, the lists re-page to the new size and keep the first spot you were reading in view.
- ‘Your spots’
The breaks you follow, ranked by conditions for the tab, or in the order you keep them, when you choose ‘Your order’ on the ‘Your spots’ page (see Your spots), in the same row as ‘Near you’ below; each row’s place line ends with what the break is to you: ‘home break’ for the spot your account names as home, and ‘favourite’ for every other, and carries no distance. Its heading’s ‘Edit’ opens the ‘Your spots’ page, at every width and on the travelling face’s ‘Your spots, back home’. It appears only when you follow something, so a signed-out reader never sees an empty card.
- ‘Near you’
The spots within 50 km of you, ranked by conditions for the tab rather than by distance — the same order the spots directory uses. Each row is the one row every forecast list draws: its country’s flag and its name, the stars and the verdict word with the break type (on a phone the verdict alone, the break type being the spot page’s), its region, country and distance to one decimal (‘10.6 km’), and beside them the air and sea temperatures, the height, period and swell direction, and the wind with its speed. A break the wave model does not reach is listed after every rated one: it is not a bad break, it is one we cannot score. The heading links to the full map: ‘Map’ on a phone, ‘Open map’ wider. Under the list the page asks ‘Not near you?’ and offers ‘Forget my location’ (see below).
- ‘This weekend’
Four day columns — today and the three days after, the calendar days of the nearest break — each naming the best-rated break near you on that day with its height, period, the day’s air and sky, the sea temperature and its stars. A line above the columns names the pick of the four (‘Thu is the pick nearby — Zarautz, 2.2 m at 13 s, onshore.’), and from a tablet up the heading links to that break’s page. A day nothing near you can be rated for is left out. Drawn once you have shared a location.
- ‘Swell arriving’
When the next rise reaches the named break’s coast, and the day and the hour it peaks (‘peaks about 17:00 on Sat’), over a line of the coming days’ heights with the peak marked on it (‘peak Sat 17:00’) and its first, peak and last days named along the foot by their weekday, today’s included. The days and the hour are the break’s own, in its local time; the hour is the forecast step the peak falls on, which is why it is about: past the fifth day the model has a step every three hours. It is omitted when there is no rise to announce — a swell already at its height today is not arriving.
- ‘Famous right now’
Well-known breaks around the world, ranked by conditions for the tab, in the same row as ‘Near you’ but with no distance on it. The heading’s ‘All’ opens the spot directory.
- ‘Recently viewed’
At desktop width, when you are signed in: the spots whose pages you opened last, newest first, each place line ending with when (‘2 h ago’, ‘yesterday’). It is not drawn for a signed-out reader or before you have opened a spot. Your account’s ‘What we store’ section counts the record, the data export lists it, and deleting your account deletes it.
When you have shared a location and none of the spots you follow is within 50 km of it, the page ranks where you are, provided a break near you can be rated; when none can, it ranks your spots as it does at home, with one card. The opening sentence names the best break near you and says why (‘You're away from your spots, so home ranks where you are.’); the second card is the best of your spots, headed ‘Back home’; the nearby list leads as ‘Near you now’ and your spots follow as ‘Your spots, back home’; and ‘This weekend’ and ‘Swell arriving’ are left out. Nothing is stored to decide this: the page works it out from the position and the spots you follow each time it is drawn.
Every rating on the page is the same five-star row the spot page draws, and no section is drawn with invented data: a day, a card or a whole section with nothing behind it is left out rather than filled with zeroes. Click any entry to open its spot page.
Above the sentence the page names where the named break is and what the time is there: ‘Bizkaia, Spain · 11:20 CEST’. Every time on the home page is the break’s own local time, and the days are the break’s own days, whatever your own time zone; the line above the sentence is the one place the page names the zone. A break whose time zone is not on file reads in UTC and says so (‘09:20 UTC’). The time is the server’s, so it reads the same with JavaScript unavailable.
Sharing your location is what fills ‘Near you’ and lets the opening sentence name a break you can reach, and it is always your move. Pressing ‘Use my location’ makes the browser ask you, once, whether this site may know where you are; say yes and the page updates in place — the nearby list, the verdict and the cards re-rank around you without a reload, and while the browser is still answering the list is replaced by a placeholder and the line under the button reads ‘Finding your position…’. If no position comes back the line says why: the site is blocked in your browser’s settings, the browser took too long, it could not find you, or it does not share a position at all. If no spot lies within 50 km of you, the list says ‘No spots near you’ and shows the famous spots instead, with their distance from you. On an instance with no forecast yet, Near you still lists the spots around you by name and distance, under the notice that the numbers are missing. Beside the button sits an ‘Always use my location’ tick box: tick it before you press, and from then on the page locates you on every visit without being asked.
Your position is sent to us for that one request and for nothing else. It is remembered only in your own browser, for thirty days from the last time you shared it, so that the next time you open the page it is already ranked around you; it never appears in the address bar or in a link you copy, it is never kept on our side, and it is never rounded — the distances you read are measured from the position the browser reported. Under a located list the page asks ‘Not near you?’ and offers ‘Forget my location’: pressing it clears what your browser remembers and returns the page to its un-located view. Forgetting clears the memory, not the permission: if you have allowed the site in your browser and your choice is ‘Ask’, a later visit reads your position again without asking. To stop the page reading it at all, choose ‘Never’, or withdraw the site’s permission in the browser.
How the page may obtain a position is a three-way choice, and it is the same choice wherever you make it. Signed in, it is the ‘Location’ card of your account page (see The account page, below), and it follows you to every device you sign in on; signed out, you make it on the page itself, it stays with that browser, and it is carried into your account the first time you sign in unless the account already holds a choice.
- ‘This device’
The page locates you on every visit. If the browser has not yet decided whether this site may know where you are, it asks as the page loads. Under a located list a second link, ‘Stop using it automatically’, beside ‘Forget my location’ returns to ‘Ask’. On the page, ticking ‘Always use my location’ before pressing the button is what chooses it.
- ‘Ask’
The default. The page locates you only when you press ‘Use my location’; it never asks on load. Once you have allowed the site, the page keeps a remembered position current quietly on later visits, re-ranking only when you have moved about two kilometres.
- ‘Never’
The page makes no attempt to locate you: the button is gone, any remembered position is cleared on your next visit, and the near-you slot says ‘Location is off’ with a ‘Turn location on’ button (which returns to ‘Ask’) and the escape to browse by country. ‘Never’ is chosen on the account page’s row; the page itself offers only the way back on.
An account can hold a fourth choice, ‘Remember’, under which the page locates you as it does under ‘This device’, on every device you sign in on, keeps each position it locates you at on your account — at most one every two minutes unless you have moved 100 metres — and offers the same ‘Stop using it automatically’ link; the page’s own tick box and links never choose it.
If you follow spots but have not shared a location, the near-you slot asks for one — ‘Where do you surf?’, the button, the tick box and a ‘Browse by country instead’ escape — rather than quietly showing a popular list under a heading that says ‘Near you’. On an installation with no forecast ingested at all, the page says so plainly instead of showing a screen of blanks. When the latest model run is in but no spot has been rated yet — when a release could not work the ratings out before it started, until the hourly job does — the page says ‘Forecasts are being prepared’ and keeps its lists under that notice, each spot by name and distance and marked ‘forecast being prepared’.
On a first visit — before you have shared a location and while you follow no spots — the page opens on the Burning Swell badge instead: one line, the ‘Use my location’ button with its ‘Always use my location’ tick box, a link to browse places by continent, and, if you are signed out, a ‘Sign in’ link, a search field that suggests spots and places as you type and, without JavaScript, opens the search results page (the header carries no second one on this page), and one line that says what this is: how many spots in how many countries, and how long ago the forecast was updated. The popular spots are listed underneath, a page at a time like every list — each drawn as the near-you row, with its flag, its region and country, its stars and the current swell beside it, and ranked by conditions — and under them the continents with the number of spots each holds and the most catalogued countries with their flags, every one opening its own page, so you can get to your coast in one tap without sharing a position. On a tablet or a desktop the continents and the countries sit beside the list. The badge steps aside the moment there is a break to name — once a location or a followed spot gives the page something rated to open on, whether or not you are signed in. When nothing can be rated, the badge stays: the page will not put a name in that sentence it cannot stand behind. The small sun-and-wave mark from the same badge sits before the name in the header of every page.
Browsing and searching spots
The spot directory, /spots, is the place to start when you
want the best surf near you, or anywhere. It lists the public spots
ranked by their conditions, the best first.
The heading says what is listed. Once you have shared your position it is the region you are in, country first — ‘Spain · Bizkaia’ — or, when you are outside every region’s boundary, the region of the nearest spot within 50 kilometres. Otherwise it is ‘All spots’, the whole catalogue. The line under the heading counts the spots and says what they are ranked for: ‘23 spots · ranked by conditions right now’.
‘Near me’, beside the heading, switches between the two. It is pressed while the list is your region: press it to list every spot, and press it again to return to your region. Before you have shared a position the page says ‘Allow location to rank these by distance. You choose whether it is remembered.’, and pressing ‘Near me’ asks your browser where you are. The page asks only then, never on its own. While the browser looks, a line under that sentence says so, and if no position comes back the same line says why, as on the home page. Say yes and the list re-ranks for your region in place. The position is remembered in your browser alone, as the home page remembers it (see The home page); it is never kept on our side, never rounded and never put in the address. Under the ‘Never’ location choice the button does not ask.
The ‘Best on’ row above the list ranks the spots for a day of your choosing. ‘Now’ ranks each spot by its conditions right now; the nine days after today are named by their weekday (‘Tu’, ‘We’, …), so you can see where to be on Saturday. The last three sit past a dashed line, in lighter type and with their dates (‘Fr 29’): that far ahead the forecast is an outlook, and the count line says so, ‘ranked for Fri 29 · ≈ outlook’. A day is a calendar day where the spots are — in the region’s own time zone, or in UTC when the list is every spot or a region that spans time zones — and each spot is ranked on its own forecast for that day.
Each spot is one row: its flag and name, its stars and verdict, its region and country, the air and sea temperatures, the swell and the wind, and, once you have shared your position, how far away it is. The sea temperature is the latest satellite analysis (see Sea temperature). Click a row to open the spot. From a tablet up the rows run in two columns, the best down the first column and on down the second. See Forecasts and Spots, for what these figures mean.
The sort menu reorders the list: ‘Best now’, the default, ‘Distance’, offered once you have shared a position, and ‘Name’. Beside it, ‘List’ and ‘Map’ switch between this list and the forecast map (see The forecast map); the map is not told your position.
Filters narrow the list. On a desktop they are the ‘Filters’ card beside the list, on a tablet the same card above it, and on a phone the ‘Break type’, ‘Level’ and conditions menus in the row above the list. Each value is a toggle: press it to apply it, press it again to remove it. Values of one group admit a spot that has any of them; filters of different groups all apply at once.
- Break type
‘Beach’, ‘Reef’, ‘Point’ and ‘Rivermouth’. A spot passes only when the catalogue records its break type, so a spot with none passes no break filter.
- The conditions
‘Offshore’ and ‘Glassy’ read the wind, as the wind badge on each row names it; ‘Over 1 m’ keeps the spots whose swell is at least a metre (‘Over 3 ft’ under the imperial and UK units); ‘Good or better’ keeps the spots rated good or epic. They read the day the list is ranked for: the group is headed ‘Right now’ under ‘Now’, and ‘On Saturday’ when Saturday is the day picked on the ‘Best on’ row, so the filter and the ranking always describe the same forecast.
- Level
‘Beginner’, ‘Intermediate’, ‘Advanced’ and ‘Expert’. A spot’s level is derived from the wave sizes the catalogue records for it and the bottom it breaks over — a reef or a rock bottom, or waves that start big, make it advanced or expert — and a spot where the rule is wrong carries a curated level instead: Mundaka is expert. A spot with neither sizes nor a bottom has no level and passes no level filter.
- Distance
Once you have shared your position, a slider keeps the spots within 10, 25, 50, 100 or 200 kilometres of you. Without a position it is not offered. Distance is measured from your position; it is never put in the address, only the radius is.
- Data
‘Has a wave forecast’, on the desktop card, keeps the spots whose forecast carries a wave height for the day.
Each applied value shows as a pressed chip above the list with a ‘×’: press the chip to remove that value, or ‘Clear’ to remove every filter. The count line then says what the filters left: ‘4 of 23 spots · ranked by conditions right now’. A phone offers no distance slider and no ‘Has a wave forecast’, but an address carrying either applies it and shows its chip, so you can remove it.
When the filters leave no spot, the page says which one emptied the list — ‘No spot in Bizkaia is glassy right now’ — names the spot that came nearest, taken from the forecast the list was ranked on — ‘The lightest wind is at Bakio, offshore at 10 km/h.’ — and offers ‘Drop “Glassy”’, which removes that filter. Picking another day on the ‘Best on’ row is the other way out. A break type, a level or ‘Has a wave forecast’ has no nearest spot, so the page names the filter alone; when no single filter empties the list, it says ‘No spot in Bizkaia matches these filters’.
A page is a screenful: seven spots on a phone, fourteen on a tablet and sixteen on a desktop, and sixteen without JavaScript. Turn the phone or resize the window and the page is refilled at the new size, starting from the spot you had reached. The pager under the list numbers the pages between ‘Previous’ and ‘Next’, and says which spots you are looking at: ‘Spots 1–16 of 4,033’. On a phone a long list numbers the first and the last page and the three around the one you are on: ‘1 2 3 … 577’. While a day is being ranked, grey placeholder rows stand in for the list; while a page loads, the list dims.
To browse rather than rank, the four countries with the most spots are listed with their counts, each opening that country’s page, and ‘All countries’ opens the continents (see Browsing by place). On a tablet they are the ‘Browse by country’ row under the list; on a desktop, the ‘Browse’ card beside it; on a phone, the ‘Country’ menu above it.
The list’s state is part of the address, so it can be bookmarked and
sent: /spots?day=yyyy-mm-dd ranks for that day,
scope=all lists every spot even when you have shared a position,
break=beach,river, wind=offshore,glassy, over=1,
good=1, level=level,…, within=km
and covered=1 apply the filters, sort=distance or
sort=name sets the order, and page=n names the
page. A value the page does not know is ignored. The address never
carries your position.
The list has no button to follow a spot. You follow a spot from its own page, with ‘☆ Favourite’ (see What you can do on a spot page), and the spots you follow lead the home page.
If the site has no spot catalogue to read, the page says ‘The spot catalogue is unavailable’ rather than failing.
There are two ways to search. A box in the page header offers a quick jump: begin typing and the places and spots that match drop down for you to pick. You can type where a spot is as well as what it is called — ‘indonesia’ or ‘bizkaia’ finds the spots on that coast.
The dropdown answers in two groups, places first. Under ‘Regions & countries · n’ come the regions and countries whose names match, each with its flag, its country (for a region) and how many spots it holds — ‘Asturias’, ‘Spain · 42 spots’ — and ‘Browse’ at the end of the row. They are places to browse rather than spots to open: each opens that place’s own page (see Browsing by place). A place is only ever offered when it holds spots and has a page of its own, so a browse target never leads to an empty page or to a dead address. Under ‘Spots · n’ come the spots. In both headings n is how many match in all, not how many the dropdown lists: ‘Spots · 42’ over eight rows means 34 more wait on the search page.
Each spot row leads with its country’s flag and names the spot, then its region and country and, when the catalogue records it, its break type: ‘Mundaka’, ‘Bizkaia, Spain · rivermouth’. The letters that matched are marked — in the name, or in the place line when the spot was found by its region or country, so a row always shows why it is in the list. The rows carry catalogue facts only; for the surf at a spot, open it.
A name matches word by word: the start of the name, the start of any later word of it, or — from three letters on — a word close to what you typed. ‘mun’ finds Mundaka and Munielles, and Playa Munielles and Santa Monica Municipal Pier too. The region and the country match the same way. One or two letters match only the start of a name, a region or a country. Accents and capitals do not matter: ‘nazare’ finds Nazaré and ‘cote’ finds Côte Bleue and the spots in Côte d’Ivoire.
Along the foot of the dropdown, ‘All n results’ opens the search page on what you typed, with every match (on a phone the button reads ‘See all n results’).
Put the cursor in the box before typing anything and it offers a way in rather than nothing: shortcuts to the spots near you and to browsing by country.
It does not remember what you search for unless you ask it to. At the foot of that panel, under ‘Search history’, is ‘Remember recent searches’; until you choose it nothing you type is written down anywhere, and the row says as much. Choose it and the last five searches you acted on collect at the top of the same panel, ready to run again with one keystroke. They are remembered by your browser alone — never sent to us, never tied to an account, never off the machine — so there is nothing to sign in to, and nothing that follows you to another computer.
The same row turns it back off, and turning it off deletes the searches already kept rather than merely stopping new ones; the row says so before you choose it. ‘Clear recent searches’ empties the list without changing the answer, for when you want to keep the feature but not that particular list. Both are worth knowing on a shared computer, which is why the default is to remember nothing at all.
If a search matches nothing at all, the panel says ‘No spots match’ and may name the closest spot it can find — ‘Did you mean …?’ — and following it runs that search for you. It stays quiet unless one name is clearly nearer than the rest, so no answer is better than a confident wrong one. Most misspellings never get that far: the ordinary search is already forgiving enough to find ‘Mundaka’ from ‘mundakka’.
If the connection drops while you are searching, the panel says so rather than sitting there looking busy: ‘Search is offline’ and ‘The live connection dropped.’ Whatever had already arrived stays on screen, and the notice says so; ‘Retry’ beside it sends the search again, and so does typing. Emptying the box swaps the panel for the shortcuts, which are already on the page and work with no connection at all — as do your recent searches, if you have turned them on.
On a phone the header carries a search button rather than a box. It opens the search over the whole screen between the header and the tab bar: a ‘Search’ heading with a button to close it, the box with a button that clears it, and the answer filling the screen below, ending in ‘See all n results’. If you have agreed to keep recent searches, they wait under the box as a row of buttons, one tap each to run again. ESC closes the search as well. Without JavaScript the button opens the search page instead.
You need never reach for the mouse. On a tablet or a desktop / puts the cursor in the header’s box from anywhere on the page that is not itself a field; on your first visit to the home page, whose header has no box, it puts the cursor in the box under the welcome. With the cursor in the box, DOWN and UP move through the answer, RET opens whatever is highlighted, and ESC dismisses the dropdown. The panel draws the keys along its bottom edge so you do not have to guess — ‘↑ ↓ to move · ↵ to open’ on a tablet, with ‘· esc to close’ added on a desktop. The same keys drive the shortcuts, the recent searches and the spelling suggestion — every row in the panel is reachable from the keyboard. The arrows run through both groups as one list, carrying on from the last region or country into the spots beneath it, and they wrap around at either end. Because the cursor never leaves the box you can keep typing to narrow the answer at any point — and since each keystroke fetches a fresh list, the highlight starts over rather than staying on a row that has since become a different spot. A screen reader is told the same things: the box announces itself as a combobox, each hit is read out with its position and the name of the group it belongs to, and the key hints are announced when the box takes focus.
The results page, /spots/search, answers a search with every spot
it finds, a page at a time. The search field on the home page leads
there when you submit it instead of picking a suggestion, and so does
the search box at the top of the spot directory on a phone when
JavaScript is off. In the header,
RET opens the highlighted suggestion; with none highlighted it opens
this page on what you typed, except on the pages still drawn with the
older header, where it does nothing. On the results page the header’s
box is the page’s own: typing in it changes the results in place. On a
phone the page draws its box under the breadcrumb.
The page searches the whole catalogue for spot names, region names and country names that contain what you typed — ‘mun’ finds Mundaka and Santa Monica Municipal Pier alike — with accents and capitals ignored, and marks the part that matched. One or two letters match only the start of a name. The heading counts the spots that matched, ‘4 spots match “mun”’, and a line under it says what was searched.
The best match comes first: a spot whose name starts with what you typed, then one whose name contains it, then a spot found through its region or country; among equals the better conditions now, and a spot with no rating after every rated one. The sort menu beside the results reorders them by conditions alone (‘Best now’), by name, or — once you have shared your position on the home page or with ‘Near me’ in the spot directory — by distance.
Each spot is the row the spot directory draws: its flag and name, its stars and verdict for today in the spot’s own time zone, its region and country, the air and sea temperatures, the swell and the wind. A spot the wave model does not reach says ‘listed, never scored’ and draws no reading. While no spot has been rated yet — when a release could not work the ratings out before it started, until the hourly job does — every spot says ‘forecast being prepared’ instead. A new model run does not bring it back: the spots keep the ratings of the run before until the new ones are in. From a tablet up the rows run in two columns, the best down the first column and on down the second.
When what you typed names a region or a country, the page offers it first, as a place to browse with its number of spots — ‘Asturias · Spain · 42 spots’ — and the line under the heading says the list is every spot in it. When it names none, the page says so in one line after the spots, so you know regions and countries were searched.
The results can be narrowed: by country (each with the number of results in it), by break type, and to the spots with a wave forecast. On a desktop the controls stand in a column beside the results, with ‘Clear’ to drop them all and a count of what matched; on a tablet and a phone they are a row of menus above the list.
When nothing matches, the page says so and, when one name in the catalogue is clearly close to what you typed, offers a search for it: ‘mundakka’ finds nothing, and the page offers ‘Search for “Mundaka”’.
The search is part of the address: /spots/search?q=text
opens the page on the matches for text, country=es,fr,
break=reef, covered=1 and sort=name carry the
choices above, and page=n the nth page of 24, so a
search can be bookmarked and sent to somebody else. The address never
carries your position. Changing the text as you type keeps the other
choices and starts again at the first page.
Comparing spots
Compare, /compare, sets two or three spots side by side
over the next 48 hours and names the one hour to go. It is reached
from ‘Compare’ in the footer’s ‘Forecast’ column and in the
‘More’ sheet.
The address is the whole state of the page:
/compare?spots=mundaka,sopelana pins Mundaka and Sopelana, in
that order, and a compare is a link you can bookmark or send as it is.
The spots are named by the last part of their own page’s address. A
repeat is dropped, only the first three names left are read, and a
fourth and any after it are dropped; of those three, a name that is not
a public spot is dropped too, and no later name takes its place. The page then moves to the
address that is left, so the address always shows what is pinned:
/compare?spots=mundaka,mundaka,nowhere becomes
/compare?spots=mundaka. The address never carries your
position.
The pinned spots are drawn as chips, under the page’s trail, ‘Spots / Compare’, on a phone and between the band and the lanes from a tablet. Each chip is a link to the same compare without that spot.
The sentence at the top names the pick: the spot and the hour of the next 48 hours with the highest rating, as ‘Mundaka, Thursday at 08:00.’ The hour is the picked spot’s own local time. Only daylight hours count, every three hours on the models’ grid (00:00, 03:00, 06:00 UTC and so on), and each spot only while its own sun is up. A spot that is not rated, because its swell window has not been surveyed, or that has no forecast is never picked; when none of the pinned spots is rated the page names no hour. Two spots can rate the same at their best: once you have shared your position the nearer one wins, and otherwise the one pinned first. Within one spot the earlier of two equal hours wins.
The band
The band at the top says the pick in words. Its first line reads ‘Of your three · next 48 hours’; on a desktop it adds the time now, as ‘· Sunday 02:31 CEST’, and when every pinned spot keeps the same clock that is the one place the zone is named. Under the pick’s title comes one sentence of conditions, assembled from the numbers the page shows and nothing else: the height at the period, the wind as its badge says it, and the next low or high tide after the picked hour when the spot has a tide curve, as ‘1.9 m at 13 s, offshore 8 km/h, low tide 11:20.’ From a tablet it adds ‘The best hour any of the three gets in the next 48 hours’ when the picked hour is the overall pick, with ‘, and the models agree’ only when two or more models report at that hour and agree closely. Then at most one clause about the runner-up, the next spot in the lanes’ order:
- ‘Galizano is not rated: its swell window has not been surveyed, so only its size is shown.’ when it has no rating;
- ‘Sopelana holds longer.’ when it stays good at least an hour past the pick;
- ‘Sopelana is bigger on the same swell.’ (or ‘smaller’) when its height differs by 0.3 m or more on a swell from within 22.5° of the pick’s.
Otherwise the band says nothing about the other spots. Under the sentence come the pick’s stars and word, and the distance to it once you have shared your position; from a tablet two buttons follow, ‘Open ‹spot›’ and ‘Share this compare’, and beside the text one card per pinned spot at the picked hour — the time in that spot’s own zone, its stars, height, period, direction and wind — the pick first, on a desktop with ‘· your pick’, then by rating, a spot that is not rated last.
The chips name how many of the three places are used: ‘2 of 3 · one slot free’ or ‘3 of 3 · remove one to pin another’ (on a phone ‘2 of 3’, ‘3 of 3’).
Hour by hour
‘Hour by hour’ draws the next 48 hours as one lane per spot on a shared axis. The axis is the daylight hours of any pinned spot, every three hours, headed by the days and printed in the first spot’s local hours; when the spots keep different clocks each lane names its own zone (‘CEST’, ‘WEST’, ‘PDT’) and the axis says whose hours it shows. A lane is its spot’s name (from a tablet with the distance and the break type, on a desktop with the region too), its best hour in its own local time with its stars, as ‘best Thu 08’, and one cell per hour. A cell’s colour is its rating — epic, good, fair or poor, stated once in the legend under the lanes — and its number the wave height in the units you chose. A spot that is not rated reads ‘not rated · height only’ and draws neutral dashed cells, and the legend adds ‘A spot without a surveyed swell window gets no rating, so its lane shows the size and nothing else.’; a spot with no forecast reads ‘no forecast’ and draws dashes; a cell at an hour when it is dark at that spot draws a dot. Lanes are ordered by their best rating, the unrated ones and then those without a forecast last. Each lane’s best hour is ringed, the picked hour framed in amber across every lane, and a dashed line marks now.
Every cell is a link: tap or click one to pick that hour. The band and
the picked hour below re-render in place and the frame moves; the address
does not change. Without scripting the cell opens the same page with
&at= and that hour picked, as /compare?spots=mundaka,sopelana&at=2026-09-24T06%3A00Z.
The pick at a chosen hour is the spot rated highest then, with the same
tie rules.
The picked hour
Under the lanes the picked hour unfolds, headed by its time in the picked spot’s zone and the pick’s next tide turn and wind. On a phone and a tablet it is one row per spot: the name, the distance and break type and stars (or ‘not rated’), the wind badge, and the height over the period and direction. On a desktop it is a table, ‘‹Day› HH:MM · side by side’, with one column per spot and these rows:
- ‘Rating’
the stars at that hour;
- ‘Wave’
the height;
- ‘Period · from’
the period and the direction the swell comes from;
- ‘Wind’
the wind badge;
- ‘Stays good until’
the first hour after the pick at which the spot drops below good, in its own local time, with ‘, then cross’ when the wind changes there; ‘beyond ‹Day› ‹hour›’ when it stays good to the end of the forecast, and ‘—’ when it is not good at the picked hour;
- ‘Tide’
where the tide runs next, as ‘falling to low at 11:20’, and ‘; wants it low’ when the spot’s best tide has been surveyed;
- ‘Models agree’
the agreement and how many of the models reported, as ‘high · 2 of 2’; the row appears only when two or more models report for some spot.
The best value of Rating, Wave, Period, Wind and Stays good until is underlined: the most stars, the largest wave, the longest period, the offshore or glassy wind before cross-shore before onshore and then the lighter, the latest close. A tie or a missing value underlines nothing.
Right now and the link
Right now keeps the page honest about the present when the pick is tomorrow. On a phone it is one line, ‘Right now Mundaka is good until about 11:00’ for the spot best now while it is good or better, then each other spot and its rating; on a tablet and a desktop it is a card, ‘Right now · ‹Day› HH:MM ‹zone›’, with one row per spot — ‘closes ‹time›’ while it is good or better, after its height on a desktop, and its stars — and ‘Map →’, which opens the map on the same spots.
‘Share this compare’ copies the page’s address, without the picked hour, to the clipboard. On a desktop the rail also holds ‘This compare is a link’, the address in a field you can select and a ‘Copy link’ button that copies the same address, and ‘How the pick is made’, which states the rule above and, once you have shared your position, that ties go to the nearer spot.
Without a shared position every distance is left out — in the band, the lanes, the rows, the suggestions and the search — and the legend under the lanes adds ‘Distances are missing because location was not shared; the pick still stands.’
Adding a spot
While a slot is free the last lane is a dashed one, ‘+ Add a third lane’ (‘+ Add a second lane’ with one spot pinned, ‘+ Add a spot’ with none), holding chips that suggest what to pin. Each chip is a link to the same compare with that spot added at the end, so it works without scripting. The chips are, in order: the spots near you, best first, once you have shared your position; then the spots you follow, marked ‘yours’; then the spots whose page you opened lately while signed in, as ‘viewed yesterday’. A spot already pinned is never suggested. Each chip carries the stars of its best hour in the next 48 daylight hours and that hour in the spot’s own time, as ‘best Thu 08’ — the same stars its lane shows once it is pinned — then the distance and break type for a spot near you. Four are offered with a spot pinned, five with none; the hint beside the lane’s head says what they are, and with neither a position nor an account the lane offers only the search, ‘Search any spot to pin it here.’
The last chip, ‘Search any spot’, opens the site’s search in an adding mode: on a phone and a tablet as a sheet from the bottom of the screen, ‘Add a third lane · 1 slot left’; on a desktop as a dropdown under the chips. It lists spots only, headed ‘Spots · n matches · nearest first’ once you have shared your position and ‘best match’ otherwise, each with its region, country, distance and break type, and its height and stars now. A spot already pinned is listed as ‘pinned’ and cannot be chosen. Choosing a spot opens the compare with it added; Esc or a tap outside the sheet closes the search. Without scripting the chip is a link to the search results page. While a slot is free the page’s header carries no search field of its own: the add lane’s is the page’s one search.
Nothing pinned, or one spot
With nothing pinned the page shows the trail, ‘Nothing pinned yet · up to 3 spots’, the axis of the next 48 hours in UTC (no spot, so no spot’s clock), the lane ‘+ Add a spot’ with its suggestions and the sentence ‘Pin two or three spots and the page lines them up on this axis, names the best hour any of them reaches, and unfolds it below.’ There is no band, picked hour or Right now. With one spot pinned the page draws its lane and ‘+ Add a second lane’, the chips read ‘1 of 3’, and again there is no band, picked hour or Right now: one spot has nothing to be weighed against.
Browsing by place
Search is for when you know what you are looking for. When you do not — when you are planning a trip, or you are 900 kilometres from the water and just want to see what a coast holds — the catalogue is also browsable as the hierarchy it is: continent, country, region, spot.
A few words recur on every one of these pages:
- good or better
A spot’s day is good or better when the forecast rates it good or epic. The pages count spots this way; they never rate a place.
- week board
The week board is a table with a row per region and a column per day. A figure in a cell counts the region’s spots that are good or better that day, and the cell’s colour is the best grade any of them reaches — epic, good, fair or poor. A coloured cell with no figure had nothing good or better, and its colour is still the best it got; a dash means there is no forecast for that day. The days are each region’s own, so a region on the other side of the world starts on its own today.
- outlook seam
The outlook seam is the dashed line past which a board or a day row shows its last three days, in quieter type: that far ahead the forecast is an outlook (see Browsing and searching spots).
- facing
A region’s facing is the way its coast faces — N, NW, SW and so on — averaged from the bearings of its spots.
- every way
A region whose spots face in directions that disagree too much for an average to mean anything, as on an island, faces every way.
Start at ‘/continents’, headed ‘Places’: the line under the heading counts every spot in the catalogue and the countries and regions that hold them. Below it is the world, with one dot for each region holding a spot, coloured by the best that region reaches in the next seven days — epic, good, fair or poor, as the key under the map says. A region with no forecast for the week is an empty ring rather than a colour.
In a browser that can draw it, the map is the full map’s own, standing still: the same warm land and white coastline, with each region a light disc ringed in its best spot’s colour, and under the rings the forecast wave height on the sea, in the colours of the full map’s Waves layer. It shows one moment: on Places and on a continent, the forecast step at which the place’s spots see their biggest waves of the week; on a country, the step of the chosen day’s biggest; on a region, now. The key under the map, a bar of the colours from 0 to 7 m (feet under the imperial units), names that moment. The colours are the swell at that one step, not the largest each patch of sea reaches over the week. Nothing on it moves. Play on the map opens the full map on the place, on its Waves layer and at the moment the panel shows, and plays the forecast from there. Without WebGL the panel is a plain drawing of the place’s land and dots, and has no key.
Good this week is a week board of the eight regions anywhere with the most spots good or better in the next seven days, each with its country and how many spots it holds, and a column for each of the seven days. A cell leads to the region’s page for that day. When fewer than eight regions have a good day the board lists the ones that do and says how many.
Continents is a table of every continent holding a spot, the largest first, with how many countries, regions and spots each holds; each name leads to the continent’s page. Under it, ‘All n countries’ and ‘All n regions’ open the two full indexes, each naming the catalogue’s own count.
On a phone and a tablet the map, the board and the continents follow one another down the page; on a wide screen the map spans the window and the board and the continents stand side by side beneath it.
From there each level is a page of its own:
- A continent
Above the heading is the way back, ‘Places › Europe’; the heading carries the continent’s outline and name, and the line under it counts the continent’s spots and the countries and regions that hold them. The map is the continent’s own coasts with one dot for each of its regions holding a spot, coloured by the best it reaches this week as on the world map. A region belongs to its country’s continent wherever it lies, so France’s Réunion is one of Europe’s regions: it counts, and it can be on the board, but it sits off the drawing, which is cropped to the continent itself.
Good this week in Europe is the world board for the continent: its eight regions with the most spots good or better in the next seven days, read and drawn exactly as on ‘/continents’.
Countries lists the continent’s countries holding a spot, A to Z, each with its flag, its regions and its spots. A phone shows twelve at a time with a pager under them and a line such as ‘Countries 1--12 of 22’; a tablet or a wide screen shows them all in two columns. The page you are on is in the address, ‘?page=2’, so it can be bookmarked or sent. The button under the list opens the continent’s regions on ‘/regions’. Other continents is the table of the rest.
- A country
Above the heading is the way back, ‘Places › Europe › Spain’; the heading carries the country’s flag and name, and the line under it counts its spots and the regions that hold them: ‘425 spots in 22 regions.’ A country whose spots are not yet in any region says so instead: ‘14 spots, not yet in a region.’ No country is rated: a country is too big to share one forecast.
The map is the country’s own land with one dot for each of its regions, larger for a region holding more spots and coloured by the best that region reaches on the chosen day. Land far from the rest, such as Spain’s Canaries, is drawn in a small framed inset in a corner of the map. Each region is a disc holding the number of its spots rated good or better on the chosen day, ringed in the best of them; where two discs would touch, the region lower in the ‘Best this week’ order shrinks to a ring without its number, and so does a region with nothing good that day. Under the discs is the wave height at the step of that day’s biggest waves, as on Places above. Play on the map takes you to the full map over the country.
This week in Spain is the country’s week board: one row per region holding a spot, with its spots and its facing, and a column for each day, the seven days ahead and, on a tablet or a wide screen, three more past the outlook seam. A cell leads to the region’s page for that day. Each day heading is also a button: pressing it redraws the map’s discs for that day, without loading anything but that day’s wave height.
Three buttons order the regions: ‘Best this week’, the default, by the best rating any of the region’s spots reaches in the next seven days; ‘Most spots’; and ‘A–Z’. A phone shows ten regions at a time, with a pager under the board and a line such as ‘Regions 1--10 of 22’; a tablet or a wide screen shows them all. A country of a single region says how many spots it holds, ‘9 spots in 1 region’, and draws no order buttons.
Best right now in Spain lists the country’s three highest-rated spots at the current hour, each naming its region, and says the hour in UTC. When nothing in the country is rated right now the section is not drawn.
Next door is a table of the countries whose land touches this one’s and that hold a spot, the one with the most spots first, each with its flag, its regions and its spots. An island borders nothing, and then the section is not drawn at all.
Under the board, a link such as ‘Not in a region yet — 14 spots’ opens the spots we know the country of but have not placed in a region: they sit further from every mapped region boundary than we are willing to guess across, so they are listed rather than filed under a region they may not belong to. They are part of the country’s count either way, and the list pages on its own, six spots at a time.
- A region
Above the heading is the way back, ‘Places › Europe › Spain › Bizkaia’; the heading is the region’s name alone — no flag and no rating, since a region is a stretch of coast and not a forecast of its own. The sentence under it says what the region holds: how many spots, in which country (a link to the country’s page), its facing (or ‘every way’), and how many of each kind of break; a region none of whose spots has a bearing says nothing about its facing. A spot whose kind of break is not recorded is not counted in the list of kinds.
The map is the region’s own land with one dot for each of its spots, coloured by that spot’s rating right now — epic, good, fair or poor, as the key under it says — and an empty ring for a spot nothing can rate. Under the dots is the wave height offshore now; at this scale a region’s coast is one or two cells of the wave model, so the sea along the shore takes the colour of the swell beyond it. Play on the map takes you to the full map over the region. A region none of whose spots has a position draws no map.
Along the coast is the region’s week board, read like the others (see Browsing by place): a row for this region and one for the nearest region holding a spot on either side of it along the coast, west to east or north to south, each named for its side — ‘to the west’, ‘this region’, ‘to the east’. A region whose only neighbour lies on one side shows two rows, and an island, or a region whose nearest neighbour lies too far along the coast, shows its own row alone. A phone and a tablet show the seven days ahead; a wide screen adds three outlook days past the outlook seam. A cell leads to that region’s page for that day.
Spots lists every spot in the region, ranked over the whole region by its conditions right now, best first, then the ones nothing can rate yet. The ‘Best on’ row above the list ranks them for another day instead, as the spots directory’s row does (see Browsing and searching spots); a region of one spot has no such row. The list comes seven spots at a time on a phone, fourteen in two columns on a tablet and sixteen on a wider screen, with the page links and a line such as ‘Spots 1--16 of 23’ beneath. The day and the page are in the address,
/regions/es-bizkaia?day=2026-10-06&page=2, so every state of the list can be bookmarked or sent. Where you have shared your position each spot also says how far away it is; the position stays out of the address. ‘Filter in the directory’ opens the spots directory, where the list can be narrowed by break, wind and size.On the development database ‘/regions/es-bizkaia’ reads ‘23 spots in Spain, on a coast that faces north: 11 beach breaks, 5 points, 4 rivermouths and 3 reefs.’; its coast board lists Cantabria to the west, Bizkaia and Gipuzkoa to the east; and its list opens on ‘23 spots · ranked by conditions right now’, Mundaka first.
‘/countries’ is every country holding a catalogued spot, A to Z, each with its flag, its continent beneath its name, and how many regions and spots it holds. The line under the title counts the countries and the spots they hold between them, whatever you narrow the list to.
A row of continent tabs sits above the list: ‘All’, then each continent that holds a country, the one holding the most first, each with its icon. A tab narrows the list to that continent and starts it again at its first page. Beside the tabs — above them on a phone — is the find field: type part of a country’s name and the list narrows as you type, accents and capitals folded, within the continent the tabs are on. Without scripting it is an ordinary search: type and press RET. The line under the list’s title says what you are looking at — ‘101 countries, A--Z’, ‘10 countries in Oceania, A--Z’, ‘1 of 101 countries’, ‘1 of 10 countries in Oceania’ — and a find that leaves nothing says ‘No country matches’ inside the list, pointing you at the search at the top of the page, which also looks through spots and regions. The index ranks nothing and rates nothing: it is the catalogue’s own list.
The list comes a screenful at a time: twelve countries on a phone, thirty
in two columns on a tablet, thirty-six in three on a wider screen, with
the page links and the count (‘Countries 1--36 of 101’) beneath.
The continent, the find and the page are all in the address, together
— /countries?continent=europe&q=port&page=2 — so every state
of the list can be bookmarked, sent to somebody, reloaded or reached with
the browser’s Back button, and every tab and page link works with
scripting switched off.
‘/regions’ is every region holding a catalogued spot, by country and then by name, each with its country and flag beneath its name, the way its coast faces and how many spots it holds. The line under the title counts the regions and the spots they hold between them, whatever you narrow the list to.
The Faces column is the region’s facing, or ‘every way’; where none of its spots has a bearing, it shows a dash.
The continent tabs and the find work as on ‘/countries’, with one difference: the find matches a region’s name or its country’s, so ‘spain’ lists Spain’s regions. The line under the list’s title says what you are looking at — ‘561 regions, by country’, ‘1 of 561 regions’, ‘203 regions in Europe, by country’, or both narrowings at once — and a find that leaves nothing says ‘No region matches’ inside the list. The list comes a screenful at a time: ten regions on a phone, twenty-four in two columns on a tablet, thirty-six in three on a wider screen. A country may run across two pages; its name on each row’s second line keeps the list readable. As on the country index, the continent, the find and the page are all in the address, together.
A country is marked by its flag wherever a list crosses countries and wherever a page’s own subject is a country. The country index and the country rows on a continent’s page carry it inline before the name; the region index and the board of the eight best carry it before the country’s name on each row’s second line; a country page carries it beside the title, and its Next door rows before each name. A region page carries none: its sentence names the country in words. It is decoration beside a name that is already printed, so a screen reader passes over it rather than saying the country twice. Every country in the catalogue has its own flag; a place we have no flag for shows none — never a broken image, and never a placeholder standing in for one. The flags are the lipis/flag-icons set, used under the MIT licence.
Every page below a continent carries the trail of the places above it — continent, country, region — so you can walk back up as easily as down. The two indexes open their trail at ‘Places’ (‘Places › Countries’, ‘Places › Regions’); the ‘Places’ page itself carries none, and the header’s ‘Places’ link opens it. Every list is a page of ordinary links: they work with JavaScript turned off, they can be bookmarked, and they can be sent to somebody else.
Those addresses are worth knowing, because they are short enough to type and stable enough to keep:
| Address | Parameters | Page |
|---|---|---|
/continents | none | The world map, the week’s best regions and every continent. |
/continents/name | page | One continent: its map, its best regions and its countries. |
/countries | continent, q, page | Every country holding a surf spot. |
/countries/name | sort, page, bucket | One country: its regions, day by day. |
/regions | continent, q, page | Every surf region, by country. |
/regions/name | day, page | One region: its coast and its spots. |
continent is a continent’s name and narrows an index to it;
q is the find field’s text; page is the page of a list;
sort orders a country’s regions, best (the default),
spots or az; bucket is the page of the country’s
spots not in a region yet; day is the day a region’s spots are
ranked for, a date such as 2026-10-06. The parameters combine
— /regions?continent=oceania&q=fiji,
/countries/spain?sort=az&page=2. A parameter at its default is
left out of the address, and a value the page does not know falls back
to the default: /countries/spain?sort=sideways is
/countries/spain. A page past the end of a list shows its last
page.
name is the place’s own name in lower case, with accents folded to plain letters and everything that is not a letter or a digit collapsed to a single hyphen. A region carries its country’s two-letter code in front, because region names repeat around the world. Three addresses, one of each kind:
/continents/south-america
/countries/portugal
/regions/es-asturias
You do not have to remember the rule: following a link or a search result gets you there.
Note
A typed address that names no place answers ‘not found’ rather than guessing at a near miss.
The trail runs onto the spot page too, which closes the chain: open a spot from anywhere at all — a search, a bookmark, a link a friend sent — and its continent, country and region are named above it, each one a link. A level that does not apply is left out rather than shown empty: a spot we know the country of but have not placed in a region shows continent, country and then the spot, with no gap and no placeholder where the region would be.
Where there is no forecast, the pages say so rather than filling in. A board’s cell with no forecast is a dash, and a map’s dot for a place with no forecast is an empty ring. A zero would read as flat water, which is a claim about the sea; a dash reads as an absence, which is the truth. For the same reason a spot we cannot rate is never given a band. It is not dropped and it is not sent to the bottom as though it had scored badly: it is listed after every rated break on the page, visibly unrated. Last because nothing is known about it, which is a different statement from last because it is poor.
Each page says what it has when it has less than a full week:
- An empty board
When no region has a spot good or better in the next seven days, the board of the eight best on ‘/continents’ or on a continent’s page says ‘Nothing good this week’. A country’s and a region’s board list their rows whatever the week holds.
- Before the run lands
Before the week’s forecast has landed the board of the eight best says ‘The week isn't forecast yet’ rather than guessing an order; a country’s or a region’s board still lists its rows, every cell a dash, and says so under the table, and a region’s list still names every spot and says the forecast is being prepared. The page fills in by itself when the forecast lands.
- Nothing matches
A find that leaves nothing says ‘No country matches’ or ‘No region matches’ inside the list.
- An unknown place
An address that names no place answers ‘not found’: ‘No continent called … on Places’, ‘No country called …’ or ‘No region at that address’, with a button back to every place. When a region’s address begins with a country’s code, as ‘es-’ does, the page points to that country’s regions instead. A country that exists but holds no spot answers with its heading and ‘No surf spots in …’; a region holding no spot answers with its heading, ‘0 spots in Spain.’, and ‘No spots in this region yet’.
- The page that cannot be read
When the catalogue does not answer, a place page says ‘Places can't be read right now’ and offers ‘Try again’; nothing is missing, and the page answers again a minute later.
The forecast map
The map page plots spots on an interactive map and can drape a forecast field — significant wave height, for example — across the water as a coloured overlay that steps through the coming forecast hours. Pan and zoom to range along a coast, and select a spot to jump to its page.
The map fills the screen, laid out the way a maps app lays out a map, and the page does not scroll. From a tablet up the site header sits on top, with Map marked as the page you are on, and the map runs to the bottom edge; on a phone the map runs from the top edge to the tab bar. There is no footer under it. Every control floats over the map in one of four places: the search panel at the top left, the layer menu beside it, the zoom buttons and Locate at the top right (Locate alone on a phone, where a pinch zooms), and the transport along the foot — play, the speed, the time track, the hour and the colour key. One quiet line above the transport credits the map’s sources, OpenStreetMap, Protomaps and the wave model, with the language menu beside them; on a phone the small ⓘ above the sheet opens the same line.
The search panel is a pill: the site’s search, and from a tablet up a button naming how many spots are in view (‘23 in view’). The button opens the panel downward on the spots in view, best first; a picked spot opens it on that spot, with In view to go back to the list and its neighbours listed under it, ‘Nearby, best first’. The search lists its matches under the pill as you type. The panel never covers the transport, and × or Escape closes it.
On a phone the transport is a bottom sheet, and the search box takes the header’s place, led by the Burning Swell mark as the way home. The sheet holds, from the top, the grabber, the layer and the hour, play and the track, the key, and then the content. It rests at a peek, which ends on ‘23 spots in view · best first’; tapping that line raises it to half with the spots in view. A picked spot raises it as far as the spot needs (its card), and a drag up, or the grabber, shows its neighbours. At full the list fills the screen and the transport and the key step aside. A drag down, ×, Escape or a tap on the empty map steps the sheet back down. The grabber is a button, ‘Show list’ or ‘Show map’, for anyone who cannot drag.
The map opens on where you are, when Burningswell knows it: the position you last shared on the home page, which your browser keeps until you forget it there, and never under the Never location setting. The map’s own Locate does not count: what it finds stays in the page. The position is used as it was reported, never rounded, and it does not appear in the page address — the address carries the zoom alone while you are on the map in front of you. Without a known position the map opens on El Confital, on Gran Canaria. A link naming a place opens on that place, wherever you are.
The map opens on the current forecast hour: the first hour the run offers at or after your own clock. What you see first is therefore the weather now, not the hour the run was computed for — which, for a run published this morning and read this afternoon, would be hours behind you. The forecast is published in three-hour steps, so the opening hour can be up to three hours ahead of your clock; it is never behind it. When a run is old enough that every hour it holds has already passed, the map opens on its last hour.
As you pan and zoom, the address bar follows the map. A moment after the map settles, the place and the zoom you are looking at appear in the page address, so the link sitting in your browser’s address bar is always a link to the view in front of you: copy it, send it or bookmark it, and it reopens on that stretch of coast, at that zoom, with the same layer draped. The forecast hour is not carried. A shared link opens on the current hour, the same way the map itself does — an hour written into a link goes stale as soon as a newer run no longer holds it, and a link that quietly opens on the wrong weather is worse than one that never promised an hour. Panning adds nothing to your browser history either: Back leaves the map, rather than walking you backwards through every pan you made to get there.
Locate centres the map on you and follows you as you move. Whenever the place you are standing is on the map in front of you, the address carries only the zoom, so your position never goes into a link — also after a short drag that keeps you on screen. Drag the map until you are off it and the address names the view again, because that view is not where you are. Your position stays in the page: it is not stored, and it is not sent to Burningswell. If the browser refuses, the button turns to its error colour, and once you have blocked location for the site it is greyed out as ‘Location not available’; a browser that cannot share a position at all shows no Locate button.
It also answers where it is good, not only where the spots are. Each pin is a dot coloured by the same condition band the spot’s own page prints — poor, fair, good or epic — so a coast reads at a glance. A pin’s name appears beside it when you point at it, when you reach it with the Tab key, and on the pin you picked; the names stay off the map otherwise, so a busy coast does not turn into overlapping labels. A screen reader reads every pin by its spot’s name. A break we cannot rate draws a plain, hollow pin instead: visibly not scored, which is a different statement from scored badly. Group bubbles carry no colour verdict at all, because a bubble stands for many spots and there is no single score to show for it.
Tap or click a pin and the pin card opens: the spot as every list of the site draws it — its flag and name, its stars and band, its region and country and, when the site knows where you are, how far away it is, the air and sea temperatures, the wave height, period and direction, and the wind with its speed. The card reads the spot’s own today, in its own time zone. It opens in the search panel (in the sheet on a phone), and when the panel or the sheet would cover the pin you picked, the map slides until the pin shows beside it. The pin you picked turns into an ink teardrop with the spot’s name above it, and the spot leaves the list of its neighbours under the card, so it is never shown twice. Open forecast goes through to the spot’s page at the hour the slider is on. Compare opens the compare page (see Comparing spots) with the spot on it — or, when you reached the map from the compare page’s Map link, with the spot added to the spots you were comparing; with three already there, Compare opens those three, since the page holds no more. The panel’s × or the Escape key closes the card, and so does a tap on the empty map.
The layer menu chooses which field is draped: Wave height, Peak period or Wind. These are the fields the forecast pipeline draws; there is no swell layer. Its trigger names the layer beside a swatch of its colours: beside the search from a tablet up, at the head of the sheet on a phone, where the menu opens upward over the map so the field changes visibly behind it. Each row of the menu carries the layer’s range (‘0–7 m’) and its colours, so the menu is also the legend; under the rows come the Wind flow switch, the overlay’s Strength — Soft, Medium or Full, the default — and a line naming the model and the run the layers are drawn from, ‘NOAA GFS-Wave 12Z’. A pick closes the menu, and your browser remembers the layer you last picked for the next time you open the map without one in its address. Wind shades the wind’s speed and, with Wind flow on, draws the wind as motion: thousands of fine particles drift across the map along the wind, so a front, a lee shore or a corridor of offshore breeze is something you see at a glance instead of something you infer from a colour. Direction is only ever drawn this way and never as a colour, because a direction wraps: 359deg and 1deg are neighbours, and any colour scale would put them at opposite ends. The particles follow the time slider, so scrubbing forward shows the wind field turning through the forecast. Each layer’s key updates with it, and the chosen layer stays in the page address — so a link you share, or a reload, comes back to the same map.
Wind flow is on when the map opens. Turned off, the Wind layer shades the speed alone; on the other layers it draws the moving wind over the field, where the map can draw both.
The map opens paused. Rather than dragging the slider, press the round play button: the forecast plays on its own, three forecast hours a second at 1\times, and at the last hour it returns to the current one and carries on from there, so a lap never replays hours that have already passed. On a browser that can draw it, the field flows from one forecast step into the next like a film, and on most browsers the wind particles keep moving through the change rather than starting over (on an older graphics setup they start afresh at each step); the model has a step every three hours, and the frames in between are blended from the two steps either side, so the label beside the slider names the nearest hour. When the next step has not arrived over the network, the map waits on the last full step rather than skipping ahead, and goes on as soon as it lands; meanwhile a ring turns round the play button, and on a phone the sheet says ‘Loading the next hours’. Elsewhere, and when your system asks for reduced motion, the map jumps one forecast step, three hours, at a time instead. On a run old enough that every hour it holds has already passed there is nothing left to step through, and play does nothing. The button beside it cycles the speed between 1\times, 2\times and 4\times. Touching the slider pauses the animation, so you can stop on an hour and look at it. The track is marked with day ticks — ‘Wed 2’, ‘Thu 3’, and so on: every day on a desktop, every second day on a tablet and every third on a phone — so a position on it reads as a day rather than as a fraction, and a small mark on it shows now.
Behind the track, the set line draws a spot’s forecast for the layer over the whole run as a small coloured area: the picked spot’s, or, while no spot is picked, that of the spot nearest the middle of the map. It is coloured as the map colours the same values, so the next swell shows on the track before you press play. A spot with no forecast draws no line. When the run starts part of the way through a day, the narrower track leaves that first day unmarked, and so does the desktop’s when the run starts too close to midnight for the two days’ labels to stand apart. When the run ends part of the way through its last day, the narrower track leaves that last day unmarked too.
The map’s clock is UTC. Its hours belong to no single spot, so they are stated in the time the forecast run itself keeps, and said so: the hour on the transport reads ‘Wed 30 Sep · 12:00 UTC’, and the day ticks are UTC days. A spot’s own page gives its times in the spot’s local time. The track ends at its last day, which is where the forecast the map draws ends; it never advertises a horizon further out than it has. The Strength in the layer menu fades the field: turn it down to Soft when you want to see exactly which stretch of coast a swell is aimed at, rather than only how big it is.
Burningswell tracks thousands of spots, and thousands of pins at world zoom would be an unreadable smear, so the map groups them. Zoomed out you see numbered bubbles — ‘1,204’ over Europe, ‘43’ over a stretch of Portuguese coast — each telling you how many spots are under it. Zoom in and the bubbles break apart into smaller bubbles and then into named spots you can open. Clicking a bubble is a shortcut for that: it zooms towards the spots it stands for. The grouping is done afresh for whatever you are looking at, so the numbers always describe the view in front of you rather than a fixed set of regions.
The overlay shows the latest completed forecast run, and the time slider steps through that run’s own hours — the same hours the forecast was actually produced for, not a generic day. A run that is still being computed is not shown until it is finished, so the map never mixes a half-arrived forecast into the picture. If no run has completed yet the page still opens, pans and lists spots; there is simply no colour on the water, which is the honest answer rather than a stale one.
The colour key at the transport’s end (under the track on a
phone) shows the layer’s colours with their numbers under them — wave
height reads 0, 1.25, 2.5, 5 and 7 m, peak period 4 to 18 s,
the wind 0 to 20 m/s. The numbers are the values the colours
change at, so a colour on the water reads as a value, and one value is
one colour on every map: the same wave height is the same colour on
/map, on a spot’s map and on the light and the dark face alike.
The land is drawn over the field, with a white line for the coast, so
the colour reaches the shore. The forecast model’s cells stop a little
short of most coasts, and in the last stretch before the shore, in rias
and in estuaries, the sea takes the colour of the nearest swell
offshore. Two things the colours will not do: they will not paint the
open water the model does not cover, which stays clear so you can see
there is no forecast rather than a fabricated calm; and a genuinely flat
sea still gets a colour, because measuring a quiet ocean is not the
same as having no measurement. Zoom in far enough and the overlay visibly
coarsens into blocks — that is the model’s own resolution showing
through, roughly 28 km per cell, and it is deliberate: the map does
not invent detail the forecast does not have.
In the search panel — the sheet on a phone, and under the notice when the map cannot be drawn — the In view list gives the spots you are currently looking at, best first, by the same score the pins are coloured by, headed with their number: ‘23 spots · best first’. Zoomed out far enough that the map draws group bubbles, the card lists the best 20 spots of the view, ranked by their rating for now, still headed with how many spots the view holds, and the line under it adds ‘The best 20 are listed; zoom in to list the rest.’ Each row is the spot as the pin card draws it, read for the spot’s own today, and opens the spot’s page. Spots we cannot rate come after every rated one, in alphabetical order, and say ‘not rated’ where the stars would be. A line under the card says what it ranked over — ‘Ranked across 7 of 9 spots in view.’ — counted fresh for the view in front of you, and it tells you when a view holds more spots than the map layer carries, so a truncated ranking is never presented as a complete one. The list, and the counts on the search pill and the sheet, follow the map as you pan.
The map follows your colour theme like every page: in the dark theme the panels, the pin card and the transport turn dark, the play button turns white, and the base map switches to its dark style.
The interactive map needs WebGL, the browser feature for hardware-accelerated graphics. Where WebGL is switched off or unavailable — some privacy browsers, older hardware — the map degrades gracefully instead of showing a blank canvas: in its place a warning reads ‘The map needs WebGL’ and ‘Your browser has WebGL turned off, so the interactive map cannot draw. Every spot in this view is listed below.’, with a How to enable WebGL button to a help page that lists the steps for every major browser, and the In view card follows it, ranked exactly as above, so you can still read the coast and open any spot on it. Nothing on the page breaks.
The help page, /help/webgl, is headed ‘Enabling WebGL’
and carries the site’s header, footer and, on a phone, the tab bar with
Map marked; the trail above the heading leads from ‘Map’, a
link back to the map, to ‘Enabling WebGL’. The page knows
four families, each printed by its best-known name: ‘Firefox’
(which covers LibreWolf), ‘Chrome’ (which covers Chromium and
Edge), ‘Safari’, and ‘Other browsers’, whose advice is to
update the graphics drivers. It opens on a card for the family of the
browser you are using, recognised from what your browser tells the site
about itself and marked with a ‘Detected’ badge, with the steps for
turning WebGL on in it; a browser the site does not recognise gets the
‘Other browsers’ card first, with no badge, since nothing was
detected; the settings, values and addresses you type —
‘about:config’, ‘false’, ‘chrome://gpu’ — are printed in
bold. Because that recognition can be wrong, the other families follow
under ‘Other browsers, in case we guessed wrong’, each on a smaller
card of its own: one under another on a phone, three side by side on a
tablet or wider, where the page keeps to a single readable column. A
‘Back to the map’ button at the foot returns you to /map.
The page needs no account and no scripting.
On a phone zoom and a locate me control sit over the map as large, thumb-friendly buttons; tapping locate centres the map on where you are, so the spots nearest you are a glance away. The layer tabs, the time control, the colour scale, the overlay fader and the pin card live in the sheet at the bottom of the map. The layer tabs scroll sideways rather than wrapping onto a second line. Where the map cannot draw at all the sheet goes away: the page becomes an ordinary scrolling one of the warning and the In view card, because a panel over a blank map would hide the very button that fixes it.
Signing in and creating an account
You sign in with a password, or with a provider the site has set up.
The sign-in page, /login, takes your e-mail address or your
username (see Your account) and your password. ‘Forgot your
password?’, under the password field, starts the reset described below.
A page that needs an account sends a signed-out visitor to
/login, and the address it sends you to names that page. Your
browser stays signed in afterwards, so you need not repeat this every
visit.
Where you land. Signing in takes you to the first of these that applies:
- The client application you were signing in to, when a sign-in started there (see Signing in to other applications).
- Setup, once: an account whose setup is neither finished nor skipped,
and that has not been taken there before, goes to
/welcome(see Setting up: the welcome flow, above). A new account goes there on its first sign-in. - The page you were sent to sign in from. Following a link to an account page while signed out, or a ‘Your surf’ link in the footer, brings you back to that page, with the same address it had. Moving between the sign-in and registration pages keeps it, and so does continuing with Google; creating an account does not, and a new account goes to setup anyway.
- Otherwise the home page.
The sign-in page’s old address, /login/password, lands on
/login, and so does a sign-in link from an old mail, which points
at /auth/verify; such a link signs nobody in. An account that has neither
a password nor a provider sets a password through ‘Forgot your
password?’, which needs a confirmed address.
The sign-in, registration and password-reset pages are focused: a top bar with the site’s name and one way across — ‘Create an account’ on the sign-in pages, ‘Sign in’ on the others — and no menu, search or theme switch. Their dark face follows your device’s setting, or the theme your account has chosen (see Your account). Under the form, or on a wide screen in the panel beside it, a line names the four languages, each in its own words: English, Español, Français and Português. Each is a link that shows the page in that language; the one the page is in is marked as the current one.
Where this site has set up sign-in with another provider, the sign-in page shows a ‘Continue with Google’ button under the form, after the word ‘or’, and the registration page shows the same button after ‘or continue with’; one tap signs you in through that provider instead. The platform supports Google, Apple and LinkedIn as providers, and the pages draw a button for Google alone; with no provider set up, the pages draw neither the button nor the word above it.
A trip to Google that ends without signing you in comes back to a page of its own, in the same frame as the sign-in page, and changes nothing:
- ‘Sign-in didn't complete’
You cancelled at Google, or the trip did not finish. ‘Try Google again’ starts it over; ‘Back to sign in’ returns to
/login.- ‘Sign in to link Google’
The address Google gave, which the page prints, already belongs to an account here. Sign in to that account with its password, then link Google from your account page. ‘Forgot your password?’ beside ‘Sign in’ opens the reset, for when you never had a password here or have forgotten it.
- ‘Confirm your address first’
The address Google gave belongs to an account here that was never confirmed. Open the link mailed when that account was created, then continue with Google. ‘Send the link again’ mails a new confirmation link to that address and shows the check-your-inbox screen; a second press within a minute sends nothing.
Three other pages take the same shape: ‘Too many attempts’ with how long to wait, when this connection has started too many sign-ins; ‘That sign-in isn't available’, for an address naming no provider; and ‘Google sign-in isn't set up here’, on a server with no Google sign-in set up.
‘Create an account’, under the sign-in form, opens
/register, ‘Create your account’: an e-mail address and
‘Create account’, with ‘Continue with Google’ under the form
when Google sign-in is set up. The form asks for no password: you
choose it after confirming your address, from the link in the mail.
An address that is not right is refused under the field with
‘Enter the whole address, like kai@example.com.’, and the form
keeps what you typed. The address is checked for its shape only, so
the answer never says whether it already has an account.
Signing up takes four steps: type your address and press
‘Create account’; open the mail that arrives; follow its link and
choose your password; then sign in with it at /login.
Registering mails a confirmation link to
/auth/email/verify to that address. The account has no password
until you open that link and choose one, so nobody can sign in to it
with a password before then. An account that has a password and an
address that was never confirmed waits for the confirmation as well: a
correct password at /login is answered ‘Confirm your address first’ and
‘Open the link we e-mailed when you created the account. It lasts
2 hours.’, with a ‘Send the link again’ button under it. The
button mails a new confirmation link to the address you typed and says
‘We sent a new link’ and ‘It lasts 2 hours.’; it works when
you signed in with your username, when it goes to the address that
sign-in found, and it never shows the address. It
mails at most once a minute; a press inside that minute gives the same
answer and sends nothing.
The first confirmation link an account is sent opens
/auth/email/verify as ‘Choose your password’, with the line
‘Saving it confirms kai@example.com.’ under it, a password field
with the strength meter and ‘Save password’. Saving the password
confirms the address and sets the password your account signs in with,
in one step, and takes you to /login, which says ‘Address
confirmed’ and ‘Sign in with your new password.’ Opening the link
alone confirms nothing and does not use it up, so a mail program that
checks links in advance, a link preview or a second click leaves it
working until you save. A password shorter than eight characters is
refused under the field, as on the reset form, and the link keeps
working; so does a connection that has tried too often, which is told
how long to wait. The link does not sign you in.
The same kind of link confirms an address you add on your account page;
it leaves your password as it is. Opened while you are signed in, it
takes you back to that page’s addresses; opened while signed out, it
brings you to /login with a green ‘Address confirmed’ line,
‘Sign in to finish setting up.’, and the address already in the
first field. A confirmation link works once and for two
hours. A used, expired or unknown one opens a page that says it does
not work and how long a link lasts, offers ‘Sign in’ for an address that is
already confirmed, and ‘Forgot your password?’ beside it, which
starts the reset described below: the way to a password for an address
that was confirmed before one was saved. It has a field to send a new link to the address
you type: ‘Send a new link’ answers with the check-your-inbox
screen. Opening too many links from one connection in
a quarter of an hour opens ‘Too many attempts’ instead, with how
long to wait, such as ‘Wait 10 minutes, then try again.’
A forgotten password is reset in two steps.
/password/reset/request asks for your e-mail address and mails a
single-use link, valid for an hour, to /password/reset. The
field wants the address itself: a username, or nothing, is refused under
the field with ‘Enter the address the account uses, like
kai@example.com. A username won't do here.’, and what you typed stays
in it. A connection may ask for ten reset links a quarter of an hour,
and one address for three an hour; past either, the form says
‘Too many requests’ with the real wait, such as ‘Wait 14
minutes, then ask again.’ Every new request spends the links mailed
before it for that account, so only the newest mail’s link works. The
mail says the link works once and lasts an hour, that setting a new
password signs you out of every other device, and that you can ignore
the mail if you did not ask for it.
The link opens /password/reset, ‘Choose a new password’.
Opening the page only checks the link; it does not use it up, so a mail
program that checks links in advance leaves it working. The field
under ‘New password’ says that saving also signs you out of every
other device, and the meter rates what you type. A password shorter
than eight characters is refused under the field, for example with
‘At least 8 characters. This one has 5.’, and the link keeps
working. A connection may try thirty times a quarter of an hour; past
that, the form says ‘Too many attempts’ with the real wait and
that the link still works until it expires. ‘Set new password’
saves it and takes you to /login, which says ‘Password
changed’ and that every other device has been signed out; sign in with
the new password there. A link that has been used, has expired, or is
missing its token shows, instead of the form, a page saying the link
cannot be used any more, with ‘Send a new reset link’, which leads
back to /password/reset/request.
What a sign-in, registration or reset form has to tell you appears in a line at the top of the form, above the first field, with an icon and a short title, and a sentence under the title when there is more to say. Its colour says what kind of answer it is: red for a refusal, such as ‘Invalid e-mail/username or password.’ or ‘Too many attempts’ with ‘Wait 15 minutes, then try again.’; amber for a step still to take, such as ‘Confirm your address first’; green for an arrival, such as ‘Signed in…’. When the password is right but the server cannot open a session, the line says ‘Sign-in is unavailable right now’ and ‘Try again in a moment.’, and you are not signed in. After a refused sign-in the form keeps your e-mail address or username and empties the password.
Registering, or requesting a password reset, lands you on a
check-your-inbox screen,
/auth/check, that says in one sentence where the mail went, how
long its link lasts and what comes next: ‘We sent a confirmation
link to kai@example.com. It works once and expires in 2 hours. Open
it to choose your password.’ after registering, ‘We sent a
confirmation link to kai@example.com. It works once and expires in 2
hours.’ after asking for a new confirmation link, and ‘If
kai@example.com has an account, a reset link is on its way. It works
once and expires in 1 hour.’ after a reset request. The confirmation mail says the same:
the link works once and lasts two hours, in the mail’s language. From
there you can resend the mail once a short cooldown has counted down,
or go back and use a different address. Opened on its own, with no
mail just sent, the page says ‘Check your inbox’ and offers
‘Back to sign in’; it never names an address it was not just
given.
The mail arrives in your language: the one your account has chosen on its ‘Preferences’ card (see Your account) when the address belongs to an account that has chosen one, else the language the page you asked from was in. The same holds for every mail the application sends you — a confirmation for a new address, your data export, the deletion confirmation and notice.
Every one of these flows works with JavaScript turned off. The sign-in, registration, reset-request and reset forms are ordinary forms: you submit, the page reloads, and you land where the flow continues — the check-your-inbox screen for the two that send a mail, the home page once a password sign-in succeeds, the sign-in page once a reset is done. ‘Send the link again’ returns you to the sign-in page, which says ‘We sent a new link’. Anything the server has to tell you, such as an address it could not read or a wait it is enforcing, appears on the page you land on, in the same words a browser with scripting on shows. The resend button works there too; without a client its countdown does not tick, so it reads ‘Resend link’ throughout while the same waiting period is enforced either way.
When you choose a password — the first one, from the confirmation link, or a new one from a reset link — the form rates it as you type: four small bars under the field fill from ‘Weak’, one red bar, through ‘Fair’, two amber ones, to ‘Good’ and ‘Strong’, three and four green ones, with a line of encouragement such as ‘Fair --- try a longer phrase’. Length is what moves the meter, so a long passphrase beats a short soup of symbols. The meter is advice, not a gate: it never stops you from submitting.
Repeated failed password attempts soft-lock the account for a quarter of an hour. When your own tries hit that limit, the sign-in form gives way to a ‘Too many attempts’ notice with a lock, ‘This account is locked for 15 minutes. A reset link unlocks it now.’, and the way out: a ‘Reset my password’ link straight into the reset flow. The notice counts the failures this browser has seen in a row; it never asks the server whether an account is locked, so it tells nobody whether an account exists. Completing the reset unlocks the account immediately — no need to wait out the timer with the new password in hand.
With JavaScript turned off the form does not swap itself for that notice: a failed attempt returns you to the sign-in page with the same ‘Invalid e-mail/username or password.’ line every failure gets, and the ‘Forgot your password?’ link under the password field is the way into the reset flow. The lock itself is unchanged — it is enforced by the server, not by the screen that explains it.
Signing in to other applications
Some applications let you sign in with your Burning Swell account instead of an account of their own. The first is Grafana, where the people who run Burning Swell watch how it is doing; it lets in accounts that hold the admin or developer role.
- Signing in
The application sends you to Burning Swell. When you are already signed in, you go straight back to the application, signed in there too; when you are not, the ordinary sign-in page appears first, and after it you go back to the application rather than to Burning Swell’s home page. Every way of signing in works: a password, or a provider the site has set up (see Signing in and creating an account).
- What the application learns
An identifier for your account that never changes and means nothing outside that application, and — when the application asks for them — your confirmed address, your name, and the roles your account holds. It never sees your password. An application run by Burning Swell gets these without a question; an application may be refused when your account lacks the role it requires.
- When it cannot finish
The page Sign-in could not finish says why, in one sentence, and offers Go to Burning Swell. A link that has expired, was already used, or is missing a part says that the link that brought you there is incomplete: start again from the application, which makes a new one. The page says the sign-in service is not answering only when that service is down; try again later. When the application asked for something Burning Swell does not allow, the page says so and shows a short reference under the button to quote when you report it.
- Signing out
An application can send you to Burning Swell to sign out. When it proves which account it signed in, you are signed out of Burning Swell on that device as well, straight away; with nobody signed in, the sign-out also happens at once. Otherwise a page asks Sign out of Burning Swell?, names the application, and offers Sign out or Stay signed in, so a link on some other site cannot sign you out. An application that gives no name is called An application. Stay signed in keeps you signed in to Burning Swell and to the application, tells the sign-in service that you said no, and takes you to the home page. Signing out of every device from your account page also ends your sign-ins to other applications.
- What the application keeps
Grafana keeps a user of its own for everyone who signed in to it: the identifier, your address and your name. When your account is deleted (see Your account), that user is deleted with it, on the day the deletion is carried out. Losing the admin or developer role shuts you out of Grafana within minutes, but leaves its user in place until the account itself is deleted.
Your account
Once signed in, the account page, titled ‘Account’, is a small settings surface: one card per section, in this order — ‘Profile’, which opens with who you are signed in as (your primary address, when you joined and how many sessions you have logged) and holds your username; ‘E-mail addresses’; ‘Preferences’; ‘Location’, how pages find what is near you, with the ‘Location history’ card under it while you are under ‘Remember’ or positions are kept; ‘Security’, changing your password, with the ‘Active devices’ card below it; ‘Connected logins’, when a sign-in provider is offered; ‘Your data’; ‘What we store’; and ‘Delete your account’ — closed by a full-width ‘Sign out’. Each card says how an action went in a highlighted line inside it: green when it worked, amber when it was refused and why, red when it failed.
On a tablet or desktop a rail beside the cards jumps straight to a section — ‘Profile’, ‘E-mail addresses’, ‘Preferences’, ‘Location’, ‘Security’, ‘Connected logins’ when the card is drawn, ‘Your data’, ‘What we store’ and ‘Delete account’ — and marks the section you are reading as you scroll; on a phone the cards simply stack under the title. The rail carries three further entries, each a page of its own: ‘Boards’, your quiver, ‘Your spots’, the spots you follow in your own order (see Your spots), and ‘Location history’, every position kept under ‘Remember’ (see Location history). The location history carries the same rail, and the quiver’s rail the same entries. On a desktop a third column holds ‘Privacy at a glance’, the short statement of what the site does with your data; under ‘Remember’ it says that your location is kept on your account, exactly, for as long as you chose to keep it, seen by nobody but you.
The ‘Preferences’ card leads with your ‘Language’: English,
Español, Français or Português, each written in itself. Pick one and
every page — the header, the menus, the footer, the sign-in pages —
reads in it on every device you are signed in on, and any other tab you
have open re-renders in it as you watch. The field catalogue and a
field’s page, which keep no connection to the server open, follow the
next time they are loaded (see The field catalogue). Switching
language keeps you on the same page with what you had asked of it —
a search, the filters and sort of /spots, the spots on
/compare, the forecast horizon on the home page — and never carries a
position along. The same
choice is offered on
every page without signing in: on a phone, the language line at the
foot of the page and the ‘Language’ row of the ‘More’ menu;
on a tablet or a desktop, the globe-and-name dropdown in the footer’s
bottom bar; on the sign-in pages, the line under the form. On a
tablet or a desktop the footer also carries four columns of links —
‘Forecast’, ‘Your surf’, ‘Account’ and ‘About’ —
above the data credits; the ‘Account’ column offers
‘Preferences’ and ‘Your data’ once you are signed in, and
‘Sign in’ and ‘Create an account’ before. The
‘About’ column’s ‘Data sources’, and the same link in the
bottom bar, lead to the page naming the open data behind every forecast
(see Data sources). Until you choose, the site follows the
language your browser asks for, and English otherwise. A link someone shares with you opens in the language
they were reading in; when your browser asks for another one, a single
line under the header — in your language — offers to switch, and its
cross puts it away for the rest of your visit. It never appears once
you have chosen a language. Choosing a language while signed out stays
with that browser and is carried into your account the first time you
sign in. Units, theme and the ‘Location’ choice made while signed
out are carried the same way, and only into an account that holds none
yet: an account that already has units keeps them when you sign in,
whatever this browser was set to, and the browser then follows the
account. The card then holds your measurement units
(‘Metric’, ‘Imperial’ or ‘UK’ — feet and mph with
Celsius), your colour theme (‘System’, ‘Light’ or
‘Dark’) and your home spot. Signed in, these belong to
your account rather than to one browser: change any of them
here — or flip units or theme with the toggles in the page header,
or, on the forecast pages, in the footer’s bar or the ‘More’ sheet
— and the choice follows you to every device you are signed in on,
taking effect in other open tabs as you watch. To pick a home spot,
start typing its name and choose from the matches; the chip links to
the spot’s page, and ‘Clear’ removes it. Signed out, the header
toggles still work exactly as before — the choice just stays with
that browser — and whatever you had chosen before signing in is
carried into your account the first time you do.
The ‘Location’ card, under ‘Preferences’, decides how pages find what is near you, as four choices, each with a line saying what it does: ‘Remember’ locates you on every visit and keeps each position your devices report on your account, exactly, with a history you can see and delete (see Location history); ‘This device’ locates you on every visit to that browser and keeps the position there, never on our side, for 30 days; ‘Ask’ locates you when you press ‘Use my location’, or on a visit once the browser already allows it; ‘Never’ never asks and never locates. The home page, above, describes what each one changes on the page. Choosing ‘This device’, ‘Ask’ or ‘Never’ is saved at once. Choosing ‘Remember’ first asks, in a dialog, whether to remember your location on your account, saying what is kept, for how long and who sees it, with a link to ‘What we keep and why’: ‘Remember it’ turns it on, and the card then reads ‘Since today, 10 October 2026. Locates you on every visit and keeps each position on your account.’ for the rest of that day; ‘Not now’, or closing the dialog, leaves your choice as it was and keeps nothing. Under ‘Remember’, choosing one of the other three leaves it. With positions kept, a dialog asks ‘Stop remembering your location?’: from then on nothing new is kept, and the positions already kept (it says how many, and within how long they run out) either go or stay. ‘Keep until they run out’ saves your new choice and leaves what was kept to run out on its own; ‘Delete them now’ saves it and deletes every kept position at once. The sessions you logged are kept either way. Closing the dialog any other way, with Esc or by tapping beside it, leaves ‘Remember’ chosen and changes nothing. With no position kept there is nothing to ask, so the new choice is saved at once.
The ‘Location history’ card, under the ‘Location’ card, is there while you are under ‘Remember’ or positions are still kept. Its first line says where you stand: on the development server, signed in as ‘bodhi’, ‘Remember is on · kept 90 days · 1,284 positions since 13 Jul’, the day being that of the oldest position kept. Your four newest days follow, ‘Today’ or the day’s name, each with its places, its hours and how many positions it holds, as the history page words them; ‘Every day kept’ takes you to that page (see Location history), where how long to keep them, the download and deleting are. Right after agreeing to ‘Remember’ the card says ‘nothing kept yet’: your first position is kept the next time a page locates you, and from then on every page that locates you keeps where you are, even when you have not moved since it was drawn (at most one every two minutes while you stay within 100 metres). After leaving ‘Remember’ with positions still kept, it reads ‘Remember is off’, with how many are kept and within how long they run out. Under the other three the choice is about asking, not a position: the account never holds where you are. What is kept under each choice is on the ‘Your location’ page (see Your location).
The ‘Active devices’ card lists everywhere you are currently signed in — one row per live sign-in, labelled by its browser and system (say, ‘Firefox on Linux’) with the network address and the last activity we recorded for it. The name is shown in the language you read the site in. The row you are reading from is marked ‘this device’. Every other row has its own ‘Sign out’ button: pressing it ends just that sign-in, immediately — the next thing that device tries requires signing in again — while all your other devices stay signed in. The card’s footer keeps ‘Sign out of all devices’ for ending every session at once, this one included. Changing your password under ‘Security’ also ends every other sign-in, and the card then lists this device alone. We only show what we actually recorded when the device signed in and used the site; there is no tracking behind it.
To sign out of just the device in your hands, use the ‘Sign out’ button at the bottom of the account page. It ends only the session you press it from and brings you back to the home page; everywhere else you are signed in stays signed in.
On the account page you can also pick an optional username — 3–24 characters of lower-case letters, digits and underscores. It is simply a second name for the same account: the password sign-in form accepts either your e-mail address or your username in the same field, and nothing else changes — every e-mail address you have verified keeps working exactly as before. Flows that send you a mail (a password reset, a confirmation link) still want the address itself, since they need somewhere to deliver.
The ‘E-mail addresses’ section lists every address on your account, each with its state — ‘Primary’, ‘Verified’ or ‘Unverified’. Adding an address mails it a confirmation link; until you open that link the row stays ‘Unverified’, with a ‘Resend link’ button in case the mail went astray — after a resend the button counts down a short cooldown before it can send again. A verified address can be made primary with ‘Make primary’ (the primary is where account mail like the data export goes), and any non-primary address can be removed. The page tells you plainly when something can’t be done — you can’t remove your primary without promoting another address first, you can’t promote an address you haven’t confirmed, and you can’t remove your only verified address. Opening the confirmation link marks the address ‘Verified’, and makes it the primary when the account has none (see Signing in and creating an account).
The same section is also a page of its own, /account/emails,
with the same list and the same actions: it is the address a direct
link or a reload of that section opens. Signed out, it sends you to
/login, as every account page does.
The account page’s ‘Your data’ section requests a copy of
everything Burningswell holds about you — your account, addresses,
preferences, linked sign-ins, followed spots, logged sessions, media,
share links, recently viewed spots and, under ‘Remember’, every
position kept for you, each with its exact point, time, accuracy and
device — as one JSON file. Pressing ‘E-mail me my data’ sends a
download link to your primary address. The link,
/account/export/token, needs no sign-in: the link itself is
the credential. It opens a page with a ‘Download my data’ button
and fetches nothing until you press it, so a mail program that checks
links in advance cannot spend it. It works exactly once and expires
within the hour; a used or expired link says ‘Link expired’.
Delivering the download also removes the prepared copy from
our servers, and requesting a fresh export cancels any earlier link.
Below it, the ‘What we store’ section lays the same holdings out as a table you can read without exporting anything: one row per category — your sessions (with their frozen conditions snapshots), e-mail addresses, sign-in history, shared spots, recently viewed spots, photos and clips, preferences, and your location — saying what each is, what it is for, and how long it is kept, with your own counts against the rows. The copy states what actually happens: sign-in sessions expire after thirty days and their records last as long as your account; the share ledger is kept indefinitely, and deleting your account de-identifies it while people you shared spots with keep them; your recently viewed spots are the last twelve spot pages you opened while signed in, each with when you last opened it, kept for your home page and the compare page until newer ones replace them or your account is deleted, and listed in the export; photos and clips are deleted outright with your account, files included. A secret spot’s page is not recorded, nor is a page your browser only fetched ahead of time or one another site opened for you. Your position is sent for the one request that ranks the spots near you and is kept on our side by nothing: the recently viewed spots record which pages you opened, never where you were. The position’s only memory is in your own browser, for thirty days from the last time you shared it, and ‘Forget my location’ on the home page clears it. What the account does hold is your ‘Location’ choice — ‘This device’, ‘Ask’, ‘Never’ or ‘Remember’ — which the export lists among your preferences. And whatever you delete — a session, an address, or the whole account — also clears from our nightly off-site backups within fourteen days.
The last row is the location’s. Under ‘Remember’, with positions kept, it is ‘Location history’: how many positions since the oldest, exactly as your devices reported them, and what they are for — ranking the spots near you on every device, your near-me alerts, noticing when you travel, filling in where and when you surfed, keeping ads away from your home coast and showing travel links only when you are away — with how long they are kept, ‘90 days’ say, as a badge. After leaving ‘Remember’ with positions still kept, the same row says they are kept until they run out. With no position kept the row is ‘Location’, sent with one request and never kept, marked ‘not stored’.
The ‘Delete account’ section at the bottom of the page deletes
your account for good — and says exactly what that means before you
start: your sessions, followed spots, uploaded photos and clips,
addresses, sign-in methods and preferences are permanently removed,
and so is the user Grafana keeps for you if you ever signed in to it
(see Signing in to other applications);
share links you created or redeemed stay in the ledger without your
identity, and people you shared spots with keep them; off-site backups
age out within fourteen days after the deletion. It is deliberately
hard to trigger by accident: you type ‘DELETE’ to confirm, we
e-mail your primary address a confirmation link, and even confirming
that link only schedules the deletion seven days ahead, and the
card then names that day in full — ‘after Wednesday 30
September 2026’ — with ‘Keep my account’ under it. The
link, /account/delete/token, needs no sign-in: it opens a
page that says what confirming means and offers ‘Schedule
deletion’, and nothing happens until you press it. A used or expired
link says ‘Link expired’. Until
that date nothing changes — sign in any time and press ‘Keep my
account’ to cancel. After it, the deletion is carried out and cannot
be undone.
The account page’s ‘Connected logins’ section shows the sign-in providers (see Signing in and creating an account) as your account holds them: each connected provider appears with the e-mail address it reported, next to a ‘Disconnect’ button; a provider that is available but not yet connected offers ‘Connect’, which walks the same provider sign-in and ties the result to your signed-in account. Disconnecting is refused in exactly one case: when that provider is your only way back in — no password set, no other provider connected, and no verified e-mail address a password reset could reach. Set a password or verify an address first, and the disconnect goes through.
Once signed in you can log a session from any spot page — a quick record that you surfed there — and two pages draw on that history: one lists the sessions you have logged, the other rolls them up into your lifetime record (see Your sessions and Surf Life).
Your spots
The ‘Your spots’ page lists every spot you follow, in the order you keep them. It is at ‘/account/spots’: the ‘Edit’ on home’s ‘Your spots’ card opens it (see The home page), and the account’s rail lists it between ‘Boards’ and ‘Location history’. Signed out, the same address shows ‘Sign in to see your spots’ with a line on what the page holds, ‘Sign in’ and ‘Create an account’, each of which brings you back here, and ‘Browse spots’.
The page reads, in this order:
- ‘Account › Your spots’
The trail back to your account.
- ‘Your spots’
The list’s heading, then a count line: on the development server, signed in as ‘bodhi’, ‘5 spots · in the order you keep them’. One spot reads ‘1 spot’, and none ‘No spots yet’. ‘Reorder’ sits beside the heading; with fewer than two spots it is disabled, since there is nothing to put in order.
- ‘The rows’
Each spot you follow, first in your order first: the flag and the name, which opens the spot’s page; today’s stars, the word for them and the kind of break; the region and country, then ‘home break’ for your home spot (see Your account) and, on a tablet or a desktop, the month you followed it, ‘since March 2023’; then today’s air and sea temperatures, the waves and the wind; last, a filled heart. A spot no forecast covers yet keeps its place and its name, ends its place line ‘no forecast yet’ and shows a dash where the conditions would be.
- ‘The line under the list’
‘Tap a heart to stop following. The spot stays here until you leave, so a second tap takes it back.’ With one spot it reads ‘Follow a second spot and you can put them in order.’, and when a spot on the page has no forecast it names that spot and says it stays followed.
The list shows twelve spots a page at every width. A longer list ends in the pages and the range shown, ‘25–34 of 34’; each page is a plain link, ‘/account/spots?page=3’, and a page past the end shows the last one.
With nothing followed, the list says ‘You don’t follow any spots yet’ and offers ‘Browse spots’.
Tap a spot’s heart to stop following it. The row stays where it stood, quieter, its name struck through and its heart empty, so the list never moves under your thumb while you prune it. The count line adds how many you have unfollowed on this visit, and the line under the list says what happened, ‘Bakio unfollowed. Tap its heart to follow it again.’ Tap the empty heart and the spot is followed again in its old place: ‘Bakio followed again, back in its place.’
While any spot is unfollowed on this visit, a notice under the list counts them, ‘3 spots unfollowed’, and carries one ‘Undo’, which follows them all again, each in its old place, and says ‘3 spots followed again, each in its place.’ The notice stays until you act or leave. Leaving the page, or reloading it, ends the visit: the struck rows are gone, and the spots stay unfollowed.
When a change cannot be saved the list shows what is stored, the spot still followed, and a red notice at its head says so: ‘Bakio is still followed. The change was not saved.’
Press ‘Reorder’ to put your spots in order. The button turns to ‘Done’, the count line reads ‘Your order · the arrows move a spot, Top sends it first’, and each row shows its place in your list in place of its conditions and heart, then three buttons: ‘Top’, up and down. Spots unfollowed on this visit are hidden while you reorder. Each press is saved at once; there is no Save button. The spot takes its new place, its row warms for a moment, and the line under the list says where it went, ‘Hossegor moved to 2 of 5. Saved.’ The first spot’s ‘Top’ and up and the last spot’s down are disabled. On a list of several pages, up on a page’s first spot moves it onto the page before, and ‘Top’ always sends a spot to 1; you stay on the page you are on. Press ‘Done’ to go back to the reading. Reloading the page opens it on the reading as well.
The buttons work the same way from a keyboard: Tab reaches a spot’s buttons, and Enter or Space moves it. Focus stays on the button you pressed, so the next press moves the spot again. On a tablet or a desktop a line under the list says so.
When a move cannot be saved, the list comes back as it is stored, with a red notice at its head, ‘The new order was not saved’, and the line under the list says where the spot is: ‘Not saved. Hossegor is back at 3 of 5.’ The spot’s row lights up at that place. Try the move again, and reload the page if it keeps failing. If you unfollowed the spot in another tab or on another device, the notice says you have unfollowed it, and the list shows the spots you follow.
With scripting off, a heart still unfollows or follows its spot, and ‘Top’, up and down still move a spot; each brings you back to the same page of the list, which lists only the spots you follow and shows the three buttons on a line under each spot. ‘Undo’ needs scripting.
Beside the list on a tablet or a desktop, and under it on a phone, the card ‘Follow another spot’ finds a spot to add. Type a spot, region or country into its field: a moment after you stop typing it shows the first five spots the catalogue finds, the letters you typed marked, each a row like the list’s, and a line that counts every match, ‘10 spots match · See every match’. ‘See every match’ opens the search for what you typed (see Browsing and searching spots). A spot you already follow shows its heart filled. Tap an empty heart to follow the spot: it joins the end of your list, the list turns to the page that shows it, and the line under the list says so, ‘Zarautz followed. It is at the end of your list, 6 of 6.’ Tap the heart again and the spot is unfollowed like any other, struck through in the list until you leave. With the field empty, the card says where a new spot goes and offers ‘Browse all spots’. With scripting off, pressing Enter in the field opens the search.
Under it the card ‘On the home page’ sets how the home page’s ‘Your spots’ card orders your spots (see The home page). ‘Order’ offers two buttons, ‘Best first’, pressed until you choose otherwise, and ‘Your order’. ‘Best first’ ranks your spots by the wind right now, as home always has; ‘Your order’ keeps the order of this page, so the spot you put first is the one home shows first. Press one and it is saved at once, the button stays pressed and the line beside it says what the order does. ‘Home break’ names your home spot, ‘Mundaka’ for ‘bodhi’ on the development server, or says ‘None set’; ‘Change’ opens the preferences of your account, where you choose it (see Your account). With scripting off the two buttons still save the order and bring you back to the page.
The developer guide describes the page’s internals (see The Web UI for developers in Burningswell Developer Guide).
Your location
The ‘Your location’ page says what Burning Swell keeps about where you are, and shows your own ‘Location’ choice beside it. It is at ‘/privacy/location’ and needs no account: signed out you read the same page, with a card that says nothing is kept.
The page opens with its title, ‘Your location’, and one sentence: ‘We keep your location only if you choose Remember.’ Two cards follow.
- ‘Your choice’
Your ‘Location’ choice in bold and what it means. Under ‘Remember’ it adds how long positions are kept and how many are kept since you chose it; on the development server, signed in as ‘bodhi’, it reads ‘Remember · kept 90 days · 1,284 positions since 10 July’. With nothing kept yet it ends ‘nothing kept yet’. Under ‘Remember’ an outline ‘Location history’ button, with a pin, follows that line and opens the page of what is kept (see Location history). Under ‘Ask’, ‘This device’ or ‘Never’ it says that nothing is kept on our side and how that choice locates you. ‘Change’ takes you to the ‘Location’ card of your account page (see Your account). Signed out the card says ‘You are signed out, so nothing about your location is kept on our side.’ and offers ‘Sign in’, which brings you back to this page signed in.
- ‘At a glance’
The answer in short, six rows: ‘Kept’, only if you choose Remember; ‘What’, exact positions, their times, and the browser that sent them; ‘For’, 90 days, or up to 24 months; ‘Seen by’, you; ‘Sold, or used for ads’, never; ‘Stop’, any time, in your preferences.
Eight sections of text follow the cards, the same for every reader:
- ‘What we keep’
Under ‘Remember’, and only while you are signed in: each position exactly as your device reported it, its time and accuracy, and the name of the browser and system that sent it, with the device’s model when the browser gives it; at most one position every two minutes unless you have moved 100 metres; no street address, and nothing from a visit made signed out.
- ‘Why we keep it’
The six uses, each a bold lead and a sentence: spots near you on every device, alerts near where you are, travel, your log, keeping ads away from home, and travel links only when you travel.
- ‘What we never do’
Sell or give away your location, use it for an ad, show it to anyone but you, or keep writing it once you leave ‘Remember’.
- ‘How long we keep it’
90 days unless you choose 12 or 24 months, deleted daily past your choice; logged sessions are kept apart; an account deletion takes the history with it after the seven-day hold.
- ‘Who can see it’
You, and the product’s own systems for the six uses; it is stored in the European Union by the hosting provider and does not leave it.
- ‘Your choices and your rights’
See it on Location history, take it with you as GeoJSON, delete it, or stop by choosing another ‘Location’ choice; and the further rights to correction, erasure, restriction and a copy, and to complain. The text’s ‘Location history’ links that page (see Location history); signed out, it asks you to sign in first.
- ‘Without Remember’
What ‘This device’, ‘Ask’ and ‘Never’ do, that the last position stays only in your browser for 30 days, and that you are never placed by your connection’s address.
- ‘The legal part’
The legal basis (your consent, Article 6(1)(a) of the GDPR), the recorded date and words, what happens when the words change, and withdrawal. It names the privacy page without linking it.
The text ends ‘Last changed 23 September 2026.’, the date of the words a ‘Remember’ agreement records.
The page follows your language (see Your account), the legal part included. On a phone the title, the sentence, the two cards and the text stack in that order, and the tab bar marks ‘More’. From a tablet’s width the title sits in a bar under the header, which marks ‘Account’ when you are signed in, and the two cards stand side by side above the text. On a wide screen the cards stand in a column to the right, and an ‘On this page’ column on the left lists the eight sections: each entry jumps to its section, and the marked entry follows the section you are reading.
The developer guide describes the page’s internals (see The reader's location for developers in Burningswell Developer Guide).
Location history
The ‘Location history’ page lists every position kept on your account under ‘Remember’, a day per row, by month. It is at ‘/account/location’, a page of your account, reached from the rail or from ‘Every day kept’ on the account page’s ‘Location history’ card: signed out, the address takes you to the sign-in, which brings you back here.
A day is a date as it was where you were: each position is told
in the time zone of the place it was taken, and a day in another zone,
on a trip, reads in that zone’s time. A stay is a run of a day’s
positions at one place with no gap longer than two hours.
A stay of 45 minutes or more at the break of a spot is offered on
/sessions as a surf to log, until you log it or answer
‘Not a surf’ (see Logging a surf).
The page reads, in this order:
- ‘Your choice’
Your ‘Location’ choice in bold and since when it stands: on the development server, signed in as ‘bodhi’, ‘Remember, since 11 July 2026. While you are signed in, every position your devices report is kept here, exactly, with its time.’ ‘Change’ takes you to the ‘Location’ card of your account page.
- ‘The current month’
A card headed by the newest month that holds a position, with how many days and positions it holds (‘October’, ‘4 days · 68 positions’), then a row per day, newest first. A row names the day, ‘Today’ or the weekday and date (‘Tuesday 6 October’), and under it the places of its stays in the order you visited them, its first and last time and its positions: ‘near Mundaka, then Gernika · 06:52–10:31 · 26 positions’. The newest day opens on arrival.
- ‘A day's stays’
The chevron on a row opens the day to its stays, one line each: its first and last time, its place, its positions and the device that reported them, ‘06:52–09:48 near Mundaka, at the break · 23 positions on Chrome on Pixel 8’. The device is named in the language of the page, so the same stay in Portuguese reads ‘23 posições do Chrome no Pixel 8’. The chevron again closes it. The cross on a stay, and the cross on a row, delete it (see Deleting positions).
- ‘The earlier months’
A closed row per earlier month with its counts, back to the first day kept (‘September’, ‘12 days · 378 positions’). Opening one lists its days as the current month does. A month of another year names the year: ‘December 2025’.
- ‘Keep it for’
The three periods a position is kept, ‘90 days’, ‘12 months’ and ‘24 months’, with yours marked, and that positions older than your choice are deleted every night (see Keeping positions for a period).
- ‘Take it with you’
‘Download (GeoJSON)’ saves every position as one file (see Taking your history with you).
- ‘Delete all of it’
How many positions ‘Delete all’ removes, and that ‘Remember’ stays on (see Deleting positions).
The page closes with ‘Seen by nobody but you. Never sold, never used to pick an ad.’ and a link to ‘What we keep and why’, the ‘Your location’ page (see Your location).
How places are named
The page names places in words and never prints a position or draws a map; the exact positions are in the download. A stay is named by the nearest spot within 5 km: ‘near Mundaka’, or ‘near Mundaka, at the break’ when it came within 500 metres of the spot. With no spot that close it is named by the nearest town within 25 km, ‘Gernika, no spot within 5 km’; with no town either, by its region, and failing that ‘somewhere without a name’. A day’s row lists each place once, ‘near Meñakoz, then near Bakio’, and a day spent at one town reads in the stay’s words: ‘Bilbao, no spot within 5 km’.
Keeping positions for a period
Choosing a period under ‘Keep it for’ saves it at once when it is as long as yours or longer, or when no position is older than it. A shorter one that would delete positions asks first, with how many and from before which day: signed in as ‘rosie’, on ‘12 months’, ‘90 days’ asks ‘Keep 90 days instead of 12 months?’ and says how many positions are deleted tonight, and that from then on each day goes once it is 90 days old. ‘Keep 12 months’ leaves your choice as it was; ‘Keep 90 days’ saves the shorter one, and the nightly deletion removes the older positions. Nothing is kept longer than 24 months, and the sessions you logged are kept whatever you choose.
Taking your history with you
‘Download (GeoJSON)’ saves the file
burningswell-location-history.geojson: one GeoJSON
FeatureCollection with a Point for every position you
keep, earliest first, at its exact longitude and latitude. Each point’s
properties are time, the moment it was taken in ISO 8601 and UTC
(‘2026-07-11T05:05:00.000000Z’, ‘bodhi’’s first); accuracy, how accurate the
device said it was, in metres, or null; and device, the
name of the device that reported it, always in English whatever language
you read the site in, such as ‘Firefox on Android’, or
null. Most map applications open the file. The same points
are in the full copy of your data (see Your account).
Deleting positions
Every deletion asks first, in a dialog that says what goes, and is final: there is no undo.
- A stay
The cross on a stay of an opened day: signed in as ‘bodhi’, today’s stay in Gernika asks ‘Delete 10:12–10:31 in Gernika?’, with its count and what the day keeps, ‘The rest of today stays: 06:52–09:48 near Mundaka, 23 positions.’ ‘Delete the stay’ removes its positions, redraws the day from what is left and says so in a note at the corner of the screen: ‘The stay in Gernika deleted’, ‘3 positions are gone for good. Today keeps its stay near Mundaka.’ Deleting a day’s only stay deletes the day.
- A day
The cross on a row: ‘Delete Monday 21 September?’ with its count. ‘Delete the day’ removes the row, lowers the month’s counts and says ‘Monday 21 September deleted’.
- All of it
‘Delete all’: ‘Delete your whole location history?’ with the count and the first day kept. ‘Delete all’ removes every position and the days give way to ‘Location history deleted’: ‘Remember’ is still on, so positions are kept again from now. To stop, choose ‘This device’, ‘Ask’ or ‘Never’. After leaving ‘Remember’, ‘Delete them now’ on the notice that ‘Remember’ is off asks the same, without the sentence that it stays on.
Deleting a stay or a day under ‘Remember’ redraws only that day and its month’s counts: the months and days you opened stay open, on this page and in your other tabs.
‘Cancel’ closes a dialog and deletes nothing. A deletion removes positions only: your ‘Location’ choice and your agreement to ‘Remember’ stay as they were, and the sessions you logged are kept, since a session keeps its spot and times, never the positions it was filled in from. This page and ‘Your location’, open in another tab or on another device, redraw at once.
When there is nothing to list
- ‘Nothing kept yet’
Under ‘Remember’ with no position kept: your choice, ‘since today’ when you chose it today, and that your first position is kept the next time a page locates you.
- ‘Remember is off’
After you leave ‘Remember’ with positions still kept: nothing new is kept, the positions kept before run out day by day, and the day the last one goes; signed in as ‘bunker’, ‘Nothing new has been kept since 8 October. The 1,284 positions kept before then run out day by day; the last goes on 6 January.’ Every month is a closed row, ‘Delete them now’ deletes them (see Deleting positions), and ‘Choose Remember again’ takes you to your account’s ‘Location’ card.
- ‘Your location is not kept’
Under ‘Ask’, ‘This device’ or ‘Never’ with nothing kept: your choice, ‘Choose Remember’ to your account’s ‘Location’ card, and ‘What we keep and why’.
- ‘This browser blocks location’
Under ‘Remember’, when the browser you are reading in does not allow Burning Swell to locate you: nothing is kept from this device until you allow it in the browser’s settings.
- ‘Your location history did not load’
When the days cannot be read: nothing was changed or deleted, and ‘Try again’ reads them again.
On a phone the page stacks in the order above and the tab bar marks ‘More’; the account’s sections are not listed. From a tablet’s width the header marks ‘Account’, the trail ‘Account › Location history’ sits in a bar under it, and the account’s sections are listed on the left, ‘Location history’ marked. On a wide screen the days take the middle and the cards stand in a column on the right. Every word follows your language (see Your account).
The developer guide describes the page’s internals (see The location history page for developers in Burningswell Developer Guide).
Data sources
The ‘Data sources’ page names the open data every forecast on Burning Swell is built from, what each source is used for, the credit its owner asks for in the owner’s own words, and its licence. It is at ‘/data-sources’ and needs no account: signed in or out it is the same page. The footer of every page links it: ‘Data sources’ in the ‘About’ column and in the bottom bar, both marked as the current page while you are on it.
The page opens with its title, ‘Data sources’, and one paragraph: ‘Every forecast on Burning Swell is built from open data. Here is each source, what we use it for, the credit its owner asks for in their own words, and its licence.’ The ‘At a glance’ card follows: each source and its licence in short, and the day the wordings were last checked.
- ‘NOAA’
Public domain.
- ‘ECMWF’
CC BY 4.0.
- ‘DWD’
CC BY 4.0.
- ‘Météo-France’
Licence Ouverte 2.0.
- ‘Copernicus Marine’
Copernicus Marine licence.
- ‘EOT20’
CC BY 4.0.
- ‘OpenStreetMap’
ODbL.
- ‘Checked’
‘9 October 2026’: the day the providers’ own pages were last read.
A section for each source follows the card, in this order. Each opens with what the source is used for and its licence, linked to the licence’s own text where it has one; then, set apart as a quotation, the credit the source’s owner asks for in the owner’s own words, and links to the owner’s terms.
- ‘NOAA’
Waves (GFS-Wave), air temperature and sky (GFS), sea temperature (OISST) and tides on United States coasts (CO-OPS). Public domain. The quotation is the National Weather Service’s terms: NOAA asks for no credit line, only that its data is not claimed, not presented as an endorsement and not passed off as official material.
- ‘ECMWF’
Waves (IFS-WAM). CC BY 4.0, with ECMWF’s terms of use for open data. The quotation is the four statements those terms ask a service to carry.
- ‘Deutscher Wetterdienst’
Waves (GWAM worldwide, EWAM in European waters). CC BY 4.0, with DWD’s rules for naming it as the source. The quotation is DWD’s source note, in German and in English.
- ‘Météo-France’
Waves along the coasts of western Europe (MFWAM). Licence Ouverte 2.0. The quotation is the licence’s own attribution clause, in Etalab’s English version.
- ‘Copernicus Marine Service’
Waves in the Mediterranean. The Copernicus Marine Service licence. The quotation is the licence’s acknowledgement with the dataset’s DOI.
- ‘EOT20 tide model’
Tides wherever no NOAA station predicts them. CC BY 4.0. The quotation is the citation its authors ask for, as SEANOE publishes it.
- ‘OpenStreetMap’
The map under the forecast layers and the time-zone boundaries every spot’s local time comes from. The Open Database License (ODbL). The quotation is the credit the map carries in its corner.
A quotation stays in its owner’s language, whatever the page’s: on a page in French, Spanish or Portuguese the credits read as their owners publish them, in English and, for DWD, in German too.
The page follows your language (see Your account). On a phone the title, the paragraph, the card and the text stack in that order, and the tab bar marks ‘More’. From a tablet’s width the title sits in a bar under the header, which marks no item, and the card stands above the text in one column. On a wide screen the card stands in a column to the right, and an ‘On this page’ column on the left lists the sections and marks the one being read as the page scrolls.
The developer guide describes the page’s internals (see The data sources page for developers in Burningswell Developer Guide).
Your quiver
‘Boards’ in the account rail opens your quiver,
/account/boards: the boards
you own, configured once and then picked, rather than retyped on every
session. Each board shows a drawing of itself, its name, its dimensions
and what your own log says about it — how many sessions you have
ridden it, when and where you last did, the spread of ratings you gave
those sessions, and the range of wave heights it has actually been
ridden in. The page, its form, the month a board was acquired in, the
“last ridden” phrases and every outcome it reports read in your
language; the button and card names quoted below are the English face.
The page opens on the breadcrumb ‘Account / Boards’, the way back to your account. Every board you own is in one list, in one card: the boards in your quiver first, then the retired ones, and the count beside ‘Your quiver’ counts all of them, retired included. On a phone the card carries that title and count and ends with ‘Add a board’, and a note under it says what retiring and deleting do. On a tablet or a computer the title and ‘Add a board’ stand over the card, and beside it a ‘Settings’ card holds the account rail — your account’s sections, then ‘Boards’, ‘Your spots’ and ‘Location history’ — with ‘Boards’ marked as the page you are on. Under it a tablet shows the note as its own card, ‘Retiring, not deleting’, and a computer shows ‘Board for tomorrow’ instead.
Each board’s row names it, with a ‘Default’ or ‘Retired’ chip, and gives its dimensions on one line. On a phone the line under them says what the board is and how much it is used — ‘Shortboard · thruster · 128 sessions · last ridden 4 days ago’ — and a pencil opens its form. On a tablet or a computer the dimension line ends with the fin setup (‘· thruster’), the line under it says since when you have had the board and when and where you last rode it — ‘Since March 2024 · last ridden 4 days ago at Mundaka’ — and an ‘Edit’ button opens the form. The row then shows the board’s history: ‘Ridden in’, the range of wave heights it was ridden in, drawn on one 0–4 m scale that every board shares; a bar of the ratings you gave its sessions in four parts — five stars, four, three, and one or two; and the number of sessions with how they typically went, as stars: the middle rating, the lower of the two middle ones when the sessions split evenly. A tablet shows the history under the lines, a computer in a column of its own.
A retired board says when it was retired instead: ‘Retired March 2025 · 23 sessions kept’ on a phone, and ‘Retired March 2025 · last ridden at Mundaka’ on a wider screen, with a note in the history’s place that its sessions keep it and the picker does not, and a ‘Restore’ button.
The drawing is generated from the board’s own numbers: the shape from its type, the proportions from its length and width, the fin plugs from its setup, and the paint from its colour — so a fish is short and fat, a gun is a sliver, and “the red one” is red. Every board in the quiver stands to one scale, so a 5’8” and a 7’2” compare by eye. A retired board is washed out; a board with no stated dimensions is drawn at its type’s typical proportions.
Dimensions read in your units. With ‘Imperial’ or ‘UK’ selected in ‘Preferences’ a board is written the way a surfer says it — ‘6'1" × 19¼" × 2½" · 29.5 L’; with ‘Metric’ the same board reads in centimetres. Volume stays in litres either way, because that is what shapers print.
You enter dimensions as they are printed on the stringer: feet and whole inches for the length, inches and an eighth for the width and the thickness (the eighths are a list — ‘0’, ‘⅛’, ‘¼’ … ‘⅞’), and litres. Each box is a number with a range, so a slipped finger — a 91-inch width — is refused by the browser before the form is sent, and the page refuses it again if it arrives another way. Picking a type while every box is still blank fills them with a typical board of that type — a 6’1” × 19¼” × 2½” · 29.5 L shortboard, a 5’8” × 20½” × 2⅜” · 31 L fish — as a starting point to correct, never over a figure you have typed. The ‘ft · in’ / ‘cm’ switch beside the field is for a board you only know in centimetres; it starts on your account’s units and changes the spelling of the boxes, never the board. As you fill them, the drawing at the head of the form redraws with the length, the width and the thickness marked on it, and the line beneath it (‘Reads 6'1" × 19¼" × 2½" · 29.5 L’) reads the board back the way a shaper writes it. All four are optional — a board with only a name is still a board.
Until you add a board the card says ‘No boards yet’: add the board you ride most and it is picked for you every time you log a surf. Its ‘Add your first board’ button is then the page’s one way to add one; ‘Add a board’ appears once the quiver holds a board.
‘Add a board’ opens the form: a name (whatever you call it out loud — shaper and model, or ‘the red one’), a type picked by its shape from a group of six (the arrow keys move through them), a colour — fourteen named paints, or any colour at all through the last swatch, which opens the browser’s own colour picker, with the paint’s name beside the ‘Colour’ label — the dimensions, a fin setup, the month you got it, and whether it is your default — the board pre-selected when you log a session. Only one board can be the default at a time. Editing a board never changes which sessions reference it.
The form has two addresses of its own, to link to or bookmark:
/account/boards/new opens the quiver with the form open and
empty, and /account/boards/id opens it with that board’s
form filled in, ready to edit. An address naming a board that is not
yours, or no board at all, shows the quiver with no form open.
Pressing ‘Add a board’, or a board’s ‘Edit’, opens the same
form in place without changing the address. Signed out, every quiver
address sends you to /login.
Retiring and deleting are deliberately different, and both are in a board’s form, beside ‘Save to quiver’ and ‘Cancel’, when you edit it. ‘Retire’ takes a board out of the picker and keeps every session that used it; a retired board still names itself on its own sessions, and ‘Restore’, on its row, puts it back. Making a board your default is the form’s switch, ‘Make this my default’. ‘Delete’ is refused outright while any session references the board: an alert over the quiver, ‘This board cannot be deleted’, says how many sessions are in the way — ‘41 sessions were logged on the Lost Puddle Jumper, and deleting it would take it off every one of them’ — and offers ‘Retire instead’, which retires the board and clears the alert.
Before boards existed, a session recorded its board as free text you retyped each time. Those values are still there, and the quiver page offers them back: ‘You have typed these before’ lists each distinct spelling with the number of sessions carrying it, and ‘Adopt’ turns every one of them into a reference to a real board. Near-duplicates — ‘6'1 shortboard’ beside ‘6'1" shortboard’ — are flagged as such, their count line naming the spelling they look like a typo of (‘7 sessions · looks like a typo of 6'1" shortboard’), and offered as ‘Merge’, which lands them on the same board rather than minting a second one. A spelling that looks like a typo of a board already in your quiver is offered the same way, so adopting the heavier spelling first still leaves its typo a merge. The list is ordered by the number of sessions, most first. Nothing is rewritten until you press the button, and what you originally typed is never altered.
Once you have a board, the session edit form on ‘/sessions/id’ offers your quiver as a one-tap picker: one row per board, with its drawing, its name and, under the name, its length and volume in your units. The drawings stand to one scale, as in the quiver. The board the session names is pressed when the form opens, and the pressed row is outlined and carries a check at its right. A retired board is not offered, unless it is the one this session already names. ‘None’, below the boards, is always available: a borrowed board should not force a quiver entry. ‘Add a board’, last, opens the quiver’s add form on ‘/account/boards/new’; with no boards yet, the row offers that link instead of a picker. The choice is kept when you press ‘Save changes’.
Finally, if you have set a home spot, the quiver page answers ‘Board for tomorrow’, a card in the column beside your quiver on a screen at least 1200 pixels wide; a phone or a tablet does not show it. It takes the forecast for your home spot at 07:00 tomorrow, in your home spot’s own time, and states it in one line: the spot, the day and hour where the spot is, the wave height, the period in whole seconds and the wind word, as in ‘Mundaka, Thursday 07:00 --- 1.6 m at 14 s, offshore.’ The wind word (‘offshore’, ‘cross’, ‘onshore’ or ‘glassy’) is said only when the forecast has a wind and the spot has a known bearing, since the shore is what makes a wind offshore; without it the line ends at the period, and without a period at the height.
Under the line the card names the board whose ridden range contains that swell, preferring the one you have rated highest, with its length and volume and the badge ‘Your range’, and says how many of your sessions the suggestion rests on. The suggestion comes from your own log — not from a shaper’s opinion or a volume formula — so it appears only when your log actually supports it; when no board has been ridden in that size, the card says so instead.
Your sessions and Surf Life
A session is one surf you logged from a spot’s page: when, how it was, and what you saw. Three pages hold them, and all three need an account; signed out, each sends you to the sign-in page.
/sessions, headed ‘Sessions’, is your surf diary. Beside
the heading, ‘Log a surf’ opens the log page (see Logging a surf); on a desktop ‘Stats’ before it opens Surf Life. Under
the heading come, in this order:
- The note to log a stay
Under ‘Remember’, the stay the log page would offer, with ‘Log it’ and ‘Not a surf’ (see Logging a surf).
- The summary
Four figures of the whole diary, whatever the filters below say. On the development server, signed in as ‘bodhi’: ‘214 sessions since March 2023’, the month of the first; ‘300 h in the water’, to the nearest hour from ten hours on and to the minute below (‘1 h 30’, ‘45 min’), and ‘1 h 24 a session’; ‘28 spots in 3 countries’; and ‘6 weeks in a row with a surf in each’. The weeks run Monday to Sunday in the time zone of your home spot; a week not yet surfed does not break a run that held until the week before.
- The last six weeks
A strip of the six weeks up to this one, a row a week headed by its Monday and a square a day, headed by how many sessions they hold, ‘15 sessions, coloured by your rating’. A day you surfed takes the colour of the best rating you gave it: four or five stars ‘epic’, three ‘good’, two ‘fair’, one ‘poor’. Today is outlined, and the days after it are empty frames. Holding the pointer on a day names it, ‘19 August: 2 of 5’.
On a phone these stack in one column; on a tablet the summary and the six weeks sit side by side. On a desktop the six weeks head a column at the right, with two cards under them:
- Where you surf
The four spots you have surfed most, each with its flag, its region and how many sessions, ‘Mundaka 96’; a spot opens its page, and ‘Stats’ opens Surf Life.
- Your calls against ours
How the sizes you logged compare with the forecast kept with each session: ‘You call it 0.2 m smaller than we forecast, over 118 sessions where you logged a size.’ The figure is the median difference, in your height unit, and a bar chart under it counts the sessions by how far off the call was, with the forecast marked at 0. Until three sessions carry a size, the card says so instead.
Under them come your sessions, newest first, a card a month. The card names the month, ‘September 2026’, and how many sessions it holds and how long you were in the water, ‘8 sessions · 11 h 35 in the water’, counted over the whole month rather than the sessions shown. A session’s month, day and time are told in its spot’s own time. Each session is one row, read top to bottom:
- The spot
Its flag and name, and a lock when the session is private.
- The rating
The stars you gave it, coloured as the forecast colours its own — four or five stars ‘Epic’, three ‘Good’, two ‘Fair’, one ‘Poor’ — then the spot’s break.
- The day line
The day, the time you went in and how long you stayed, ‘Sat 19 · 07:10 · 1 h 35’, or ‘55 min’ under an hour. On a tablet or a desktop the day is spelled out and the board you rode follows, ‘Saturday 19 · 07:10 · 1 h 35 · Pyzel Ghost’.
- The forecast
The reading kept with the session: the height, the period and the direction the swell came from, ‘1.3 m 12 s NW’. A session logged without a forecast shows none.
- Your call
The size you logged, in your height unit, ‘you: chest 1.1 m’; nothing when you logged no size.
- The note
What you wrote, when you wrote anything. The session’s title stays on its own page.
A page holds fifteen sessions at every width. While more remain, ‘Older sessions’ at its foot adds the next fifteen below the ones you have, in place, with grey placeholder rows while they load; a month that runs on carries on in its own card. Without scripting the link opens the next fifteen as a page of their own, where a month that runs on continues under its own heading. Sorted by ‘Best rated’, the sessions are one card headed ‘Best rated’, each day line carrying its month and year.
Before you have logged anything the page says ‘No sessions yet’, that the diary starts with your first surf, and offers ‘Log a surf’; until then it shows no summary, no six weeks and no filters.
The filters above the months narrow and order them. On a tablet or a computer they are one form, in three columns on a tablet and in one row on a wide screen:
- ‘Notes’
Matches the text anywhere in a session’s title or notes.
- ‘Spot’
Keeps the sessions at one spot. It offers the spots you have surfed by name as you type; the spot’s name in any case, or its address name (
mundaka, as in/spots/mundaka), both work. A name that is none of your spots matches nothing.- ‘From’ and ‘To’
Keep the sessions from one day up to and including another, each session’s day told in its spot’s time zone.
- ‘Rating’
‘Any’, ‘3 stars or more’, ‘4 stars or more’ or ‘5 stars’.
- ‘Sort’
‘Newest’, ‘Oldest’ or ‘Best rated’.
‘Filter’ applies them, and the form keeps the values it applied.
On a phone the filters are a row of buttons, ‘Spot’, ‘Dates’, ‘Rating’ and ‘Notes’, with the order (‘Newest’ and its arrow) at the end of the row. Each button opens a sheet from the bottom of the screen holding its field (‘Dates’ holds both days) and ‘Apply’; the order opens a menu of the three. An applied filter turns its button into a pressed one that says what it keeps — ‘Mundaka’, ‘5 stars’, ‘June to August’ (whole months by name, otherwise ‘3 June to 12 August’, ‘From 3 June’ or ‘Until 12 August’) — with a cross; pressing it removes that filter alone.
The filters are part of the address —
/sessions?spot=mundaka&min_rating=4&sort=rating — so a filtered
list can be bookmarked, and ‘Older sessions’ keeps them. They work
with scripting switched off: a phone’s button then leads to its field
further down the page. The summary, the six weeks and the right-hand
column always show the whole diary, whatever the filters.
When nothing matches, the list says ‘No sessions match these filters’. When it is only the dates that hide your sessions, it says what they hide: for example ‘You have rated one surf at Mundaka five stars, on 13 September. It falls outside the dates you chose.’ Otherwise it suggests ‘Try fewer filters.’ ‘Clear filters’ shows the whole diary again.
Opening a session goes to its own page, /sessions/id. It
names the spot, its break type and the way it faces, and when you
surfed, and shows what you logged beside the conditions snapshot frozen
when you logged it, including how the height you saw compares with what
was forecast. From there you can:
- ‘Edit’ the session — its title, time, duration, rating, the waves you saw, notes and tags — and pick the board you rode from your quiver (see Your quiver);
- switch it between ‘Private’ and shared: a shared session is one of the Sessions logged here on its spot’s page, without your name (see Anatomy of a spot page);
- ‘Show matching photos’: photos taken at the same spot within two hours of the session;
- ‘Delete…’ it, after a confirmation, for good.
An address naming a session that is not yours, or no session, sends you back to the list; it never says whether such a session exists. Every other tab you have open on the same session follows a change as you make it.
/stats is Surf Life, headed ‘Stats’: your lifetime
record, counted from every session you have logged. It needs an
account; signed out, it sends you to the sign-in page and back. Six
figures head it: your sessions and the month of the first; your hours in
the water and the length of a session on average; your spots and the
countries they are in; the biggest wave you called, in your height unit,
with its spot and day; the weeks in a row with a surf, and your longest
run of them; and your average rating as stars, to the nearest half star,
over the number of ratings. ‘Sessions’ beside the heading leads
back to the list, and on a desktop ‘Log a surf’ beside it opens the
log page (see Logging a surf).
Under the figures, ‘The last twelve months’ draws the year a day a cell, a column a week from Monday, shaded by how many sessions you logged that day — one, two, or three or more — with the months named under it; today is outlined and the days after it are empty. On a phone the year is wider than the screen and opens on the current weeks: swipe right, or focus it and use the arrow keys, to reach the older months. A sentence under it names your season: winter when October to March holds at least half of the year’s sessions, else summer, with that half’s share. ‘The last six weeks’ follows, the same calendar the Sessions page draws, coloured by your rating, and ends on your streak: the weeks in a row with a surf and your longest run.
‘Where you surf’ lists the five spots you have surfed most, each behind its country’s flag with its region and country under it, the country named in the language of the page, how many sessions you logged there and ‘Your call’: how the size you called there usually differs from the forecast kept with the surf, the median difference in your height unit (‘−0.2 m’ calls it smaller), or a dash until three surfs at that spot have both. A spot’s name opens its page.
‘Your calls against ours’ follows once three of your surfs have both a called size and a kept forecast. A sentence names how your calls usually differ from the forecast, ‘You call it 0.2 m smaller than we forecast, over 118 sessions where you logged a size.’; a chart counts the differences in steps of 0.2 m from −1 m to +0.8 m (the same steps, named in feet, from −3.3 to +2.6 ft when you read in feet), the dashed line at 0 being our forecast and the busiest step coloured; and three figures close it: the median difference, the typical miss (how far a call lands from the forecast on average, either way) and the share of calls within 0.3 m of it, or within a foot. Until then the card asks you to log the size you saw, with a bar of your surfs with a size, ‘2 of 3 sessions with a size’; it stops at two while fewer than three of them have a kept forecast.
‘Boards you score on’ lists your boards, the most surfed first, each with its length in your units and, under it, the range of forecast wave heights you rode it in (‘ridden in 0.8–2.6 m’) or the month you retired it (‘retired, March 2025’); then its sessions and ‘Typical’, the median of your ratings on it as stars. A board’s name opens your quiver (see Your quiver).
‘Conditions you surfed’ draws the waves of every surf with a kept forecast: the wave heights in steps of 0.2 m from 0.5 to 2.3 m (the same steps, named in feet, from 1.6 to 7.5 ft), and the periods in whole seconds from 8 to 16 s, a wave beyond either end counted in the last step. A sentence under them names where the middle half of your surfs fell, ‘Most of your surfs were between 1.1 and 1.5 m, at 11 to 13 s.’ Until one of your surfs has a kept forecast, the card holds a line in place of its charts: log a few surfs within a week of going, and your ranges show up. Every height on the page, the biggest figure, the calls and the chart, follows the units you chose in the footer.
‘Records’ names your biggest surf called, the most wave energy (from the size you called, else the forecast, with the forecast’s period: when it is the same surf, ‘the same surf, 2.8 m at 15 s’), your longest session, your longest run of weeks with a surf, from its first day to its last, and how many five-star surfs you logged, under it the latest of them. Each record opens the surf it names — the run its first surf — with its spot and day under it, ‘Meñakoz, Wednesday 14 January 2026’; a record you do not hold yet, such as the biggest before you call a size, is left out.
‘Badges’ shows the badges you have earned and the month you earned each: ‘First session’; the highest of 10, 50, 100 and 250 sessions you have reached, in the month of that session; ‘All four seasons’, in the month you first had a surf in each of December to February, March to May, June to August and September to November; and ‘Three countries’, in the month of your first surf in a third country. A badge you have not earned is not drawn. Under them, until you pass 250 sessions, ‘Next’ names the next milestone with a bar of how far you are and how long the rest takes at the pace of the last twelve months, ‘214 of 250 --- about 5 months at your pace this year.’: in whole months, or in weeks under half a month.
On a phone the cards follow one another in the order above. On a tablet the year spans the page and the cards under it stand in two columns: ‘Where you surf’, ‘Boards you score on’ and ‘Records’ on the left; ‘The last six weeks’, ‘Your calls against ours’, ‘Conditions you surfed’ and ‘Badges’ on the right. On a desktop ‘The last six weeks’, ‘Records’ and ‘Badges’ stand in a narrow column at the right, beside the figures, the year and the other four cards. Every word on the page, the month names and the dates included, is in the language you chose in the footer.
Before your first session the page holds its heading and ‘Nothing to count yet’ alone, with ‘Log a surf’ to log one.
Logging a surf
/sessions/new, headed ‘How was it?’, logs a surf. It needs
an account; signed out, it sends you to the sign-in page and back. The
page arrives answered: the spot, the day, when you went in and came out,
the board and the size come from what Burning Swell already knows, and
the one thing left to you is how good it was. Two taps — a rating,
then ‘Log it’ — log it.
Under the Location choice ‘Remember’ the answers come from your location history (see Location history): the newest stay of 45 minutes or more at the break of a spot, ended, that no surf you have logged covers. The line under the heading reads it back, ‘Mundaka this morning, 06:52 to 09:48.’ for a stay of today (‘this afternoon’ from 12:00, ‘this evening’ from 18:00), or ‘Mundaka, yesterday, 06:52 to 09:48.’ for an earlier one. Times are the spot’s local time, on a 24-hour clock.
Without a stay to answer from — without ‘Remember’, or with no
such stay — the spot is the one whose page you came from
(‘Log a surf here’ opens /sessions/new?spot=mundaka), else
the public spot nearest the position this browser already holds, within
50 km, and the ‘Spot’ fact says how far it is: ‘Mundaka
2.4 km away’. The position is the one the page would rank by anywhere
on the site (see Your location); it never goes in an address. You
came out now, to the minute, and went in your usual length before that:
the median length of the surfs you have logged, or 1 h 30 before you
have logged one with a length. ‘In the water’ shows the length,
‘Today, 08:40 to 10:10 1 h 30’, and the foot of ‘Your surf’
says so: ‘Out now, in for your usual 1 h 30. Change the times if
they are wrong.’
With no spot to go on — none asked for and no position — ‘Your surf’ asks ‘Where did you surf?’ over a search box, ‘Search spots’, and offers ‘Or one you surf most:’ with a button for each of the three spots you have logged most. A button, or a spot picked from the search, answers the card as above, out now and in for your usual length. Before your first logged surf there are no buttons.
The page, top to bottom:
- ‘Your rating’
Five stars, none picked. The rating is the one answer the page cannot fill in.
- ‘How big was it?’
Six sizes, ‘Waist’ (0.5 m) to ‘Double’ (3.5 m). The size nearest the wave height we forecast for the hour you went in is picked, and the note under the sizes says so: ‘Head high is picked from our 07:00 forecast. Change it if the sea disagreed.’ Without a forecast for that hour nothing is picked, and the note reads ‘No forecast to pick from, so pick the size you saw.’
- ‘What we forecast’
The forecast for the hour you went in, drawn as the spot’s row on every list: the stars, the reading, the wind, the air and the sea, with ‘Our forecast for today at 07:00’. Its footer names the tide, the model and its run, and that the forecast is ‘Kept with your surf as it was forecast.’: the snapshot is stored with the session, so it later shows what you saw against what was forecast. A spot our wave model does not reach, or a day before our forecasts begin, says so instead.
- ‘Your surf’
The answers as facts: ‘Spot’, ‘In the water’ (‘Today, 06:52 to 09:48’) and ‘Board’, with ‘From your location history’ at the foot. ‘Change’ opens the fields behind them, and ‘Done’ closes them again:
- ‘Spot’, a search box over a list of the public spots nearest the stay, each with its region and distance (‘Bizkaia · 2.4 km’; ‘about 62 km’ past 50 km). Typing narrows the list and searches the whole catalogue; the arrow keys walk it, RET picks a spot and ESC closes it. A name the search finds no spot for reads ‘No spot by that name. Try another spelling.’, and leaving the field with a name that is not a spot of the list says ‘Pick a spot from the list.’ until you type in it again, as ‘Log it’ does with the field empty;
- ‘Day’: ‘Today’, ‘Yesterday’, the five days before by name (‘Monday 21’), or ‘Another day…’ with a date up to today (‘Pick a day up to today.’ otherwise);
- ‘In’ and ‘Out’, to the minute, with the length under them, ‘2 h 56 in the water.’, and a question past eight hours, ‘More than 8 hours? Check the times.’ Leaving ‘Out’, or ‘In’ once ‘Out’ holds a time, with something wrong says what, until you type in either again: ‘Give the time you went in and came out.’, ‘Out is before in.’, or, for today, ‘That is later than now.’;
- ‘Board’, your quiver and ‘No board’: the board your own sessions say suits the forecast height (see Your quiver), else your default board;
- ‘Note’, up to 1000 characters.
- ‘Log it’
Logs the surf. Under it, ‘Only you can see it until you share it.’: a logged surf is private until you share it from its own page. While it is on its way the button reads ‘Logging…’ and cannot be pressed twice.
The page follows its fields as you change them. The forecast follows the spot, the day and the time you went in: it dims while the new hour is fetched, and shows its empty state when there is none. The size follows the forecast until you pick one; after that it stays yours, and the note reads ‘Your call. Our forecast stays beside it.’ The line under the heading and the facts read your changes back, and the foot of ‘Your surf’ reads ‘You changed it, and the forecast follows your times’ once the spot, the day or the times differ from the stay. ‘Log it’ with no rating says ‘Pick one to five stars. It is the one thing we cannot fill in.’ on the stars, and with a field wrong opens the fields to show it.
‘Log it’ checks the form again when it arrives, with the same words on the same fields, so a surf is logged only when: one to five stars are picked; the spot is one of the catalogue’s; the day is today or before it, in the spot’s time zone; both times are given, out after in and, for today, not later than now; the note holds at most 1000 characters (‘Write at most 1000 characters.’ otherwise); and the board is one of yours, or none. A refusal leaves the form as you had it, with its fields open and each error on its field. This holds with scripting off in the browser too: the form is posted as it is, and the page comes back with the same errors.
A logged surf keeps the spot; the instant you went in, on the day you
chose in the spot’s time zone; how long you were in the water; the
stars; the size you picked; the board; and the note. With it is kept
the forecast for the hour you went in, not for the minute you logged
it: a surf logged at ten for a session at seven is compared with seven.
The page then reads ‘Logged’, with what was recorded:
‘Today, 06:52 to 09:48 at Mundaka, on the Pyzel Ghost.’ (the
board’s name as you gave it in your quiver; without a board the line
ends at the spot), the stars, and ‘You called it head high. We
forecast 1.9 m.’ (‘You called it head high.’ alone when no
forecast was kept, and no line without a size). ‘Open the surf’
goes to the surf’s own page, /sessions/<id>, for its waves, tags
and sharing, and ‘Done’ to /sessions. With scripting off,
‘Log it’ goes straight to the surf’s page.
Under ‘Remember’, /sessions offers the same stay before you
open the log page: under the heading, a note with a pin reads
‘You were at Mundaka this morning’ (‘this afternoon’ for a
stay begun from 12:00, ‘this evening’ from 18:00, ‘yesterday’
for one of the day before), then ‘06:52 to 09:48. Log it while you
remember how it was?’. ‘Log it’ opens the log page answered from
that stay. ‘Not a surf’ removes the note and keeps on your account
that the stay was not a surf, so it is never offered again, here or on
the log page; the next stay that qualifies, if any, takes its place.
Logging a surf that covers the stay ends the offer too. What
‘Not a surf’ keeps is deleted with your account. Without
‘Remember’ there is no note.
‘Cancel’ in the header goes back to /sessions without
logging anything. The fields start open at a tablet’s width and closed
behind ‘Change’ on a phone and a desktop. On a desktop the
forecast stands beside the form, with ‘Your last surf here’ under
it when you have surfed the spot before: the day, the stars you gave it,
and ‘You called it chest high. We forecast 1.3 m.’ ‘Cancel’
sits beside ‘Log it’.
Sharing a spot
Not every spot is public. A spot can be kept secret and passed along by link rather than listed in the index; this is how a private break travels from one surfer to another without going on the public map. A secret spot’s page opens only for its owner and for those it was shared with or who found it nearby; to anyone else, signed in or not, its address answers as an address no spot has.
A spot’s Share command opens /share, which needs an
account. Under the breadcrumb ‘Spots › spot › Share’ it is
headed ‘Share this spot’ on a phone and ‘Share spot’ on
a wider screen, and it shows your share link for the spot in a box of
its own. The link stays the same every time you open the page, until
someone uses it, you revoke it or it expires; only then does the page
make a new one.
The link carries the language you are reading in, so it opens in that
language.
There are four ways to hand the link over, and none of them sends anything from Burning Swell:
- ‘Copy’
‘Copy link’ on a wider screen. Puts the link on your clipboard; the button reads ‘Copied’ for two seconds afterwards.
- ‘Share…’
Opens your device’s share sheet with the link, for a message app or anything else the device offers. A browser that has no share sheet, such as Firefox on a desktop, copies the link instead.
- ‘Email it’
On a tablet or a desktop. Opens a new message in your own mail program, with no recipient, the subject ‘A surf spot for you’ and a body holding the spot’s name, the link and the days it has left, in the language you are reading in.
- The QR code
Beside the link on a tablet or a desktop, black on white in both the light and the dark theme, for someone to scan from your screen. On a phone ‘Show QR’ opens it under the link and ‘Hide QR’ closes it again.
Three numbered steps say what the link does: the person who opens it signs in, the spot unlocks on their account for good, and the link is then spent, so a second person opening it gets the spent-link notice described below. Under the steps the page says the link expires in seven days if nobody uses it.
‘Links you have made’ lists every link you have made for the spot, newest first, with their count. Each line says when the link was made and what became of it: ‘unused’ for the current one, with the days it has left on a wider screen; the date it was claimed and ‘claimed by’ the address of the account that claimed it (‘a deleted account’ once that account is gone), with the badge ‘used’; ‘expired unused’, with the badge ‘expired’; or ‘revoked’, with the badge ‘revoked’. A date in an earlier year carries its year.
A link nobody has used yet can be taken back: ‘Revoke’ ends its line in the list, and on a tablet or a desktop also ends the row of buttons under the link box. Revoking the link the page shows turns its line ‘revoked’ and puts a new link in the box, the QR code and the top of the list, and the page says ‘Link revoked. A new link is ready.’; revoking an older link says ‘Link revoked.’ Whoever opens a revoked link gets the spent-link notice described below, as for a used one, and the spot is not unlocked for them. A link that was used, revoked or expired in the meantime, say from another tab, cannot be revoked, and the page says ‘That link could not be revoked — it was already used, revoked or expired.’
If the spot is yours, a tablet or a desktop also shows ‘Who can see this spot’: you, as its owner, then everyone who claimed one of your links, with the day they claimed it, and everyone who found it nearby. Someone who shares a spot that was shared with them sees their own links and not this list.
Everyone who came in through one of your links has ‘Remove’. It takes the spot away from them at once, without asking first: their row leaves the list, a line under it names them and the spot, and the spot leaves the spots they can see. Only the spot’s owner can remove someone, and only someone a link let in: you, and anyone who found the spot nearby, have no ‘Remove’, and a removal that is not yours to make says ‘Only the spot's owner can remove someone, and only someone a link let in.’ A removal is undone by sending that person a new link. A desktop adds ‘Why single-use’, which says why a link opens a spot for one person only.
/share opened without a spot says ‘Nothing to share’; a spot
that does not exist, or that you cannot see, says ‘Can't share this
spot’; and when links cannot be made at all it says ‘Sharing
unavailable’. Each has ‘Back to the surf spots’, which leads to
the spots page.
Opening the link while signed in is the whole of the other side: the spot is claimed at once, it joins the spots you can see, and you land on its page.
Signed out, the link opens a page headed ‘A spot was shared with you’. It shows the spot’s name, its coast (the kind of break, its region and its country), who shared it, and the conditions there right now, with two buttons: ‘Sign in and claim’ and ‘Create an account’. Opening this page does not use the link up, and says so: ‘Opening this page does not spend the link — only a successful signed-in claim does. You can come back after signing in.’ Signing in returns you to the link, which then claims the spot and opens its page, in the language the link was shared in. A card beside the claim, on a desktop, explains ‘Why it only works once’.
Whoever holds a live link can therefore see a secret spot’s name and its current conditions before claiming it; the page shows neither its position nor a map. That is the point of the link: the person who sent it chose to show you the spot.
A link that has been used, was revoked, has expired or was never valid says ‘Link no longer works’ and ‘Ask whoever sent it for a fresh one.’, whether you are signed in or not, with ‘Back to the surf spots’, which leads to the spots page. A link that is missing its token gets the same notice. A link that nobody opens expires after seven days.
The documentation
This guide is part of the site. ‘/docs’ is the documentation’s front page: a card for the user guide, with its version and a list of its chapters, and, for an account holding the developer role, a second card for the developer guide. To reach it, follow ‘Documentation’ in the footer’s ‘About’ column on a tablet or a desktop, or in the ‘More’ menu on a phone. The user guide itself starts at ‘/docs/users/’, and every page of it has an address of its own that you can bookmark and share. Accounts with the developer role also find the mock-up gallery there, at ‘/docs/mockups’, and see a ‘Mock-up:’ link in each section of this guide that a design sheet draws. The Pages index at the end of this guide lists every page it describes by its address (see Pages).
Each page of the guide is one section of this manual, drawn inside the site’s own header and footer:
- ‘Contents’ lists every page of the guide, with the page you are on marked. On a desktop it stands in a column beside the text; on a phone or a tablet it is a collapsed list above the text that opens with a tap.
- ‘On this page’ lists the page’s headings and jumps to each one. It stands in a column on the right on a desktop and is a second collapsed list on narrower screens; a page without headings has none.
- ‘Previous’, ‘Up’ and ‘Next’ at the foot of the page lead to the neighbouring pages and to the page one level up, each named by its title.
- The trail above the text, ‘Documentation’ then the guide’s name, leads back to ‘/docs’ and to the guide’s first page.
- Every heading carries a link to itself: copy it to point someone at exactly that part of a page.
- Printing a page prints the text alone, black on white in either theme: the site’s header, footer, menus and the navigation above are left out, and long examples wrap instead of being cut off.
The guide is written in English. The site around it — the header, the menus, the footer, the page’s own labels — follows the language you read the site in, and a page shown in another language says, above the text, that the guide is written in English.
The developer guide and the design mock-ups are for accounts that hold the developer role, which an admin grants (see Managing platform roles); an admin can read them without it. A link from this guide into the developer guide carries a ‘for developers’ mark. Following one while signed out takes you to the sign-in page; once you have signed in, open the link again. Signed in without the role, the page says that this part is for developers, names the role you would need, and offers a way back to the user guide. The role is checked on every page you open, so a role granted or removed takes effect on your next click.
Watching a pull request’s screencasts
When an agent changes a page of the site, it records a screencast of each feature it changed and posts it on its pull request. The recordings are watched on prod, by an account holding the developer role (or admin), at the address the pull request’s description carries: ‘https://prod.burningswell.com/review/pr/burningswell-cl/number/’. Signed out, the address takes you to the sign-in page and back; signed in without the role, it says the page is for developers. The role is checked on every request, so a role removed takes effect on the next click, and a video link the page handed out stops working within five minutes.
The pull request’s page
‘The newest push’ lists the shots of the latest push that recorded anything, in the order of its walkthrough, with the widths each was filmed at (a width with a failing step is marked red), how many steps passed, and the push it was recorded at: ‘this push’, or, for a shot an agent carried over unchanged from an earlier push, that push’s short commit and how many pushes behind the newest it is. ‘Pushes’ lists every push that uploaded recordings, newest first, with its date, how many steps passed and how many failed; open one to watch it. ‘The pull request’ opens the request on GitHub. Until the first upload the page says there are no recordings yet.
A push’s page
The head commit, when the recording was made, whether the agent’s working copy was clean, and how many of its steps passed come first; when a step failed, a red box names each recording that failed, by width, and opens it.
Each feature then has a player that plays its shots in order as one walkthrough and moves on to the next shot when one ends. Under the video, the step rail draws the whole video as a bar: the title card hatched, then each step as a block from where it starts to where its result shows, green when it passed and red when it failed. Click a block to jump there. The line across the rail follows the video.
- ‘390’, ‘834’ and ‘1440’ at the top choose the width the walkthroughs were filmed at: phone, tablet and desktop. Switching keeps the shot and the step you were on. The page opens on the width of your own window.
- ‘Shots’ lists the feature’s shots with how many steps passed, or how many failed; click one to play it.
- ‘Steps’ lists the shot’s steps with a failing step first, marked red, showing what was expected and what the page held. A step after a failing one reads ‘not walked’: the take stopped there. Click a step to jump to it.
- ‘Recording’ gives the account that was signed in, the language and theme, the width the page really had, the video’s size and length, how many takes it needed, the commit it was recorded at (for a shot carried over, a link to that push’s page), and the console errors and failed requests seen while it was filmed. ‘Contact sheet’ opens the frames where the page changed, labelled by step; ‘Chapters’ the list of steps with their times; ‘Video file’ the video alone.
- ‘Stills’ shows the page at each width, light and dark; click one to see it whole.
‘Language checks’ lists each page the agent checked in English, Portuguese, Spanish and French, with the result and the agent’s note. A shot that could not be filmed is listed with the reason.
If you pause for a long while, the video’s link expires. When you play on, the player fetches a fresh one and resumes where it stopped, and says so under the video.
A push whose recordings are gone says that nothing is stored for it: recordings are kept until 30 days after the pull request is merged or closed. On staging, dev or your own dev server, which cannot read the recordings, the page says they play on prod and links there.
Managing platform roles
Most people never see this part of the site. The platform grants two roles, and an account can hold either, both or neither:
- admin
The platform admin role opens the account roster described here, with the right to grant and remove both roles, and the weather console (see The weather console). Accounts that hold it get one extra entry in the header and in the phone menu — Admin — leading to the roster. Admin also includes everything the developer role opens.
- developer
The platform developer role opens the developer guide and the design mock-ups, and nothing else: a developer gets no Admin entry and cannot open the roster or the weather console.
Because admin includes developer access, an admin can open the developer guide and the design mock-ups whether or not the account also holds the developer role. The two roles are still granted and removed separately, and each keeps its own record of who granted it and when.
The roster lists every account on the platform: admins first, then developers, then everyone else, each group by e-mail address. Under its title, Accounts, a line counts the whole platform: how many accounts, how many admins and how many developers. You can search it by e-mail address or display name — type, then press Enter — and narrow it with the filter to All, Admins, Developers or Members. Each filter shows how many accounts it holds under the search you typed, and choosing one keeps that search; a new search keeps the filter you chose. Admins lists the accounts holding the admin role; Developers lists the accounts holding the developer role itself, so an admin who was never granted it is not listed there; Members lists the accounts holding neither. A search that matches nothing says so, names what you typed, and offers Clear search.
The roster shows 200 accounts at a time. The line under the list says which ones, as in “Showing 201–400 of 1,284 accounts”; Next opens the following page and First page returns to the start. There is no way back one page at a time.
Each row shows the account’s e-mail address, which opens the account, a badge for each role it holds, and its display name — No display name when it has none — with you on your own row, which is highlighted. What else a row says depends on the width of the screen:
- On a phone
One line under the address says how long the account has stood where it stands: admin since the day admin was granted, developer since the day the developer role was granted for an account that is not an admin, or joined and the day the account was created. The row’s actions follow, under the account when the row is too narrow for both.
- On a tablet
The roster is a table of four columns: Account, Role, Granted and Action. The account line adds the account’s number and the day it joined. Granted gives the day its leading role — admin if it holds admin, otherwise developer — was granted, and under it who granted it and how: the granting account’s address and ‘console’, or An operator on the server and ‘CLI’ for a grant made on the server rather than by an account.
- On a wide screen
The same table in six columns: who granted the leading role has a column of its own, Granted by, and so has the day the account joined, Joined.
An account that holds neither role shows a dash in Role and Granted.
Beside the roster — under it on a phone, in a column to its right on a tablet or a wide screen — a column of cards answers the questions the rows cannot:
- The admin count
How many admins hold the platform, stated rather than left to be counted from the rows, because it is the number that decides whether the admin role can safely be removed. Under it, the rule that the last admin cannot be removed here.
- Role changes
The six newest role changes on the platform, newest first, each with a light: green for a grant an account made in this console, red for a removal, and grey for a change no account made — a grant by an operator on the server, which reads An operator on the server · no acting account. Under the title, Recorded since gives the day recording began (see What the history shows). When the changes cannot be read the card says so, rather than showing an empty history.
- Grant by e-mail
Reaches an account that is not on the page (see Granting and removing a role).
On a wide screen two more cards appear. What the admin role unlocks, under the table, lists what the role opens — this console, the weather operations overview, each model and its runs, and the developer guide and the design mock-ups — what stays public, and what removing the role leaves in place. Who can see this, last in the column, says that only admins can open the roster.
The roster is a page of the weather console: it carries the console’s Operations header, with ‘Accounts’ marked as the section you are in (see The weather console), and no site footer. The Burning Swell brand and ‘Back to the forecast’, in the menu the ‘Operations’ button opens, both lead back to the home page; on a phone the tab bar stays along the bottom of the screen.
Opening the roster, or any other page of the console, while signed out takes you to the sign-in page, which brings you back once you have signed in. Signed in with an account that does not hold the admin role, the page says ‘Not for this account’, names the address you are signed in with and says that the platform console needs the admin role; ‘Back to spots’ leads to the spots, and the site’s tab bar and footer stay in place. Nothing of the roster is shown. The role is checked on every page you open, so a role granted or removed takes effect on your next click.
Opening an account shows what the roster row cannot: when it joined, how it can sign in, how many sessions it has open right now, every e-mail address it owns and whether each is verified, the roles it holds with their attribution, and its own history of role changes. On an account that holds admin, the roles card also shows a Developer line reading included with admin, whether or not the developer role is held as well.
Granting and removing a role
Every row, and every account page, offers one action per role: Grant admin or Revoke admin, and Grant developer or Revoke developer. Granting and removing either role take two steps. Choosing the action opens a page that says what will change, and nothing happens until you confirm there.
- Granting admin says what the account gains — this console, the weather operations pages, developer access, and the ability to grant and remove platform roles — and how many admins will hold the platform afterwards.
- Removing admin says how many admins will remain, and what becomes of the developer guide and the design mock-ups: an account that also holds the developer role keeps them through it; any other account loses them with admin. Removing your own admin role is its own question: it tells you that you lose the console immediately, how many other admins remain, and that any of them can restore you.
- Granting developer says the account gains the developer guide and the design mock-ups, and that nothing else about it changes. Removing developer says the account loses those two, and that its sign-in, sessions and spots are untouched. On an account that holds admin, both pages add that admin includes developer access, so what the account can open does not change while it is an admin. Removing your own developer role asks the same question and never locks you out.
The page you return to reports the outcome at its top. On the account list it is an alert: green with a check for a change that went through, naming the account it reached — Admin granted. over kai@example.com now holds the admin role. — and red for one that did not, such as That account isn’t a developer. When role management is unavailable, the alert adds that nothing changed and that the operations team can still manage roles on the server. An account’s own page reports the outcome as a single line.
The last remaining admin cannot be removed here. Rather than offering the action and then rejecting it, the console withholds it and explains why, and offers granting a second admin as the way out. If it is attempted anyway — from a page left open while someone else’s role changed — the server refuses and says so. Nobody is ever permanently locked out: the operations team can restore admin access directly on the server. Only the admin role has this protection: removing the developer role is always offered, even from the last account holding it, because every admin already has developer access.
An address that is not on the page can be reached through Grant by e-mail, which accepts any address an account owns, including a secondary one, and opens that account’s page, where each role’s own action is offered.
What the history shows, and what it does not
Every grant and every removal is recorded: who it was for, who did it, when, and whether it came from this console, from the server, or from the automatic grant that gives the very first account on a new platform the role. A removal is recorded as fully as a grant, which is what the account roster alone can never show — removing a role there erases the record of it having existed.
Recording began when this history shipped, on the day the roster’s Role changes card names, and nothing earlier was reconstructed. An account whose role changed before then shows an empty history saying exactly that, rather than a blank card that would read as though nothing had ever happened. For the same reason, a grant made before the history existed says its origin was not recorded rather than guessing at one.
The console works with JavaScript turned off, which is deliberate: it is reached during incidents, and the moment you most need to remove someone’s access is not the moment to discover a script did not load.
The weather console
The weather console is where the platform’s admins watch the
forecast pipeline, put failed work back in its queue, and choose which
wave models feed it. Like the account roster, it needs the platform
admin role — all but the field catalogue, which anyone may read
(see The field catalogue): a signed-out visitor
is sent to the sign-in page, and a signed-in account without the role
gets the same refusal as the roster (see Managing platform roles).
Its first page is /weather. An admin finds it as
‘Operations’ under ‘Workspaces’: in the ‘More’ menu on a
phone and, on the forecast pages from a tablet, in the menu the
header’s ‘Account’ button opens. The wide header of the other
pages keeps an ‘Admin’ link to the account roster. A reader who
is not an admin is offered no entry.
The console has a header of its own, the Operations header: the
Burning Swell brand, which leads to the home page, an
‘Operations’ button, and the console’s sections — ‘Status’,
‘Models’, ‘Variables’ and ‘Accounts’, the last of which
opens the account roster (/admin/users). The ‘Operations’
button opens a menu of your workspaces, with ‘Operations’ checked,
and ends in ‘Back to the forecast’, which leads home. On a tablet or a
desktop the sections are a row of buttons ending in the time now in UTC
(on the status page, the time the page last received new data, see
below); on a phone they sit in a menu
under a button that names the section you are in, and the header shows
no clock. On the field catalogue’s pages a reader who is not an admin
sees the brand, ‘Status’, ‘Models’ and ‘Accounts’ as
plain words rather than links, and ‘Operations’ as a plain label
with no menu, since those pages would only send them to
the sign-in page or the refusal. The forecast map is reached from the
tab bar and the ‘More’ menu of the public pages
(see The forecast map), and the colour theme from the ‘More’
menu’s settings, the account’s preferences, and the site footer’s bar
on the field catalogue’s pages. Its pages are:
- ‘Status’ (
/weather) The pipeline at a glance. At the top a verdict says whether the forecast can be trusted: on a phone the word alone — ‘Healthy’, ‘Degraded’, ‘At risk’ or ‘Not trustworthy’ — and on a wider screen the word with the count of switched-on models that are current (‘Degraded — 3 of 4 switched-on models current’). Under it one line names the models the ensemble blends, one sentence says what is wrong with the model the verdict is most concerned about (‘MFWAM failed its 18Z run; its last good cycle is 10 h old.’) or with the ensemble, and one says how many more models are registered and switched off. Right after a Retry the sentence stays on the run that was retried (‘MFWAM failed its 18Z run; …’) for as long as the queued answer shows, although the run is being fetched again. When the model the verdict is about has a run to retry, a button beside the verdict, ‘Retry Météo-France MFWAM now’, puts that run back to work (see Retry, Fetch again and Revive, below). Otherwise, when a single cycle is to blame, the button reads ‘Open arome 06Z in the inspector’ and opens that cycle in the cycle inspector (see Cycles and the cycle inspector, below).
Below the verdict come all six registered wave models: the switched-on ones under ‘Switched on · n of 6’, then the switched-off ones under ‘Switched off · not feeding the ensemble’, greyed — a model switched off is never hidden. Each card shows the model’s status word where the fleet shows its switch (‘switched off’ for a model switched off), and a few lines about its latest run: for a published run its date, its steps, size and duration and how long ago it was published; for a running one how many of its steps have landed, when its first file was taken for download and when it should finish — ‘started 12 min ago · ETA 8 min’, the time taken so far scaled to the steps still to come and rounded up to whole minutes, or ‘no step in yet’ before the first step lands; for a pending one that it is waiting for its files, or until when it waits for its provider; for a failed one how many runs in a row have failed and how long ago the last good one was published. A model is named by its full name, ‘NOAA GFS-Wave’, on its card and in every sentence about it. A switched-off card says why it adds nothing — ‘Switched off · never run’ for a model that has never run here, ‘Switched off · not in the ensemble’ for one that has, or, for a model whose fetching is not built, ‘Can’t be switched on yet: fetching from Copernicus Marine is not built’ — followed by its region for a regional model (‘· Mediterranean only’), and on a second line how often it runs while switched on, ‘runs 4× daily while switched on’. A model switched on although its fetching is not built says so first, ‘Switched on, but fetching from Copernicus Marine is not built’, with an amber light. A number the console does not know reads ‘—’. When the console cannot read the pipeline at all, every card reads ‘Unknown’ and ‘state unknown’, with no bars. Between the switched-on and the switched-off models, the ‘Work in flight’ card shows the workers, their queue and the work the queue gave up on (see Work in flight, below). On a tablet and a desktop, ‘Today's cycles’, ‘Storage’ and ‘Skill vs buoys’ follow (see The status panels, below), and whenever a model’s latest run has failed, a ‘Last failure’ card explains it. Beside or below the cards, the ‘Recent activity’ card is the activity feed the fleet shows (see The activity feed, below), with the retries, re-fetches and revivals of cycles as well.
The page keeps itself current as ingestion changes (see How current is the forecast?), and its clock in the header says how current it is: it shows the time the page last received new data, not the time of day — ‘15:59:04Z’ on a tablet, and on a desktop ‘live · 2026-08-22 15:59:04Z’; a phone’s header has no clock. If nothing has reached the page for 45 seconds, neither new data nor the connection’s regular signal of life, the clock turns amber and a band above the verdict reads ‘Reconnecting… Everything below is as of 15:59:04Z, 48 s ago. The numbers refresh by themselves when the stream is back.’ Both return to normal as soon as the connection does. When the console cannot read the pipeline’s state at all, the verdict reads ‘Pipeline state unknown’ and every model’s status reads ‘Unknown’.
- ‘Models’ (
/weather/models) The model fleet: every registered wave model with the switch that switches it on and off, the ensemble’s card, the coverage matrix and the activity feed. The subsections from The model fleet on describe it.
- A model’s page (
/weather/models/slug) One model in detail: its card with the run it serves and the run it waits for, the served run on a map, its recent runs with how long each waited for its provider and how long it took to fetch, its facts and the coverage of the run it serves (see A model’s page, below).
- ‘Variables’ (
/weather/variables) The field catalogue and each field’s own page,
/weather/variables/name. They are public (see The field catalogue).- ‘Accounts’ (
/admin/users) The platform’s account roster (see Managing platform roles).
The status page, the fleet, a model’s page, the inspector and the account roster carry no site footer, and the console’s header is the way between pages. The field catalogue and a field’s page end with the site footer and its language choice. On a phone every console page keeps the tab bar along the bottom of the screen, with ‘More’ marked, so the forecast is one tap away. The console reads in the language you have chosen, as every other page does; model names, slugs, run tags, times and units read the same in every language.
Work in flight
The ‘Work in flight’ card on the status page shows what the workers that download and process the forecast are doing right now. It sits between the switched-on and the switched-off models, and on a desktop in the row under the model cards. Its header counts the units of work in hand, the workers and the machines they run on, and says how old the card’s data is: ‘4 units in hand · 3 workers on 2 hosts · last push 3 s ago’; a tablet and a desktop add that the card is refreshed on every change, at most once every 2 seconds. If the card’s own data cannot be read, it says only ‘Work in flight is unavailable.’ and the rest of the page is unaffected.
- The time limit
The first line judges every running cycle against a time limit of 90 minutes, counted from the moment its first file was taken for download. A cycle still waiting for its provider to publish its files has not started and is never judged. With nothing running, the line reads ‘No cycle is running, none is past its time limit’; while every running cycle is inside the limit, it names the one closest to it, ‘Every running cycle is inside its time limit · icon-eu 12Z has 58 min of its 90 left’; and once a cycle is past the limit, the line turns to a warning with one sentence per cycle: ‘icon-eu 12Z has been running 1 h 57 — 27 min past its limit’.
- The three lanes
The work is split in three lanes: ‘Fetch & extract’, which downloads each model’s fields; ‘Blend’, which combines the switched-on models into the ensemble; and ‘Tiles’, which draws the map’s images. A phone shows the lanes one under another; a tablet puts Fetch & extract above Blend and Tiles; a desktop puts all three side by side.
Each run a lane is working on has a sentence and a bar. Fetch & extract reads ‘icon-eu 12Z · step 48 of 79 · 5 fields a step’; a run that failed today stays in the lane until a newer run of the model is published, with the next run: ‘arome 18Z · failed · 0 of 384 fetched · 00Z on schedule’. Blend reads ‘Blending the 12Z ensemble · 2 of 4 members ready’, or, while it waits for a model’s run, ‘Waiting on icon-eu 12Z · blends the 12Z ensemble once its core steps are in · 2 of 4 members ready’, with a bar of the models ready and the models still waiting, each named. Tiles reads ‘gfs-wave 18Z · 12 of 57’.
The bar divides the run’s units of that lane into done, running, waiting (ready to be taken), held back (waiting for a retry or for the provider’s publish time) and dead (given up on), and its legend counts them: ‘240 done’, ‘4 running’, ‘151 waiting’, ‘381 held back · next try in 4 min’, ‘3 dead’. A lane with nothing to do says what comes next and keeps the bar of the last run it finished: ‘Idle · gfs-wave 00Z is due; its files are published around 06:00Z’, ‘Idle · the 06Z ensemble is GFS-Wave, IFS-WAM, blended 12:29Z’, ‘Idle · gfs-wave 18Z tiles 57 of 57, finished 22:40Z’.
Beside each lane’s title, a short line counts the workers serving it and the units they hold: ‘2 workers · 4 units in hand’, ‘1 worker · idle’. Tiles are taken by the workers of Fetch & extract, and the Tiles lane says so.
- The workers
Under a lane’s runs, every unit a worker holds is a sentence: a light, the machine the worker runs on (on a tablet and wider), the unit — ‘icon-eu 12Z · Sig. wave height · +48 h’, with ‘· try 3’ when it is not the first attempt — and how long the worker has held it. A worker holding nothing reads ‘idle’ and when it was last seen: ‘seen 4 s’. A worker is named by its machine only.
The page hears every worker’s latest report at least every 15 seconds, whether or not any work moved, so a running worker with nothing to do stays green and reads between ‘seen 0 s’ and ‘seen 20 s’. A worker that has not reported for 30 seconds turns red on the page by itself, without waiting for new data: its sentence reads ‘not seen for 6 min’, followed by the units it still holds, or by ‘its units are back in the queue’ once they have been taken from it; and its lane shows a ‘not seen’ badge. After 90 seconds of silence its units go back to the queue for the workers that are still running.
- The dead-letter tail
The card closes with the units the queue gave up on, under ‘Dead-lettered · 7 units · the queue gave up on these’, grouped by cycle, one line per field with its lead times, the reason in plain words and when the last one died: ‘arome 18Z · Sig. wave height · +1 h, +2 h, +3 h · the provider refused the download · 1 h ago’. The reasons are those the activity feed uses (see The activity feed, below). The tail lists the cycles of the last 24 hours and every cycle whose dead units could still be put back to work, at most six. Under a cycle whose dead units can be revived, a button counts them — ‘Revive 3’ — and puts them back to work (see Retry, Fetch again and Revive, below). Under a cycle that cannot be revived, a line says why: ‘gfs-wave 18Z is published — its dead units cannot be revived’, ‘A newer arome run replaced arome 06Z — nothing to revive’, or ‘Météo-France MFWAM is switched off — switch it on from the models page first’. The tail ends with what reviving means: ‘Reviving puts a cycle's dead units back in the queue with a fresh deadline; it does not re-run anything already done.’ An operator revives a cycle’s dead units from the command line with
bs queue requeue. With nothing given up on, the card reads ‘Nothing dead-lettered. A worker not seen for 30 s turns red; after 90 s its units go back to the queue for whoever is alive.’
The status panels
Four cards on the status page sum up the day. A tablet and a desktop show the first three; a phone shows only the Last failure card, so a phone reader still learns what went wrong.
- ‘Today's cycles’
One labelled row per registered wave model, in the order the fleet lists them, over the hours of the current day in UTC (‘00’ to ‘24’), with a mark at the current time. Each run of a model draws a bar from the moment its first file was taken for download until it finished — or until now, while it is still running — so a bar’s width is how long the run took: green for a published run, the colour of a running card’s light while it runs, red for a failed one. A run still waiting for its provider has not started and draws nothing. A model switched off keeps its labelled row and draws nothing: an empty lane, not a missing one. A screen reader names the rows by the day they draw, ‘Runs on Wednesday 23 September’. On a tablet the card sits under the switched-off models; on a desktop under the work in flight.
- ‘Storage’
How much the pipeline keeps: ‘Model files’, the downloaded model files of the runs of the last two days, and ‘Spot values’, the forecast computed for every spot, each with its size and a bar showing its share of the two. The header reads ‘retention · 2 days’, and the card explains that model files are reclaimed after two days — a downloaded file can be fetched again, a computed spot forecast cannot. No disk size or capacity is shown: the console does not know one.
- ‘Skill vs buoys’
How close each switched-on model’s wave height has come to what the buoys measured over the last 30 days: one row per model with the typical error in metres (‘0.30 m’) and a bar that shortens as the error grows and is empty at one metre. The card says at how many spots near a buoy the comparison was made. A model with no comparison — every model switched off among them — has no row: no data, no number. When no model can be compared at all, the card says so in one sentence and draws no rows: ‘No model can be compared with a buoy yet: no spot near a buoy has a forecast and an observation in the last 30 days.’
On a tablet Storage and Skill sit in the right-hand column under the activity; on a desktop they sit side by side under Today’s cycles.
- ‘Last failure’
Shown whenever a model’s latest run has failed, at every width, under the activity (on a phone after ‘Recent activity’). The model’s short name stands on a red badge, and three sentences say what happened in plain words: whose download of which run failed and why — ‘Météo-France's download of the 18Z run failed: the provider refused the download.’ — how often it was tried and when the pipeline gave up (‘Its units tried 3 times; the pipeline marked the run failed at 21:47Z.’), and what happens next (‘The 00Z run will be attempted on schedule.’, or that the model is switched off and no run is attempted). The raw error is not shown here; ‘Full log →’ opens the failed cycle in the cycle inspector, which keeps it (see Cycles and the cycle inspector, below). While the model is switched on and its download works, the card ends with ‘Fetch arome 06Z again’, which downloads the failed run anew (see Retry, Fetch again and Revive, below).
If one of these cards cannot be read, it says ‘Cannot be read just now.’ and the rest of the page is unaffected.
Retry, Fetch again and Revive
The status page gives three commands, each where the trouble it answers is shown. None of them downloads anything itself: each puts work back in the queue, and the workers take it from there.
- Retry
On the verdict, when the model the verdict is about is switched on, its download works, and either its newest run has failed or its provider has issued a run for which no cycle exists yet. The button names the model, ‘Retry Météo-France MFWAM now’, and puts that run back to work: when the queue had given up on some of its units, those are revived; otherwise the run’s files that are not yet in the queue are queued. A run that is still being fetched, is published, or has been replaced by a newer run offers no retry.
- Fetch again
On the ‘Last failure’ card, while its run has failed, its model is switched on and its download works: ‘Fetch arome 06Z again’. Because it repeats the whole download, it asks first. The button opens a confirmation, ‘Fetch arome 06Z again?’, which says ‘Every file of the run is downloaded again, even those already stored. Spot pages keep showing this run meanwhile, each value replaced as its new file lands.’ A spot page shows the ensemble unless the spot prefers a model, and the ensemble built from the run is left as it is until the run is complete again and the ensemble is rebuilt. Its ‘Fetch again’ button queues every file of the run anew; ‘Cancel’ closes it and changes nothing.
- Revive
On each group of the dead-letter tail whose cycle can be revived (see Work in flight, above), a button counting the dead units: ‘Revive 3’. It puts that cycle’s dead units back in the queue with a fresh deadline, and re-runs nothing already done.
While a command is on its way, its button is disabled and reads ‘Queuing…’ (Retry, Fetch again) or ‘Reviving…’ (Revive) beside a spinner. The answer replaces the button, in the same place, with one line:
- Retry
‘Retry queued · fetch starts now’, or ‘fetch starts at 18:00Z’ when the run’s files are held back until that time; or, when the retry revived units the queue had given up on, ‘Retry queued · 3 units back in the queue’.
- Fetch again
‘Fetch again queued · 3 units to download again’: the count is every unit of the run that had finished or been given up on, each sent to download its file again — for a run that finished, all of its units — and it is the number the activity feed prints for the same re-fetch.
- Revive
‘Revived 3 units · back in the queue’.
A queued Retry or Fetch again then says who asked — ‘by you’ to the admin who asked, ‘by name’ to every other admin, in the words of the activity feed (see The activity feed, below). A queued Retry adds ‘no worker is running’ when no download worker is running, since the run then waits in the queue until one starts; for example ‘Retry queued · 3 units back in the queue · by you · no worker is running’. A revival names nobody on its line; the activity feed says who revived.
The queued line shows for 60 seconds, on every open copy of the status page at once, each in its own reader’s language; then the button, or whatever the page has to offer by then, returns. After a Fetch again the ‘Last failure’ card stays on the re-fetched run for that minute, although the run is being fetched again. It keeps the reason the run failed, which the run’s files still record, and its second sentence says when Fetch again was asked for instead of when the run failed: ‘Its units tried 3 times; fetch again was asked for at 13:05Z.’ A run fetched again from the command line although it had not failed gets no card. After a revival that emptied a cycle’s dead-letter group, the tail keeps a line with the cycle’s name (‘arome 18Z’) and its answer for the same minute.
When a command changes nothing, the line says why, in amber, and nothing is written or recorded:
- Retry
‘Already fetching arome 00Z — nothing to retry’; ‘arome 06Z is already published — nothing to retry’; ‘A newer arome run replaced 06Z — nothing to retry’; ‘arome 06Z has nothing left to fetch — fetch it again to download it anew’; ‘Météo-France MFWAM is switched off — switch it on from the models page first’; ‘CMEMS Mediterranean Wave has no working download yet’; ‘arome 06Z is not issued yet’.
- Fetch again
‘Already fetching arome 00Z’; ‘A newer arome run replaced 06Z — nothing to fetch again’; the switched-off and the no-working-download lines above; ‘arome 06Z has no files left in the queue to fetch again — a published run leaves the queue after 7 days’.
- Revive
‘Nothing to revive in arome 18Z’; ‘gfs-wave 18Z is published — its dead units cannot be revived’; ‘A newer arome run replaced 06Z — nothing to revive’; the switched-off line above.
A command that could not be carried out at all — the database did not answer, or the command failed — reads, in red, ‘The retry could not be started. Try again.’, ‘The re-fetch could not be started. Try again.’ or ‘The revive could not be started. Try again.’ Nothing was written; the button returns with the page’s next update or a reload, and pressing it again is safe. If your session has ended in the meantime, the page gives way to ‘Your session has ended.’ and a ‘Sign in again’ link, and nothing is changed.
Every command that was queued is recorded in the status page’s activity
feed with the run, the units it moved and who gave it (see The
activity feed, below). The commands need JavaScript. A cycle’s own
page offers Fetch again too, and Replace older runs (see Fetch
again and Replace older runs, below). From the command line an operator
re-fetches a run with bs forecast refetch (see Re-fetching a
run from the command line for developers in Burningswell
Developer Guide), replaces the runs before a ready one with
bs forecast supersede (see Replacing older runs from the
command line for developers in Burningswell Developer
Guide) and revives a cycle’s dead units with bs queue
requeue; their answers reach every open status page the same way,
‘by the command line’.
The model fleet
/weather/models, titled ‘Models’, draws one card for every
registered wave model, in catalogue order, switched on or off. A model
switched off stays on the board on a muted ground, so what the forecast
is not using is always in view. The count beside the title says how
many are registered and how many are switched on: ‘6 registered ·
1 switched on’. The catalogue registers six:
| Card | Issued by | Slug | Runs (UTC) |
|---|---|---|---|
| NOAA GFS-Wave | NOAA | gfs-wave | 00, 06, 12, 18 |
| ECMWF IFS-WAM | ECMWF | ecmwf-ifs-wam | 00, 06, 12, 18 |
| DWD EWAM | DWD | icon-eu | 00, 12 |
| Météo-France MFWAM | Météo-France | arome | 00, 06, 12, 18 |
| CMEMS Mediterranean Wave | Copernicus Marine | cmems-med-wav | 00 |
| DWD GWAM | DWD | gwam | 00, 12 |
A card names its model by the full name in the first column; a column
head in the coverage table uses its short name (‘GFS-Wave’,
‘IFS-WAM’, ‘EWAM’, ‘MFWAM’, ‘Med-WAV’, ‘GWAM’),
and the command line its slug. CMEMS Mediterranean Wave covers
the Mediterranean only. The derived ensemble — the blend of the
models switched on — and the atmospheric gfs-atmo source are not
wave models of their own: they have no model card, and are switched only
from the command line (see Enabling and parking from the command
line for developers in Burningswell Developer Guide).
The ensemble of a run takes, at every hour from that run on, the median of the models switched on that forecast that hour: each model’s own run, or, for a model that does not issue that run (GWAM issues only 00Z and 12Z) or missed it, its complete run of up to twelve hours earlier. Directions are blended on the compass, so two models that say 20° and 359° blend to about 10°, not 190°. A model whose run completes after the ensemble was built joins it: the ensemble is built again.
Under the title an alert gives the verdict, judged by the runs each model serves:
- ‘Current · 1 of 6 models switched on’
Every model switched on is current. The sentence under it names the ensemble — ‘The ensemble is NOAA GFS-Wave alone, built 12:29Z from the 06Z run.’ or ‘The ensemble blends NOAA GFS-Wave · ECMWF IFS-WAM, …’ — and adds that a model switched on joins with its first complete run. While a model just switched on has not completed a run, it reads ‘The ensemble stays NOAA GFS-Wave alone until ECMWF IFS-WAM completes its first run.’
- ‘Current · the 06Z is being fetched’
A newer run is being fetched: ‘The forecast serves the 00Z run until the 06Z is complete.’
- ‘Behind · the 06Z run failed’
A newer run failed while an older one still serves: ‘The forecast still serves the 00Z run. The 12Z is next.’ With more than one model switched on the model is named: ‘Behind · the NOAA GFS-Wave 06Z run failed’.
- ‘No model switched on’
Nothing is fetched and there is no ensemble.
- ‘Degraded’, ‘At risk’, ‘Not trustworthy’
The status page’s judgement, with the same count and sentence.
Each card carries its status light, the model’s full name, which opens the model’s page, the issuing organisation and how often it runs — ‘NOAA · 4 runs a day’ — the switch, and what the model is doing, the same at every width:
- the run it serves, whose tag opens that run’s page: ‘06Z served · 209 of 209 steps · ready 12:26Z’;
- a newer run being fetched, ‘06Z fetching since 12:00Z’, with the status page’s progress lines under it — the steps landed, their size, when it started and when it should finish — which move as files land;
- a newer run that failed, with the reason in words: ‘06Z failed at 12:23Z: NOAA’s file for +192 h has no Swell 2 height’;
- a newer run waiting for its provider: ‘12Z waiting for NOAA until 18:00Z’;
- for a model switched on with no run yet, its next run and when its provider’s files open: ‘Switched on · next run 18Z, its files open at 01:00Z on Thursday’;
- for a model switched off, ‘Switched off · not in the ensemble’, or ‘Switched off · never run’ for one that has never run.
The light is green while the run served is current, the primary colour while a newer run is fetched, red when a newer run failed, amber when the run served is late or stale, and grey for a model switched off or with no run served. The status console’s cards keep a row of bars for the recent cycles; the models page draws none.
Beside the cards, the ‘Blended ensemble’ card gives the ensemble’s freshness on a badge, ‘Built 12:29Z from the 06Z run · 7 h 07 m old of 13 h 15 m allowed’, and how many models it blends and values it wrote, ‘1 model · 11,800,558 values’; with no build it reads ‘Not built yet’. One sentence under the cards says what switching does.
On a phone the page is one column: the title, the verdict, the cards, the ensemble’s card, the coverage table and the activity feed. A tablet sets the cards two to a row and reads the activity feed before the coverage table. On a desktop — a window at least 1,280 pixels wide — the cards stand three to a row, and the coverage table and the activity feed sit side by side.
If the database cannot be read, the verdict says ‘Fleet state unknown’ and ‘The database could not be read, so no switch can be changed. Reload once it answers.’ Every card then reads ‘state unknown’ with its switch disabled, and the ensemble’s card, the coverage table and the activity feed are left out. A live update that cannot read the database is skipped, so an open page keeps the last board it had.
Switching a model on and off
A model’s switch stands in two places: on its card on the models page, and in the head of the model’s own page (see A model’s page, below). Both are the same switch and ask the same question. A switch never acts on its own. Pressing it opens a dialog that says what will happen; ‘Cancel’ closes it.
- Switching on
The dialog, ‘Switch on ECMWF IFS-WAM?’, names the model’s next run and when its files open — ‘Fetching starts with its next run, the 18Z, whose files open at 01:00Z on Thursday.’ — and says it joins the ensemble with its first complete run, that nothing older is fetched, and that switching it off later keeps everything already fetched.
- Switching off
The dialog, ‘Switch off NOAA GFS-Wave?’, says that new runs stop being fetched and that the model leaves the ensemble at the next build; nothing already fetched is deleted. Its button is drawn as a destructive action.
The dialog’s own button, ‘Switch on’ or ‘Switch off’, makes the change. While the change is being saved the button reads ‘Switching on…’ or ‘Switching off…’, every switch and button on the board is disabled, and the cards and the activity feed are dimmed; the switch itself does not move until the answer arrives. The answer redraws the verdict, the cards, the ensemble, the coverage table and the activity feed together, and closes the dialog. On a model’s own page the head dims instead, and the answer redraws the head, the recent runs and the Fetching line of About the model.
Every other open copy of the page, and of the status page, shows the change a moment later without a reload, each in its own reader’s language; the feed says ‘by you’ only to the admin who made it. A change made from the command line reaches them the same way.
The dialog asks for a state, not for a flip, so a page that missed another admin’s change cannot undo it by accident: confirming a switch off of a model that is already off changes nothing, and the answer shows the board as it stands. A change that cannot be saved is reported on its card, under the heading ‘Not saved’: ‘The change to DWD GWAM could not be saved. Try again.’, with the switch where it was — on a model’s own page, in its head. If your session has ended in the meantime, the board — on a model’s own page, the head — gives way to ‘Your session has ended.’ and a ‘Sign in again’ link, and nothing is changed.
A model whose download is not built cannot be switched on. Of the six,
that is CMEMS Mediterranean Wave: switched off, its card says
‘Can’t be switched on yet: fetching from Copernicus Marine is not
built’ with its switch disabled and an amber light; a request to switch
it on is answered on its card, ‘CMEMS Mediterranean Wave stays
off’, leaves the model off and records nothing. bs forecast
enable --source cmems-med-wav refuses the same way. Switching such a
model off is never refused: a database where it is switched on shows
‘Switched on, but fetching from Copernicus Marine is not built’, and
its switch still works.
The switch needs JavaScript; with scripting turned off it does nothing. The command line switches a model without a browser (see Enabling and parking from the command line for developers in Burningswell Developer Guide). Either way a switch is a change of data only: it takes effect at the model’s next scheduled run, with no restart and no release.
No model switched on
A newly created database starts with every model switched off, and any model can be switched off, the last one switched on included. With no model switched on the environment fetches nothing, and the models page’s verdict says ‘No model switched on’. Switch a model on to start fetching it at its next scheduled run. Every environment, staging and dev included, runs the same scheduled fetches, so what an environment fetches is decided on this page alone. A staging or dev environment holds no production data: an operator rebuilds it from the data committed to the source tree, and it starts with every model switched off (see Rebuilding a derived environment for developers in Burningswell Developer Guide). Models can also be switched on and off from the command line (see Enabling and parking from the command line for developers in Burningswell Developer Guide).
A model switched on again
A model switched on again starts afresh. Its cycles from before it was switched off are not counted as current anywhere in the console: until a cycle that started after the switch was turned on arrives, its card on the models page reads ‘Switched on · next run 00Z, its files open at …’ with a grey light, and on the status page ‘switched on — joins at its next 00/06/12/18Z run’, with the model’s own run hours, its bars leaving the earlier cycles out; its column in the coverage table reads an em dash; and the status page counts it as not yet run rather than as overdue. A model switched on for the first time reads the same until its first cycle arrives.
Waiting is not an alarm, and nothing turns it into one. A model that never produces a cycle — one whose data this platform cannot fetch, for instance — keeps its next-run line and does not by itself change the verdict; the absence of its cycles on the card and in the activity feed is the only sign. The developer guide describes which models a platform can fetch (see The Forecast Pipeline for developers in Burningswell Developer Guide).
The console dates a return from the switches it has recorded, so a model that has stayed switched on since before the record began is never treated as returning.
The activity feed
The ‘Activity’ card, ‘Newest runs and switches first.’, lists the six most recent events of the registered wave models, newest first, each with its time in UTC: every switch that changed something, every command given for a cycle, every cycle, and every build of the ensemble. Every row names the model by its full name. A switch reads ‘NOAA GFS-Wave switched off — leaves the ensemble at the next build · by you’ or ‘NOAA GFS-Wave switched on — joins with its first complete run · by you’, and its last words say who made it:
- ‘by you’
The admin reading the page.
- ‘by name’
Another admin: name is their display name, else their username, else their e-mail address.
- ‘by the command line’
An operator on the server (see Enabling and parking from the command line for developers in Burningswell Developer Guide).
- ‘by a deleted account’
An admin whose account has since been deleted. The switch stays on record; only who made it is lost.
A cycle is worded by the event the row stands for: a run that became ready to serve reads ‘NOAA GFS-Wave 06Z ready · n steps’, and keeps those words after a newer run replaces it; a run that is queued or being fetched reads ‘NOAA GFS-Wave 12Z started’, at the time it was queued; a run that failed — or was replaced with its failure still on record — reads ‘failed’ with the reason in plain words, ‘Météo-France MFWAM 06Z failed · the provider refused the download’. The reason is one of: the provider refused the download; the field was missing from the provider’s files; the download timed out; a downloaded file could not be read; or, for anything else, that the fetch failed. The cycle inspector keeps the error itself (see Cycles and the cycle inspector, below). A failure with no recorded error reads ‘failed’ alone. A build of the ensemble reads ‘Ensemble built from the NOAA GFS-Wave 06Z run’, naming the models it blended, at the time it finished; an older build names its run alone, ‘Ensemble built from the 00Z run’. The status page’s feed lists no ensemble builds.
Both feeds list the commands given for a cycle, each naming the run and who gave it, in the words the switches use: ‘Météo-France MFWAM 06Z retry queued · by you’, ‘NOAA GFS-Wave 06Z: fetch again queued · 2926 units to download again · by the command line’ (see Re-fetching a run from the command line for developers in Burningswell Developer Guide) and ‘Météo-France MFWAM 06Z revived · 3 units · by you’, the count being the units sent back to the queue — for a re-fetch, the units sent to download their files again.
The newest switch or command is highlighted for its first minute. The feed keeps itself current like the rest of the board, and says ‘no recent activity’ when there is nothing to list.
A refusal records nothing, and neither does a request for the state a model is already in. Switches made before the platform kept this record were not reconstructed and never appear.
The coverage matrix
The ‘Coverage’ card has a row for each of the seventeen forecast fields, by its full name, and a column for every registered model under its short name, switched off ones included, then the ‘Ensemble’ column; the columns are the same at every width. It counts the steps of the run each model serves, so a newer run still waiting or fetching never hides the one in use. A cell reads:
- a number on a badge
How many steps of the run served carry the field: green when every planned step does, amber when only some do.
- ‘off’
The model is switched off; its column keeps its place.
- ‘not yet’
The model’s download is not built (CMEMS Mediterranean Wave).
- ‘·’
The model does not carry the field; a screen reader hears ‘not carried’. ECMWF IFS-WAM, for one, carries no swell partitions and no wind.
- ‘—’
There is nothing to count: the model serves no run of its current stint, or the run served has no step of the field.
The ‘Ensemble’ column reads ‘1 of 1’: how many of the models switched on carry the field, of those switched on. A legend under the table says what the words mean.
A model’s page
Every wave model has a page of its own, /weather/models/slug
— /weather/models/gfs-wave for NOAA GFS-Wave — opened from the
model’s name on the models page. Like the rest of the console it needs
the platform admin role. The page is titled with the model’s full name,
and the trail at its top, ‘Models / NOAA GFS-Wave’, leads back to
the models page. The head, the recent runs and the Fetching line of
About the model keep themselves current without a reload: when a run
turns from waiting to fetching to serving, or a model is switched on or
off anywhere — on this page, on the models page, from the command line
— they change a moment later, in the page’s language. The rest of the
page shows the model as it was when the page was opened; reload it to
see the rest of what has changed.
The head. The model’s card opens the page: its full name, one line saying what it is — ‘NOAA · Open Data · wave · grid 0.25° · 384 h ahead · runs 00·06·12·18Z’ — its status light with a word, and its switch, shown in the model’s state. The switch works as it does on the models page: pressing it opens the same dialog, and the answer redraws the head (see Switching a model on and off, above). A model whose fetching is not built cannot be switched on here either; its switch is drawn disabled, and a refusal is said in the head, under the model’s name. Under the name come a few facts:
- Serving
The run readers get, when it landed and how long ago: ‘06Z run · landed 12:26Z, 41 min ago’.
- Steps
How much of that run landed, as a track of ten segments and in words: ‘209 of 209 · 3,553 files’.
- Failed
The newest run, when it failed while an older one still serves, and why: ‘06Z run at 12:23Z: NOAA’s file for +192 h has no Swell 2 height’. Serving then reads ‘00Z run · landed 06:25Z’, and there is no Steps fact.
- Fetching
A newer run being downloaded: ‘12Z run since 18:00Z’.
- Next
The run the model waits for and until when — ‘12Z · waiting for NOAA until 18:00Z’ — or its next run and when that run’s files open.
A model switched off has one fact instead: ‘Fetching: none: not fetched, not in the ensemble’, or, for a model that has never run here, ‘none: switched off since it was added’.
The word beside the light is the model’s state:
- ‘Current’ (green)
The model is switched on and serves a current run. It stays current while a newer run waits for its provider or is being fetched.
- ‘Failed’ (red)
The newest run failed while an older run still serves.
- ‘Switched off’, ‘Never run’ (grey)
The model is switched off; ‘Never run’ when it has never run here.
- ‘Late’, ‘Overdue’, ‘Orphaned’, ‘Stale’, …
Any other state of a switched-on model, in the status page’s words and colours — ‘Never run’, for one, for a model switched on whose first run has not landed. A run whose provider has not published it yet is waiting, never orphaned.
- ‘Unknown’
The pipeline could not be read.
The served run on the map. Under the head, the model’s field on a map, from the run it serves: the card’s line names that run and its day, and says when a newer run has no files yet (‘06Z · Wed 23 Sep · the 12Z has no files yet’). The tabs under it pick the field, among those the model carries — ‘Wave height’, ‘Period’, ‘Direction’, ‘Swell 1’ to ‘Swell 3’, ‘Wind’ and ‘Wind flow’ (DWD GWAM, which carries no swell, has no swell tab); a field with no published picture says ‘No map for this field’. The run tabs offer the served run and, while its files are kept, the run it replaced, and the line beside them says when the run began to be served (‘run Wed 23 Sep 06Z · served since 12:26Z’). The map, its key and its transport work as on a field’s page (see The field page); ‘Wind flow’ shades the wind speed with the trails moving over it. The map opens on the model’s own waters: the Mediterranean for CMEMS Mediterranean Wave, the North-East Atlantic for the others. A model with no run to draw has no map card; the map does not follow the pipeline live, a reload does.
Recent runs. The model’s six newest runs, the failed ones first, then the newest first. A line under the title says what the two times mean: ‘The last six. Waiting: from queueing the run until NOAA publishes it. Fetching: from then until it was ready to serve.’ Each row gives:
- ‘Run’
The run’s day and hour, ‘Wed 23 Sep · 06Z’, which opens that run’s page (see Cycles and the cycle inspector, below).
- ‘State’
‘Waiting’, ‘Fetching’, ‘Serving’, ‘Replaced’ (a newer run serves instead) or ‘Failed’.
- ‘Waiting for NOAA’
How long the run waited for its provider: ‘06:02Z–12:00Z · 5 h 57 m’, or, while it still waits, ‘since 12:02Z · 1 h 04 m’. A run a Retry, Fetch again or Revive put back to work reads ‘started by hand’; the page looks for those commands among the model’s eight newest runs only, so an older run is never marked.
- ‘Fetching’
How long the download took: ‘12:00Z–12:26Z · 26 m’; for a run still waiting, when its files are expected, ‘from 18:00Z’.
- ‘Steps’
The steps that landed of the steps planned: ‘209 of 209’.
A failed run has one more line under its row: the reason in words. A number the page does not know reads ‘—’.
About the model. The model’s facts in words: ‘Provider’; ‘Grid’, ‘0.25°, about 28 km’; ‘Forecast’, ‘384 h ahead · runs 00·06·12·18Z’; ‘Published’, when the provider’s files are expected, ‘about 6 h after each run’, or per run where that differs, ‘8 h after 00·12Z, 7 h after 06·18Z’; ‘Role’, ‘primary’, ‘major’ or ‘regional’; ‘Fields’, how many fields the model carries and which, ‘14: waves, wind, three swells’; and ‘Fetching’: ‘every run while switched on’; ‘none: not fetched, not in the ensemble’ for a model switched off; or, for a model switched on whose fetching is not built, a sentence saying so. A model that has never run has no Fetching line here.
Coverage. Each field of the run the model serves, with the steps of that run that carry it, ‘209/209’: green when every step does, amber when some are missing or a step the forecast can do without failed, red when a step the forecast needs failed. With no run served there is no Coverage card.
A model with no run. A model that has never run has, in place of its runs, one panel: ‘No run yet --- The map, the coverage and the runs fill in once DWD GWAM is switched on and its first run lands.’ For a model switched on it reads ‘… once DWD GWAM’s first run lands.’ A model switched off that has run before still shows its runs and its coverage.
When something is wrong. When the pipeline cannot be read, the
head reads ‘Unknown’ and About still shows the model’s facts, but
the runs give way to ‘The cycles could not be read. Try again.’ An
address naming no wave model — /weather/models/ww3, or the
ensemble, which is a blend rather than a model — answers
‘No model called “ww3”’ (or ‘No such model’ for an address
that cannot be a model’s), ‘6 wave models are registered. Pick one
from the list.’ and an ‘All models’ button back to the models page.
On a phone and a tablet the page is one column: the head, the map, the runs, About and Coverage. On a desktop — a window at least 1,280 pixels wide — the map and the runs sit beside About and Coverage. The map and its slider are the ones a field’s page draws (see The field page).
Cycles and the cycle inspector
A cycle is one run of one model as the platform ingested it: the
steps it planned, the steps that landed and the fields each step
carries. Its page, /weather/models/slug/cycle/id,
shows one cycle in full; a run’s tag on a models page card and every row
of a model’s ‘Recent runs’ open it.
The page leads with a trail — ‘Models / NOAA GFS-Wave / Wed 23 Sep · 06Z’ — whose first two parts lead back to the models page and the model’s page. Its card, the cycle inspector, is headed with the cycle’s number and run, ‘Cycle 1841 · Wed 23 Sep · 06Z’, beside a badge naming the run’s state: ‘Serving’, ‘Replaced’, ‘Failed’ (which stays after a newer run replaced it), ‘Waiting’ or ‘Fetching’. It shows:
- four figures: ‘waiting for NOAA’, how long the run waited for its provider, from being queued until its fetch began (‘5h 57m’, ‘06:02Z–12:00Z’; while it still waits, ‘since 12:02Z, so far’; for a run started again by hand, a dash and ‘started by hand’); ‘fetching’, how long the fetch took until the run was ready to serve, against the 90-minute limit (‘26m’, ‘12:00Z–12:26Z · limit 90 m’) — for a failed run, until it failed, and for a waiting run the time the provider’s files open and how long a fetch usually takes (‘18:00Z’, ‘when NOAA publishes · about 26 m’); ‘steps’, the steps every field landed for, of those planned (‘209/209’), with the files counted (‘17 fields each, 3,553 in all’, ‘complete; 1 of 3,553 fields missing’, ‘complete; 1 step without wind speed’, or while the run is in flight ‘0 of 3,553 fields landed’); and ‘stored’, the size of its files (‘4.0 GB’), how many there are and, while the run serves, their average size — ‘never served’ for a failed run, ‘nothing stored yet’ before anything landed;
- a line in words. A served run that landed complete says so, how long it waited for its provider — as every run of the model does, or how much longer than usual — and how its fetch compares with the limit: ‘Every field of every step landed. The run waited 5 h 57 m for NOAA to publish, as every GFS-Wave run does, and the fetch itself took 26 minutes, well inside the 90-minute limit.’ A waiting run says what it waits for and when fetching starts; a fetching run since when, and how many fields have landed;
- while the run waits or fetches, a bar of the fields landed;
- for a finished run that lacks a field at a step, an alert naming the first such unit. A field the run can serve without is a warning — ‘Swell 2 height at +12 h (valid Tue 12:00Z) is missing’, ‘A swell 2 field is not needed to serve a run, so this one served without it from 06:26Z until 12:25Z.’ A field it needs — waves, wind and the first swell, up to +120 h — failed the run: ‘Wind speed at +54 h (valid Thu 00:00Z) was given up at 00:13Z on Tuesday’, ‘Wind speed is needed to serve a run, so this run failed at 00:13Z on Tuesday and was never served. The Tuesday 00Z run replaced it at 06:26Z.’ The time is when the platform gave that field up. When more fields were given up the title adds ‘(and 1 more)’;
- the run’s steps, twelve a page, in lead order — every step the model
plans for the run, so a step that never landed shows as a row of dashes
rather than a gap: ‘Lead’ (‘+12 h’), ‘Valid’ (the time the
step is valid for, in UTC, with its day: ‘Wed 06:00Z’),
‘Fields’ (how many of the run’s fields it carries, ‘17/17’; a
run fetched before the model gained a field, such as the wind sea, is
counted against the fields it fetched, ‘14/14’),
‘Size’, ‘Fetched’ (when its last field arrived) and
‘State’: ‘Complete’; the field it lacks and how many more,
‘No swell 2 height +1’, red when the run needs one of them and amber
when it can serve without; ‘Nothing landed’; or ‘Not yet’ while
the run waits or fetches. On a phone the table shows Lead, Valid, Fields
and Fetched. Under it, the range on view (‘1–12 of 209’) and the
pages: Previous, the first and last page, the pages around the one on
view (three on a phone, five wider) and Next. Each page is a link —
?steps=2opens the page on the second, and a page opened in a new tab keeps it — and a click brings the page’s rows in place, the card dimmed and five placeholder rows standing in until they land; - at the card’s foot, what can be done about the run (see Fetch again and Replace older runs, below).
Beside the card on a wide screen, and under it on a phone or a tablet, stand three more cards:
- ‘Coverage’: each field of the model by its full name with its steps landed of steps expected, ‘209/209’, in a badge that is green when the field is complete, amber when a field the run can serve without is short, red when a field it needs is, and grey while the run waits or fetches;
- ‘Stored files’: how many files the run stored, one for each field
and step, and a ‘Field’ list to pick one field; its files, twelve a
page, with their lead, the day and time they are valid for (‘Wed 23
Sep, 06:00Z’) and their size, under pages as the steps’ —
?field=tp&files=2opens the second page of the peak period; - ‘Log’, what went wrong and why: for each field the platform gave up, when and after how many tries — ‘Swell 2 height at +12 h was given up at 06:03Z, after 1 try.’, with the day when it is not the run’s (‘00:13Z on Tue 22 Sep’), or for a field given up at several steps ‘… was given up at 3 steps, the first at +12 h …’ — followed by the provider’s error as the platform recorded it. A failed run whose fields were not given up one by one shows its own error under ‘The run failed with this error:’. Otherwise the log says ‘Nothing went wrong: no field was given up.’, or while the run fetches ‘Nothing given up so far.’ A run a newer one replaced ends its log with ‘Nothing to fetch again: a newer run replaced this one.’
While a run waits and nothing has landed, the steps, ‘Coverage’,
‘Stored files’ and ‘Log’ each say ‘Nothing has landed
yet.’ Two days after its run the platform removes an older run’s files
(bs storage gc); the page then says ‘The files of this run
were removed after 2 days.’ in the steps and in ‘Stored files’,
counts ‘Coverage’ from what the run fetched, and keeps what it stored
as its ‘stored’ figure with ‘removed after 2 days’.
Fetch again and Replace older runs
The inspector’s foot offers two commands for a finished run:
- Fetch again
For a run that serves or failed and that no newer run has replaced. It downloads every field of the run again, even those already stored. The button opens a confirmation, ‘Fetch the 06Z run again?’: ‘Every field of this run is fetched again: 3,553 fields, 17 at each of 209 steps. NOAA has already published them, so fetching starts at once and takes about 26 m.’ — the length being how long the model’s recent fetches usually took — then ‘Spot pages’: ‘Keep showing this run, each value replaced as its new file lands’, and ‘Recorded as’ your name, ‘in the activity feed’. ‘Fetch again’ starts it; ‘Keep this run’ closes the confirmation and changes nothing.
- Replace older runs
For a run that serves. Every older run of the model that is not replaced yet — a run that is ready or failed — stops being served at once, as it would when a newer run finishes on its own. An older run still being fetched is left alone, and one the platform finds more complete than this run is kept. Nothing is deleted: storage clean-up removes old files as it always does. Its confirmation, ‘Replace the runs before the 06Z run?’, says so and names who it is recorded as; ‘Replace older runs’ (red) does it and ‘Keep them’ changes nothing.
A button that cannot be pressed is greyed, with one line saying why: ‘Switched off: switch the model on first.’, the no-working-download line of the status page, or ‘Nothing older to replace: every run before this one already is.’ A waiting, fetching or replaced run offers neither. While a command is on its way its button reads ‘Queuing…’ or ‘Replacing…’ beside a spinner. The answer closes the confirmation and redraws the card: after Fetch again the run reads ‘Waiting’ until a worker picks up its first file, then ‘Fetching’, and a toast at the corner of the screen says ‘Fetching the 06Z run again’ and ‘Started 13:07:15Z by Ane Goikoetxea. Spot pages keep showing this run, each value replaced as its new file lands.’; after Replace older runs it says ‘Replaced 2 runs before the 06Z run’. The toast is drawn from the activity feed’s record, so reloading the page within the minute shows it again. When a command changes nothing, the line says why, in amber: ‘Already fetching gfs-wave 06Z’, ‘A newer gfs-wave run replaced 06Z — nothing to fetch again’, ‘gfs-wave 06Z is not ready — only a ready run replaces the runs before it’, ‘Nothing older than gfs-wave 06Z to replace’ or ‘The guard kept every run before gfs-wave 06Z: each is more complete than this one’; one that could not be carried out at all reads, in red, ‘The re-fetch could not be started. Try again.’ or ‘The older runs could not be replaced. Try again.’ Both commands are recorded in the activity feed — ‘NOAA GFS-Wave 06Z replaced the runs before it · 2 runs · by you’ — and need JavaScript.
While the run can still move — it waits, fetches, or serves or failed with nothing replacing it — the page follows it without a reload: the badge, the four figures, the line, the bar, ‘Coverage’ and the commands change as files land, and the page of steps on view refreshes itself. A replaced run’s page does not follow anything.
An address naming a cycle that does not exist is a page that says so — ‘No cycle 1843’, ‘No run has this number yet. The newest is 1842, Wed 23 Sep · 12Z.’ — with ‘Back to NOAA GFS-Wave’; an address whose last part is not a number says ‘No such cycle’. An address filing a cycle under another model’s name leads to the cycle’s own address, and one naming no wave model is the models’ ‘No model called …’ page. When the cycle cannot be read, the page says ‘The cycles could not be read. Try again.’
The field catalogue
The field catalogue, /weather/variables, is the public part
of the console: anyone may read it and each field’s own page (see The field page), signed in or not. It lists the
seventeen forecast fields the platform stores (see Forecast fields)
as cards, in the catalogue’s order: the three wave fields, the two wind
fields, each swell train’s height, period and direction, then the wind
sea’s. A card
gives the field’s name and unit, one sentence saying what it measures,
its group and the code the providers publish it under
(‘waves · HTSGW’), and a row of dots, one per model and one for the
ensemble, lit where that model carries the field; a screen reader hears
the dots as ‘carried by n of m’.
Above the cards, the groups — ‘All’, ‘Waves’, ‘Swell 1’, ‘Swell 2’, ‘Swell 3’, ‘Wind sea’ and ‘Wind’, each with its count — narrow the page: a group shows only its own cards and dims the other rows of the matrix below; ‘All’, or ‘show all 17’ on a phone, shows every card again. Beside them, ‘carried by’ offers one button per wave model the platform registers (GFS-Wave, IFS-WAM, EWAM, MFWAM, Med-WAV and GWAM) and none for the ensemble. A model fades every card it does not carry and marks its own column in the matrix; faded cards stay in place and still open their page, and pressing the same button again clears the choice. The two choices combine — a group hides cards, a model fades them — so the page never empties, and the sentence under the cards says what is shown (‘The 3 wave fields · faded: what EWAM does not carry’). On a phone the groups and the models share one row that scrolls sideways. Narrowing happens in your browser and asks nothing of the server.
‘Who carries what’ is the matrix: a row per field, one row per swell train for its three fields and one for the wind sea’s, and a column per model with the ensemble last. A dot means the model publishes the field at all, not that today’s run arrived, which is the status console’s question (see How current is the forecast?). A model switched off keeps its column. The ensemble carries whatever any real model provides. On a desktop ‘Reading a field’ stands beside the matrix and explains the groups.
With JavaScript turned off every card, row and cell shows, the buttons do nothing, and every card opens its field’s page.
A field’s own page
Each field has a page of its own at
/weather/variables/name, where name is the field’s
stored name: /weather/variables/hs for the significant wave
height. Anyone may open it, signed in or not. On a phone or a tablet
a card of the catalogue opens that page. On a desktop — a window at
least 1,280 pixels wide — a card opens the field under the cards
without leaving the catalogue: the address stays the catalogue’s, and
‘The field's own page’ at the top right of the field opens its
page. The catalogue opens with the significant wave height chosen, and
the chosen field’s card is outlined. The field under the cards has the
same map, runs and transport as its page.
The page draws the same parts at every width: one column on a phone and a tablet, where on a phone the source pick’s tabs wrap onto more than one row, and on a desktop the map across the page with the transport on one row, and the ‘Field’ card beside the carriers under it. It opens with the trail ‘Variables / Significant wave height’ — ‘Variables’ leads back to the catalogue (see The field catalogue) — the field’s full name as the heading, and a line under it with the stored name, the unit as a word, the code NOAA’s files name it by and how many of the registered wave models carry it (‘hs · metres · HTSGW · carried by 6 of 6 models’).
Under the heading, ‘Source on the map’ offers one tab per wave model the platform registers, by its short name (GFS-Wave, IFS-WAM, EWAM, MFWAM, Med-WAV, GWAM); a model that has no run to draw — switched off, not fetchable yet, or serving nothing — is greyed out. The ensemble has no tab: it is worked out per spot and has no map.
Then comes the field’s map, drawn from a real run as /map draws
the forecast: it opens on the run the first model in catalogue order
that serves one is serving, and a tab of the source pick moves it to
that model’s newest run. Above the map, the run tabs offer the run that
model serves and, while its files are still kept (two days), the run it
replaced, newest first, beside a line naming the model and the run
(‘GFS-Wave · run Wed 23 Sep 06Z · served since 12:26Z’).
A tag on the map’s top-left corner says what the map shows: a model’s own step (‘Model step · +9 h’), a blend between two steps (‘Blended · 60 % of the way from +9 h to +12 h’), or, on a step whose picture is missing, which step it still shows (‘No map file for +129 h · the map still shows +126 h’). Point at the sea to read the value there, its position and, between two steps, the two values it is blended from; click to pin it, and click again to let it go.
Under the map the key reads the colour scale. ‘Full range’, the start, spreads the colours evenly over everything the pictures can hold (0 to 10 m for wave height, 0 to 20 s for period, 0 to 30 m/s for wind), so a clipped top or a hole shows; ‘As on the map’ uses the scale readers see on the map. Your browser remembers the choice.
Then the transport. Play runs the forecast as a film, one model step a second, faster with the speed button (‘1×’, ‘2×’, ‘4×’); between two of the model’s three-hourly steps the map is blended from the steps either side, and the time reads the minute (‘Wed 23 Sep · 16:48 UTC’, ‘+10 h 48 m · between model steps’). ‘Between steps: Hold’ plays the model’s own steps alone; it is where the map starts if you asked your system for less motion. The arrows step to the previous or the next model step, and the track can be dragged. Under the track one small mark per step says whether its picture is on the server, loading, missing or unreadable, checked as soon as the run is picked, and the line under it counts them (‘57 frames, every 3 h to +168 h · all on the server’). While play waits for a picture it stays on a whole step, the play button turns a ring, and a line says so (‘Holding on +15 h until +18 h has loaded’); a missing step is passed over. Playing asks the server for nothing: your browser fetches each picture from the forecast archive. Pictures are published for significant wave height, peak period and wind speed (and the wind’s flow); any other field’s map says ‘No map for this field’.
A browser that cannot draw the live map (no WebGL) gets a still image of each step instead, drawn from the same pictures: the tag adds ‘still image’, a line under the map says so, and the source pick, the runs, the steps and Play keep working, a whole step at a time.
The ‘Field’ card says what the field is: ‘Stored as’, the ‘GRIB code’ (NOAA’s name for it), the ‘Unit’, the ‘Group’ and ‘Carried by’ — ‘6 models and the ensemble’. A platform admin also reads the ‘Ensemble’: its freshness, its run and how many models it blends (‘Fresh 06Z run, from 1 model’).
‘Where it comes from’ lists, under the map and the card, each model that carries the field by its full name, with its organisation and its grid (‘NOAA · 0.25°’, ‘Météo-France · 0.025°’), and the ensemble last. Anyone else reads the models’ names and grids, the ensemble as ‘derived · the models that are on’, and a closing line naming the run the map shows (‘The map shows NOAA GFS-Wave's 06Z run.’). A platform admin reads, beside the heading, how many models are switched on (‘today's runs · 1 of 6 models on’), and on each row a lamp, what the model is doing, a badge and a button to the model’s page (see A model's page):
- Serving a run
‘landed 12:26Z · 12Z waits for NOAA until 18:00Z’ while a newer run waits for the provider’s files — the time is when they are expected — or ‘landed 12:26Z’ and the next run; the badge reads ‘06Z served’.
- Switched on, serving nothing yet
The next run and when its files open; the badge is the model’s state as the status console words it (‘never run’, ‘waiting’, ‘failed’ …).
- Switched off
‘carries hs · not in the ensemble’, or ‘never run’ for a model that has never run; the badge reads ‘switched off’.
- Cannot fetch yet
A model whose download is not built reads ‘its download is not built’, with its region (‘Mediterranean only’), and the badge ‘cannot fetch yet’, whether it is switched on or off.
The ensemble’s row then reads where it is derived from (‘derived · NOAA GFS-Wave alone’), its run and when it was built (‘run 06Z, built 12:29Z’), its freshness, and a button to the status page. The rows are read once, when the page loads, and do not change while you watch. A value the service could not read shows as ‘—’.
The page has three other faces:
- No run yet
When no model serves a run of the field, the map shows the land alone under ‘No run to draw yet’, which names the model whose first run is awaited and how long after its run time its files are fetched (‘from 6 hours after its run time’). There is no run pick, slider or button; the heading, the ‘Field’ card and ‘Where it comes from’ still show.
- No WebGL
When your browser cannot draw WebGL, the map is a still image of each hour drawn from the same pictures: the tag adds ‘still image’, a line under the slider says so, and the source pick, the runs, the hours, ‘Play’ and the read-out keep working.
- An unknown field
An address naming no stored field answers “not found” with the trail ‘Variables / name’, ‘No field is stored as “name”’, how many fields the catalogue lists, and a ‘Field catalogue’ button back to it.
The page carries the site footer, with the language line on a phone and the language, units and theme controls from a tablet up.
The field catalogue and a field’s page keep no connection to the server open, so a language, units or theme chosen in another tab applies the next time they are loaded. They read in your language; model names, codes, units, run tags and times stay as they are.