1<!doctype html> 2<html lang="en"> 3 4<head> 5 <meta charset="utf-8"/> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge"/> 7 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/> 8 9 <title>Blog</title> 10 11 <meta name="description" content="Windy blog: where go kitesurfing, sailing, fishing. Windy features. Meteo articles, storms and typhoon analytics"/> 12 13 <link rel="preconnect" href="https://websdk.appsflyer.com"/> 14 <link rel="preconnect" href="https://banner.appsflyersdk.com" crossorigin/> 15 <link rel="preconnect" href="https://creatives-cdn.appsflyersdk.com" crossorigin/> 16 <link rel="dns-prefetch" href="https://cdn.appsflyer.com"/> 17 18 <style>body > :has(+ #smart-banner){height:0!important;min-height:0!important}</style> 19
19<script> 20 !function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,o.src="https://websdk.appsflyer.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","banners",{banners:{key:"2ff9f184-eda9-43e0-bddf-9bccc29ade3c"}}); 21 AF('banners', 'showBanner', { bannerZIndex: 999999, additionalParams: { p1: "v1", p2: "v2" } }); 22 </script>
22 23 24 <meta property="og:type" content="article"> 25 <meta property="og:locale" content="en"> 26 <meta property="og:title" content="Blog"> 27 <meta property="og:description" content="Windy blog: where go kitesurfing, sailing, fishing. Windy features. Meteo articles, storms and typhoon analytics"> 28 <meta property="og:image" content="https://windy.app/img/og_image_new.png?v2"> 29 <meta property="og:url" content="https://windy.app/blog"> 30 <meta property="og:site_name" content="WINDY.APP"> 31 32 <meta name="twitter:card" content="summary_large_image"> 33 <meta name="twitter:url" content="https://windy.app/blog"> 34 <meta name="twitter:title" content="Blog"> 35 <meta name="twitter:description" content="Windy blog: where go kitesurfing, sailing, fishing. Windy features. Meteo articles, storms and typhoon analytics"> 36 <meta name="twitter:image" content="https://windy.app/img/og_image_new.png?v2"> 37 <meta name="twitter:image:alt" content="Blog"> 38 <meta name="google-site-verification" content="qbwybSGEpGNICUF0j-CMB1puHqcD5s1Xm42hDHU0OBI" /> 39 40 41 <link href="/css/app.css?id=8afb3e6e0ca1b2ed1930436a655f6177" rel="stylesheet"> 42 <link href="/css/_white.css?id=66bcbc67ba0b5b58358794470539b86a" rel="stylesheet"> 43 <link href="/css/all.css?id=08a130c57be952eb99c3dd938f1cd59b" rel="stylesheet"> 44 <link href="/css/modules.css?id=3051357356d671e88844f25d798d4df0" rel="stylesheet"> 45 <link href="/css/bootstrap4-compat.css" rel="stylesheet"> 46 47
47<script type="text/javascript"> 48 window.amplitudeApiKey = ''; 49 window.userID = ''; 50 window.ip = '10.201.200.20'; 51</script>
vendor: 1 bytes, line 51
51
52<script type="text/javascript"> 53window.amplitude = (function () { 54 var api = {}; 55 var chain = function () { return api; }; 56 57 [ 58 'init', 'add', 'remove', 'logEvent', 'track', 'identify', 'groupIdentify', 59 'setGroup', 'revenue', 'flush', 'setUserId', 'setDeviceId', 'setSessionId', 60 'setOptOut', 'setTransport', 'reset', 'extendSession', 'regenerateDeviceId', 61 'setVersionName', 'setUserProperties', 'clearUserProperties', 'logRevenueV2', 62 'set', 'setOnce', 'unset', 'append', 'prepend', 'preInsert', 'postInsert', 63 'clearAll', 'setProductId', 'setQuantity', 'setPrice', 'setRevenueType', 64 'setEventProperties', 'getEventProperties', 'runQueuedFunctions' 65 ].forEach(function (name) { api[name] = chain; }); 66 67 api.getUserId = function () { return null; }; 68 api.getDeviceId = function () { return null; }; 69 api.getSessionId = function () { return null; }; 70 api.getUserProperties = function () { return {}; }; 71 api.getInstance = function () { return api; }; 72 api.createInstance = function () { return api; }; 73 api.Identify = function () { return api; }; 74 api.Revenue = function () { return api; }; 75 api.invoked = true; 76 api._q = []; 77 api._iq = {}; 78 79 return api; 80})(); 81</script>
81 82 83 84 85
85<script src="/js/manifest.js?id=c75f487e2ce7679678599909387d4b14" defer></script>
85 86
86<script src="/js/AnalyticsService.js?id=b374f19981c84864ef4b3f54df306493" defer></script>
86 87
87<script src="/js/vendor.js?id=c2c3b945c5032df2ffd9819d37c2838f" defer></script>
87 88
88<script src="/js/app.js?id=268d6e2dc09420321f6f159a84e4927c" defer></script>
88 89
89<script src="/js/all.js?id=d66a491ccf8c20d0d0171e242197f871" defer></script>
89 90
90<script src="/js/windyPopup.js?id=5d9c4e88580d90655303ad9a5338397f" defer></script>
90 91 92 <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png"/> 93 <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png"/> 94 <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png"/> 95 <link rel="manifest" href="/site.webmanifest"/> 96 <link rel="mask-icon" href="/safari-pinned-tab.svg" color="#407fef"/> 97 98 <link rel="canonical" href="https://windy.app/blog"> 99 100 <link rel="alternate" hreflang="en" href="https://windy.app/blog" title="English" /> 101 <link rel="alternate" hreflang="x-default" href="https://windy.app/blog" title="English" /> 102 103
103<script type="application/ld+json">{"@context":"https://schema.org","@type":"SoftwareApplication","name":"WINDY.APP","image":"https://windy.app/img/promo-image.png?v2","url":"https://windy.app/","publisher":{"@type":"Organization","name":"Windy Weather World Inc."},"applicationCategory":"WeatherApplication","operatingSystem":["Android","iOS"],"downloadUrl":["https://windy.app.link/download-windy-ios","https://windy.app.link/download-windy-android"],"offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"aggregateRating":{"@type":"AggregateRating","ratingValue":4.75,"ratingCount":492837,"bestRating":5,"worstRating":1}}</script>
103 104 105 <!-- Google Tag Manager --> 106
106<script>
vendor: 343 bytes, lines 106-110
106(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 107 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 108 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 109 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 110 })(window,document,'script','dataLayer','
110GTM-KZJ5994
vendor: 3 bytes, line 110
110');
110</script>
110 111 <!-- End Google Tag Manager --> 112 113</head> 114<style> 115 .windy-forecast { 116 position: relative; 117 overflow: hidden; 118 } 119</style> 120<body lang="en" class="articles white" data-analytics='{ 121 "actions": [{ 122 "action": "pushToDataLayer", 123 "value": { 124 "event": "pageView" 125 } 126 }], 127 "waitingActions": [{ 128 "selector": "[aria-label=\"App promotion banner\"] [type=\"button\"]", 129 "actions": [{ 130 "action": "pushToDataLayer", 131 "value": { 132 "event": "analyticsEvent", 133 "eventCategory": "smart_app_banner", 134 "eventAction": "view", 135 "eventLabel": "appsflyer", 136 "eventProperty": "", 137 "eventValue": 0 138 } 139 },{ 140 "action": "pushToDataLayer", 141 "type": "onClick", 142 "value": { 143 "event": "analyticsEvent", 144 "eventCategory": "smart_app_banner", 145 "eventAction": "to_app", 146 "eventLabel": "appsflyer", 147 "eventProperty": "", 148 "eventValue": 0 149 } 150 }] 151 },{ 152 "selector": "[aria-label=\"Close banner\"]", 153 "actions": [{ 154 "action": "pushToDataLayer", 155 "type": "onClick", 156 "value": { 157 "event": "analyticsEvent", 158 "eventCategory": "smart_app_banner", 159 "eventAction": "close", 160 "eventLabel": "appsflyer", 161 "eventProperty": "", 162 "eventValue": 0 163 } 164 }] 165 }] 166}'> 167 <!-- Google Tag Manager (noscript) -->
vendor: 72 bytes, lines 167-168
167 168 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
168GTM-KZJ5994
vendor: 91 bytes, lines 168-170
168" 169 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 170
170<!-- End Google Tag Manager (noscript) --> 171 172 <!-- <div id="page-loading-overlay" class="page-loading-overlay" onclick="this.style.display='none'"><div></div></div> --> 173 174
174<script> 175 window.__cfRLUnblockHandlers = true; 176 // setTimeout(function(){ 177 // document.getElementById('page-loading-overlay').style.display = 'none'; 178 // }, 5000); 179 </script>
179 180
180<script> 181function getCookie(name) { 182 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 183 return r && r[1]; 184} 185</script>
185 186 187 <header class="header"> 188 <nav class="navbar"> 189 <a id="navbarLogo" class="navbar-brand navbar-logo navbar__logo" href="https://windy.app/"> 190 <img src="/img/logo-w-words-short.svg" 191 alt="windyapp logo"> 192 </a> 193 <style> 194.red_button:hover { 195 background-color: #b8220e; 196 /* filter: drop-shadow(1px 2px 6px #ff3e47); */ 197} 198 199</style> 200 <a id="proBtnMobile" data-click-ab="true" style="color:#fff; background-image: url(/img/paywall/pro-btn-white.svg);" data-promo-pro href="/pro?src=header_mobile" target="_blank" class="red_button pro-btn pro-btn_place_header_mobile" data-amplitude-name="BTN_HEADER" data-analytics='{ 201 "actions": [{ 202 "type": "onClick", 203 "action": "setVariable", 204 "name": "referred_screen", 205 "value": "web_header_mobile" 206 }] 207 }'> 208 Try for FREE 209 </a> 210
211<script> 212function getCookie(name) { 213 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 214 return r && r[1]; 215} 216</script>
vendor: 1 bytes, line 216
216
217<script> 218// show/hide "pro" promo buttons 219// This partial is included several times per page, so no top-level declarations 220// here â they would throw "already declared" and kill the later copies. 221document.querySelectorAll('[data-promo-pro]').forEach(el => { 222 // nothing promoting PRO on the paywall itself, and visibility goes back to 223 // CSS instead of a forced inline flex, which used to override media queries 224 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 225 else el.style.removeProperty('display'); 226 // } 227}) 228</script>
228 229 <button class="navbar__search-button" type="button" id="mobileSearchButton"> 230 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"> 231 <path d="M17.5 17.5L13.8833 13.8833" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 232 <path d="M9.16667 15.8333C12.8486 15.8333 15.8333 12.8486 15.8333 9.16667C15.8333 5.48477 12.8486 2.5 9.16667 2.5C5.48477 2.5 2.5 5.48477 2.5 9.16667C2.5 12.8486 5.48477 15.8333 9.16667 15.8333Z" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 233 </svg> 234 </button> 235 <input type="checkbox" class="navbar__fake-burger" id="fakeBurger"> 236 <label for="fakeBurger" class="navbar__burger" id="headerBurger"></label> 237 <ul id="navbarMenu" class="navbar__list"> 238
238<script> 239function getCookie(name) { 240 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 241 return r && r[1]; 242} 243</script>
243 244 245 246<li class="navbar__list-item"> 247 <a id="menuItemMap" class="navbar__list-link" href="https://windy.app/map" data-amp="map" data-position="header"> 248 Live map </a> 249</li> 250<li id="menuItemSpots" class="navbar__list-item" data-amp="spots" data-position="header"> 251 <a class="navbar__list-link" href="https://windy.app/spots"> 252 Spots </a> 253</li> 254<li id="menuItemWidgets" class="navbar__list-item" data-amp="widgets" data-position="header"> 255 <a class="navbar__list-link" href="https://windy.app/widgets"> 256 Widgets </a> 257</li> 258 259<style> 260.red_button:hover { 261 background-color: #b8220e; 262 /* filter: drop-shadow(1px 2px 6px #ff3e47); */ 263} 264 265</style> 266<li class="nav-item"> <a id="proBtn" data-click-ab="true" style="color:#fff; background-image: url(/img/paywall/pro-btn-white.svg);" data-promo-pro href="/pro?src=header_desktop" target="_blank" class="red_button pro-btn pro-btn_place_header" data-amplitude-name="BTN_HEADER" data-analytics='{ 267 "actions": [{ 268 "type": "onClick", 269 "action": "setVariable", 270 "name": "referred_screen", 271 "value": "web_header_desktop" 272 }] 273 }'> 274 Try for FREE 275 </a> 276</li>
277<script> 278function getCookie(name) { 279 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 280 return r && r[1]; 281} 282</script>
vendor: 1 bytes, line 282
282
283<script> 284// show/hide "pro" promo buttons 285// This partial is included several times per page, so no top-level declarations 286// here â they would throw "already declared" and kill the later copies. 287document.querySelectorAll('[data-promo-pro]').forEach(el => { 288 // nothing promoting PRO on the paywall itself, and visibility goes back to 289 // CSS instead of a forced inline flex, which used to override media queries 290 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 291 else el.style.removeProperty('display'); 292 // } 293}) 294</script>
294 295 296<a id="navbarLoginMobile" class="navbar__login navbar__login_mobile" href="/user/dashboard/" data-amplitude-usr="HEADER_IN_BUTTON"><p class="navbar__login-p">Sign in</p></a> 297 298<a id="navbarLoginDesktop" class="navbar__login navbar__login_desktop" href="/user/dashboard/"><p class="navbar__login-p">Sign in</p></a> 299 </ul> 300</nav> 301 <div class="spot-search-mobile" id="spotSearchMobile" style="display: none;"> 302 303 304 <div class="spot-search"> 305 <form class="spot-search__form input-group"> 306 <fieldset class="spot-search__input-wrapper"> 307 <input 308 type="text" 309 class="px-4 form-control spots_search spot-search__input" 310 placeholder="Enter spot name" 311 name="search" 312 id="search-mobile" 313 /> 314 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none"> 315 <path stroke="#0583f4" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M12.28 12.28 17 17m-2.89-9.44A6.56 6.56 0 1 1 1 7.56a6.56 6.56 0 0 1 13.11 0"/> 316 </svg> 317 </fieldset> 318 319 <a href="/map" button class="btn-openmap btn-map-icon spot-search__button"> 320 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="18" fill="none"> 321 <path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" stroke-width="2" d="M7 1 1 3v14l6-2M7 1v14M7 1l6 2M7 15l6 2m0-14v14m0-14 6-2v14l-6 2"/> 322 </svg> 323 </a> 324 </form> 325 326 <button class="spot-search__button" type="button" id="mobileSearchClose"> 327 <svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 328 <path d="M15.8332 4.16675L4.1665 15.8334" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 329 <path d="M4.1665 4.16675L15.8332 15.8334" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 330 </svg> 331 </button> 332 </div> 333 334 335 <div class="search_example search_example--mobile"> 336 <span class="dimmed-text">For example:</span> 337 <a>Dolphin Beach</a> 338 </div> 339 340</div> 341 342 343 344 345
346<script> 347(function() { 348 document.addEventListener('click', function(e) { 349 var link = e.target.closest('.search_example a'); 350 if (!link) return; 351 if (link.getAttribute('href')) return; 352 353 e.preventDefault(); 354 var text = link.textContent.trim(); 355 var searchInput = null; 356 357 if (link.closest('.spot-search-mobile')) { 358 searchInput = document.getElementById('search-mobile'); 359 } else { 360 var exampleContainer = link.closest('.search_example--desktop'); 361 if (exampleContainer) { 362 var spotSearch = exampleContainer.previousElementSibling; 363 while (spotSearch && !spotSearch.classList.contains('spot-search')) { 364 spotSearch = spotSearch.previousElementSibling; 365 } 366 if (spotSearch) searchInput = spotSearch.querySelector('.spots_search'); 367 } 368 if (!searchInput) searchInput = document.querySelector('.spots_search'); 369 } 370 371 if (searchInput) { 372 searchInput.value = text; 373 searchInput.focus(); 374 searchInput.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 41, which: 41 })); 375 } 376 }); 377})(); 378</script>
378 379</header>
380<script> 381 const mobile = window.matchMedia('(max-width: 960px)').matches; 382 const navbarLogin = mobile ? document.querySelector('#navbarLoginMobile') : document.querySelector('#navbarLoginDesktop'); 383 const isLoggedIn = getCookie('mobile_user_auth') == 1; 384 385 navbarLogin.classList.add('navbar__login_' + (isLoggedIn ? 'y' : 'n')); 386 387 if (isLoggedIn) { 388 navbarLogin.querySelector('.navbar__login-p').remove(); 389 const img = document.createElement('img'); 390 img.alt = ''; 391 img.className = 'navbar__avatar'; 392 const placeholder = '/img/navbar__login2.svg'; 393 const avatar = decodeURIComponent(getCookie('mobile_user_avatar') || ''); 394 img.src = avatar || placeholder; 395 img.onerror = () => { if (img.src !== location.origin + placeholder) img.src = placeholder; }; 396 navbarLogin.append(img); 397 } 398 399 if (getCookie('mobile_user_is_pro') == 1) { 400 navbarLogin.classList.add('navbar__login_pro'); 401 const proBadge = document.createElement('span'); 402 proBadge.classList.add('navbar__pro-badge'); 403 proBadge.textContent = 'PRO'; 404 navbarLogin.append(proBadge); 405 } 406 407 const mobileSearchBtn = document.getElementById('mobileSearchButton'); 408 const spotSearchMobile = document.getElementById('spotSearchMobile'); 409 if (mobileSearchBtn && spotSearchMobile) { 410 mobileSearchBtn.addEventListener('click', function(e) { 411 e.preventDefault(); 412 spotSearchMobile.style.display = 'flex'; 413 requestAnimationFrame(function() { 414 var searchInput = spotSearchMobile.querySelector('.spots_search'); 415 if (searchInput) { 416 searchInput.focus(); 417 } 418 }); 419 }); 420 } 421</script>
421 422 423 424 <div class="container no-gutters mx-auto mt-5 pb-5 articles"> 425 426
426<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://windy.app"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://windy.app/blog"}]}</script>
426 427 428 <ol class="breadcrumb clearfix"> 429 <li class="breadcrumb-item"> 430 <a href="/">Home</a> 431 </li> 432 <li class="breadcrumb-item"> 433 <span>Blog</span> 434 </li> 435 </ol> 436 437 438 <h1 class="text-uppercase mb-3">Blog</h1> 439 440 <div class="articles-items"> 441 <div class="row"> 442 <a href="https://windy.app/blog/what-to-read.html" class="articles-item col-12 col-md-6 mb-4"> 443 <div class="articles-item__image"> 444 <div> 445 <img data-src="https://cdn.windy.app/site-storage/posts/November2022/ONy2C78zNXjXKgY8NfJ9-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/November2022/ONy2C78zNXjXKgY8NfJ9-tn-x2.jpg 2x" alt="First time here? Read the most useful posts on the Windy.app blog and site" class="lazyload"> 446 </div> 447 </div> 448 <div class="articles-item__text px-0"> 449 <h3 class="item-title">First time here? Read the most useful posts on the Windy.app blog and site</h3> 450 <p></p> 451 </div> 452 </a> 453 454 455 456 <a href="https://windy.app/blog/cycling-guide-with-windy-app.html" class="articles-item col-12 col-md-3 mb-4"> 457 <div class="articles-item__image"> 458 <div> 459 <img data-src="https://cdn.windy.app/site-storage/posts/July2023/YSfJcFDskGwfxg89jAZ2-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/July2023/YSfJcFDskGwfxg89jAZ2-tn-x2.jpg 2x" alt="Embracing the Prairies: Cycling Guide with Windy.app" class="lazyload"> 460 </div> 461 </div> 462 <div class="articles-item__text px-0"> 463 <h3 class="item-title">Embracing the Prairies: Cycling Guide with Windy.app</h3> 464 <p></p> 465 </div> 466 </a> 467 468 469 470 <a href="https://windy.app/blog/sup-safety-rules.html" class="articles-item col-12 col-md-3 mb-4"> 471 <div class="articles-item__image"> 472 <div> 473 <img data-src="https://cdn.windy.app/site-storage/posts/May2023/XzPYWp21j0dCtmOA6iUj-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/May2023/XzPYWp21j0dCtmOA6iUj-tn-x2.jpg 2x" alt="Stand up paddle boarding (SUP) safety rules" class="lazyload"> 474 </div> 475 </div> 476 <div class="articles-item__text px-0"> 477 <h3 class="item-title">Stand up paddle boarding (SUP) safety rules</h3> 478 <p></p> 479 </div> 480 </a> 481 482 483 484 <a href="https://windy.app/blog/sup-gear-equipment.html" class="articles-item col-12 col-md-3 mb-4"> 485 <div class="articles-item__image"> 486 <div> 487 <img data-src="https://cdn.windy.app/site-storage/posts/May2023/Ic6qwPabKk4fKWBZJX2o-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/May2023/Ic6qwPabKk4fKWBZJX2o-tn-x2.jpg 2x" alt="SUP gear is not just a board. Here's what other equipment you need" class="lazyload"> 488 </div> 489 </div> 490 <div class="articles-item__text px-0"> 491 <h3 class="item-title">SUP gear is not just a board. Here's what other equipment you need</h3> 492 <p></p> 493 </div> 494 </a> 495 496 497 498 <a href="https://windy.app/blog/olympic-outdoor-sports.html" class="articles-item col-12 col-md-3 mb-4"> 499 <div class="articles-item__image"> 500 <div> 501 <img data-src="https://cdn.windy.app/site-storage/posts/April2023/gc0KVFP2xD5i4DcdQxUl-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/April2023/gc0KVFP2xD5i4DcdQxUl-tn-x2.jpg 2x" alt="Check if your outdoor activity is an Olympic sport" class="lazyload"> 502 </div> 503 </div> 504 <div class="articles-item__text px-0"> 505 <h3 class="item-title">Check if your outdoor activity is an Olympic sport</h3> 506 <p></p> 507 </div> 508 </a> 509 510 511 512 <a href="https://windy.app/blog/learn-to-read-wind-barbs.html" class="articles-item col-12 col-md-3 mb-4"> 513 <div class="articles-item__image"> 514 <div> 515 <img data-src="https://cdn.windy.app/site-storage/posts/April2023/HzxfHqBmOMLUEHj3B57Q-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/April2023/HzxfHqBmOMLUEHj3B57Q-tn-x2.jpg 2x" alt="How to read wind barbs â wind speed and direction symbols" class="lazyload"> 516 </div> 517 </div> 518 <div class="articles-item__text px-0"> 519 <h3 class="item-title">How to read wind barbs â wind speed and direction symbols</h3> 520 <p></p> 521 </div> 522 </a> 523 524 525 526 <a href="https://windy.app/blog/photos-community-mar-2023.html" class="articles-item col-12 col-md-3 mb-4"> 527 <div class="articles-item__image"> 528 <div> 529 <img data-src="https://cdn.windy.app/site-storage/posts/April2023/HBGF5nOYLaKCZCoofJ60-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/April2023/HBGF5nOYLaKCZCoofJ60-tn-x2.jpg 2x" alt=" Photos we liked the most in the Windy.app Community in March 2023" class="lazyload"> 530 </div> 531 </div> 532 <div class="articles-item__text px-0"> 533 <h3 class="item-title"> Photos we liked the most in the Windy.app Community in March 2023</h3> 534 <p></p> 535 </div> 536 </a> 537 538 539 540 <a href="https://windy.app/blog/collection-hiking.html" class="articles-item col-12 col-md-3 mb-4"> 541 <div class="articles-item__image"> 542 <div> 543 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/TDcMZBamUyVl8X8w5D88-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/TDcMZBamUyVl8X8w5D88-tn-x2.jpg 2x" alt="The collection of articles about hiking" class="lazyload"> 544 </div> 545 </div> 546 <div class="articles-item__text px-0"> 547 <h3 class="item-title">The collection of articles about hiking</h3> 548 <p></p> 549 </div> 550 </a> 551 552 553 554 <a href="https://windy.app/blog/weather-forecast-hike-bike.html" class="articles-item col-12 col-md-3 mb-4"> 555 <div class="articles-item__image"> 556 <div> 557 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/TW0lcn0QtZ0yo6JNhPT9-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/TW0lcn0QtZ0yo6JNhPT9-tn-x2.jpg 2x" alt="Expert tips on weather forecasting for hiking and cycling" class="lazyload"> 558 </div> 559 </div> 560 <div class="articles-item__text px-0"> 561 <h3 class="item-title">Expert tips on weather forecasting for hiking and cycling</h3> 562 <p></p> 563 </div> 564 </a> 565 566 567 568 <a href="https://windy.app/blog/koppen-climate-classification.html" class="articles-item col-12 col-md-3 mb-4"> 569 <div class="articles-item__image"> 570 <div> 571 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/aPbQ64Md8DQsAtRT8XVd-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/aPbQ64Md8DQsAtRT8XVd-tn-x2.jpg 2x" alt="Find out what climate you live in by the Koppen classification" class="lazyload"> 572 </div> 573 </div> 574 <div class="articles-item__text px-0"> 575 <h3 class="item-title">Find out what climate you live in by the Koppen classification</h3> 576 <p></p> 577 </div> 578 </a> 579 580 581 582 <a href="https://windy.app/blog/collection-cycling.html" class="articles-item col-12 col-md-3 mb-4"> 583 <div class="articles-item__image"> 584 <div> 585 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/2uhrnn4cvScMcft26EA3-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/2uhrnn4cvScMcft26EA3-tn-x2.jpg 2x" alt="The collection of articles about cycling" class="lazyload"> 586 </div> 587 </div> 588 <div class="articles-item__text px-0"> 589 <h3 class="item-title">The collection of articles about cycling</h3> 590 <p></p> 591 </div> 592 </a> 593 594 595 596 <a href="https://windy.app/blog/uci-world-tour-calendar.html" class="articles-item col-12 col-md-3 mb-4"> 597 <div class="articles-item__image"> 598 <div> 599 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/i5K0ufKOOK2Wgx8iEVhU-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/i5K0ufKOOK2Wgx8iEVhU-tn-x2.jpg 2x" alt="A guide to the UCI World Tour calendar with major pro road bike races" class="lazyload"> 600 </div> 601 </div> 602 <div class="articles-item__text px-0"> 603 <h3 class="item-title">A guide to the UCI World Tour calendar with major pro road bike races</h3> 604 <p></p> 605 </div> 606 </a> 607 608 609 610 <a href="https://windy.app/blog/fire-danger-levels.html" class="articles-item col-12 col-md-3 mb-4"> 611 <div class="articles-item__image"> 612 <div> 613 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/l2hbS8jdonFpYh8UsKO9-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/l2hbS8jdonFpYh8UsKO9-tn-x2.jpg 2x" alt="Learn to read Fire Danger levels â stay away from wildfires" class="lazyload"> 614 </div> 615 </div> 616 <div class="articles-item__text px-0"> 617 <h3 class="item-title">Learn to read Fire Danger levels â stay away from wildfires</h3> 618 <p></p> 619 </div> 620 </a> 621 622 623 624 <a href="https://windy.app/blog/how-to-read-hurricane-map.html" class="articles-item col-12 col-md-3 mb-4"> 625 <div class="articles-item__image"> 626 <div> 627 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/3jPJQZlA8edQr2jLtmWs-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/3jPJQZlA8edQr2jLtmWs-tn-x2.jpg 2x" alt="How to read hurricane map like an expert" class="lazyload"> 628 </div> 629 </div> 630 <div class="articles-item__text px-0"> 631 <h3 class="item-title">How to read hurricane map like an expert</h3> 632 <p></p> 633 </div> 634 </a> 635 636 637 638 <a href="https://windy.app/blog/ecmwf-ens-weather-forecast-model.html" class="articles-item col-12 col-md-3 mb-4"> 639 <div class="articles-item__image"> 640 <div> 641 <img data-src="https://cdn.windy.app/site-storage/posts/February2021/jqL0pP51NJUk7hdJoOeq-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/February2021/jqL0pP51NJUk7hdJoOeq-tn-x2.jpg 2x" alt="What is ECMWF-ENS (Ensemble) weather model and how it works" class="lazyload"> 642 </div> 643 </div> 644 <div class="articles-item__text px-0"> 645 <h3 class="item-title">What is ECMWF-ENS (Ensemble) weather model and how it works</h3> 646 <p></p> 647 </div> 648 </a> 649 650 651 652 <a href="https://windy.app/blog/surfing-in-the-us-best-spots-and-destinations.html" class="articles-item col-12 col-md-3 mb-4"> 653 <div class="articles-item__image"> 654 <div> 655 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/hlWsnNWoIJAcCbVQTx4e-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/hlWsnNWoIJAcCbVQTx4e-tn-x2.jpg 2x" alt="Where and when to go surfing in the US. Plus schools and camps" class="lazyload"> 656 </div> 657 </div> 658 <div class="articles-item__text px-0"> 659 <h3 class="item-title">Where and when to go surfing in the US. Plus schools and camps</h3> 660 <p></p> 661 </div> 662 </a> 663 664 665 666 <a href="https://windy.app/blog/surfing-in-asia-best-spots-and-destinations.html" class="articles-item col-12 col-md-3 mb-4"> 667 <div class="articles-item__image"> 668 <div> 669 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/FleHL9hj93ORortcbcaK-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/FleHL9hj93ORortcbcaK-tn-x2.jpg 2x" alt="Where and when to go surfing in Asia. Plus schools and camps" class="lazyload"> 670 </div> 671 </div> 672 <div class="articles-item__text px-0"> 673 <h3 class="item-title">Where and when to go surfing in Asia. Plus schools and camps</h3> 674 <p></p> 675 </div> 676 </a> 677 678 679 680 <a href="https://windy.app/blog/surfing-in-europe-best-spots-and-destinations.html" class="articles-item col-12 col-md-3 mb-4"> 681 <div class="articles-item__image"> 682 <div> 683 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/JNFVpKefkyn38MeFRcOy-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/JNFVpKefkyn38MeFRcOy-tn-x2.jpg 2x" alt="Where and when to go surfing in Europe. Plus schools and camps" class="lazyload"> 684 </div> 685 </div> 686 <div class="articles-item__text px-0"> 687 <h3 class="item-title">Where and when to go surfing in Europe. Plus schools and camps</h3> 688 <p></p> 689 </div> 690 </a> 691 692 693 694 <a href="https://windy.app/blog/photos-community-feb-2023.html" class="articles-item col-12 col-md-3 mb-4"> 695 <div class="articles-item__image"> 696 <div> 697 <img data-src="https://cdn.windy.app/site-storage/posts/March2023/e22lzcT
697NwWVcOtsRSD0o-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2023/e22lzcTNwWVcOtsRSD0o-tn-x2.jpg 2x" alt="Photos we liked the most in the Windy.app Community in February 2023" class="lazyload"> 698 </div> 699 </div> 700 <div class="articles-item__text px-0"> 701 <h3 class="item-title">Photos we liked the most in the Windy.app Community in February 2023</h3> 702 <p></p> 703 </div> 704 </a> 705 706 </div> 707 </div> 708 709 <hr class="my-4"> 710 <div class="text-right"><ul class="pagination" role="navigation"> 711 712 <li class="page-item disabled" aria-disabled="true"> 713 <span class="page-link">« Previous</span> 714 </li> 715 716 717 <li class="page-item"> 718 <a class="page-link" href="https://windy.app/blog?page=2" rel="next">Next »</a> 719 </li> 720 </ul> 721</div> 722 723 </div> 724 725 726<div id="stickyRibbonPro" class="banner-ribbon banner-ribbon_fixed banner-ribbon_orange" data-promo-pro> 727 <div class="banner-ribbon__container"> 728 <span class="banner-ribbon__text banner-ribbon__text_smaller">Get unlimited access to weather data</span> 729 <a href="/pro?src=sticky" target="_blank" class="banner-ribbon__button" data-analytics='{ 730 "actions": [{ 731 "type": "onClick", 732 "action": "setVariable", 733 "name": "referred_screen", 734 "value": "web_footer_ribbon" 735 }] 736 }'> 737 <div class="banner-ribbon__button-image banner-ribbon__button-image_crown"></div> 738 <span class="banner-ribbon__button-text">Go PRO</span> 739 </a> 740 </div> 741</div>
742<script> 743function getCookie(name) { 744 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 745 return r && r[1]; 746} 747</script>
vendor: 1 bytes, line 747
747
748<script> 749// show/hide "pro" promo buttons 750// This partial is included several times per page, so no top-level declarations 751// here â they would throw "already declared" and kill the later copies. 752document.querySelectorAll('[data-promo-pro]').forEach(el => { 753 // nothing promoting PRO on the paywall itself, and visibility goes back to 754 // CSS instead of a forced inline flex, which used to override media queries 755 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 756 else el.style.removeProperty('display'); 757 // } 758}) 759</script>
vendor: 1 bytes, line 759
759
760<script> 761function getCookie(name) { 762 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 763 return r && r[1]; 764} 765</script>
vendor: 1 bytes, line 765
765
766<script> 767// show/hide "pro" promo buttons 768// This partial is included several times per page, so no top-level declarations 769// here â they would throw "already declared" and kill the later copies. 770document.querySelectorAll('[data-promo-pro]').forEach(el => { 771 // nothing promoting PRO on the paywall itself, and visibility goes back to 772 // CSS instead of a forced inline flex, which used to override media queries 773 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 774 else el.style.removeProperty('display'); 775 // } 776}) 777</script>
777 778 779 <div class="intro_promo"> 780 <div class="container row no-gutters mx-auto text-center text-sm-left"> 781 <div class="col-12 col-xl-7 d-inline-block align-bottom py-4 pb-xl-6 text-left"> 782 <h2>Professional Weather App</h2> 783 <div class="promo_text pt-2 pb-5">Windy.app is a professional weather app, created for water and wind sports and all outdoor activities.<br> 784 Get a detailed online 10 day weather forecast, live worldwide wind map and local weather reports from the most accurate weather models.<br> 785 Compare spot conditions, ask locals in the app chat, discover meteo lessons, and share your experience in our Windy.app Community.<br> 786 Be sure with Windy.app.</div> 787 <div class="text-center text-lg-left pb-5"> 788 <a href="https://windyapp.onelink.me/VcDy/3x8vacb6" data-desktopqrcode="/img/qr/code_main.png" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'ios'});" class="pr-0 pr-sm-2 download-windy-ios" rel="nofollow"><img data-src="/img/btn-appstore.svg" width="180" height="60" alt="WINDY APP Appstore" class="pb-2 pb-sm-0 lazyload"/></a> 789 <a href="https://windyapp.onelink.me/VcDy/3x8vacb6" data-desktopqrcode="/img/qr/code_main.png" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'android'});" class="pr-sm-2 download-windy-android" rel="nofollow"><img data-src="/img/btn-googleplay.svg" width="180" height="60" alt="WINDY APP Google Play" class="pb-2 pb-sm-0 lazyload"/></a> 790 <a href="https://appgallery.huawei.com/app/C110281657" class="pr-sm-2" rel="nofollow"><img src="/img/btn-huawei.svg"width="180" height="60" alt="WINDY APP Huawei store" class="pb-2 pb-sm-0 lazyload"/></a> 791 </div> 792 </div> 793 <div class="col-12 col-xl-5 text-center d-none d-xl-inline-block" style="align-content: flex-end;"> 794 <img data-src="/img/promo-image.png?v2" alt="WINDY APP" data-srcset="/img/[email protected]?v2 2x" class="intro_promo-image ml-0 ml-xl-5 lazyload"> 795 </div> 796 </div> 797</div> <footer class="footer"> 798 <nav class="footer__nav"> 799 <a class="footer__logo" href="/"> 800 <img src="/img/logo-w-words-short.svg" 801 alt="windyapp logo"> 802 </a> 803 <ul class="footer__nav-list"> 804 <li class="navbar__list-item"> 805 <a id="menuItemMapFooter" class="navbar__list-link" href="https://windy.app/map" data-amp="map" data-position="footer"> 806 Live map </a> 807</li> 808<li id="menuItemSpotsFooter" class="navbar__list-item" data-amp="spots" data-position="footer"> 809 <a class="navbar__list-link" href="https://windy.app/spots"> 810 Spots </a> 811</li> 812 <li class="nav-item"> 813 <a id="menuItemSpotfinderFooter" class="navbar__list-link" href="/search" data-amp="spotfinder" data-position="footer"> 814 Spotfinder 815 </a> 816 </li> 817<li id="menuItemWidgetsFooter" class="navbar__list-item" data-amp="widgets" data-position="footer"> 818 <a class="navbar__list-link" href="https://windy.app/widgets"> 819 Widgets </a> 820</li> 821<li class="navbar__list-item"> 822 <span id="menuItemMoreFooter" class="navbar__list-link"> 823 Articles... </span> 824 <div class="navbar__dropdown" aria-labelledby="navbarDropdown"> 825 <span class="navbar__dropdown-item navbar__dropdown-item_header">Articles...</span> 826 <a href="https://windy.app/news" class="navbar__dropdown-item" data-amp="news" data-position="footer">News</a> 827 <a href="https://windy.app/blog" class="navbar__dropdown-item" data-amp="blog" data-position="footer">Blog</a> 828 <a href="https://windy.app/guide" class="navbar__dropdown-item" data-amp="guide" data-position="footer">Guide</a> 829 <a href="https://windy.app/textbook" class="navbar__dropdown-item" data-amp="textbook" data-position="footer">Textbook</a> 830 <a href="https://windy.app/activities" class="navbar__dropdown-item" data-amp="activities" data-position="footer">Activities</a> 831 <a href="https://windy.app/features" class="navbar__dropdown-item" data-amp="features" data-position="footer">Features</a> 832 </div> 833
833<script> 834 document.addEventListener('DOMContentLoaded', function() { 835 const menuItemMore = document.getElementById('menuItemMoreFooter'); 836 const dropdownMenu = menuItemMore.nextElementSibling; 837 const parentLi = menuItemMore.parentElement; 838 839 menuItemMore.addEventListener('click', function(e) { 840 e.preventDefault(); 841 e.stopPropagation(); 842 843 document.querySelectorAll('.navbar__list-item.dropdown-open').forEach(item => { 844 if (item !== parentLi) { 845 item.classList.remove('dropdown-open'); 846 } 847 }); 848 849 parentLi.classList.toggle('dropdown-open'); 850 }); 851 852 document.addEventListener('click', function(e) { 853 if (!parentLi.contains(e.target)) { 854 parentLi.classList.remove('dropdown-open'); 855 } 856 }); 857 858 document.addEventListener('keydown', function(e) { 859 if (e.key === 'Escape') { 860 parentLi.classList.remove('dropdown-open'); 861 } 862 }); 863 }); 864 </script>
864 865 866</li> 867 868 869<li class="navbar__list-item" > 870 <span id="menuItemLangFooter" class="lang-choose"> 871 EN 872 </span> 873 <div class="navbar__dropdown" aria-labelledby="menuItemLangFooter"> 874 <span class="navbar__dropdown-item navbar__dropdown-item_header">Language</span> 875 <a class="navbar__dropdown-item" href="/es/blog">ES</a> 876 <a class="navbar__dropdown-item" href="/de/blog">DE</a> 877 <a class="navbar__dropdown-item" href="/fr/blog">FR</a> 878 <a class="navbar__dropdown-item" href="/it/blog">IT</a> 879 <a class="navbar__dropdown-item" href="/ja/blog">JA</a> 880 <a class="navbar__dropdown-item" href="/ko/blog">KO</a> 881 <a class="navbar__dropdown-item" href="/pt/blog">PT</a> 882 <a class="navbar__dropdown-item" href="/zh/blog">ZH</a> 883 <a class="navbar__dropdown-item" href="/tr/blog">TR</a> 884 <a class="navbar__dropdown-item" href="/ru/blog">RU</a> 885 </div> 886
886<script> 887 document.addEventListener('DOMContentLoaded', function() { 888 const menuItemLang = document.getElementById('menuItemLangFooter'); 889 const dropdownMenu = menuItemLang.nextElementSibling; 890 const parentLi = menuItemLang.parentElement; 891 892 menuItemLang.addEventListener('click', function(e) { 893 e.preventDefault(); 894 e.stopPropagation(); 895 896 document.querySelectorAll('.navbar__list-item.dropdown-open').forEach(item => { 897 if (item !== parentLi) { 898 item.classList.remove('dropdown-open'); 899 } 900 }); 901 902 parentLi.classList.toggle('dropdown-open'); 903 }); 904 905 document.addEventListener('click', function(e) { 906 if (!parentLi.contains(e.target)) { 907 parentLi.classList.remove('dropdown-open'); 908 } 909 }); 910 911 document.addEventListener('keydown', function(e) { 912 if (e.key === 'Escape') { 913 parentLi.classList.remove('dropdown-open'); 914 } 915 }); 916 }); 917 </script>
917 918</li> 919 </ul> 920 921 <div class="footer__social-wrapper"> 922 <a target="_blank" href="https://www.youtube.com/@windyapp" rel="nofollow"> 923 <img src="/img/yt-footer.svg" alt="youtube"> 924 </a> 925 <a target="_blank" href="https://www.facebook.com/windyapp.co/" rel="nofollow"> 926 <img src="/img/fb-footer.svg" alt="facebook"> 927 </a> 928 <a target="_blank" href="https://x.com/windyapp_co" rel="nofollow"> 929 <img src="/img/x-footer.svg" alt="x"> 930 </a> 931 <a target="_blank" href="https://www.instagram.com/windy.app?igshid=cqczug38wu7o" rel="nofollow"> 932 <img src="/img/inst-footer.svg" alt="instagram"> 933 </a> 934 </div> 935 </nav> 936 937 <div class="footer__copyright"> 938 © 2026 Copyright Windy Weather World Inc. The weather forecast, all info about spots and content of the articles is provided for personal non-commercial use.<br/>Windy Weather World Inc. does not promise any specific results from the use of its service or its components.<br>If you have any questions, <a class="mailtowindy" href="/cdn-cgi/l/email-protection#5126383f35281126383f35283021217f323e" target="_blank">drop us a message</a><br><a href="https://windyapp.co/CustomMenuItems/26/en" rel="nofollow">Privacy Policy</a> <a href="https://windyapp.co/CustomMenuItems/34/en" rel="nofollow">Terms of use</a>. </div> 939 940 <div class="footer__store-container"> 941 <a href="https://windyapp.onelink.me/VcDy/2nk1q8jz" data-desktopqrcode="/img/qr/code_main.png" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'ios'});" target="_blank" class="download-windy-ios" rel="nofollow"> 942 <img data-src="/img/btn-light-appstore.svg" 943 class="lazyload store-icons_type_footer" 944 alt="windyapp in app-store"> 945 </a> 946 <a href="https://windyapp.onelink.me/VcDy/2nk1q8jz" data-desktopqrcode="/img/qr/code_main.png" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'android'});" target="_blank" class="download-windy-android" rel="nofollow"> 947 <img data-src="/img/btn-light-googleplay.svg" 948 class="lazyload store-icons_type_footer" 949 alt="windyapp in google-play"> 950 </a> 951 <a href="https://appgallery.huawei.com/app/C110281657" rel="nofollow"> 952 <img src="/img/btn-light-huawei.svg" 953 alt="WINDY APP Huawei store" 954 class="lazyload store-icons_type_footer"/> 955 </a> 956 </div> 957 </footer> 958 959 960 <div class="weusecookies" data-frommobile=""> 961 <div class="weusecookies__content"> 962 <p>This website uses cookies to improve your experience. If you continue to browse this site, you are agreeing to our <a href="https://windyapp.co/CustomMenuItems/26/en" target="_blank" rel="nofollow">Privacy Policy</a> and <a href="https://windyapp.co/CustomMenuItems/34/en" target="_blank" rel="nofollow">Terms of Use</a>.</p> 963 <button>OK, close</button> 964 </div> 965 </div>
vendor: 114 bytes, lines 965-967
965 966 967 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
967<script> 968 //analytics 969 function logEventBackup(eventData) { 970 const url = '/amplitude-proxy.php'; 971 972 fetch(url, { 973 method: 'POST', 974 headers: { 975 'Content-Type': 'application/json', 976 }, 977 body: JSON.stringify({ events: [eventData] }) // Wraps the event data in an array 978 }) 979 .then(response => response.json()) 980 .then(data => { 981 console.log('Event logged successfully:', data); 982 }) 983 .catch(error => { 984 console.error('There was an error logging the BACKUP event:', error); 985 }); 986} 987 988 function logAmpPaywall(name, project = false) { 989 let userId = ''; 990 let params = { 'page': window.location.pathname }; // Define params here 991 992 try { 993 if (window.windySite && window.windySite.userDataAmplitude) { 994 params = { 995 'page': window.location.pathname, 996 'user': window.windySite.userDataAmplitude 997 }; 998 userId = window.windySite.userDataAmplitude.userId; 999 } 1000 1001 1002 amplitude.getInstance('paywall').init('444dfa426f5e17447c367e1ca0b89a1d', userId); 1003 1004 if(project) { 1005 if(project === 'paywall') { 1006 amplitude.getInstance('paywall').logEvent('CLICK_PAYWALL_' + name, params); 1007 } else if (project === 'login') { 1008 amplitude.getInstance('paywall').logEvent('USR_' + name, params); 1009 } 1010 } else { 1011 amplitude.getInstance('paywall').logEvent(name, params); 1012 } 1013 } catch (error) { 1014 1015 try { 1016 1017 const event = { 1018 event_type: name, 1019 device_id: 'WUCPUAImHUfkwbRJruUqWfVvaMefYfE9', 1020 event_properties: params ? params : 'none' // params is accessible here 1021 }; 1022 logEventBackup(event); 1023 } catch (backupError) { 1024 console.error('Failed to log backup ð« amplitude event', backupError); 1025 } 1026 } 1027 } 1028 1029 try { 1030 // Bind click events for elements with specific data attributes 1031 const bindAmplitudeEvents = (selector, project) => { 1032 const elements = document.querySelectorAll(selector); 1033 elements.forEach((item) => { 1034 item.addEventListener('click', function () { 1035 var postfix = selector.replace(/\[data-(.*?)\]/, "$1") 1036 .replace(/-([a-z])/g, function (match, letter) { 1037 return letter.toUpperCase(); 1038 }); 1039 1040 logAmpPaywall(item.dataset[postfix], project); 1041 }); 1042 }); 1043 }; 1044 1045 bindAmplitudeEvents('[data-amplitude-name]', 'paywall'); 1046 bindAmplitudeEvents('[data-amplitude-usr]', 'login'); 1047 1048 } catch (error) { 1049 console.error('Error attaching events to amplitude elements: ', error); 1050 } 1051 1052</script>
1052 1053
1054<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"e99ba1343284487ea99697080f9d450c","spa":2}' crossorigin="anonymous"></script>
1054 1055</body> 1056</html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.