PageSourceSearch

https://windy.app/

html windy.app collected 2026-10-01 10:20:49 UTC 74,703 bytes, 1,492 lines download raw bytes

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 &amp; 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 &amp; 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 &amp; 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 &amp; 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;">&plus;</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&#160;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;">&plus;</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&#160;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                &copy; 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&nbsp;its service or&nbsp;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>&nbsp;<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&nbsp;website&nbsp;uses&nbsp;cookies to&nbsp;improve&nbsp;your&nbsp;experience. If&nbsp;you&nbsp;continue&nbsp;to&nbsp;browse&nbsp;this&nbsp;site, you&nbsp;are&nbsp;agreeing&nbsp;to&nbsp;our <a href="https://windyapp.co/CustomMenuItems/26/en" target="_blank" rel="nofollow">Privacy&nbsp;Policy</a>&nbsp;and&nbsp;<a href="https://windyapp.co/CustomMenuItems/34/en" target="_blank" rel="nofollow">Terms&nbsp;of&nbsp;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.