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>Windy.app â Live wind map & weather forecast</title> 10 11 <meta name="description" content="Wind speed and direction map. Detailed weather forecast for your location. Weather tools for kiters, surfers, sailors and all outdoor sports lovers. Forecast models ECMWF, ICON, GFS, NAM, WRF"/> 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="website"> 25 <meta property="og:locale" content="en"> 26 <meta property="og:title" content="Windy.app â Live wind map & weather forecast"> 27 <meta property="og:description" content="Wind speed and direction map. Detailed weather forecast for your location. Weather tools for kiters, surfers, sailors and all outdoor sports lovers. Forecast models ECMWF, ICON, GFS, NAM, WRF"> 28 <meta property="og:image" content="https://windy.app/img/og_image_new.png?v2"> 29 <meta property="og:url" content="https://windy.app"> 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"> 34 <meta name="twitter:title" content="Windy.app â Live wind map & weather forecast"> 35 <meta name="twitter:description" content="Wind speed and direction map. Detailed weather forecast for your location. Weather tools for kiters, surfers, sailors and all outdoor sports lovers. Forecast models ECMWF, ICON, GFS, NAM, WRF"> 36 <meta name="twitter:image" content="https://windy.app/img/og_image_new.png?v2"> 37 <meta name="twitter:image:alt" content="Windy.app â Live wind map & weather forecast"> 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 99 <link rel="alternate" hreflang="es" href="https://windy.app/es" title="Español" /> 100 <link rel="alternate" hreflang="de" href="https://windy.app/de" title="Deutsch" /> 101 <link rel="alternate" hreflang="fr" href="https://windy.app/fr" title="Français" /> 102 <link rel="alternate" hreflang="it" href="https://windy.app/it" title="Italiano" /> 103 <link rel="alternate" hreflang="ja" href="https://windy.app/ja" title="æ¥æ¬èª" /> 104 <link rel="alternate" hreflang="ko" href="https://windy.app/ko" title="íêµì´" /> 105 <link rel="alternate" hreflang="pt" href="https://windy.app/pt" title="Português" /> 106 <link rel="alternate" hreflang="zh" href="https://windy.app/zh" title="ç®ä½ä¸æ" /> 107 <link rel="alternate" hreflang="tr" href="https://windy.app/tr" title="Türkçe" /> 108 <link rel="alternate" hreflang="ru" href="https://windy.app/ru" title="Ð ÑÑÑкий" /> 109 <link rel="alternate" hreflang="en" href="https://windy.app" title="English" /> 110 <link rel="alternate" hreflang="x-default" href="https://windy.app" title="English" /> 111 112
112<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>
112 113
113<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","name":"Windy Weather World Inc.","url":"https://windy.app/","logo":"https://windy.app/img/logo-w-words-short.svg","address":{"@type":"PostalAddress","streetAddress":"2093 Philadelphia Pike Ste 7353","addressLocality":"Claymont","addressRegion":"DE","postalCode":"19703","addressCountry":"US"},"sameAs":["https://www.youtube.com/@windyapp","https://facebook.com/windyapp.co/","https://twitter.com/windyapp_co","https://instagram.com/windy.app"]}</script>
113 114 115 <!-- Google Tag Manager --> 116
116<script>
vendor: 343 bytes, lines 116-120
116(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': 117 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], 118 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= 119 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); 120 })(window,document,'script','dataLayer','
120GTM-KZJ5994
vendor: 3 bytes, line 120
120');
120</script>
120 121 <!-- End Google Tag Manager --> 122 123 <link rel="canonical" href="https://windy.app"> 124</head> 125<style> 126 .windy-forecast { 127 position: relative; 128 overflow: hidden; 129 } 130</style> 131<body lang="en" class="main white" data-analytics='{ 132 "actions": [{ 133 "action": "pushToDataLayer", 134 "value": { 135 "event": "pageView" 136 } 137 }], 138 "waitingActions": [{ 139 "selector": "[aria-label=\"App promotion banner\"] [type=\"button\"]", 140 "actions": [{ 141 "action": "pushToDataLayer", 142 "value": { 143 "event": "analyticsEvent", 144 "eventCategory": "smart_app_banner", 145 "eventAction": "view", 146 "eventLabel": "appsflyer", 147 "eventProperty": "", 148 "eventValue": 0 149 } 150 },{ 151 "action": "pushToDataLayer", 152 "type": "onClick", 153 "value": { 154 "event": "analyticsEvent", 155 "eventCategory": "smart_app_banner", 156 "eventAction": "to_app", 157 "eventLabel": "appsflyer", 158 "eventProperty": "", 159 "eventValue": 0 160 } 161 }] 162 },{ 163 "selector": "[aria-label=\"Close banner\"]", 164 "actions": [{ 165 "action": "pushToDataLayer", 166 "type": "onClick", 167 "value": { 168 "event": "analyticsEvent", 169 "eventCategory": "smart_app_banner", 170 "eventAction": "close", 171 "eventLabel": "appsflyer", 172 "eventProperty": "", 173 "eventValue": 0 174 } 175 }] 176 }] 177}'> 178 <!-- Google Tag Manager (noscript) -->
vendor: 72 bytes, lines 178-179
178 179 <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=
179GTM-KZJ5994
vendor: 91 bytes, lines 179-181
179" 180 height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> 181
181<!-- End Google Tag Manager (noscript) --> 182 183 <!-- <div id="page-loading-overlay" class="page-loading-overlay" onclick="this.style.display='none'"><div></div></div> --> 184 185
185<script> 186 window.__cfRLUnblockHandlers = true; 187 // setTimeout(function(){ 188 // document.getElementById('page-loading-overlay').style.display = 'none'; 189 // }, 5000); 190 </script>
190 191
191<script> 192function getCookie(name) { 193 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 194 return r && r[1]; 195} 196</script>
196 197 198 <header class="header"> 199 <nav class="navbar"> 200 <a id="navbarLogo" class="navbar-brand navbar-logo navbar__logo" href="https://windy.app/"> 201 <img src="/img/logo-w-words-short.svg" 202 alt="windyapp logo"> 203 </a> 204 <style> 205.red_button:hover { 206 background-color: #b8220e; 207 /* filter: drop-shadow(1px 2px 6px #ff3e47); */ 208} 209 210</style> 211 <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='{ 212 "actions": [{ 213 "type": "onClick", 214 "action": "setVariable", 215 "name": "referred_screen", 216 "value": "web_header_mobile" 217 }] 218 }'> 219 Try for FREE 220 </a> 221
222<script> 223function getCookie(name) { 224 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 225 return r && r[1]; 226} 227</script>
vendor: 1 bytes, line 227
227
228<script> 229// show/hide "pro" promo buttons 230// This partial is included several times per page, so no top-level declarations 231// here â they would throw "already declared" and kill the later copies. 232document.querySelectorAll('[data-promo-pro]').forEach(el => { 233 // nothing promoting PRO on the paywall itself, and visibility goes back to 234 // CSS instead of a forced inline flex, which used to override media queries 235 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 236 else el.style.removeProperty('display'); 237 // } 238}) 239</script>
239 240 <button class="navbar__search-button" type="button" id="mobileSearchButton"> 241 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"> 242 <path d="M17.5 17.5L13.8833 13.8833" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 243 <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"/> 244 </svg> 245 </button> 246 <input type="checkbox" class="navbar__fake-burger" id="fakeBurger"> 247 <label for="fakeBurger" class="navbar__burger" id="headerBurger"></label> 248 <ul id="navbarMenu" class="navbar__list"> 249
249<script> 250function getCookie(name) { 251 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 252 return r && r[1]; 253} 254</script>
254 255 256 257<li class="navbar__list-item"> 258 <a id="menuItemMap" class="navbar__list-link" href="https://windy.app/map" data-amp="map" data-position="header"> 259 Live map </a> 260</li> 261<li id="menuItemSpots" class="navbar__list-item" data-amp="spots" data-position="header"> 262 <a class="navbar__list-link" href="https://windy.app/spots"> 263 Spots </a> 264</li> 265<li id="menuItemWidgets" class="navbar__list-item" data-amp="widgets" data-position="header"> 266 <a class="navbar__list-link" href="https://windy.app/widgets"> 267 Widgets </a> 268</li> 269 270<style> 271.red_button:hover { 272 background-color: #b8220e; 273 /* filter: drop-shadow(1px 2px 6px #ff3e47); */ 274} 275 276</style> 277<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='{ 278 "actions": [{ 279 "type": "onClick", 280 "action": "setVariable", 281 "name": "referred_screen", 282 "value": "web_header_desktop" 283 }] 284 }'> 285 Try for FREE 286 </a> 287</li>
288<script> 289function getCookie(name) { 290 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 291 return r && r[1]; 292} 293</script>
vendor: 1 bytes, line 293
293
294<script> 295// show/hide "pro" promo buttons 296// This partial is included several times per page, so no top-level declarations 297// here â they would throw "already declared" and kill the later copies. 298document.querySelectorAll('[data-promo-pro]').forEach(el => { 299 // nothing promoting PRO on the paywall itself, and visibility goes back to 300 // CSS instead of a forced inline flex, which used to override media queries 301 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 302 else el.style.removeProperty('display'); 303 // } 304}) 305</script>
305 306 307<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> 308 309<a id="navbarLoginDesktop" class="navbar__login navbar__login_desktop" href="/user/dashboard/"><p class="navbar__login-p">Sign in</p></a> 310 </ul> 311</nav> 312 <div class="spot-search-mobile" id="spotSearchMobile" style="display: none;"> 313 314 315 <div class="spot-search"> 316 <form class="spot-search__form input-group"> 317 <fieldset class="spot-search__input-wrapper"> 318 <input 319 type="text" 320 class="px-4 form-control spots_search spot-search__input" 321 placeholder="Enter spot name" 322 name="search" 323 id="search-mobile" 324 /> 325 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none"> 326 <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"/> 327 </svg> 328 </fieldset> 329 330 <a href="/map" button class="btn-openmap btn-map-icon spot-search__button"> 331 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="18" fill="none"> 332 <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"/> 333 </svg> 334 </a> 335 </form> 336 337 <button class="spot-search__button" type="button" id="mobileSearchClose"> 338 <svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> 339 <path d="M15.8332 4.16675L4.1665 15.8334" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 340 <path d="M4.1665 4.16675L15.8332 15.8334" stroke="white" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/> 341 </svg> 342 </button> 343 </div> 344 345 346 <div class="search_example search_example--mobile"> 347 <span class="dimmed-text">For example:</span> 348 <a>Boracay Island</a> 349 </div> 350 351</div> 352 353 354 355 356
357<script> 358(function() { 359 document.addEventListener('click', function(e) { 360 var link = e.target.closest('.search_example a'); 361 if (!link) return; 362 if (link.getAttribute('href')) return; 363 364 e.preventDefault(); 365 var text = link.textContent.trim(); 366 var searchInput = null; 367 368 if (link.closest('.spot-search-mobile')) { 369 searchInput = document.getElementById('search-mobile'); 370 } else { 371 var exampleContainer = link.closest('.search_example--desktop'); 372 if (exampleContainer) { 373 var spotSearch = exampleContainer.previousElementSibling; 374 while (spotSearch && !spotSearch.classList.contains('spot-search')) { 375 spotSearch = spotSearch.previousElementSibling; 376 } 377 if (spotSearch) searchInput = spotSearch.querySelector('.spots_search'); 378 } 379 if (!searchInput) searchInput = document.querySelector('.spots_search'); 380 } 381 382 if (searchInput) { 383 searchInput.value = text; 384 searchInput.focus(); 385 searchInput.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 41, which: 41 })); 386 } 387 }); 388})(); 389</script>
389 390</header>
391<script> 392 const mobile = window.matchMedia('(max-width: 960px)').matches; 393 const navbarLogin = mobile ? document.querySelector('#navbarLoginMobile') : document.querySelector('#navbarLoginDesktop'); 394 const isLoggedIn = getCookie('mobile_user_auth') == 1; 395 396 navbarLogin.classList.add('navbar__login_' + (isLoggedIn ? 'y' : 'n')); 397 398 if (isLoggedIn) { 399 navbarLogin.querySelector('.navbar__login-p').remove(); 400 const img = document.createElement('img'); 401 img.alt = ''; 402 img.className = 'navbar__avatar'; 403 const placeholder = '/img/navbar__login2.svg'; 404 const avatar = decodeURIComponent(getCookie('mobile_user_avatar') || ''); 405 img.src = avatar || placeholder; 406 img.onerror = () => { if (img.src !== location.origin + placeholder) img.src = placeholder; }; 407 navbarLogin.append(img); 408 } 409 410 if (getCookie('mobile_user_is_pro') == 1) { 411 navbarLogin.classList.add('navbar__login_pro'); 412 const proBadge = document.createElement('span'); 413 proBadge.classList.add('navbar__pro-badge'); 414 proBadge.textContent = 'PRO'; 415 navbarLogin.append(proBadge); 416 } 417 418 const mobileSearchBtn = document.getElementById('mobileSearchButton'); 419 const spotSearchMobile = document.getElementById('spotSearchMobile'); 420 if (mobileSearchBtn && spotSearchMobile) { 421 mobileSearchBtn.addEventListener('click', function(e) { 422 e.preventDefault(); 423 spotSearchMobile.style.display = 'flex'; 424 requestAnimationFrame(function() { 425 var searchInput = spotSearchMobile.querySelector('.spots_search'); 426 if (searchInput) { 427 searchInput.focus(); 428 } 429 }); 430 }); 431 } 432</script>
432 433 434 <div class="intro position-relative"> 435 436
436<script> 437 document.addEventListener("DOMContentLoaded", function(event) { 438 const searchForm = document.querySelector('.spot-search__form'); 439 if (searchForm) { 440 searchForm.addEventListener('submit', e => { 441 e.preventDefault(); 442 }); 443 } 444 }); 445 </script>
445 446 447 <main class="content"> 448 <div class="spot-search"> 449 <form class="spot-search__form input-group"> 450 <fieldset class="spot-search__input-wrapper"> 451 <input 452 type="text" 453 class="px-4 form-control spots_search spot-search__input" 454 placeholder="Enter spot name" 455 name="search" 456 id="search" 457 /> 458 <svg xmlns="http://www.w3.org/2000/svg" width="18" height="18" fill="none"> 459 <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"/> 460 </svg> 461 </fieldset> 462 463 <a href="/map" button class="btn-openmap btn-map-icon spot-search__button"> 464 <svg xmlns="http://www.w3.org/2000/svg" width="20" height="18" fill="none"> 465 <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"/> 466 </svg> 467 Open on map </a> 468 </form> 469 470 </div> 471 472 473 474 475 476 477<div class="search_example search_example--desktop"> 478 <span class="dimmed-text">For example:</span> 479 <a>St. Peter-Ording</a> 480</div> 481 482
483<script> 484(function() { 485 document.addEventListener('click', function(e) { 486 var link = e.target.closest('.search_example a'); 487 if (!link) return; 488 if (link.getAttribute('href')) return; 489 490 e.preventDefault(); 491 var text = link.textContent.trim(); 492 var searchInput = null; 493 494 if (link.closest('.spot-search-mobile')) { 495 searchInput = document.getElementById('search'); 496 } else { 497 var exampleContainer = link.closest('.search_example--desktop'); 498 if (exampleContainer) { 499 var spotSearch = exampleContainer.previousElementSibling; 500 while (spotSearch && !spotSearch.classList.contains('spot-search')) { 501 spotSearch = spotSearch.previousElementSibling; 502 } 503 if (spotSearch) searchInput = spotSearch.querySelector('.spots_search'); 504 } 505 if (!searchInput) searchInput = document.querySelector('.spots_search'); 506 } 507 508 if (searchInput) { 509 searchInput.value = text; 510 searchInput.focus(); 511 searchInput.dispatchEvent(new KeyboardEvent('keyup', { keyCode: 41, which: 41 })); 512 } 513 }); 514})(); 515</script>
515 516 </main> 517 <div class="wmo-winner"> 518 <img class="wmo-winner__img-logo" src="/img/wmo/WMO-logo-blue.png?v3" width="1000" height="563" title="WINDY APP Best specialized weather app in its category - WMO"> 519 <h1 class="text mb-0 wmo-winner__text"> 520 Best specialized weather app in<br>its category - Outdoor<br>activities, leisure and sports<br> 521 (<a href="/wmowinner/en" target="_blank" >read more</a>) 522 </h1> 523 <img class="wmo-winner__img-two-circles" src="/img/wmo/WMO3.png?v2" width="519" height="312" title="WINDY APP Best specialized weather app in its category - WMO"> 524 <img class="wmo-winner__img-three-phones" src="/img/wmo/WMO-screen-2.jpg" width="777" height="820" title="WINDY APP Best specialized weather app in its category - WMO"> 525 <div class="wmo-winner__download-container"> 526 <a href="https://windyapp.onelink.me/VcDy/maj23uxr" data-desktopqrcode="/img/qr/code_main.png" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'ios'});" class="download-windy-ios wmo-winner__download wmo-winner__download_left" rel="nofollow"><img src="/img/btn-appstore.svg" alt="WINDY APP Appstore" width="141" height="47" class="wmo-winner__download-image"/></a> 527 <a href="https://windyapp.onelink.me/VcDy/maj23uxr" data-desktopqrcode="/img/qr/code_main.png" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'android'});" class="download-windy-android wmo-winner__download wmo-winner__download_right" rel="nofollow"><img src="/img/btn-googleplay.svg" alt="WINDY APP Google Play" width="141" height="47" class="wmo-winner__download-image"/></a> 528 <a href="https://appgallery.huawei.com/app/C110281657" class="download-windy-android wmo-winner__download wmo-winner__download_right" rel="nofollow"><img src="/img/btn-huawei.svg" alt="WINDY APP Huawei store" width="141" height="47" class="wmo-winner__download-image"/></a> 529 </div> 530 </div> 531 <div class="what-is-windy container row no-gutters mx-auto my-5"> 532 <div class="col-12 col-md-6 p-4 image"> 533 <span class="youtube" onclick="$('#video').attr('src', $('#video').attr('data-src')).show();"></span> 534 <iframe id="video" width="100%" height="100%" data-src="https://www.youtube.com/embed/PtHn7ylJ1vk" title="The world is out playground!" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> 535 </div> 536 <div class="col-12 col-md-6 py-4 pl-0 pl-md-5"> 537 <h2 class="pb-3">What is Windy?</h2> 538 <p>Windy.app is a professional weather app, created for water and wind sports: sailing, surfing, fishing, and etc. Get detailed weather forecast, live world wind map, and local weather reports.</p> 539 </div> 540 541 </div> 542 543 <div class="home-weather container no-gutters mx-auto" id="homeWeather" 544 onclick="gtag('event', 'click_main_widget_forecast');"> 545 <h3 class="home-weather__title">Forecast</h3> 546 <div class="home-weather__forecast"></div> 547 <div class="home-weather__map"></div> 548 <div class="home-weather__station"> 549 <h3 class="home-weather__station-title"></h3> 550 <div class="home-weather__station-widget"></div> 551 </div> 552</div> 553
554<script> 555(function () { 556 const DEFAULT_SPOT_ID = 395499; 557 const API = 'https://api.windyapp.co'; 558 559 const root = document.getElementById('homeWeather'); 560 const lastSpot = getCookie('last_spot'); 561 const spotId = lastSpot || DEFAULT_SPOT_ID; 562 const json = (url) => fetch(url).then((response) => response.json()); 563 const first = (list) => (Array.isArray(list) && list.length ? list[0] : null); 564 565 function loader(src, onload) { 566 const script = document.createElement('script'); 567 script.async = true; 568 script.src = src; 569 if (onload) script.onload = onload; 570 document.body.appendChild(script); 571 } 572 573 function widget(selector, type) { 574 const div = document.createElement('div'); 575 Object.assign(div.dataset, { 576 windywidget: type, 577 thememode: 'white', 578 appid: 'windyapp', 579 spotid: spotId 580 }); 581 root.querySelector(selector).appendChild(div); 582 } 583 584 function whenVisible(selector, mount) { 585 const observe = () => { 586 const observer = new IntersectionObserver((entries) => { 587 if (!entries[0].isIntersecting) return; 588 observer.disconnect(); 589 mount(); 590 }, { rootMargin: '200px' }); 591 observer.observe(root.querySelector(selector)); 592 }; 593 594 // Images above this block carry no width/height, so until they load the 595 // block sits near the top of the page and would look visible right away 596 if (document.readyState === 'complete') observe(); 597 else addEventListener('load', observe); 598 } 599 600 function showMap() { 601 widget('.home-weather__map', 'map'); 602 loader('/widgets-code/map/windy_map_async.js'); 603 } 604 605 widget('.home-weather__forecast', 'forecast'); 606 loader('/widgets-code/forecast/windy_forecast_async.js'); 607 608 // The map is the heaviest part of the page, so it loads up front only for a 609 // signed in visitor on a wide screen. Phones already struggle with INP, and 610 // an anonymous visitor who never scrolls should not pay for the tiles 611 const onPhone = window.matchMedia('(max-width: 767px)').matches; 612 const loggedIn = getCookie('mobile_user_auth') == 1 && getCookie('mobile_user_user_id'); 613 614 if (!onPhone && loggedIn) { 615 showMap(); 616 } else { 617 whenVisible('.home-weather__map', showMap); 618 } 619 620 // The meteostation is below the fold and needs the spot coordinates first, 621 // so both requests wait until the user scrolls towards it 622 function showMeteostation() { 623 json(API + '/apiV9.php?method=getSpot&spotID=' + spotId) 624 .then((res) => first(res.response && res.response.spots)) 625 .then((spot) => spot && json(API + '/v10/nearby/meteostations/' + spot.lat + ',' + spot.lon + '?sort=distance&limit=1')) 626 .then((res) => { 627 const station = res && first(res.response && res.response.data); 628 if (!station) throw new Error('no station nearby'); 629 630 // The widget prints the station name itself, the title only frames it 631 root.querySelector('.home-weather__station-title').textContent = 632 'Closest meteostation (:distance km):' 633 .replace(':distance', Math.round(station.distance)); 634 root.querySelector('.home-weather__station-widget').innerHTML = '<div id="homeMeteostation"></div>'; 635 loader('/widgets-code/meteostation-widget-v2/dist/widget.min.js', 636 () => MeteostationWidget.init('#homeMeteostation', station.station_id, { locale: 'en-US', showForecast: true })); 637 }) 638 .catch(() => root.querySelector('.home-weather__station').remove()); 639 } 640 641 whenVisible('.home-weather__station', showMeteostation); 642})(); 643</script>
643 644 645 <div class="container no-gutters mx-auto widgets mt-5"> 646 647 <h3><a href="https://windy.app/spots">Top Spots</a></h3> 648 649 <ul class="spots__list"> 650 <li> 651 <a href="https://windy.app/forecast2/spot/23140/Tarifa">Tarifa<span style="font-size:0"> 652 <img src="/img/activities-icons/kite-w.svg"/> 653 </span></a> 654 </li> 655 <li> 656 <a href="https://windy.app/forecast2/spot/29892/Almanarre+-+Zone+De+kite+%23kite">Almanarre - Zone De kite #kite<span style="font-size:0"> 657 <img src="/img/activities-icons/kite-w.svg"/> 658 </span></a> 659 </li> 660 <li> 661 <a href="https://windy.app/forecast2/spot/277907/Ulcinj">Ulcinj<span style="font-size:0"> 662 <img src="/img/activities-icons/kite-w.svg"/> 663 </span></a> 664 </li> 665 <li> 666 <a href="https://windy.app/forecast2/spot/10771/Brouwersdam">Brouwersdam<span style="font-size:0"> 667 <img src="/img/activities-icons/kite-w.svg"/> 668 </span></a> 669 </li> 670 <li> 671 <a href="https://windy.app/forecast2/spot/17991/Taipei+Taiwan+%E5%8F%B0%E5%8C%97">Taipei, Taiwan (å°å)<span style="font-size:0"> 672 </span></a> 673 </li> 674 <li> 675 <a href="https://windy.app/forecast2/spot/344598/Leucate+-+La+Franqui+-+Les+Coussoules+%23kite">Leucate - La Franqui - Les Coussoules #kite<span style="font-size:0"> 676 <img src="/img/activities-icons/kite-w.svg"/> 677 </span></a> 678 </li> 679 <li> 680 <a href="https://windy.app/forecast2/spot/23251/Lisbon+Lisboa">Lisbon, Lisboa<span style="font-size:0"> 681 </span></a> 682 </li> 683 <li> 684 <a href="https://windy.app/forecast2/spot/324072/Hurgada+-+Playkite+%23kite">Hurgada - Playkite #kite<span style="font-size:0"> 685 <img src="/img/activities-icons/kite-w.svg"/> 686 </span></a> 687 </li> 688 <li> 689 <a href="https://windy.app/forecast2/spot/327697/Marseille+-+Pointe+Rouge+%23kite">Marseille - Pointe Rouge #kite<span style="font-size:0"> 690 <img src="/img/activities-icons/kite-w.svg"/> 691 </span></a> 692 </li> 693 <li> 694 <a href="https://windy.app/forecast2/spot/315701/Taichung+Taiwan+%E5%8F%B0%E4%B8%AD">Taichung, Taiwan (å°ä¸)<span style="font-size:0"> 695 </span></a> 696 </li> 697 </ul> 698 699 <h3><a href="https://windy.app/spots#topCountries">Top Countries</a></h3> 700 701 <ul class="spots__list mb-0 pb-0"> 702 <li> 703 <a href="https://windy.app/spots/United States">United States (131550)</a> 704 </li> 705 <li> 706 <a href="https://windy.app/spots/Canada">Canada (14393)</a> 707 </li> 708 <li> 709 <a href="https://windy.app/spots/Russia">Russia (9867)</a> 710 </li> 711 <li> 712 <a href="https://windy.app/spots/Japan">Japan (7898)</a> 713 </li> 714 <li> 715 <a href="https://windy.app/spots/China">China (6502)</a> 716 </li> 717 <li> 718 <a href="https://windy.app/spots/France">
718France (6480)</a> 719 </li> 720 <li> 721 <a href="https://windy.app/spots/Brazil">Brazil (6307)</a> 722 </li> 723 <li> 724 <a href="https://windy.app/spots/Australia">Australia (6008)</a> 725 </li> 726 <li> 727 <a href="https://windy.app/spots/Spain">Spain (5863)</a> 728 </li> 729 <li> 730 <a href="https://windy.app/spots/Italy">Italy (5432)</a> 731 </li> 732 <li> 733 <a href="https://windy.app/spots/Turkey">Turkey (5393)</a> 734 </li> 735 <li> 736 <a href="https://windy.app/spots/United Kingdom">United Kingdom (5348)</a> 737 </li> 738 <li> 739 <a href="https://windy.app/spots/Sweden">Sweden (5003)</a> 740 </li> 741 <li> 742 <a href="https://windy.app/spots/Indonesia">Indonesia (4821)</a> 743 </li> 744 <li> 745 <a href="https://windy.app/spots/South Korea">South Korea (4456)</a> 746 </li> 747 <li> 748 <a href="https://windy.app/spots/Germany">Germany (3791)</a> 749 </li> 750 <li> 751 <a href="https://windy.app/spots/Argentina">Argentina (2768)</a> 752 </li> 753 </ul> 754 755 </div> 756 757 758 759 <div style="padding: 20px 0; background: linear-gradient(0deg, #F1F1F1 0%, #FFFFFF 25%, #FFFFFF 100%);"> 760 <div class="what-is-windy container row no-gutters mx-auto mt-5" > 761 <div class="col-12 col-md-6 p-4"> 762 <h2 class="pb-3">Windy for Business</h2> 763 <p>Windy.app is more than just a wind forecast app.<br> We help companies improve business efficiency and mitigate weather-related risks by providing hyperlocal weather data and solutions based on it.</p> 764 <a href="https://media.windy.app/b2b" target="_blank" class="btn" style="display:flex;align-items:center; justify-content:space-around; width:288px; border-radius:10px; background-color: #0583F4;min-height:49px; text-decoration:none; color:#ffffff; font-size:14px;" rel="nofollow"> 765 <p style="margin:0;">Learn more</p> 766 </a> 767 </div> 768 <div class="col-12 col-md-6 py-4 pl-0 pl-md-5"> 769 <img style="border-radius: 10px; max-height: 356px; object-fit:contain;" width="100%" height="100%" src="https://windy.app/img/windy-business.jpg?v2" alt="windy-business-image" loading="lazy"/> 770 </div> 771 </div> 772 </div> 773 774</div> 775<div id="popup" class="popup" style="position:fixed; z-index: 1000; top:0;left: 0; height: 100%; width:100%; overflow-y: scroll; background-color: rgba(0,0,0,0.5); visibility: hidden; opacity: 0; transition: visibility 0.4s, opacity 0.4s ease-out;"> 776 <div style="max-width: 400px; margin: 1.5rem auto; position: relative; box-sizing: border-box"> 777 <div class="popup-content" style="margin-top: 10%; background-color: #ffffff; border-radius: 5px; width: 100%;"> 778 <div class="modal-header"> 779 <h5 class="modal-title" style="width: 100%; text-align: center;"> 780 We are sorry, but this model is available only in the App 781 <img style="display: inline-block; height: 30px; width: 30px;" src="https://windy.app/logo.svg" alt="Windy.app logo"> 782 </h5> 783 <button id="closeButton" class="popup-closebutton" style="width:30px;height: 30px; font-size: 30px; box-sizing: border-box; color: #000000; opacity: 0.5; background-color: rgba(0,0,0,0); border: none; transform: rotate(45deg); outline: none; cursor: pointer;">+</button> 784 </button> 785 </div> 786 <div class="modal-body" style="text-align: center;"> 787 <span>You can get Windy.App for your platform here:</span> 788 <br> 789 <a style="display: inline-block; width:45%;" target="_blank" href="https://windy.app.link/site-need-map-features-ios" onclick="gtag('event', 'go_to_
789store', {'event_category':'site_button', 'event_label':'ios'});" class="pr-0 pr-sm-2" rel="nofollow"><img style="width: 100%;" src="/img/btn-appstore.svg" alt="WINDY APP Appstore" class="p-2"></a> 790 <a style="display: inline-block; width:45%;" target="_blank" href="https://windy.app.link/site-need-map-features-android" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'android'});" rel="nofollow"><img style="width: 100%;" src="/img/btn-googleplay.svg" alt="WINDY APP Google Play" class="p-2"></a> 791 <br> 792 <br> 793 <span>Or if this model is important for you in the web - please let us know at <a href="/cdn-cgi/l/email-protection#604017090e04192017090e04190110104e030f" target="_blank"><span class="__cf_email__" data-cfemail="ee9987808a97ae9987808a978f9e9ec08d81">[email protected]</span></a></span> 794 <br> 795 <br> 796 <img style="width: 100%; object-fit: contain;" alt="App models" src="/img/promo/app-models.svg"> 797 </div> 798 </div> 799 </div> 800</div> 801 802 803 <div class="container no-gutters mx-auto my-5 articles articles-news"> 804 <h2 class="mb-4">News</h2> 805 <div class="all-link ml-5"> 806 <a href="https://windy.app/news"> 807 All news </a> 808 </div> 809 810 811 <div class="articles-items"> 812 <div class="row"> 813 814 815 816 <div class="articles-item col-12 col-md-4"> 817 <div class="articles-item__text"> 818 <h3><a href="https://windy.app/news/watch-the-webinar-fish-and-boat-with-windy-app.html">Watch our Webinar: Fish and Boat with Windy.app</a></h3> 819 <p></p> 820 </div> 821 </div> 822 823 824 <div class="articles-item col-12 col-md-4"> 825 <div class="articles-item__text"> 826 <h3><a href="https://windy.app/news/widgets-for-apple-watch.html">Widgets for Apple Watch</a></h3> 827 <p></p> 828 </div> 829 </div> 830 831 832 <div class="articles-item col-12 col-md-4"> 833 <div class="articles-item__text"> 834 <h3><a href="https://windy.app/news/sea-temperature-map.html">Presenting the Sea Temperature Map</a></h3> 835 <p></p> 836 </div> 837 </div> 838 839 840 </div> 841 </div> 842 843 <hr class="my-4"/> 844 845 </div> 846 847 848 <div class="container no-gutters mx-auto my-5 articles articles-blog"> 849 <h2 class="mb-4">Blog</h2> 850 <div class="all-link ml-5"> 851 <a href="https://windy.app/blog"> 852 Read all articles </a> 853 </div> 854 855 <div class="articles-items"> 856 <div class="row"> 857 <a href="https://windy.app/blog/what-to-read.html" class="articles-item col-12 col-md-6 mb-4"> 858 <div class="articles-item__image"> 859 <div> 860 <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"> 861 </div> 862 </div> 863 <div class="articles-item__text px-0"> 864 <h3 class="item-title">First time here? Read the most useful posts on the Windy.app blog and site</h3> 865 <p></p> 866 </div> 867 </a> 868 869 870 871 <a href="https://windy.app/blog/cycling-guide-with-windy-app.html" class="articles-item col-12 col-md-3 mb-4"> 872 <div class="articles-item__image"> 873 <div> 874 <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"> 875 </div> 876 </div> 877 <div class="articles-item__text px-0"> 878 <h3 class="item-title">Embracing the Prairies: Cycling Guide with Windy.app</h3> 879 <p></p> 880 </div> 881 </a> 882 883 884 885 <a href="https://windy.app/blog/sup-safety-rules.html" class="articles-item col-12 col-md-3 mb-4"> 886 <div class="articles-item__image"> 887 <div> 888 <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"> 889 </div> 890 </div> 891 <div class="articles-item__text px-0"> 892 <h3 class="item-title">Stand up paddle boarding (SUP) safety rules</h3> 893 <p></p> 894 </div> 895 </a> 896 897 </div> 898 </div> 899 900 <hr class="my-4"/> 901 902 </div> 903 904 <div class="container no-gutters mx-auto my-5 articles articles-blog"> 905 <h2 class="mb-4"> 906 <a href="https://windy.app/textbook"> 907 Textbook </a> 908 </h2> 909 <div class="all-link ml-5"> 910 <a href="https://windy.app/textbook/meteorology-in-simple-words-windy-app-textbook.html"> 911 All posts </a> 912 </div> 913 914 <div class="articles-items"> 915 <div class="row"> 916 <a href="https://windy.app/textbook/meteorology-in-simple-words-windy-app-textbook.html" class="articles-item col-12 col-md-6 mb-4"> 917 <div class="articles-item__image"> 918 <div> 919 <img data-src="https://cdn.windy.app/site-storage/posts/November2022/79o0DcEbKlfQgoD7somZ-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/November2022/79o0DcEbKlfQgoD7somZ-tn-x2.jpg 2x" alt="The Windy.app Meteorological Textbook for better weather forecasting" class="lazyload"> 920 </div> 921 </div> 922 <div class="articles-item__text px-0"> 923 <h3 class="item-title">The Windy.app Meteorological Textbook for better weather forecasting</h3> 924 <p></p> 925 </div> 926 </a> 927 928 929 930 <a href="https://windy.app/textbook/little-known-facts-about-cyclones.html" class="articles-item col-12 col-md-3 mb-4"> 931 <div class="articles-item__image"> 932 <div> 933 <img data-src="https://cdn.windy.app/site-storage/posts/March2026/qSAwrmzlGXhLhh7gMDap-tn.png" data-srcset="https://cdn.windy.app/site-storage/posts/March2026/qSAwrmzlGXhLhh7gMDap-tn-x2.png 2x" alt="Little-known facts about cyclone
933s" class="lazyload"> 934 </div> 935 </div> 936 <div class="articles-item__text px-0"> 937 <h3 class="item-title">Little-known facts about cyclones</h3> 938 <p></p> 939 </div> 940 </a> 941 942 943 944 <a href="https://windy.app/textbook/when-fire-rises-above-the-clouds.html" class="articles-item col-12 col-md-3 mb-4"> 945 <div class="articles-item__image"> 946 <div> 947 <img data-src="https://cdn.windy.app/site-storage/posts/February2026/iXU6uGHGJQspiR8mHq6I-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/February2026/iXU6uGHGJQspiR8mHq6I-tn-x2.jpg 2x" alt="When Fire Rises Above the Clouds" class="lazyload"> 948 </div> 949 </div> 950 <div class="articles-item__text px-0"> 951 <h3 class="item-title">When Fire Rises Above the Clouds</h3> 952 <p></p> 953 </div> 954 </a> 955 956 </div> 957 </div> 958 959 <div> 960 <a href="/media/subscribe/" target="_blank" class="link-subscribe"> 961 Subscribe to Windy.app Meteo Textbook </a> 962 </div> 963 964 <hr class="my-4"/> 965 966 </div> 967 968 <div class="container no-gutters mx-auto my-5 articles articles-blog"> 969 <h2 class="mb-4">Guide</h2> 970 <div class="all-link ml-5"> 971 <a href="https://windy.app/guide"> 972 All posts </a> 973 </div> 974 975 <div class="articles-items"> 976 <div class="row"> 977 <a href="https://windy.app/guide/guide-windhub.html" class="articles-item col-12 col-md-6 mb-4"> 978 <div class="articles-item__image"> 979 <div> 980 <img data-src="https://cdn.windy.app/site-storage/posts/August2023/YqH8i0sABdF0nkuE7JTK-tn.png" data-srcset="https://cdn.windy.app/site-storage/posts/August2023/YqH8i0sABdF0nkuE7JTK-tn-x2.png 2x" alt="Guide into WindHub" class="lazyload"> 981 </div> 982 </div> 983 <div class="articles-item__text px-0"> 984 <h3 class="item-title">Guide into WindHub</h3> 985 <p></p> 986 </div> 987 </a> 988 989 990 991 <a href="https://windy.app/guide/guide-for-apple-watch.html" class="articles-item col-12 col-md-3 mb-4"> 992 <div class="articles-item__image"> 993 <div> 994 <img data-src="https://cdn.windy.app/site-storage/posts/August2023/Ti4YFy6GZ2k6HwK9DnKX-tn.png" data-srcset="https://cdn.windy.app/site-storage/posts/August2023/Ti4YFy6GZ2k6HwK9DnKX-tn-x2.png 2x" alt="The guide to Windy.app for Apple Watch" class="lazyload"> 995 </div> 996 </div> 997 <div class="articles-item__text px-0"> 998 <h3 class="item-title">The guide to Windy.app for Apple Watch</h3> 999 <p></p> 1000 </div> 1001 </a> 1002 1003 1004 1005 <a href="https://windy.app/guide/all-guides.html" class="articles-item col-12 col-md-3 mb-4"> 1006 <div class="articles-item__image"> 1007 <div> 1008 <img data-src="https://cdn.windy.app/site-storage/posts/February2022/nbTWC27cWg9rVzAfyYeB-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/February2022/nbTWC27cWg9rVzAfyYeB-tn-x2.jpg 2x" alt="User guides: get the most out of the Windy.app" class="lazyload"> 1009 </div> 1010 </div> 1011 <div class="articles-item__text px-0"> 1012 <h3 class="item-title">User guides: get the most out of the Windy.app</h3> 1013 <p></p> 1014 </div> 1015 </a> 1016 1017 </div> 1018 </div> 1019 1020 <hr class="my-4"/> 1021 1022 </div> 1023 1024 <div class="container no-gutters mx-auto my-5 articles articles-blog"> 1025 <h2 class="mb-4">Activities</h2> 1026 <div class="all-link ml-5"> 1027 <a href="https://windy.app/activities"> 1028 All activities </a> 1029 </div> 1030 1031 <div class="articles-items"> 1032 <div class="row"> 1033 <a href="https://windy.app/activities/outdoor-encyclopedia.html" class="articles-item col-12 col-md-6 mb-4"> 1034 <div class="articles-item__image"> 1035 <div> 1036 <img data-src="https://cdn.windy.app/site-storage/posts/January2022/jF35wkUXv1b3fPr5kUxi-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/January2022/jF35wkUXv1b3fPr5kUxi-tn-x2.jpg 2x" alt="The Windy.app Outdoor Encyclopedia" class="lazyload"> 1037 </div> 1038 </div> 1039 <div class="articles-item__text px-0"> 1040 <h3 class="item-title">The Windy.app Outdoor Encyclopedia</h3> 1041 <p></p> 1042 </div> 1043 </a> 1044 1045 1046 1047 <a href="https://windy.app/activities/a-brief-guide-to-kiteboarding-for-beginners.html" class="articles-item col-12 col-md-3 mb-4"> 1048 <div class="articles-item__image"> 1049 <div> 1050 <img data-src="https://cdn.windy.app/site-storage/posts/March2021/Stqqceujc7KB81rDNTSS-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/March2021/Stqqceujc7KB81rDNTSS-tn-x2.jpg 2x" alt="Kitesurfing" class="lazyload"> 1051 </div> 1052 </div> 1053 <div class="articles-item__text px-0"> 1054 <h3 class="item-title">Kitesurfing</h3> 1055 <p></p> 1056 </div> 1057 </a> 1058 1059 1060 1061 <a href="https://windy.app/activities/windsurfing.html" class="articles-item col-12 col-md-3 mb-4"> 1062 <div class="articles-item__image"> 1063 <div> 1064 <img data-src="https://cdn.windy.app/site-storage/posts/December2021/QQTaNiMmfPz18YET1OHz-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/December2021/QQTaNiMmfPz18YET1OHz-tn-x2.jpg 2x" alt="Windsurfing" class="lazyload"> 1065 </div> 1066 </div> 1067 <div class="articles-item__text px-0"> 1068 <h3 class="item-title">Windsurfing</h3> 1069 <p></p> 1070 </div> 1071 </a> 1072 1073 </div> 1074 </div> 1075 1076 <hr class="my-4"/> 1077 1078 </div> 1079 1080 <div class="container no-gutters mx-auto my-5 articles articles-blog"> 1081 <h2 class="mb-4">Features</h2> 1082 <div class="all-link ml-5"> 1083 <a href="https://windy.app/features"> 1084 All features </a> 1085 </div> 1086 1087 <div class="articles-items"> 1088 <div class="row"> 1089 <a href="https://windy.app/features/key.html" class="articles-item col-12 col-md-6 mb-4"> 1090 <div class="articles-item__image"> 1091 <div> 1092 <img data-src="https://cdn.windy.app/site-storage/posts/December2021/uUbEAOrkzZV1UCvYH8Vn-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/December2021/uUbEAOrkzZV1UCvYH8Vn-tn-x2.jpg 2x" alt="Navigate through the Windy.app key features" class="lazyload"> 1093 </div> 1094 </div> 1095 <div class="articles-item__text px-0"> 1096 <h3 class="item-title">Navigate through the Windy.app key features</h3> 1097 <p></p> 1098 </div> 1099 </a> 1100 1101 1102 1103 <a href="https://windy.app/features/compare-basic-pro-web.html" class="articles-item col-12 col-md-3 mb-4"> 1104 <div class="articles-item__image"> 1105 <div> 1106 <img data-src="https://cdn.windy.app/site-storage/posts/February2022/JJ3xfJtNwloNUeg2mAdL-tn.jpg" data-srcset="https://cdn.windy.app/site-storage/posts/February2022/JJ3xfJtNwloNUeg2mAdL-tn-x2.jpg 2x" alt="Compare Windy.app versions: Basic, Pro, Web" class="lazyload"> 1107 </div> 1108 </div> 1109 <div class="articles-item__text px-0"> 1110 <h3 class="item-title">Compare Windy.app versions: Basic, Pro, Web</h3> 1111 <p></p> 1112 </div> 1113 </a> 1114 1115 1116 1117 <a href="https://windy.app/features/spots-search.html" class="articles-item col-12 col-md-3 mb-4"> 1118 <div class="articles-item__image"> 1119 <div> 1120 <img data-src="https://cdn.windy.app/site-storage/posts/December2021/Km4WlMlUEo0g2LJHnKF9-tn.png" data-srcset="https://cdn.windy.app/site-storage/posts/December2021/Km4WlMlUEo0g2LJHnKF9-tn-x2.png 2x" alt="Spots search" class="lazyload"> 1121 </div> 1122 </div> 1123 <div class="articles-item__text px-0"> 1124 <h3 class="item-title">Spots search</h3> 1125 <p></p> 1126 </div> 1127 </a> 1128 1129 </div> 1130 </div> 1131 1132 <hr class="my-4"/> 1133 1134 </div> 1135 1136 <div id="popupWeatherModels" class="popup-weather-models" style="position:fixed; z-index: 1000; top:0;left: 0; height: 100%; width:100%;
1136 overflow-y: scroll; background-color: rgba(0,0,0,0.5); visibility: hidden; opacity: 0; transition: visibility 0.4s, opacity 0.4s ease-out;"> 1137 <div style="max-width: 400px; margin: 1.5rem auto; position: relative; box-sizing: border-box"> 1138 <div class="popup-content" style="margin-top: 10%; background-color: #ffffff; border-radius: 5px; width: 100%;"> 1139 <div class="modal-header"> 1140 <h5 class="modal-title" style="width: 100%; text-align: center;"> 1141 We are sorry, but this model is available only in the App 1142 </h5> 1143 <button id="closeButton" class="popup-closebutton" style="width:30px;height: 30px; font-size: 30px; box-sizing: border-box; color: #000000; opacity: 0.5; background-color: rgba(0,0,0,0); border: none; transform: rotate(45deg); outline: none; cursor: pointer;">+</button> 1144 </button> 1145 </div> 1146 <div class="modal-body" style="text-align: center;"> 1147 <span>You can get Windy.App for your platform here:</span> 1148 <br> 1149 <a style="display: inline-block; width:45%;" target="_blank" href="https://windy.app.link/site-need-map-features-ios" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'ios'});" class="pr-0 pr-sm-2" rel="nofollow"><img src="/img/btn-appstore.svg" alt="WINDY APP Appstore" class="p-2 store-icons_type_black"></a> 1150 <a style="display: inline-block; width:45%;" target="_blank" href="https://windy.app.link/site-need-map-features-android" onclick="gtag('event', 'go_to_store', {'event_category':'site_button', 'event_label':'android'});" rel="nofollow"><img src="/img/btn-googleplay.svg" alt="WINDY APP Google Play" class="p-2 store-icons_type_black"></a> 1151 <br> 1152 <br> 1153 <span>Or if this model is important for you in the web - please let us know at <a href="/cdn-cgi/l/email-protection#7a5a0d13141e033a0d13141e031b0a0a541915" target="_blank"><span class="__cf_email__" data-cfemail="d2a5bbbcb6ab92a5bbbcb6abb3a2a2fcb1bd">[email protected]</span></a></span> 1154 <br> 1155 <br> 1156 <img style="width: 100%; object-fit: contain;" alt="App models" src="/img/promo/app-models.svg"> 1157 </div> 1158 </div> 1159 </div> 1160 </div> 1161 1162<div id="stickyRibbonPro" class="banner-ribbon banner-ribbon_fixed banner-ribbon_orange" data-promo-pro> 1163 <div class="banner-ribbon__container"> 1164 <span class="banner-ribbon__text banner-ribbon__text_smaller">Get unlimited access to weather data</span> 1165 <a href="/pro?src=sticky" target="_blank" class="banner-ribbon__button" data-analytics='{ 1166 "actions": [{ 1167 "type": "onClick", 1168 "action": "setVariable", 1169 "name": "referred_screen", 1170 "value": "web_footer_ribbon" 1171 }] 1172 }'> 1173 <div class="banner-ribbon__button-image banner-ribbon__button-image_crown"></div> 1174 <span class="banner-ribbon__button-text">Go PRO</span> 1175 </a> 1176 </div> 1177</div>
vendor: 109 bytes, lines 1177-1178
1177 1178<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1178<script> 1179function getCookie(name) { 1180 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 1181 return r && r[1]; 1182} 1183</script>
vendor: 1 bytes, line 1183
1183
1184<script> 1185// show/hide "pro" promo buttons 1186// This partial is included several times per page, so no top-level declarations 1187// here â they would throw "already declared" and kill the later copies. 1188document.querySelectorAll('[data-promo-pro]').forEach(el => { 1189 // nothing promoting PRO on the paywall itself, and visibility goes back to 1190 // CSS instead of a forced inline flex, which used to override media queries 1191 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 1192 else el.style.removeProperty('display'); 1193 // } 1194}) 1195</script>
vendor: 1 bytes, line 1195
1195
1196<script> 1197function getCookie(name) { 1198 var r = document.cookie.split('; ').map(c => c.split('=')).find(o => o[0] == name); 1199 return r && r[1]; 1200} 1201</script>
vendor: 1 bytes, line 1201
1201
1202<script> 1203// show/hide "pro" promo buttons 1204// This partial is included several times per page, so no top-level declarations 1205// here â they would throw "already declared" and kill the later copies. 1206document.querySelectorAll('[data-promo-pro]').forEach(el => { 1207 // nothing promoting PRO on the paywall itself, and visibility goes back to 1208 // CSS instead of a forced inline flex, which used to override media queries 1209 if (/^\/pro2?(\/|$)/.test(location.pathname) || getCookie('mobile_user_is_pro') == 1) el.style.display = 'none'; 1210 else el.style.removeProperty('display'); 1211 // } 1212}) 1213</script>
1213 1214 1215 <div class="intro_promo"> 1216 <div class="container row no-gutters mx-auto text-center text-sm-left"> 1217 <div class="col-12 col-xl-7 d-inline-block align-bottom py-4 pb-xl-6 text-left"> 1218 <h2>Professional Weather App</h2> 1219 <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> 1220 Get a detailed online 10 day weather forecast, live worldwide wind map and local weather reports from the most accurate weather models.<br> 1221 Compare spot conditions, ask locals in the app chat, discover meteo lessons, and share your experience in our Windy.app Community.<br> 1222 Be sure with Windy.app.</div> 1223 <div class="text-center text-lg-left pb-5"> 1224 <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> 1225 <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> 1226 <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> 1227 </div> 1228 </div> 1229 <div class="col-12 col-xl-5 text-center d-none d-xl-inline-block" style="align-content: flex-end;"> 1230 <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"> 1231 </div> 1232 </div> 1233</div> <footer class="footer"> 1234 <nav class="footer__nav"> 1235 <a class="footer__logo" href="/"> 1236 <img src="/img/logo-w-words-short.svg" 1237 alt="windyapp logo"> 1238 </a> 1239 <ul class="footer__nav-list"> 1240 <li class="navbar__list-item"> 1241 <a id="menuItemMapFooter" class="navbar__list-link" href="https://windy.app/map" data-amp="map" data-position="footer"> 1242 Live map </a> 1243</li> 1244<li id="menuItemSpotsFooter" class="navbar__list-item" data-amp="spots" data-position="footer"> 1245 <a class="navbar__list-link" href="https://windy.app/spots"> 1246 Spots </a> 1247</li> 1248 <li class="nav-item"> 1249 <a id="menuItemSpotfinderFooter" class="navbar__list-link" href="/search" data-amp="spotfinder" data-position="footer"> 1250 Spotfinder 1251 </a> 1252 </li> 1253<li id="menuItemWidgetsFooter" class="navbar__list-item" data-amp="widgets" data-position="footer"> 1254 <a class="navbar__list-link" href="https://windy.app/widgets"> 1255 Widgets </a> 1256</li> 1257<li class="navbar__list-item"> 1258 <span id="menuItemMoreFooter" class="navbar__list-link"> 1259 Articles... </span> 1260 <div class="navbar__dropdown" aria-labelledby="navbarDropdown"> 1261 <span class="navbar__dropdown-item navbar__dropdown-item_header">Articles...</span> 1262 <a href="https://windy.app/news" class="navbar__dropdown-item" data-amp="news" data-position="footer">News</a> 1263 <a href="https://windy.app/blog" class="navbar__dropdown-item" data-amp="blog" data-position="footer">Blog</a> 1264 <a href="https://windy.app/guide" class="navbar__dropdown-item" data-amp="guide" data-position="footer">Guide</a> 1265 <a href="https://windy.app/textbook" class="navbar__dropdown-item" data-amp="textbook" data-position="footer">Textbook</a> 1266 <a href="https://windy.app/activities" class="navbar__dropdown-item" data-amp="activities" data-position="footer">Activities</a> 1267 <a href="https://windy.app/features" class="navbar__dropdown-item" data-amp="features" data-position="footer">Features</a> 1268 </div> 1269
1269<script> 1270 document.addEventListener('DOMContentLoaded', function() { 1271 const menuItemMore = document.getElementById('menuItemMoreFooter'); 1272 const dropdownMenu = menuItemMore.nextElementSibling; 1273 const parentLi = menuItemMore.parentElement; 1274 1275 menuItemMore.addEventListener('click', function(e) { 1276 e.preventDefault(); 1277 e.stopPropagation(); 1278 1279 document.querySelectorAll('.navbar__list-item.dropdown-open').forEach(item => { 1280 if (item !== parentLi) { 1281 item.classList.remove('dropdown-open'); 1282 } 1283 }); 1284 1285 parentLi.classList.toggle('dropdown-open'); 1286 }); 1287 1288 document.addEventListener('click', function(e) { 1289 if (!parentLi.contains(e.target)) { 1290 parentLi.classList.remove('dropdown-open'); 1291 } 1292 }); 1293 1294 document.addEventListener('keydown', function(e) { 1295 if (e.key === 'Escape') { 1296 parentLi.classList.remove('dropdown-open'); 1297 } 1298 }); 1299 }); 1300 </script>
1300 1301 1302</li> 1303 1304 1305<li class="navbar__list-item" > 1306 <span id="menuItemLangFooter" class="lang-choose"> 1307 EN 1308 </span> 1309 <div class="navbar__dropdown" aria-labelledby="menuItemLangFooter"> 1310 <span class="navbar__dropdown-item navbar__dropdown-item_header">Language</span> 1311 <a class="navbar__dropdown-item" href="/es">ES</a> 1312 <a class="navbar__dropdown-item" href="/de">DE</a> 1313 <a class="navbar__dropdown-item" href="/fr">FR</a> 1314 <a class="navbar__dropdown-item" href="/it">IT</a> 1315 <a class="navbar__dropdown-item" href="/ja">JA</a> 1316 <a class="navbar__dropdown-item" href="/ko">KO</a> 1317 <a class="navbar__dropdown-item" href="/pt">PT</a> 1318 <a class="navbar__dropdown-item" href="/zh">ZH</a> 1319 <a class="navbar__dropdown-item" href="/tr">TR</a> 1320 <a class="navbar__dropdown-item" href="/ru">RU</a> 1321 </div> 1322
1322<script> 1323 document.addEventListener('DOMContentLoaded', function() { 1324 const menuItemLang = document.getElementById('menuItemLangFooter'); 1325 const dropdownMenu = menuItemLang.nextElementSibling; 1326 const parentLi = menuItemLang.parentElement; 1327 1328 menuItemLang.addEventListener('click', function(e) { 1329 e.preventDefault(); 1330 e.stopPropagation(); 1331 1332 document.querySelectorAll('.navbar__list-item.dropdown-open').forEach(item => { 1333 if (item !== parentLi) { 1334 item.classList.remove('dropdown-open'); 1335 } 1336 }); 1337 1338 parentLi.classList.toggle('dropdown-open'); 1339 }); 1340 1341 document.addEventListener('click', function(e) { 1342 if (!parentLi.contains(e.target)) { 1343 parentLi.classList.remove('dropdown-open'); 1344 } 1345 }); 1346 1347 document.addEventListener('keydown', function(e) { 1348 if (e.key === 'Escape') { 1349 parentLi.classList.remove('dropdown-open'); 1350 } 1351 }); 1352 }); 1353 </script>
1353 1354</li> 1355 </ul> 1356 1357 <div class="footer__social-wrapper"> 1358 <a target="_blank" href="https://www.youtube.com/@windyapp" rel="nofollow"> 1359 <img src="/img/yt-footer.svg" alt="youtube"> 1360 </a> 1361 <a target="_blank" href="https://www.facebook.com/windyapp.co/" rel="nofollow"> 1362 <img src="/img/fb-footer.svg" alt="facebook"> 1363 </a> 1364 <a target="_blank" href="https://x.com/windyapp_co" rel="nofollow"> 1365 <img src="/img/x-footer.svg" alt="x"> 1366 </a> 1367 <a target="_blank" href="https://www.instagram.com/windy.app?igshid=cqczug38wu7o" rel="nofollow"> 1368 <img src="/img/inst-footer.svg" alt="instagram"> 1369 </a> 1370 </div> 1371 </nav> 1372 1373 <div class="footer__copyright"> 1374 © 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#cfb8a6a1abb68fb8a6a1abb6aebfbfe1aca0" 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> 1375 1376 <div class="footer__store-container"> 1377 <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"> 1378 <img data-src="/img/btn-light-appstore.svg" 1379 class="lazyload store-icons_type_footer" 1380 alt="windyapp in app-store"> 1381 </a> 1382 <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"> 1383 <img data-src="/img/btn-light-googleplay.svg" 1384 class="lazyload store-icons_type_footer" 1385 alt="windyapp in google-play"> 1386 </a> 1387 <a href="https://appgallery.huawei.com/app/C110281657" rel="nofollow"> 1388 <img src="/img/btn-light-huawei.svg" 1389 alt="WINDY APP Huawei store" 1390 class="lazyload store-icons_type_footer"/> 1391 </a> 1392 </div> 1393 </footer> 1394 1395 1396 <div class="weusecookies" data-frommobile=""> 1397 <div class="weusecookies__content"> 1398 <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> 1399 <button>OK, close</button> 1400 </div> 1401 </div>
vendor: 114 bytes, lines 1401-1403
1401 1402 1403 <script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>
1403<script> 1404 //analytics 1405 function logEventBackup(eventData) { 1406 const url = '/amplitude-proxy.php'; 1407 1408 fetch(url, { 1409 method: 'POST', 1410 headers: { 1411 'Content-Type': 'application/json', 1412 }, 1413 body: JSON.stringify({ events: [eventData] }) // Wraps the event data in an array 1414 }) 1415 .then(response => response.json()) 1416 .then(data => { 1417 console.log('Event logged successfully:', data); 1418 }) 1419 .catch(error => { 1420 console.error('There was an error logging the BACKUP event:', error); 1421 }); 1422} 1423 1424 function logAmpPaywall(name, project = false) { 1425 let userId = ''; 1426 let params = { 'page': window.location.pathname }; // Define params here 1427 1428 try { 1429 if (window.windySite && window.windySite.userDataAmplitude) { 1430 params = { 1431 'page': window.location.pathname, 1432 'user': window.windySite.userDataAmplitude 1433 }; 1434 userId = window.windySite.userDataAmplitude.userId; 1435 } 1436 1437 1438 amplitude.getInstance('paywall').init('444dfa426f5e17447c367e1ca0b89a1d', userId); 1439 1440 if(project) { 1441 if(project === 'paywall') { 1442 amplitude.getInstance('paywall').logEvent('CLICK_PAYWALL_' + name, params); 1443 } else if (project === 'login') { 1444 amplitude.getInstance('paywall').logEvent('USR_' + name, params); 1445 } 1446 } else { 1447 amplitude.getInstance('paywall').logEvent(name, params); 1448 } 1449 } catch (error) { 1450 1451 try { 1452 1453 const event = { 1454 event_type: name, 1455 device_id: 'YU1h0Ftd2hHzXuh9Rj3J4ErXvuyNOMUe', 1456 event_properties: params ? params : 'none' // params is accessible here 1457 }; 1458 logEventBackup(event); 1459 } catch (backupError) { 1460 console.error('Failed to log backup ð« amplitude event', backupError); 1461 } 1462 } 1463 } 1464 1465 try { 1466 // Bind click events for elements with specific data attributes 1467 const bindAmplitudeEvents = (selector, project) => { 1468 const elements = document.querySelectorAll(selector); 1469 elements.forEach((item) => { 1470 item.addEventListener('click', function () { 1471 var postfix = selector.replace(/\[data-(.*?)\]/, "$1") 1472 .replace(/-([a-z])/g, function (match, letter) { 1473 return letter.toUpperCase(); 1474 }); 1475 1476 logAmpPaywall(item.dataset[postfix], project); 1477 }); 1478 }); 1479 }; 1480 1481 bindAmplitudeEvents('[data-amplitude-name]', 'paywall'); 1482 bindAmplitudeEvents('[data-amplitude-usr]', 'login'); 1483 1484 } catch (error) { 1485 console.error('Error attaching events to amplitude elements: ', error); 1486 } 1487 1488</script>
1488 1489
1490<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>
1490 1491</body> 1492</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.