PageSourceSearch

https://windy.app/blog

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

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.