1<!DOCTYPE html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8"> 5 <title>Windscribe Wins Legal Battle in Greece Due to No-Logs Policy</title> 6 <meta content="width=device-width, initial-scale=1" name="viewport"> 7 8 <!-- Stylesheets --> 9 <link href="/blog/assets/css/normalize.css?v=DTNql-_VKk70TvMn" rel="stylesheet" type="text/css"> 10 <link href="/blog/assets/css/webflow.css?v=st-vXNG3dLM1jkU3" rel="stylesheet" type="text/css"> 11 <link href="/blog/assets/css/graces-wondrous-site-4ca0e9.webflow.css?v=e2vAhVvCAi2lrzLL" rel="stylesheet" type="text/css"> 12 13 <style> 14 /* ========================================================================== 15 Webflow Overrides 16 Webflow-generated rules needed for animations/transitions to work 17 ========================================================================== */ 18 html.w-mod-js:not(.w-mod-ix3) :is( 19 .glow-underline, 20 [data-wf-target*='["09b99aaa-60ae-a5b4-ae29-6961d3020a60","bb6cf3ee-742f-0ca1-68ac-27c981174138"]'] 21 ) { 22 visibility: hidden !important; 23 } 24 25 /* Ensure dropdown-list is visible when open, regardless of IX3 state */ 26 .dropdown-list.w--open { 27 visibility: visible !important; 28 display: block !important; 29 } 30 31 /* Z-index layering: top bar above dropdown */ 32 .nav-top { 33 position: relative; 34 z-index: 100; 35 } 36 37 .dropdown-list { 38 z-index: 50; 39 top: 73px !important; /* Keep position fixed even when closed */ 40 } 41 42 /* Dropdown - simple quick fade */ 43 .dropdown-list { 44 display: block !important; 45 visibility: hidden; 46 opacity: 0; 47 transition: opacity 0.15s ease, visibility 0s 0.15s; 48 pointer-events: none; 49 background-color: var(--_colors---background-dark); 50 } 51 .dropdown-list.w--open { 52 visibility: visible !important; 53 opacity: 1; 54 transition: opacity 0.15s ease, visibility 0s 0s; 55 pointer-events: auto; 56 background-color: var(--_colors---background-dark); 57 } 58 59 /* ========================================================================== 60 Global 61 ========================================================================== */ 62 body.body { 63 background-color: var(--_colors---background-dark); 64 } 65 66 .section-all { 67 background-color: var(--_colors---background-dark); 68 } 69 70 /* ========================================================================== 71 Navigation â Search Icon 72 ========================================================================== */ 73 .search-toggle { 74 cursor: pointer; 75 display: flex; 76 align-items: center; 77 } 78 79 .search-toggle .search-icon { 80 transition: opacity 0.15s ease; 81 } 82 83 .search-toggle:hover .search-icon { 84 opacity: 0.85; 85 filter: brightness(0.85); 86 } 87 88 /* ========================================================================== 89 Navigation â Active States (Desktop Tabs + Mobile Dropdown) 90 ========================================================================== */ 91 .nav-glow.active .glow-underline { 92 visibility: visible !important; 93 opacity: 1 !important; 94 } 95 96 .nav-glow.active .tab { 97 color: var(--_colors---text-light-default); 98 } 99 100 html.w-mod-ix3 .nav-glow.active .glow-underline { 101 visibility: visible !important; 102 opacity: 1 !important; 103 } 104 105 .dropdown-inner .link-2.active { 106 color: var(--_colors---text-light-default); 107 text-decoration: underline; 108 text-decoration-color: var(--_colors---text-green-default); 109 text-underline-offset: 4px; 110 text-decoration-thickness: 2px; 111 } 112 113 /* ========================================================================== 114 Author Lists â Comma Separator 115 ========================================================================== */ 116 .cms-author:last-child .cms-comma { 117 display: none; 118 } 119 120 /* Fix multi-author comma spacing â override flex gap with inline flow */ 121 .author-list { 122 display: inline; 123 grid-column-gap: 0; 124 grid-row-gap: 0; 125 } 126 127 .author-list .cms-author { 128 white-space: nowrap; 129 } 130 131 .author-list .cms-comma { 132 margin-right: 4px; 133 } 134 135 /* ========================================================================== 136 Post/Page Hero â Layout & Spacing 137 ========================================================================== */ 138 .post-hero-content { 139 width: 80% !important; 140 max-width: 1112px; 141 margin: 0 auto; 142 text-align: center; 143 } 144 145 .post-hero-content .featured-post-info { 146 align-items: center; 147 } 148 149 .post-hero-image { 150 width: 100%; 151 max-width: 1112px; 152 margin: 0 auto; 153 } 154 155 .tag-list { 156 display: flex; 157 gap: 12px; 158 justify-content: center; 159 flex-wrap: wrap; 160 } 161 162 .tag-list .tag { 163 justify-content: center; 164 } 165 166 .post-template .section-top, 167 .page-template .section-top { 168 grid-row-gap: 40px; 169 } 170 171 .post-template .featured-post-info, 172 .page-template .featured-post-info { 173 gap: 24px; 174 } 175 176 .post-template .section-top .thumbnail-link, 177 .page-template .section-top .thumbnail-link { 178 margin-top: 0; 179 } 180 181 .post-template .section-top .hero-image, 182 .page-template .section-top .hero-image { 183 cursor: default; 184 } 185 186 .post-template .section-top .hero-image:hover, 187 .page-template .section-top .hero-image:hover { 188 opacity: 1; 189 } 190 191 .post-template .authors-list.center-author, 192 .page-template .authors-list.center-author { 193 justify-content: center; 194 } 195 196 .post-template .authors-list.center-author .author-list-wrapper, 197 .page-template .authors-list.center-author .author-list-wrapper { 198 width: auto; 199 text-align: left; 200 } 201 202 /* Tag row with decoration */ 203 .tag-row { 204 display: flex; 205 justify-content: space-between; 206 align-items: center; 207 width: 100%; 208 } 209 210 .tag-decoration { 211 height: 10px; 212 width: auto; 213 opacity: 0.6; 214 } 215 216 /* ========================================================================== 217 Post Content â Images, Figures & Captions 218 ========================================================================== */ 219 .blog-text img, 220 .w-richtext img { 221 width: 80%; 222 max-width: 100%; 223 height: auto; 224 display: block; 225 padding: 16px 0; 226 margin-left: auto; 227 margin-right: auto; 228 } 229 230 /* HTML card images â make <a> wrappers block-level so margin:auto centering works */ 231 .blog-text a:has(> img) { 232 display: block; 233 } 234 235 /* Bookmark card images should NOT inherit global image styles */ 236 .kg-bookmark-icon { 237 width: 22px !important; 238 height: 22px !important; 239 padding: 0 !important; 240 display: inline !important; 241 margin-left: 0 !important; 242 margin-right: 8px !important; 243 } 244
245 .kg-bookmark-thumbnail img { 246 width: 100% !important; 247 height: 100% !important; 248 object-fit: cover !important; 249 padding: 0 !important; 250 margin-left: 0 !important; 251 margin-right: 0 !important; 252 } 253 254 /* Bookmark card â full styling override */ 255 .blog-text .kg-bookmark-card, 256 .w-richtext .kg-bookmark-card { 257 width: 100%; 258 margin: 1.5em 0; 259 } 260 261 .blog-text .kg-bookmark-container, 262 .w-richtext .kg-bookmark-container { 263 display: flex; 264 text-decoration: none; 265 border-radius: 0 !important; 266 border: 1px solid var(--_colors---border-white-10) !important; 267 background-color: var(--_colors---background-light-5) !important; 268 overflow: hidden; 269 color: inherit; 270 min-height: 140px; 271 } 272 273 .blog-text .kg-bookmark-content, 274 .w-richtext .kg-bookmark-content { 275 flex-grow: 1; 276 display: flex; 277 flex-direction: column; 278 justify-content: flex-start; 279 padding: 20px; 280 overflow: hidden; 281 order: 1; 282 text-align: left !important; 283 } 284 285 .blog-text .kg-bookmark-title, 286 .w-richtext .kg-bookmark-title { 287 font-weight: 600; 288 font-size: 1rem; 289 line-height: 1.4; 290 color: var(--_colors---text-light-default, #fff); 291 } 292 293 .blog-text .kg-bookmark-description, 294 .w-richtext .kg-bookmark-description { 295 margin-top: 10px; 296 font-size: 0.875rem; 297 line-height: 1.5; 298 opacity: 0.7; 299 color: var(--_colors---text-light-default, #fff); 300 overflow: hidden; 301 display: -webkit-box; 302 -webkit-line-clamp: 2; 303 -webkit-box-orient: vertical; 304 } 305 306 .blog-text .kg-bookmark-metadata, 307 .w-richtext .kg-bookmark-metadata { 308 margin-top: auto; 309 padding-top: 10px; 310 display: flex; 311 align-items: center; 312 font-size: 0.8rem; 313 color: var(--_colors---text-light-default, #fff); 314 } 315 316 .blog-text .kg-bookmark-author, 317 .w-richtext .kg-bookmark-author { 318 opacity: 0.7; 319 } 320 321 .blog-text .kg-bookmark-publisher, 322 .w-richtext .kg-bookmark-publisher { 323 opacity: 0.7; 324 } 325 326 .blog-text .kg-bookmark-thumbnail, 327 .w-richtext .kg-bookmark-thumbnail { 328 position: relative; 329 min-width: 160px; 330 max-width: 240px; 331 order: 2; 332 } 333 334 .kg-image-card, 335 .kg-gallery-card, 336 .kg-card { 337 width: 100%; 338 max-width: 100%; 339 } 340 341 .blog-text figure, 342 .w-richtext figure, 343 .blog-text .kg-image-card, 344 .blog-text .kg-card { 345 display: block; 346 width: 100%; 347 max-width: 100%; 348 margin-left: 0; 349 margin-right: 0; 350 text-align: center; 351 } 352 353 /* HTML card (code snippets) - center align contents */ 354 .blog-text .kg-html-card, 355 .w-richtext .kg-html-card { 356 width: 100% !important; 357 max-width: 100% !important; 358 text-align: center !important; 359 display: flex !important; 360 flex-direction: column !important; 361 align-items: center !important; 362 } 363 364 /* Linked images in paragraphs - center */ 365 .blog-text p > a:has(img), 366 .w-richtext p > a:has(img) { 367 display: block; 368 text-align: center; 369 } 370 371 .blog-text p > a > img, 372 .w-richtext p > a > img { 373 display: inline-block; 374 margin-left: auto; 375 margin-right: auto; 376 } 377 378 .blog-text figure img, 379 .w-richtext figure img { 380 display: block; 381 width: 80%; 382 margin-left: auto; 383 margin-right: auto; 384 } 385 386 .blog-text p:has(img), 387 .w-richtext p:has(img) { 388 text-align: center; 389 } 390 391 .blog-text figcaption, 392 .w-richtext figcaption, 393 .kg-image-card figcaption, 394 .kg-card figcaption { 395 text-align: center; 396 width: 100%; 397 color: var(--_colors---text-light-subtitle); 398 } 399 400 /* ========================================================================== 401 Post Content â Ghost Card Overrides (Callouts, Buttons, Dividers) 402 ========================================================================== */ 403 .blog-text .kg-callout-card { 404 border-radius: 0; 405 background-color: var(--_colors---background-light-10); 406 text-align: left; 407 display: flex; 408 align-items: center; 409 justify-content: flex-start; 410 padding: 24px !important; 411 } 412 413 .blog-text .kg-callout-card .kg-callout-text { 414 font-weight: 600; 415 } 416 417 .blog-text .kg-btn-accent, 418 .blog-text a.kg-btn.kg-btn-accent, 419 .w-richtext .kg-btn-accent, 420 div.blog-text div.kg-card a.kg-btn, 421 .blog-text .kg-button-card .kg-btn, 422 .blog-text .kg-button-card a.kg-btn, 423 .kg-button-card .kg-btn { 424 border-radius: 0 !important; 425 text-align: center !important; 426 display: flex !important; 427 align-items: center !important; 428 justify-content: center !important; 429 position: relative !important; 430 background-color: var(--_colors---background-green-default) !important; 431 color: var(--_colors---text-dark) !important; 432 padding: 32px 24px !important; 433 margin-top: 16px !important; 434 margin-bottom: 16px !important; 435 line-height: 1 !important; 436 } 437 438 .blog-text hr, 439 .w-richtext hr { 440 border: none; 441 border-top: 1px solid var(--_colors---border-white-10); 442 padding: 0; 443 margin-top: 40px; 444 margin-bottom: 40px; 445 } 446 447 /* YouTube/Vimeo video embeds - proper aspect ratio and full width */ 448 .blog-text iframe[src*="youtube"], 449 .blog-text iframe[src*="vimeo"], 450 .w-richtext iframe[src*="youtube"], 451 .w-richtext iframe[src*="vimeo"], 452 .kg-embed-card iframe[src*="youtube"], 453 .kg-embed-card iframe[src*="vimeo"] { 454 width: 100% !important; 455 max-width: 100% !important; 456 aspect-ratio: 16 / 9; 457 height: auto !important; 458 } 459 460 /* All other iframes - full width but natural height */ 461 .blog-text iframe, 462 .w-richtext iframe, 463 .kg-embed-card iframe { 464 max-width: 100%; 465 display: block; 466 } 467 468 .kg-embed-card,
469 .kg-video-card { 470 margin: 24px 0; 471 width: 100% !important; 472 max-width: 100% !important; 473 } 474 475 /* Ghost native video player - full width, no black box */ 476 .kg-video-card .kg-video-container { 477 width: 100% !important; 478 max-width: 100% !important; 479 background: transparent !important; 480 padding: 0 !important; 481 } 482 483 .kg-video-card .kg-video-player-container { 484 width: 100% !important; 485 max-width: 100% !important; 486 background: transparent !important; 487 } 488 489 .kg-video-card .kg-video-player { 490 width: 100% !important; 491 max-width: 100% !important; 492 } 493 494 /* Video elements in post content */ 495 .blog-text video, 496 .w-richtext video, 497 .kg-video-card video { 498 width: 100% !important; 499 max-width: 100% !important; 500 height: auto !important; 501 display: block; 502 padding: 0; 503 border-radius: 0; 504 } 505 506 /* Twitter/YouTube embed spacing */ 507 .blog-text iframe[src*="youtube"], 508 .blog-text iframe[src*="vimeo"], 509 .w-richtext iframe[src*="youtube"], 510 .w-richtext iframe[src*="vimeo"], 511 .blog-text iframe[src*="twitter.com"], 512 .blog-text iframe[src*="x.com"], 513 .blog-text iframe[src*="platform.twitter"], 514 .w-richtext iframe[src*="twitter.com"], 515 .w-richtext iframe[src*="x.com"], 516 .w-richtext iframe[src*="platform.twitter"], 517 .blog-text twitter-widget, 518 .w-richtext twitter-widget { 519 padding: 8px 0; 520 } 521 522 /* Social media embeds (Twitter/X, Instagram, etc.) - center align */ 523 .blog-text .kg-embed-card[data-provider*="twitter"], 524 .blog-text .kg-embed-card[data-provider*="x"], 525 .blog-text .kg-embed-card[data-provider*="instagram"], 526 .blog-text .kg-embed-card[data-provider*="tiktok"], 527 .w-richtext .kg-embed-card[data-provider*="twitter"], 528 .w-richtext .kg-embed-card[data-provider*="x"], 529 .w-richtext .kg-embed-card[data-provider*="instagram"], 530 .w-richtext .kg-embed-card[data-provider*="tiktok"] { 531 display: flex; 532 justify-content: center; 533 align-items: center; 534 } 535 536 /* Twitter/X embeds - center and natural sizing */ 537 .blog-text iframe[src*="twitter.com"], 538 .blog-text iframe[src*="x.com"], 539 .blog-text iframe[src*="platform.twitter"], 540 .w-richtext iframe[src*="twitter.com"], 541 .w-richtext iframe[src*="x.com"], 542 .w-richtext iframe[src*="platform.twitter"] { 543 margin: 0 auto !important; 544 width: auto !important; 545 } 546 547 .blog-text .twitter-tweet, 548 .blog-text twitter-widget, 549 .w-richtext .twitter-tweet, 550 .w-richtext twitter-widget { 551 margin: 0 auto !important; 552 } 553 554 /* ========================================================================== 555 Page Template â Full-Width Content 556 ========================================================================== */ 557 .page-template .article-left { 558 max-width: 100%; 559 } 560 561 .page-template .post-feature-image { 562 margin-bottom: 2rem; 563 } 564 565 .page-template .post-feature-image img { 566 width: 100%; 567 border-radius: 8px; 568 } 569 570 /* ========================================================================== 571 Tag Page â Description Spacing 572 ========================================================================== */ 573 .tag-description { 574 margin-bottom: 0; 575 } 576 577 /* ========================================================================== 578 Author Page â Social Link Icons 579 ========================================================================== */ 580 .author-social-icon { 581 width: 24px; 582 height: 24px; 583 } 584 585 .author-bio-text { 586 max-width: 500px; 587 } 588 589 .author-links:empty, 590 .author-links:not(:has(*)) { 591 display: none; 592 } 593 594 /* ========================================================================== 595 404 Page â Inline Period Fix 596 ========================================================================== */ 597 .home-link-group { 598 display: flex; 599 gap: 0; 600 align-items: center; 601 } 602 603 .home-link-group .text-mono { 604 margin: 0; 605 } 606 607 /* ========================================================================== 608 Footer â Subscribe Button 609 ========================================================================== */ 610 .footer-form-block .button-primary { 611 white-space: nowrap; 612 align-self: stretch; 613 } 614 615 /* ========================================================================== 616 Load More Button 617 ========================================================================== */ 618 .load-more-btn { 619 margin-top: 56px; 620 } 621 622 /* ========================================================================== 623 Responsive â Mobile (max-width: 767px) 624 ========================================================================== */ 625 @media screen and (max-width: 767px) { 626 /* Nav toolbar */ 627 .nav-actions { 628 display: flex; 629 align-items: center; 630 gap: 16px; 631 } 632 633 .nav-actions .search-toggle { 634 order: 1; 635 padding: 0; 636 margin: 0; 637 } 638
639 .nav-actions .search-toggle .icon, 640 .nav-actions .search-toggle .search-icon { 641 display: block !important; 642 width: 24px; 643 height: 24px; 644 padding: 0; 645 margin: 0; 646 } 647 648 .nav-actions .button-nav { 649 display: none; 650 } 651 652 .nav-actions .dropdown { 653 order: 2; 654 } 655 656 /* Post/Page hero spacing */ 657 .post-hero-content { 658 width: 100% !important; 659 } 660 661 .post-template .section-top, 662 .page-template .section-top { 663 grid-row-gap: 32px; 664 } 665 666 /* Load more button */ 667 .load-more-btn { 668 margin-top: 40px; 669 } 670 } 671 672 @media screen and (max-width: 479px) { 673 .blog-text img, 674 .w-richtext img, 675 .blog-text figure img, 676 .w-richtext figure img, 677 .kg-image-card img { 678 width: 100% !important; 679 } 680 } 681 </style> 682 683 <!-- Fonts --> 684 <link href="https://fonts.googleapis.com" rel="preconnect"> 685 <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous"> 686
686<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js" type="text/javascript"></script>
686 687
687<script type="text/javascript"> 688 WebFont.load({ 689 google: { 690 families: [ 691 "IBM Plex Mono:300,400,500,600,700", 692 "IBM Plex Sans:300,400,500,600,700" 693 ] 694 } 695 }); 696 </script>
696 697 698 <!-- Webflow feature detection --> 699
699<script type="text/javascript"> 700 !function(o, c) { 701 var n = c.documentElement, t = " w-mod-"; 702 n.className += t + "js"; 703 ("ontouchstart" in o || o.DocumentTouch && c instanceof DocumentTouch) && (n.className += t + "touch"); 704 }(window, document); 705 </script>
705 706 707 <!-- Favicon --> 708 <link href="https://windscribe.com/blog/content/images/size/w256h256/2022/05/favicon.png" rel="shortcut icon" type="image/x-icon"> 709 <link href="/blog/assets/images/webclip.png?v=ExWBz05NbEKNSgmo" rel="apple-touch-icon"> 710 711 <meta name="description" content="Windscribe was sued by a Greek court, which kicked off a 2 year legal battle. The case was dismissed because of our no-logs policy."> 712 <link rel="icon" href="https://windscribe.com/blog/content/images/size/w256h256/2022/05/favicon.png" type="image/png"> 713 <link rel="canonical" href="https://windscribe.com/blog/windscribe-greek-court-case/"> 714 <meta name="referrer" content="no-referrer-when-downgrade"> 715 716 <meta property="og:site_name" content="Windscribbles"> 717 <meta property="og:type" content="article"> 718 <meta property="og:title" content="Windscribe Wins Legal Battle in Greece Due to No-Logs Policy"> 719 <meta property="og:description" content="Windscribe was sued by a Greek court, which kicked off a 2 year legal battle. The case was dismissed because of our no-logs policy."> 720 <meta property="og:url" content="https://windscribe.com/blog/windscribe-greek-court-case/"> 721 <meta property="og:image" content="https://windscribe.com/blog/content/images/size/w1200/2025/04/WS_ThatOneTimeIGotCharged_blogHeader_v1.png"> 722 <meta property="article:published_time" content="2025-04-24T19:33:02.000Z"> 723 <meta property="article:modified_time" content="2026-08-10T15:16:06.000Z"> 724 <meta property="article:tag" content="Must Reads"> 725 726 <meta property="article:publisher" content="https://www.facebook.com/windscribe/"> 727 <meta name="twitter:card" content="summary_large_image"> 728 <meta name="twitter:title" content="Windscribe Wins Legal Battle in Greece Due to No-Logs Policy"> 729 <meta name="twitter:description" content="Windscribe was sued by a Greek court, which kicked off a 2 year legal battle. The case was dismissed because of our no-logs policy."> 730 <meta name="twitter:url" content="https://windscribe.com/blog/windscribe-greek-court-case/"> 731 <meta name="twitter:image" content="https://windscribe.com/blog/content/images/size/w1200/2025/04/WS_ThatOneTimeIGotCharged_blogHeader_v1.png"> 732 <meta name="twitter:label1" content="Written by"> 733 <meta name="twitter:data1" content="Yegor Sak"> 734 <meta name="twitter:label2" content="Filed under"> 735 <meta name="twitter:data2" content="Must Reads"> 736 <meta name="twitter:site" content="@windscribe"> 737 <meta name="twitter:creator" content="@yegor"> 738 <meta property="og:image:width" content="1200"> 739 <meta property="og:image:height" content="675"> 740 741
741<script type="application/ld+json"> 742{ 743 "@context": "https://schema.org", 744 "@type": "Article", 745 "publisher": { 746 "@type": "Organization", 747 "name": "Windscribbles", 748 "url": "https://windscribe.com/blog/", 749 "logo": { 750 "@type": "ImageObject", 751 "url": "https://windscribe.com/blog/content/images/2022/01/scribbleslogo.svg", 752 "width": 245, 753 "height": 48 754 } 755 }, 756 "author": { 757 "@type": "Person", 758 "name": "Yegor Sak", 759 "image": { 760 "@type": "ImageObject", 761 "url": "https://windscribe.com/blog/content/images/2021/09/Q2fYnLX--1-.jpg", 762 "width": 500, 763 "height": 500 764 }, 765 "url": "https://windscribe.com/blog/author/yegor/", 766 "sameAs": [ 767 "https://x.com/yegor" 768 ] 769 }, 770 "headline": "Windscribe Wins Legal Battle in Greece Due to No-Logs Policy", 771 "url": "https://windscribe.com/blog/windscribe-greek-court-case/", 772 "datePublished": "2025-04-24T19:33:02.000Z", 773 "dateModified": "2026-08-10T15:16:06.000Z", 774 "image": { 775 "@type": "ImageObject", 776 "url": "https://windscribe.com/blog/content/images/size/w1200/2025/04/WS_ThatOneTimeIGotCharged_blogHeader_v1.png", 777 "width": 1200, 778 "height": 675 779 },
780 "keywords": "Must Reads", 781 "description": "Windscribe was sued by a Greek court, which kicked off a 2 year legal battle. The case was dismissed because of our no-logs policy.", 782 "mainEntityOfPage": "https://windscribe.com/blog/windscribe-greek-court-case/" 783} 784 </script>
784 785 786 <meta name="generator" content="Ghost 6.62"> 787 <link rel="alternate" type="application/rss+xml" title="Windscribbles" href="https://windscribe.com/blog/rss/"> 788
788<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://windscribe.com/blog/" data-key="b4c1c3d92059e9d08b4cd483d9" data-api="https://windscribe.com/blog/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script>
788<style id="gh-members-styles">.gh-post-upgrade-cta-content, 789.gh-post-upgrade-cta { 790 display: flex; 791 flex-direction: column; 792 align-items: center; 793 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 794 text-align: center; 795 width: 100%; 796 color: #ffffff; 797 font-size: 16px; 798} 799 800.gh-post-upgrade-cta-content { 801 border-radius: 8px; 802 padding: 40px 4vw; 803} 804 805.gh-post-upgrade-cta h2 { 806 color: #ffffff; 807 font-size: 28px; 808 letter-spacing: -0.2px; 809 margin: 0; 810 padding: 0; 811} 812 813.gh-post-upgrade-cta p { 814 margin: 20px 0 0; 815 padding: 0; 816} 817 818.gh-post-upgrade-cta small { 819 font-size: 16px; 820 letter-spacing: -0.2px; 821} 822 823.gh-post-upgrade-cta a { 824 color: #ffffff; 825 cursor: pointer; 826 font-weight: 500; 827 box-shadow: none; 828 text-decoration: underline; 829} 830 831.gh-post-upgrade-cta a:hover { 832 color: #ffffff; 833 opacity: 0.8; 834 box-shadow: none; 835 text-decoration: underline; 836} 837 838.gh-post-upgrade-cta a.gh-btn { 839 display: block; 840 background: #ffffff; 841 text-decoration: none; 842 margin: 28px 0 0; 843 padding: 8px 18px; 844 border-radius: 4px; 845 font-size: 16px; 846 font-weight: 600; 847} 848 849.gh-post-upgrade-cta a.gh-btn:hover { 850 opacity: 0.92; 851}</style> 852
852<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="b4c1c3d92059e9d08b4cd483d9" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://windscribe.com/blog/" data-locale="en" crossorigin="anonymous"></script>
852 853 854 <link href="https://windscribe.com/blog/webmentions/receive/" rel="webmention"> 855
855<script defer src="/blog/public/cards.min.js?v=ShRHxgy4po8zN-Wf"></script>
855 856 <link rel="stylesheet" type="text/css" href="/blog/public/cards.min.css?v=WwnU9jw5ancNC8Gc"> 857
857<script defer src="/blog/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
857<style>:root {--ghost-accent-color: #10b2da;}</style> 858</head> 859<body class="body post-template tag-must-reads"> 860 861 862<div class="hero-bg"> 863<div class="nav-wrapper"> 864 <div class="nav-top"> 865 <a href="https://windscribe.com/blog" class="navbar-brand-three w-nav-brand"> 866 <img src="/blog/assets/images/scribbleslogo.svg?v=WhTMgsR0Zl7-JR78" loading="lazy" alt="Windscribbles" class="brand"> 867 </a> 868 <div class="nav-actions"> 869 <a href="#" class="search-toggle" data-ghost-search> 870 <img src="/blog/assets/images/Search.svg?v=XsOTyWbvZ-soAkaK" loading="lazy" alt="Search" class="icon search-icon"> 871 </a> 872 <a href="https://windscribe.com/download/?cpid=new_blog" target="_blank" class="button-nav w-button">Get Windscribe</a> 873 <div data-hover="false" data-delay="0" class="dropdown w-dropdown"> 874 <div class="dropdown-toggle w-dropdown-toggle"> 875 <img src="/blog/assets/images/menu-icon.svg?v=TeMrggXiCsSP1LOn" loading="lazy" alt="" class="menu-icon"> 876 </div> 877 <nav class="dropdown-list w-dropdown-list"> 878 <div class="dropdown-inner"> 879 <a href="https://windscribe.com/blog/tag/must-reads/" class="link-2 w-dropdown-link" data-tag="must-reads">Must-Reads</a> 880 <a href="https://windscribe.com/blog/tag/announcements/" class="link-2 w-dropdown-link" data-tag="announcements">Announcements</a> 881 <a href="https://windscribe.com/blog/tag/opinions/" class="link-2 w-dropdown-link" data-tag="opinions">Opinions</a> 882 <a href="https://windscribe.com/blog/tag/technical/" class="link-2 w-dropdown-link" data-tag="technical">Technical</a> 883 <a href="https://windscribe.com/download/?cpid=new_blog" target="_blank" class="button-nav-mobile w-button">Get Windscribe</a> 884 </div> 885 </nav> 886 </div> 887 </div> 888 </div> 889 <section class="tabs-navigation"> 890 <div class="nav-glow" data-tag="must-reads"> 891 <a href="https://windscribe.com/blog/tag/must-reads/" class="tab w-button">Must-Reads</a> 892 <div class="glow-underline"></div> 893 </div> 894 <div class="nav-glow" data-tag="announcements"> 895 <a href="https://windscribe.com/blog/tag/announcements/" class="tab w-button">Announcements</a> 896 <div class="glow-underline"></div> 897 </div> 898 <div class="nav-glow" data-tag="opinions"> 899 <a href="https://windscribe.com/blog/tag/opinions/" class="tab w-button">Opinions</a> 900 <div class="glow-underline"></div> 901 </div> 902 <div class="nav-glow" data-tag="technical"> 903 <a href="https://windscribe.com/blog/tag/technical/" class="tab w-button">Technical</a> 904 <div class="glow-underline"></div> 905 </div> 906 </section> 907 </div> 908 909<section class="post-top"> 910 <div class="hero-div"> 911 <div class="article-title"> 912 <div class="tag-list"> 913 <div class="tag"> 914 <img loading="lazy" src="/blog/assets/images/Tag-Rectangle.svg?v=XQNuLj6F_21CPk0Q" alt=""> 915 <a href="/blog/tag/must-reads/" class="tag-link w-inline-block"> 916 <div class="tag-text">Must Reads</div> 917 </a> 918 </div> 919 </div> 920 921 <h1 class="h1-big center-align">My Big Fat Greek Case</h1> 922 923 <div class="authors-list center-author"> 924 <div class="w-dyn-list"> 925 <div role="list" class="w-dyn-items"> 926 <div role="listitem" class="w-dyn-item"> 927 <img src="https://windscribe.com/blog/content/images/2021/09/Q2fYnLX--1-.jpg" loading="lazy" alt="Yegor Sak" class="profile-image"> 928 </div> 929 </div> 930 </div> 931 <div class="author-list-wrapper in-line"> 932 <div class="author-list"> 933 <a href="/blog/author/yegor/" class="cms-author link-underline">Yegor Sak</a> 934 </div> 935 <p class="publish-date">April 24, 2025</p> 936 </div> 937 </div> 938 </div> 939 940 <div class="post-hero-image"> 941 <img src="https://windscribe.com/blog/content/images/2025/04/WS_ThatOneTimeIGotCharged_blogHeader_v1.png" loading="lazy" alt="My Big Fat Greek Case" class="hero-image"> 942 </div> 943 </div> 944</section> 945</div> 946 947<div class="section-all"> 948 <div class="article-content"> 949 <div class="article-left"> 950 <div class="blog-text w-richtext"> 951 <p>The story begins in June 2023 when we received a letter from the Canadian Department of Justice part of the Mutual Legal Assistance Treaty (MLAT) process, which informed us that I, Yegor Sak, am being charged in Greece for the crime of "illegal access to information system". </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://windscribe.com/blog/content/images/2025/04/image-2.png" class="kg-image" alt="Screenshot of Writ of Summons" loading="lazy" width="847" height="637" srcset="https://windscribe.com/blog/content/images/size/w600/2025/04/image-2.png 600w, https://windscribe.com/blog/content/images/2025/04/image-2.png 847w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Typos were present in the document</span></figcaption></figure><p>This was followed by 100 pages of disclosure which was virtually indecipherable, it might as well have been in Greek (it was). It showed that an IP address that belonged to one of Windscribe's servers in Finland was used to breach a server in Greece. </p><p>Given the nature of VPNs, especially ones that value your privacy, some "bad apples" sometimes use VPNs to commit crimes. Some people will say this is why VPNs should be banned, but that's a rather misguided approach. By this logic we should ban cars and hammers, since 0.0001% of owners of those objects choose to hurt people with them, but I digress. </p><p>When a Windscribe user does something allegedly illegal, we usually get a subpoena which includes an IP address and a timestamp associated with the alleged crime. We get <a href="https://windscribe.com/transparency/" rel="noreferrer">5-10 of these per month</a>. Since we're a non-logging VPN service, we state this fact and 99.9% of the time that makes the matter go away since we're not obligated to store logs. </p><p>This time, something unusual happened. Greek authorities, with the help of INTERPOL, subpoenaed the hosting provider of the server in Finland in order to get the billing information associated with the account, which in that case was me. This account, much like 100+ other accounts we maintain with various hosting providers world wide, is a corporate account, and the fact that Windscribe, a VPN provider, owns the server is very evident. Nothing that occurred thus far is unusual, and the next step usually involves a subpoena that is sent to our abuse department, and in rare circumstances - a server seizure. None of that happened this time. Instead, they took the only name that appeared on the account, mine, and started criminal proceedings against me personally, as if I committed the alleged crime myself. </p><figure class="kg-card kg-image-card"><img src="https://windscribe.com/blog/content/images/2025/04/image-3.png" class="kg-image" alt="Document showing IP was registered to Yegor Sak" loading="lazy" width="1289" height="1266" srcset="https://windscribe.com/blog/content/images/size/w600/2025/04/image-3.png 600w, https://windscribe.com/blog/content/images/size/w1000/2025/04/image-3.png 1000w, https://windscribe.com/blog/content/images/2025/04/image-3.png 1289w" sizes="(min-width: 720px) 720px"></figure>
951<h2 id="lawyer-up">Lawyer Up</h2><p>Although Windscribe has legal representation in Canada, they cannot do much as far as international criminal proceedings are concerned, so we had to retain legal counsel in Greece in order to dispute the charge. </p><p>This kicked off a nearly 2 year long process of fighting this in the court of Athens. This as you can imagine is a costly matter (think 5+ figures). It would have been a lot faster (and cheaper) to simply hand over the logs in order to identify the actual culprit behind the alleged crime. However, you cannot hand over what you do not have, so off to court I go! </p><h2 id="december-2023">December 2023</h2><p>The first court hearing was supposed to take place in December of 2023, where we were hoping to get the case dismissed. Unfortunately, due to a <a href="https://www.ekathimerini.com/news/1225609/athens-bar-association-initiates-five-day-strike-in-opposition-to-new-taxation-bill/" rel="noreferrer">lawyer strike</a>, all cases got pushed forward, so we got a new date in March of 2024. </p><h2 id="march-2024">March 2024 </h2><p>We got our first hearing, it didn't go as planned. We were informed that I now have a co-defendant, in Morocco, and the Moroccan authorities didn't submit the necessary documents for the case to proceed. We tried to separate the 2 cases, however that was not successful, so the matter was postponed once again to April 2025. The wheels of justice do indeed move slowly. </p><h2 id="april-2025">April 2025</h2><p>On April 11th 2025, I finally got my day in court, and was found not guilty, or rather the case was dismissed. Hurray for justice! </p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">ð¡</div><div class="kg-callout-text">Cases like this are why the legal picture matters. We maintain a running guide to <a href="https://windscribe.com/blog/are-vpns-legal/" rel="noreferrer">VPN legality around the world</a>, including which governments treat encryption itself as an offence.</div></div><h2 id="keep-the-pandoras-box-closed">Keep the Pandora's Box Closed </h2><p>We obviously do not condone the use of Windscribe for any criminal activity. Some crimes are indisputable and universally frowned upon (fraud, hacking, child abuse material, revenge porn, extortion, etc) and we would love to help put people in jail who do these things. However in order to do that, we would have to keep extensive logs, and once those are known to exist, we would have no choice but to cooperate with legal authorities in various countries when it comes to any kind of "crime". </p><ul><li>Insulted Mohammed bin Salman Al Saud's beard? Jail time. </li><li>Compared Xi Jinping to Winnie-the-Pooh? Jail time. </li><li>Spoke ill of Ali Khamenei's glasses? Worse than jail. </li><li>?????</li></ul><p>The law is pretty cut and dry, if you have the data, you must provide it, and if you say you don't have what you do in fact have, guess what? That's a crime, and we would very much be guilty of it - if that was in fact the case. </p><p>When we say we don't keep logs, we really mean it. Even if you don't believe our <a href="https://windscribe.com/blog/freshscribe-next-generation-vpn-infrastructure-2/" rel="noreferrer">audits</a>, or any of the <a href="https://windscribe.com/blog/windscribe-logging-explained-in-detail-387ad63f646/" rel="noreferrer">previous articles</a> I wrote on this subject, believe this simple fact: None of us want to go to prison for a $9 subscription, and keeping logs for multiple years is pretty expensive. </p> 952 </div> 953 </div> 954 <div class="stickycta"> 955 <div class="h3 center-align">Keep your browsing private and secure by masking your IP address.</div> 956 <a href="https://windscribe.com/download/?cpid=new_blog" target="_blank" class="button-primary full-width w-button">Get Windscribe</a> 957 </div> 958 </div> 959</div> 960 961 962 963 <div class="footer-wrapper"> 964 <section class="footer"> 965 <div class="footer-div"> 966 <div class="left-footer"> 967 <div class="column"> 968 <div class="text-allcaps">Navigation</div> 969 <div class="nav-links"> 970 <a href="https://windscribe.com/blog/all-posts/" class="footer-link">All Posts</a> 971 <a href="https://windscribe.com/blog/tag/must-reads/" class="footer-link">Must-Reads</a> 972 <a href="https://windscribe.com/blog/tag/announcements/" class="footer-link">Announcements</a> 973 <a href="https://windscribe.com/blog/tag/opinions/" class="footer-link">Opinions</a> 974 <a href="https://windscribe.com/blog/tag/technical/" class="footer-link">Technical</a> 975 </div> 976 </div> 977 <div class="column-socials"> 978 <div class="text-allcaps">Connect With US</div> 979 <div class="w-layout-grid grid"> 980 <a href="https://www.youtube.com/c/Windscribe?sub_confirmation=1" target="_blank" class="link-block w-inline-block"> 981 <img loading="lazy" src="/blog/assets/images/youtube.svg?v=-ZRDFJ-Re_vdeUqV" alt="" class="snsicon"> 982 </a> 983 <a href="https://www.reddit.com/r/Windscribe/" target="_blank" class="link-block w-inline-block"> 984 <img loading="lazy" src="/blog/assets/images/reddit.svg?v=pkOxIu_xUTxHcu_p" alt="" class="snsicon"> 985 </a> 986 <a href="https://discord.gg/vpn" target="_blank" class="link-block w-inline-block"> 987 <img loading="lazy" src="/blog/assets/images/discord.svg?v=4pyHg1Q8yZYRz4-2" alt="" class="snsicon"> 988 </a> 989 <a href="https://x.com/intent/user?screen_name=Windscribe" target="_blank" class="link-block w-inline-block"> 990 <img loading="lazy" src="/blog/assets/images/twitter-x.svg?v=8jPkAqIDMjrHJqyr" alt="" class="snsicon"> 991 </a> 992 <a href="https://www.instagram.com/windscribe" target="_blank" class="link-block w-inline-block"> 993 <img loading="lazy" src="/blog/assets/images/instagram.svg?v=QAbvg26ol1XpuraZ" alt="" class="snsicon"> 994 </a> 995 <a href="https://www.tiktok.com/@windscribe.vpn" target="_blank" class="link-block w-inline-block"> 996 <img loading="lazy" src="/blog/assets/images/tiktok.svg?v=UerLXqpCdV3c6Baa" alt="" class="snsicon"> 997 </a> 998 <a href="https://swag.windscribe.com/" target="_blank" class="link-block w-inline-block"> 999 <img loading="lazy" src="/blog/assets/images/shirt.svg?v=Dvia0a59c7jxjxNs" alt="Merch Store" class="snsicon"> 1000 </a> 1001 </div> 1002 </div> 1003 </div> 1004 <div class="footer-form w-form"> 1005 <form id="footer-subscribe-form" class="footer-form-container" data-members-form="subscribe"> 1006 <div class="text-allcaps">Service updates, opinion pieces, technical writeups and random ramblings.</div> 1007 <div class="footer-form-block"> 1008 <input class="footer-form-field w-input" maxlength="256" name="email" aria-label="Get product updates" placeholder="Your Email" type="email" required="" data-members-email> 1009 <button type="submit" class="button-primary w-button">Sign up</button> 1010 </div> 1011 <div class="success-message w-form-done" style="display: none;"> 1012 <div class="text-mono green">Thanks for subscribing!</div> 1013 </div> 1014 <div class="error-message w-form-fail" style="display: none;"> 1015 <div class="text-mono error">An error occurred while submitting. Try again.</div> 1016 </div> 1017 </form> 1018 </div> 1019 </div> 1020 </section> 1021 <section class="footer-credit"> 1022 <div class="footer-credit-div"> 1023 <div class="text-mono">© 2026 Windscribbles</div> 1024 <div class="text-mono">Powered by <a href="https://www.windscribe.com" target="_blank" class="link">Windscribe</a></div> 1025 </div> 1026 </section> 1027 </div> 1028 1029 <!-- Vendor Scripts --> 1030
1030<script src="https://code.jquery.com/jquery-3.5.1.min.js" type="text/javascript"></script>
1030 1031
1031<script src="/blog/assets/js/webflow.js?v=F9R-dyF6sGFFJmiC" type="text/javascript"></script>
1031 1032
1032<script src="https://cdn.prod.website-files.com/gsap/3.14.2/gsap.min.js" type="text/javascript"></script>
1032 1033 1034 <!-- Matomo -->
1035<script> 1036 var _paq = window._paq = window._paq || []; 1037 /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ 1038 _paq.push(['trackPageView']); 1039 _paq.push(['enableLinkTracking']); 1040 (function() { 1041 var u="//stats.windscribe.com/"; 1042 _paq.push(['setTrackerUrl', u+'piwik.php']); 1043 _paq.push(['setSiteId', '3']); 1044 var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; 1045 g.async=true; g.src=u+'piwik.js'; s.parentNode.insertBefore(g,s); 1046 })(); 1047</script>
1047 1048<!-- End Matomo Code --> 1049 1050 <!-- Theme Scripts --> 1051
1051<script> 1052 (function() { 1053 'use strict'; 1054 1055 /* ====================================================================== 1056 Load More â Paginated Post Loading 1057 ====================================================================== */ 1058 function initLoadMore() { 1059 var POSTS_PER_PAGE = 6; 1060 var loadMoreBtn = document.querySelector('.load-more-btn'); 1061 var postsContainer = document.querySelector('.posts-container'); 1062 1063 if (!loadMoreBtn || !postsContainer) return; 1064 1065 var pageType = postsContainer.getAttribute('data-page-type'); 1066 var tagSlug = postsContainer.getAttribute('data-tag-slug'); 1067 var authorSlug = postsContainer.getAttribute('data-author-slug'); 1068 var totalPosts = parseInt(postsContainer.getAttribute('data-total-posts')) || 0; 1069 var currentPage = 2; 1070 var isLoading = false; 1071 var postsLoaded = postsContainer.querySelectorAll('.blog-item').length; 1072 1073 // Detect the blog's base path from the current URL 1074 // e.g. "/blog/tag/news/" â basePath = "/blog" 1075 var pathname = window.location.pathname; 1076 var basePath = ''; 1077 if (pageType === 'tag' && tagSlug) { 1078 basePath = pathname.split('/tag/')[0]; 1079 } else if (pageType === 'author' && authorSlug) { 1080 basePath = pathname.split('/author/')[0]; 1081 } else { 1082 // For index and all-posts pages, strip trailing slash and /page/N if present 1083 basePath = pathname.replace(/\/page\/\d+\/?$/, '').replace(/\/$/, ''); 1084 // For all-posts page, strip the /all-posts slug to get base blog path 1085 if (pageType === 'all-posts') { 1086 basePath = basePath.replace(/\/all-posts$/, ''); 1087 } 1088 } 1089 1090 if (totalPosts <= POSTS_PER_PAGE) { 1091 loadMoreBtn.style.display = 'none'; 1092 return; 1093 } 1094 1095 loadMoreBtn.addEventListener('click', async function(e) { 1096 e.preventDefault(); 1097 if (isLoading) return; 1098 1099 isLoading = true; 1100 var originalText = loadMoreBtn.textContent; 1101 loadMoreBtn.textContent = 'Loading...'; 1102 loadMoreBtn.style.pointerEvents = 'none'; 1103 loadMoreBtn.style.borderRadius = 'var(--button-radius)'; 1104 1105 try { 1106 var pageUrl; 1107 if (pageType === 'tag' && tagSlug) { 1108 pageUrl = basePath + '/tag/' + tagSlug + '/page/' + currentPage + '/'; 1109 } else if (pageType === 'author' && authorSlug) { 1110 pageUrl = basePath + '/author/' + authorSlug + '/page/' + currentPage + '/'; 1111 } else if (pageType === 'all-posts') { 1112 pageUrl = basePath + '/page/' + currentPage + '/'; 1113 } else { 1114 pageUrl = basePath + '/page/' + currentPage + '/'; 1115 } 1116 1117 var response = await fetch(pageUrl); 1118 if (!response.ok) throw new Error('Page not found'); 1119 1120 var html = await response.text(); 1121 var doc = new DOMParser().parseFromString(html, 'text/html'); 1122 1123 var selectors = [ 1124 '.posts-container .post-item', 1125 '.posts-container .blog-item', 1126 '.collection-list-grid .blog-item', 1127 '.section-tags .blog-item', 1128 '.section-all .blog-item' 1129 ]; 1130 1131 var newPosts = null; 1132 for (var i = 0; i < selectors.length; i++) { 1133 newPosts = doc.querySelectorAll(selectors[i]); 1134 if (newPosts && newPosts.length > 0) break; 1135 } 1136 1137 var count = newPosts ? newPosts.length : 0; 1138 1139 if (count > 0) { 1140 newPosts.forEach(function(post, index) { 1141 var clone = post.cloneNode(true); 1142 clone.classList.add('blog-item', 'w-dyn-item', 'post-item'); 1143 clone.style.opacity = '0'; 1144 clone.style.transform = 'translateY(20px)'; 1145 clone.style.transition = 'opacity 0.3s ease, transform 0.3s ease'; 1146 postsContainer.appendChild(clone); 1147 1148 setTimeout(function() { 1149 clone.style.opacity = '1'; 1150 clone.style.transform = 'translateY(0)'; 1151 }, index * 50); 1152 }); 1153 1154 postsLoaded += count; 1155 currentPage++; 1156 } 1157 1158 if (postsLoaded >= totalPosts || count < POSTS_PER_PAGE) {
1159 loadMoreBtn.style.display = 'none'; 1160 } else { 1161 loadMoreBtn.textContent = originalText; 1162 loadMoreBtn.style.pointerEvents = 'auto'; 1163 } 1164 } catch (err) { 1165 console.error('Load more error:', err); 1166 loadMoreBtn.style.display = 'none'; 1167 } 1168 1169 isLoading = false; 1170 }); 1171 } 1172 1173 /* ====================================================================== 1174 Active Nav â Highlight Current Tag in Desktop & Mobile 1175 ====================================================================== */ 1176 function initActiveNav() { 1177 var path = window.location.pathname; 1178 var tagMatch = path.match(/\/tag\/([^\/]+)/); 1179 if (!tagMatch) return; 1180 1181 var currentTag = tagMatch[1]; 1182 1183 // Desktop tabs 1184 document.querySelectorAll('.nav-glow[data-tag]').forEach(function(item) { 1185 if (item.getAttribute('data-tag') === currentTag) { 1186 item.classList.add('active'); 1187 } 1188 }); 1189 1190 // Mobile dropdown 1191 document.querySelectorAll('.dropdown-inner .link-2[data-tag]').forEach(function(link) { 1192 if (link.getAttribute('data-tag') === currentTag) { 1193 link.classList.add('active'); 1194 } 1195 }); 1196 } 1197 1198 /* ====================================================================== 1199 Cleanup â Remove Webflow "undefined" CMS Bindings 1200 ====================================================================== */ 1201 function cleanupUndefined() { 1202 document.querySelectorAll('.blog-text, .w-richtext').forEach(function(el) { 1203 if (el.textContent.trim() === 'undefined') { 1204 el.textContent = ''; 1205 } 1206 }); 1207 } 1208 1209 /* ====================================================================== 1210 Newsletter â Footer Subscribe Form (Ghost Members API) 1211 ====================================================================== */ 1212 function initNewsletter() { 1213 var form = document.getElementById('footer-subscribe-form'); 1214 if (!form) return; 1215 1216 var wrapper = form.closest('.footer-form'); 1217 var successMsg = wrapper.querySelector('.success-message'); 1218 var errorMsg = wrapper.querySelector('.error-message'); 1219 var formBlock = form.querySelector('.footer-form-block'); 1220 var formDesc = form.querySelector('.text-allcaps'); 1221 1222 form.addEventListener('submit', function(e) { 1223 e.preventDefault(); 1224 1225 var emailInput = form.querySelector('input[type="email"]'); 1226 var email = emailInput.value.trim(); 1227 var submitBtn = form.querySelector('button[type="submit"]'); 1228 1229 if (!email) return; 1230 1231 submitBtn.disabled = true; 1232 submitBtn.textContent = 'Sending...'; 1233 errorMsg.style.display = 'none'; 1234 successMsg.style.display = 'none'; 1235 1236 fetch('/members/api/send-magic-link/', { 1237 method: 'POST', 1238 headers: { 'Content-Type': 'application/json' }, 1239 body: JSON.stringify({ email: email, emailType: 'subscribe' }) 1240 }) 1241 .then(function(res) { 1242 if (res.ok) { 1243 if (formBlock) formBlock.style.display = 'none'; 1244 if (formDesc) formDesc.style.display = 'none'; 1245 successMsg.style.display = 'block'; 1246 } else { 1247 throw new Error('Subscription failed'); 1248 } 1249 }) 1250 .catch(function() { 1251 errorMsg.style.display = 'block'; 1252 }) 1253 .finally(function() { 1254 submitBtn.disabled = false; 1255 submitBtn.textContent = 'Sign up'; 1256 }); 1257 }); 1258 } 1259 1260 /* ====================================================================== 1261 Init 1262 ====================================================================== */ 1263 function init() { 1264 initLoadMore(); 1265 cleanupUndefined(); 1266 initActiveNav(); 1267 initNewsletter(); 1268 } 1269 1270 if (document.readyState === 'loading') { 1271 document.addEventListener('DOMContentLoaded', init); 1272 } else { 1273 init(); 1274 } 1275 })(); 1276 </script>
1276 1277 1278
1278<script> 1279 /* ============================================= 1280 Custom Dropdown Toggle 1281 Replaces Webflow's built-in dropdown behavior 1282 to prevent the first-click-closes bug. 1283 ============================================= */ 1284 (function() { 1285 function initDropdownFix() { 1286 var dropdowns = document.querySelectorAll('.w-dropdown'); 1287 dropdowns.forEach(function(dropdown) { 1288 var toggle = dropdown.querySelector('.w-dropdown-toggle'); 1289 var list = dropdown.querySelector('.w-dropdown-list'); 1290 if (!toggle || !list) return; 1291 1292 // Remove Webflow's data attributes that drive its dropdown JS 1293 dropdown.removeAttribute('data-hover'); 1294 dropdown.removeAttribute('data-delay'); 1295 1296 // Clone toggle to strip all Webflow event listeners 1297 var newToggle = toggle.cloneNode(true); 1298 toggle.parentNode.replaceChild(newToggle, toggle); 1299 1300 var isOpen = false; 1301 1302 function openMenu() { 1303 isOpen = true; 1304 list.classList.add('w--open'); 1305 newToggle.classList.add('w--open'); 1306 newToggle.setAttribute('aria-expanded', 'true'); 1307 } 1308 1309 function closeMenu() { 1310 isOpen = false; 1311 list.classList.remove('w--open'); 1312 newToggle.classList.remove('w--open'); 1313 newToggle.setAttribute('aria-expanded', 'false'); 1314 } 1315 1316 newToggle.addEventListener('click', function(e) { 1317 e.preventDefault(); 1318 e.stopPropagation(); 1319 if (isOpen) { 1320 closeMenu(); 1321 } else { 1322 openMenu(); 1323 } 1324 }); 1325 1326 // Close when clicking outside 1327 document.addEventListener('click', function(e) { 1328 if (isOpen && !dropdown.contains(e.target)) { 1329 closeMenu(); 1330 } 1331 }); 1332 1333 // Close when pressing Escape 1334 document.addEventListener('keydown', function(e) { 1335 if (e.key === 'Escape' && isOpen) { 1336 closeMenu(); 1337 newToggle.focus(); 1338 } 1339 }); 1340 1341 // Close when a nav link inside the dropdown is clicked 1342 list.querySelectorAll('a').forEach(function(link) { 1343 link.addEventListener('click', function() { 1344 closeMenu(); 1345 }); 1346 }); 1347 }); 1348 } 1349 1350 if (document.readyState === 'loading') { 1351 document.addEventListener('DOMContentLoaded', initDropdownFix); 1352 } else { 1353 initDropdownFix(); 1354 } 1355 })(); 1356 </script>
1356 1357</body> 1358</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.