⛴️
Will It Sail?
CalMac Sailing Predictor
Fetching weather data…

CalMac Sailing Predictor

Unofficial weather-based predictions for all CalMac routes across Scotland's west coast and islands.

Loading weather forecasts…
⚠️ Unofficial tool — not affiliated with CalMac. Predictions use wind, wave height, swell, visibility, snow, tidal restrictions and seasonal factors. Timetables are approximate. Always check CalMac's official service status before travelling.
Checking…

Database

Months of
real data
Routes
calibrated
🟢
Live CalMac
status API

Historical cancellation data comes from official CalMac monthly reliability PDFs at corporate.calmac.co.uk. Routes without PDF data use research-based estimates from Transport Scotland reports and FOI releases. The 📊 Calibrated badge means a route's prediction is anchored to real cancellation history.

How the prediction works

Every route gets a Sailing Chance % calculated in three stages:

1
Weather risk score (0–100)

Live data fetched from Open-Meteo every 30 minutes. Four conditions scored and summed:

💨
Wind gusts & direction
Gust speed compared against each route's specific cancellation threshold — 40 mph for the exposed Stornoway crossing, 65 mph for the sheltered Gourock–Dunoon run. The score scales from 3 pts at 45% of threshold up to 40 pts when gusts exceed 120%. Wind direction (N/NE/E etc.) is also displayed on each card, averaged over the next 12 hours.
0–40 pts
🌊
Wave height & swell
Significant wave height combined with swell period — long-period Atlantic swells are weighted more heavily than short wind chop at the same height. Threshold varies by route exposure (1 = sheltered, 4 = open ocean).
0–30 pts
🌫
Visibility / fog
CalMac can suspend sailings in fog independently of wind. 0 pts above 5 km, scaling to 15 pts in dense fog below 500 m.
0–15 pts
🌧
Precipitation & snow
Heavy rain adds 2 pts, heavy snow adds 5 pts, and blizzard conditions (WMO code ≥ 71) add the full 10 pts. Accounts for port access and loading difficulties.
0–10 pts

The overall route score is the average of the three worst hours in the next 12 — so one gusty hour doesn't tank a mostly calm day. Each individual sailing row shows that departure's specific hour score.

2
Season & route adjustments
  • Season factor — cancellation thresholds are 15% stricter in winter (Nov–Feb), 7% stricter in shoulder months (Mar, Sep, Oct), and standard in summer (Apr–Aug). This reflects CalMac's real-world higher cancellation rates in winter.
  • Route exposure profile — each of the 22 routes has a wind threshold (mph), wave threshold, and exposure rating built from route geography and historical cancellation data.
  • Tidal penalty — a small fixed penalty for routes with known tidal constraints (Uig triangle, Small Isles) that can cause cancellations independently of weather.
3
Historical calibration blend

For routes with a 📊 Calibrated badge, the weather score is blended with real CalMac reliability data — seasonal figures from official monthly performance PDFs:

final = (weather × 0.7) + (history × 0.3)

The result is capped at that route's historical reliability + 10% — so even in perfect weather, a structurally unreliable route can't show an unrealistically high score. The 📊 Calibrated badge only appears when the historical data shifts the final score by more than 3%, so it's a genuine signal rather than a label on every route. Routes without PDF data use weather-only predictions.

Features

🚨 Live CalMac service status

Pulled automatically from CalMac's internal service status API every 10 minutes. Affected route cards are flagged with a status pill — 🚨 Cancelled, ⚠️ Disrupted, or ⚠️ Be Aware — and individual sailing rows show the disruption reason (Weather, Technical, Operational). When all sailings on a route are cancelled, the card shows ❌ and "Cancelled" instead of a percentage. Routes with an upcoming status change show an ⏰ pill even before the disruption starts.

🗺️ Interactive route map

The Map tab shows all 22 CalMac routes as coloured lines on a live OpenStreetMap — green for likely sailing, amber for caution, red for at risk or cancelled. Tap any route line to see its current forecast and open the full detail view. Line colours update automatically as weather and CalMac status data refreshes.

📅 Tomorrow's forecast

The Tomorrow button in the toolbar switches every route card to show the next day's sailing chances, gust and wave figures, and a full timetable with per-sailing risk scores for tomorrow. Tap it again to return to today's view.

🔔 Smart route notifications

Tap Alert me on any route to subscribe to push notifications. A slider lets you set your own alert threshold per route — anywhere from 30% to 90% — so you can choose exactly how sensitive the alert is. The notification fires when the sailing chance drops below your threshold, with a 2-hour cooldown per route to avoid spam. Works on Chrome, Edge, Firefox, and Safari on iOS 16.4+ when added to your home screen.

🌬️ Wind direction

Each route card now shows the dominant wind direction alongside gust speed — for example "47 mph SW". Direction is averaged over the next 12 hours and shown as a compass bearing (N, NE, E, SE, S, SW, W, NW).

🌙 Pre-dawn sailing flag

Early departures that are scheduled before sunrise are flagged with "🌙 Pre-dawn · Next" on the Next sailing pill. Sunrise and sunset are calculated from each route's latitude and longitude, accounting for the season and UK timezone offset.

🔗 Share links

Every route card has a Share button. Tap it, enter your name, and a unique link is generated. On iOS and Android it opens the native share sheet; on desktop it copies the link to clipboard. When the recipient opens the link it shows your name at the top — "Ross shared Ardrossan – Brodick with you 🚢" — and opens directly to that route.

🚢 Live vessel identification

The route detail modal shows the vessel currently operating that route, fetched live from AIS position data via aisstream.io. If a vessel is detected within the route's geographic bounding box it's shown with a green live indicator. If AIS data is unavailable, the scheduled vessel for that route is shown instead.

ℹ️ Route info & next sailing

The detail modal shows crossing time, service type, scheduled vessel, and a contextual note per route. On the card itself, the next upcoming departure is highlighted with a blue border and "Next sailing" label (or "🌙 Pre-dawn · Next" for early departures). Past sailings are faded. Routes without a published timetable show a link to calmac.co.uk instead.

📡 System status page

The Status tab gives a live health check of every data source: Weather API, Marine/Wave API, CalMac Status API (including when disruption data was last fetched), Push Notifications, Service Worker, and Historical Calibration. Each shows a green/amber/red indicator with a detail line. Tap "Check now" to re-run all checks.

📱 Offline support & installable (PWA)

A service worker caches the app shell so it remains usable in areas with no signal — useful in remote ferry terminals. When offline, a banner shows the time data was last loaded. On supported browsers (Chrome, Edge on Android) a prompt offers to install the app to your home screen for faster access. On iOS, add it via Safari's Share → Add to Home Screen.

Individual sailing predictions

Each route card shows a timetable where every departure has its own sailing chance, re-calculated for that specific hour. A route might show 90% overall but flag a 15:00 departure at 65% if a squall is forecast that afternoon.

The next upcoming sailing is highlighted with a blue border. Cancelled sailings show in red with a strikethrough direction; disrupted sailings show in amber with the disruption reason (e.g. 🔧 Technical, 🌊 Weather). Use the Tomorrow button in the toolbar to switch all cards to the following day's timetable and risk scores.

Timetables are based on the CalMac Summer 2026 schedule (27 March – 18 October 2026), verified from official CalMac PDFs.

Data sources

🌤
Open-Meteo
Free, open-source weather API. Provides 48 hours of hourly wind speed, gusts, direction, wave height, swell, visibility and precipitation forecasts at each route's midpoint coordinates. Auto-refreshed every 30 minutes.
🚨
CalMac service status API
CalMac's own internal GraphQL endpoint, polled automatically on load and every 10 minutes. Returns per-route disruption status, reason, and whether a change is imminent. Falls back to a link to the official status page if unavailable.
🛳
AIS vessel tracking (aisstream.io)
Live vessel position data from AIS receivers. Used to identify which vessel is currently operating each route, updated when you open a route's detail view.
🗺️
OpenStreetMap & Leaflet
The Map tab uses Leaflet.js with OpenStreetMap tiles to display all 22 routes as interactive polylines. No API key required — OSM data is freely available under the Open Database Licence.
📋
CalMac Reliability PDFs
Official monthly performance reports from CalMac's corporate site. Each PDF contains month-by-month operated and cancelled sailing counts. Six routes are currently fully calibrated (72 months of verified data).
🗂
Transport Scotland / FOI data
For routes where CalMac PDFs aren't yet in the database, estimates come from Transport Scotland annual reports and published FOI responses.

Limitations & honest caveats

  • Not all cancellations are weather-related. Mechanical breakdowns, crewing issues and port problems cause a significant proportion of cancellations. The live CalMac status API catches many of these — but only when CalMac has already published an alert. Surprise failures won't appear until CalMac posts them.
  • The forecast grid may miss local conditions. The Minch, Sound of Mull and Firth of Lorn can have sea states that differ significantly from the nearest Open-Meteo grid point.
  • CalMac masters have the final say. Internal safety thresholds aren't published — our thresholds are reverse-engineered from cancellation history and will never be perfectly calibrated.
  • Tidal routes are especially uncertain. Operational constraints at some piers go beyond weather alone and aren't fully captured in the model.
  • AIS coverage has gaps. Some areas have limited AIS receiver coverage. The vessel shown may be delayed or missing if the vessel is out of range of a receiver.
  • Historical data quality varies. Six routes have full verified PDF data; the rest use estimates which are less precise — particularly in winter months where disruption patterns are harder to model.

⚠️ Disclaimer

This is an unofficial community tool with no affiliation to Caledonian MacBrayne. Predictions are estimates only — always check CalMac's official service status before travelling. Never rely solely on this app for travel decisions.

Developer

Built by Ross Mackenzie

Inverness, Scotland 🏴󠁧󠁢󠁳󠁣󠁴󠁿

Timetables valid for summer 2026 (27 Mar – 18 Oct 2026). Always verify at calmac.co.uk.

Will It Sail? 🚢

An unofficial sailing predictor for CalMac's west coast ferry network. It combines live weather forecasts, real CalMac cancellation history, live service status, and AIS vessel tracking to estimate how likely each sailing is to run — route by route, departure by departure.

Database

Months of
real data
Routes
calibrated
🟢
Live CalMac
status API

Historical cancellation data comes from official CalMac monthly reliability PDFs at corporate.calmac.co.uk. Routes without PDF data use research-based estimates from Transport Scotland reports and FOI releases. The 📊 Calibrated badge means a route's prediction is anchored to real cancellation history.

How the prediction works

Every route gets a Sailing Chance % calculated in three stages:

1
Weather risk score (0–100)

Live data fetched from Open-Meteo every 30 minutes. Four conditions scored and summed:

💨
Wind gusts & direction
Gust speed compared against each route's specific cancellation threshold — 40 mph for the exposed Stornoway crossing, 65 mph for the sheltered Gourock–Dunoon run. The score scales from 3 pts at 45% of threshold up to 40 pts when gusts exceed 120%. Wind direction (N/NE/E etc.) is also displayed on each card, averaged over the next 12 hours.
0–40 pts
🌊
Wave height & swell
Significant wave height combined with swell period — long-period Atlantic swells are weighted more heavily than short wind chop at the same height. Threshold varies by route exposure (1 = sheltered, 4 = open ocean).
0–30 pts
🌫
Visibility / fog
CalMac can suspend sailings in fog independently of wind. 0 pts above 5 km, scaling to 15 pts in dense fog below 500 m.
0–15 pts
🌧
Precipitation & snow
Heavy rain adds 2 pts, heavy snow adds 5 pts, and blizzard conditions (WMO code ≥ 71) add the full 10 pts. Accounts for port access and loading difficulties.
0–10 pts

The overall route score is the average of the three worst hours in the next 12 — so one gusty hour doesn't tank a mostly calm day. Each individual sailing row shows that departure's specific hour score.

2
Season & route adjustments
  • Season factor — cancellation thresholds are 15% stricter in winter (Nov–Feb), 7% stricter in shoulder months (Mar, Sep, Oct), and standard in summer (Apr–Aug). This reflects CalMac's real-world higher cancellation rates in winter.
  • Route exposure profile — each of the 22 routes has a wind threshold (mph), wave threshold, and exposure rating built from route geography and historical cancellation data.
  • Tidal penalty — a small fixed penalty for routes with known tidal constraints (Uig triangle, Small Isles) that can cause cancellations independently of weather.
3
Historical calibration blend

For routes with a 📊 Calibrated badge, the weather score is blended with real CalMac reliability data — seasonal figures from official monthly performance PDFs:

final = (weather × 0.7) + (history × 0.3)

The result is capped at that route's historical reliability + 10% — so even in perfect weather, a structurally unreliable route can't show an unrealistically high score. The 📊 Calibrated badge only appears when the historical data shifts the final score by more than 3%, so it's a genuine signal rather than a label on every route. Routes without PDF data use weather-only predictions.

Features

🚨 Live CalMac service status

Pulled automatically from CalMac's internal service status API every 10 minutes. Affected route cards are flagged with a status pill — 🚨 Cancelled, ⚠️ Disrupted, or ⚠️ Be Aware — and individual sailing rows show the disruption reason (Weather, Technical, Operational). When all sailings on a route are cancelled, the card shows ❌ and "Cancelled" instead of a percentage. Routes with an upcoming status change show an ⏰ pill even before the disruption starts.

🗺️ Interactive route map

The Map tab shows all 22 CalMac routes as coloured lines on a live OpenStreetMap — green for likely sailing, amber for caution, red for at risk or cancelled. Tap any route line to see its current forecast and open the full detail view. Line colours update automatically as weather and CalMac status data refreshes.

📅 Tomorrow's forecast

The Tomorrow button in the toolbar switches every route card to show the next day's sailing chances, gust and wave figures, and a full timetable with per-sailing risk scores for tomorrow. Tap it again to return to today's view.

🔔 Smart route notifications

Tap Alert me on any route to subscribe to push notifications. A slider lets you set your own alert threshold per route — anywhere from 30% to 90% — so you can choose exactly how sensitive the alert is. The notification fires when the sailing chance drops below your threshold, with a 2-hour cooldown per route to avoid spam. Works on Chrome, Edge, Firefox, and Safari on iOS 16.4+ when added to your home screen.

🌬️ Wind direction

Each route card now shows the dominant wind direction alongside gust speed — for example "47 mph SW". Direction is averaged over the next 12 hours and shown as a compass bearing (N, NE, E, SE, S, SW, W, NW).

🌙 Pre-dawn sailing flag

Early departures that are scheduled before sunrise are flagged with "🌙 Pre-dawn · Next" on the Next sailing pill. Sunrise and sunset are calculated from each route's latitude and longitude, accounting for the season and UK timezone offset.

🔗 Share links

Every route card has a Share button. Tap it, enter your name, and a unique link is generated. On iOS and Android it opens the native share sheet; on desktop it copies the link to clipboard. When the recipient opens the link it shows your name at the top — "Ross shared Ardrossan – Brodick with you 🚢" — and opens directly to that route.

🚢 Live vessel identification

The route detail modal shows the vessel currently operating that route, fetched live from AIS position data via aisstream.io. If a vessel is detected within the route's geographic bounding box it's shown with a green live indicator. If AIS data is unavailable, the scheduled vessel for that route is shown instead.

ℹ️ Route info & next sailing

The detail modal shows crossing time, service type, scheduled vessel, and a contextual note per route. On the card itself, the next upcoming departure is highlighted with a blue border and "Next sailing" label (or "🌙 Pre-dawn · Next" for early departures). Past sailings are faded. Routes without a published timetable show a link to calmac.co.uk instead.

📡 System status page

The Status tab gives a live health check of every data source: Weather API, Marine/Wave API, CalMac Status API (including when disruption data was last fetched), Push Notifications, Service Worker, and Historical Calibration. Each shows a green/amber/red indicator with a detail line. Tap "Check now" to re-run all checks.

📱 Offline support & installable (PWA)

A service worker caches the app shell so it remains usable in areas with no signal — useful in remote ferry terminals. When offline, a banner shows the time data was last loaded. On supported browsers (Chrome, Edge on Android) a prompt offers to install the app to your home screen for faster access. On iOS, add it via Safari's Share → Add to Home Screen.

Individual sailing predictions

Each route card shows a timetable where every departure has its own sailing chance, re-calculated for that specific hour. A route might show 90% overall but flag a 15:00 departure at 65% if a squall is forecast that afternoon.

The next upcoming sailing is highlighted with a blue border. Cancelled sailings show in red with a strikethrough direction; disrupted sailings show in amber with the disruption reason (e.g. 🔧 Technical, 🌊 Weather). Use the Tomorrow button in the toolbar to switch all cards to the following day's timetable and risk scores.

Timetables are based on the CalMac Summer 2026 schedule (27 March – 18 October 2026), verified from official CalMac PDFs.

Data sources

🌤
Open-Meteo
Free, open-source weather API. Provides 48 hours of hourly wind speed, gusts, direction, wave height, swell, visibility and precipitation forecasts at each route's midpoint coordinates. Auto-refreshed every 30 minutes.
🚨
CalMac service status API
CalMac's own internal GraphQL endpoint, polled automatically on load and every 10 minutes. Returns per-route disruption status, reason, and whether a change is imminent. Falls back to a link to the official status page if unavailable.
🛳
AIS vessel tracking (aisstream.io)
Live vessel position data from AIS receivers. Used to identify which vessel is currently operating each route, updated when you open a route's detail view.
🗺️
OpenStreetMap & Leaflet
The Map tab uses Leaflet.js with OpenStreetMap tiles to display all 22 routes as interactive polylines. No API key required — OSM data is freely available under the Open Database Licence.
📋
CalMac Reliability PDFs
Official monthly performance reports from CalMac's corporate site. Each PDF contains month-by-month operated and cancelled sailing counts. Six routes are currently fully calibrated (72 months of verified data).
🗂
Transport Scotland / FOI data
For routes where CalMac PDFs aren't yet in the database, estimates come from Transport Scotland annual reports and published FOI responses.

Limitations & honest caveats

  • Not all cancellations are weather-related. Mechanical breakdowns, crewing issues and port problems cause a significant proportion of cancellations. The live CalMac status API catches many of these — but only when CalMac has already published an alert. Surprise failures won't appear until CalMac posts them.
  • The forecast grid may miss local conditions. The Minch, Sound of Mull and Firth of Lorn can have sea states that differ significantly from the nearest Open-Meteo grid point.
  • CalMac masters have the final say. Internal safety thresholds aren't published — our thresholds are reverse-engineered from cancellation history and will never be perfectly calibrated.
  • Tidal routes are especially uncertain. Operational constraints at some piers go beyond weather alone and aren't fully captured in the model.
  • AIS coverage has gaps. Some areas have limited AIS receiver coverage. The vessel shown may be delayed or missing if the vessel is out of range of a receiver.
  • Historical data quality varies. Six routes have full verified PDF data; the rest use estimates which are less precise — particularly in winter months where disruption patterns are harder to model.

⚠️ Disclaimer

This is an unofficial community tool with no affiliation to Caledonian MacBrayne. Predictions are estimates only — always check CalMac's official service status before travelling. Never rely solely on this app for travel decisions.

Developer

Built by Ross Mackenzie

Inverness, Scotland 🏴󠁧󠁢󠁳󠁣󠁴󠁿

Timetables valid for summer 2026 (27 Mar – 18 Oct 2026). Always verify at calmac.co.uk.

✅ Link copied!