Burning Swell
SpotsPlacesMapSessionsStatsSign in
Contents
  1. Burningswell User Guide
  2. Introduction
  3. Getting Started
  4. The Web Application
  5. Forecasts and Spots
  6. Index
  7. Pages
On this page
  1. Setting up: the welcome flow
  2. The home page
  3. Browsing and searching spots
  4. Comparing spots
  5. Browsing by place
  6. The forecast map
  7. Signing in and creating an account
  8. Signing in to other applications
  9. Your account
  10. Your quiver
  11. Your sessions and Surf Life
  12. Sharing a spot
  13. The documentation
  14. Managing platform roles
    1. Granting and removing a role
    2. What the history shows, and what it does not
  15. The weather console
    1. Work in flight
    2. The status panels
    3. Retry, Fetch again and Revive
    4. The model fleet
    5. Switching a model on and off
    6. No model switched on
    7. A model switched on again
    8. The activity feed
    9. The coverage matrix
    10. A model’s page
    11. Cycles and the cycle inspector
      1. Fetch again and Replace older runs
    12. The field catalogue
    13. A field’s own page

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.

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.

  1. 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 Language on 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 Units on 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 Location on your account page, which also offers ‘Never’; an account set to ‘Never’ sees neither card chosen here.

  2. 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.

  3. 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.

  4. 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, 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. 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’ row of your account’s ‘Preferences’ card (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.

‘Always’

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.

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 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. ‘Open the map’ takes you to the full map.

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. ‘Open 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 recolours the map’s dots for that day, without loading anything.

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. ‘Open 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:

AddressParametersPage
/continentsnoneThe world map, the week’s best regions and every continent.
/continents/namepageOne continent: its map, its best regions and its countries.
/countriescontinent, q, pageEvery country holding a surf spot.
/countries/namesort, page, bucketOne country: its regions, day by day.
/regionscontinent, q, pageEvery surf region, by country.
/regions/nameday, pageOne 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 is a block of fixed height between the site header, with Map marked as the page you are on, and the site footer. On a phone it is 640 pixels tall, with the zoom buttons, Locate and a Layers button at its top right and a bottom sheet over its foot holding the layers, the timeline and the colour scale. On a tablet a toolbar under the header holds the layers, the map is at least 470 pixels tall, the timeline floats over its foot and a rail beside it holds the colour scale. On a desktop the map is 700 pixels tall across the whole width, the layers are a panel at its top left and the timeline floats over its foot with the colour scale in it.

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. On a phone it sits in the sheet at the bottom of the map, and when the sheet would cover the pin you picked, the map slides up until the pin shows above it; on a tablet the card sits at the map’s top left and on a desktop at its right under the zoom buttons, and there the map does not move. The pin you picked is ringed. 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 close button or the Escape key closes the card.

The layer picker chooses which field is draped: Wave height, Peak period, Wind speed — and Wind, which is the same wind drawn as motion. These are the fields the forecast pipeline draws; there is no swell layer. On a phone and a tablet the picker is a row of tabs; on a desktop it is the panel at the map’s top left, each layer beside a swatch of its own colour scale, with the model and the run the layers are drawn from under Model — ‘NOAA GFS-Wave 12Z’. Pick it and 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.

Rather than dragging the slider, press play: the map steps through the run on its own, 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 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 02’, ‘Thu 03’, and so on, on a phone or a tablet the weekday alone — so a position on it reads as a day rather than as a fraction. 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 label beside the track reads ‘Wed 30 Sep · 12:00 UTC’ (on a tablet ‘Wed 12:00 UTC’), and the day ticks are UTC days. On a phone the same label sits under the sheet with the model and the run after it; on a tablet the toolbar names them with the step between the hours: ‘NOAA GFS-Wave · 12Z · 3-hourly’. 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. An Overlay slider — in the phone’s sheet, under the scale in the tablet’s rail, in the desktop’s layer panel — fades the field: turn it down 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.

Hovering the overlay reads out the value under the pointer, and the colour scale shows the layer’s colours between the numbers they span, with the unit and three to five labelled stops between — wave height reads 0 to 10 m in steps of 2.5. The numbers are the ones the field is drawn on, so a colour on the water reads as a value. Two things the colours will not do: they will not paint the land or anywhere the model does not cover, which stay 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 rail beside the map on a tablet — and under the map on a phone or a desktop when the map cannot be drawn — the In view card lists 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. On a tablet the card follows 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 timeline turn dark 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:

  1. The client application you were signing in to, when a sign-in started there (see Signing in to other applications).
  2. 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.
  3. 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.
  4. 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 is a small settings surface. It opens with who you are signed in as — your primary address, when you joined, and how many sessions you have logged — followed by one card per section: ‘Profile’, ‘E-mail addresses’, ‘Preferences’, ‘Security’ (changing your password, plus the ‘Active devices’ card below it), ‘Connected logins’, ‘Your data’ and ‘What we store’. On a tablet or desktop a navigation rail beside the cards jumps straight to a section; on a phone the sections simply stack. The rail carries one further entry, ‘Boards’, which opens a page of its own — your quiver.

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. 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’), your ‘Location’ choice and your home spot. The ‘Location’ row decides how the home page may obtain your position: ‘Always’ (locates you on every visit), ‘Ask’ (only when you press ‘Use my location’) or ‘Never’ (never asks, never locates); the line under the row names what the current choice does, and The home page, above, describes what each one changes on the page. It is a choice about asking, not a position: the account never holds where you are. 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 ‘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 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. 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 and recently viewed spots — 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, and preferences — 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 — ‘Always’, ‘Ask’ or ‘Never’ — 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 ‘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. 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 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 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.

‘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. ‘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’ puts it back. ‘Delete’ is refused outright while any session references the board — the page says how many sessions are in the way and offers ‘Retire instead’, because deleting would rewrite your logbook.

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 and offered as ‘Merge’, which lands them on the same board rather than minting a second one. 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 with your default pre-selected. ‘None’ is always available: a borrowed board should not force a quiver entry.

Finally, if you have set a home spot, the quiver page answers ‘Board for tomorrow’: it takes the forecast for your home spot tomorrow morning and names the board whose ridden range contains that swell, preferring the one you have rated highest. The suggestion comes from your own sessions — not from a volume formula — so it appears only when your log actually supports it.

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 ‘My sessions’, lists your sessions, newest first, twenty-five to a page, with ‘Next →’ at the foot while more remain. ‘Log a surf +’ beside the heading leads to the spot directory, since a session is logged from its spot. A row of filters above the list narrows and orders it:

The search box

Matches the text anywhere in a session’s title or notes.

The spot box

Keeps the sessions at one spot, named by the spot’s address name (mundaka, as in /spots/mundaka).

‘From’ and ‘To’

Keep the sessions from one date and up to another. Each date stands for the start of its day, so a session later on the ‘To’ day falls outside the range.

The rating

Keeps the sessions you rated at least one to five stars.

The order

‘Newest’, ‘Oldest’ or ‘Best rated’.

‘Filter’ applies them. They are part of the address — /sessions?spot=mundaka&min_rating=4&sort=rating — so a filtered list can be bookmarked, and the pager keeps them. They work with scripting switched off. When nothing matches, the list says ‘No sessions match these filters.’ and offers ‘Clear filters’; before you have logged anything it says ‘No sessions yet’.

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 ‘Your Surf Life’: your lifetime record, built from every session you have logged. It totals your sessions, time in the water, average rating, spots, countries and biggest wave; lists where you surf; draws your streak and a calendar of the last four weeks; shows the ranges of swell, period and wind you have surfed; compares the heights you reported with what was forecast (‘Forecast accuracy --- for you’); and ends on your records and badges. ‘My sessions →’ leads to the list. Before your first session it says ‘No surf life yet’ and points you to a spot to log.

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 spot’s Share command opens /share, which needs an account. It shows a link to copy, headed ‘Share this spot’, and says what the link does: ‘Anyone who opens this link once will see the spot. It works a single time.’ The link carries the language you are reading in, so it opens in that language. A spot you cannot share says ‘Can't share this spot’ instead.

Opening the link while signed in is the whole of the other side: the spot is revealed, it joins the spots you can see, and you land on its page. Signed out, the link sends you to sign in first and is not used up; sign in, then open the link again, since the sign-in page does not return you to it. A link that has been used, has expired or was never valid says ‘Link no longer works’. 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.

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. You can search it by e-mail address or display name, and narrow it with the filter to All, Admins, Developers or Members. 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. You can page through the result. Each row shows the roles the account holds, and when its leading role — admin if it holds admin, otherwise developer — was granted, who granted it and how. The number of admins holding the platform is stated on the page, because it is the number that decides whether the admin role can safely be removed.

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.

A single line at the top of the page you return to reports the outcome, for example Developer granted. or That account isn’t a developer.

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, 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 is refused. 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 /weather, an ‘Operations’ badge, and the console’s sections — ‘Status’, ‘Models’, ‘Variables’ and ‘Accounts’, the last of which opens the account roster (/admin/users). 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, 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, outside the console (see Managing platform roles).

The status page, the fleet, a model’s page and the inspector fill the window: they carry neither the site footer nor the phone’s tab bar, 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, and have no tab bar either. 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:

CardIssued bySlugRuns (UTC)
NOAA GFS-WaveNOAAgfs-wave00, 06, 12, 18
ECMWF IFS-WAMECMWFecmwf-ifs-wam00, 06, 12, 18
DWD EWAMDWDicon-eu00, 12
Météo-France MFWAMMétéo-Francearome00, 06, 12, 18
CMEMS Mediterranean WaveCopernicus Marinecmems-med-wav00
DWD GWAMDWDgwam00, 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).

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 fourteen 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 · 2,926 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’. ‘Run’ offers the served run and, while its files are kept, the run it replaced; the slider, ‘Forecast time’, is marked with days (‘Wed 23’, ‘Fri 25’, …) and moves in three-hour steps to seven days ahead; the tag and the read-out give the valid time and the hour (‘Wed 23 Sep 06:00Z · +0 h’). 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 the model carries, with the steps of the run it serves 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 (‘14 fields each, 2,926 in all’, ‘complete; 1 of 2,926 fields missing’, ‘complete; 1 step without wind speed’, or while the run is in flight ‘0 of 2,926 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 model’s fields it carries, ‘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=2 opens 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=2 opens 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: 2,926 fields, 14 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 fourteen forecast fields the platform stores (see Forecast fields) as cards, in the catalogue’s order: the three wave fields, the two wind fields, then each swell train’s height, period and direction. 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’ 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 14’ 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 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, hours and play 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 beside the ‘Field’ card with the slider on one row. 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: 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. A tag on the map’s top-left corner names the model, the run and the hour (‘GFS-Wave · 06Z run · +0 h’); a key on its bottom-left corner gives the colour scale. Under the map, ‘Run’ offers the run that model serves and, while its files are still kept (two days), the run it replaced, newest first. The slider, labelled ‘Hours ahead’, moves through the hours a picture exists for — the first seven days, every three hours; ‘−’ and ‘+’ step back and forward three hours; Play advances one step a second, reads ‘Stop’ while it plays, and stops at the last hour. The read-out gives the hour, the time the picture is valid for, in UTC and your language, and the run’s reach (‘+12 h · valid Wed 23 Sep 18:00Z · every 3 h to +168 h’). Playing and scrubbing ask 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’ at every hour. On a desktop the map and its slider stand beside the ‘Field’ card.

A browser that cannot draw the live map (no WebGL) gets a still image of each hour instead, 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 and Play keep working.

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.