<?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
    <channel>
        <title>lina's blog</title>
        <link>https://lina.sh</link>
        <description>My little place to ramble and rant on the internet</description>
        
        <item>
            <title>I accidentally made law enforcement shut down their stresser honeypot</title>
            <link>https://lina.sh/blog/ddos-honeypot</link>
            <guid isPermaLink="true">https://lina.sh/blog/ddos-honeypot</guid>
            <pubDate>Wed, 29 Apr 2026 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>I accidentally made law enforcement shut down their stresser honeypot</h2>
            <p><i>How I stumbled across a fake booter site run by international police, and how they panicked when I started digging</i></p>
            <img src="https://lina.sh/assets/blog/cyberzap-pricing.png" alt="I accidentally made law enforcement shut down their stresser honeypot">
            
            <h2>What is Operation PowerOFF?</h2>
<p>Before we get into the funny part, you need a quick summary. Operation PowerOFF is a massive international effort to
stop DDoS for hire services. While it includes agencies like the FBI, the UK National Crime Agency, and Europol, the
whole thing seems to be heavily coordinated by the Dutch Politie.<sup id="fnref:operation-poweroff"><a class="footnote-ref" href="#fn:operation-poweroff">1</a></sup></p>
<p>The Dutch police appear to run the actual infrastructure for these operations. They have been active for quite some time
now, and over the years, they have managed to seize a maybe around one hundred domains<sup id="fnref:seized-fyi"><a class="footnote-ref" href="#fn:seized-fyi">2</a></sup> and make a few arrests here and there<sup id="fnref:europol-arrests"><a class="footnote-ref" href="#fn:europol-arrests">3</a></sup>.</p>
<h2>Digging into "Cyberzap"</h2>
<p>I have been looking around Operation PowerOFF for a bit, and whilst digging around, I stumbled across a website called <code>https://cyberzap.fun/</code>.</p>
<p>It did not look flawlessly professional, but it definitely looked legit enough. It perfectly mirrored the thousands of
skidded booter sites floating around the internet. It was not perfect, but there was absolutely a solid effort put into
it. They even set up robots.txt files, sitemaps, SEO friendly meta tags, and everything else a real website needs to rank on search engines.
<a href="/assets/blog/cyberzap.png" style="cursor: zoom-in;" target="_blank"><img alt="Cyberzap Site" src="/assets/blog/cyberzap.png" style="width: 100%; height: 310px; object-fit: cover; object-position: top;"/></a></p>
<div class="subtext">There's more to this image! You can view the whole website by clicking on the image to open it in a new tab</div>
<p>However, there was a massive giveaway if you even slightly started looking. The Dutch police absolutely love using bit.nl as their server host. And when
you check the MX DNS records, Cyberzap used bit.nl for their mail servers.</p>
<p>I decided to sign up to see how deep this went. I just wanted to let them know that I'm just researching, and not an
active cyberterrorist™. So I registered with the email <code>conducting-research-hello-operation-poweroff@lina.sh</code>.</p>
<div class="subtext">(I sadly didn't take any screenshots of the registration page, but it had a turnstile captcha and everything)</div>
<p>Surprisingly, they even sent a real activation email! With an activation link that had a token embedded, and manual code you could enter.
<a href="/assets/blog/signup-email.png" style="cursor: zoom-in;" target="_blank"><img alt="Signup Email" src="/assets/blog/signup-email.png"/></a></p>
<p>The dashboard looked maybe a little empty, <em>but</em> still believable. It had fake network speed graphs that updated on the current time,
and a fake counter of connected bots.
<a href="/assets/blog/cyberzap-dashboard.png" style="cursor: zoom-in;" target="_blank"><img alt="Cyberzap Dashboard" src="/assets/blog/cyberzap-dashboard.png"/></a> </p>
<div class="subtext">Screenshot was taken a bit later, after I was already playing around with the website</div>
<p>I wanted to see what happened if I "ordered an attack". 
Again, I didn't want them to think I am an evil hacker, so I entered a silly domain.</p>
<p><a href="/assets/blog/ordering-an-attack.png" style="cursor: zoom-in;" target="_blank"><img alt="Benjamin Netanyahu, please smite this website!!!" src="/assets/blog/ordering-an-attack.png"/></a></p>
<p>You could choose Bitcoin, Monero, PayPal, or Credit Card.</p>
<p><a href="/assets/blog/payment-methods.png" style="cursor: zoom-in;" target="_blank"><img alt="I'm paying with Monero, Opsec status: ON ✅" src="/assets/blog/payment-methods.png"/></a></p>
<p>But no matter what you picked, it would just load around for a few seconds, and then present you with the message
<code>Payment Error - There was an error processing your payment. Please try again or contact support.</code></p>
<p>You can view your past "attacks" in a history tab, where it will just show that the payment failed.
They really just let you prove your criminal intent, grab your IP address and email,
and they probably plan to use that as "evidence" if it ever comes to it.</p>
<h2>Scare tactics: Netcrashers</h2>
<p>Cyberzap is meant to be a "secret" trap. But they also run another type of site. I found <code>https://netcrashers.net/</code> around
the same time.</p>
<p><a href="/assets/blog/netcrashers.png" style="cursor: zoom-in;" target="_blank"><img alt="Netcrashers Site" src="/assets/blog/netcrashers.png"/></a></p>
<p>This site looks a lot faker, it gives us the promise to "crash all nets". But the moment you click any
button on the website, you immediately get redirected to a "scary" police warning  page. 
That page literally says the domain is created and owned by the Dutch Police.</p>
<p><a href="/assets/blog/powered-by-dutchies.png" style="cursor: zoom-in;" target="_blank"><img alt="Scary Police Warning" src="/assets/blog/powered-by-dutchies.png"/></a></p>
<div class="subtext">
"The Dutch Police has strong indications that you were looking for a DDoS-for-hire service. 
DDoS attacks are illegal and have serious consequences. 
You always leave traces online when committing cybercrime."
😈
</div>
<p>This is clearly designed for kids. A teenager looks up a DDoS site, clicks a button, and gets a huge
jump scare with police badges. They get scared and close the tab.</p>
<h2>Oops, they shut the whole thing down because of me &gt;w&lt;</h2>
<p>While I was digging around Cyberzap, testing shit, and taking screenshots, something quite funny happened:
The feds literally pulled the plug on the site.</p>
<p>I tried to load the page again, and I got hit with a 401 Unauthorized prompt. The website was locked down.</p>
<p><a href="/assets/blog/cyberzap-locked.png" style="cursor: zoom-in;" target="_blank"><img alt="Cyberzap Login Prompt" src="/assets/blog/cyberzap-locked.png"/></a></p>
<div class="subtext">Yeah I'm not changing my browser language to English for this screenshot...</div>
<p>I guess they saw my email address that greeted them. They probably received logs of someone "falling for it",
and saw someone was poking around their secret website, and knew who was behind it.
They completely panicked. They even shut down a completely unused domain called <code>bytecannon.net</code> with the exact same authorization message.</p>
<p>It's important to mention that the scary <code>netcrashers.net</code> site stayed online. But that one was <em>meant</em> to be associated with them.</p>
<p>I did manage to archive the main-homepage of <code>cyberzap.fun</code> in time though: <a href="https://archive.ph/IS0k6">https://archive.ph/IS0k6</a>.
This blog post is quite "image heavy", so I am quite sorry about the bad resolution of some images, but it's just screenshots I took to send to friends.
I sadly wasn't able to archive high-quality stuff of everything.</p>
<h2>What is the actual goal here?</h2>
<p>This brings up a really good question. What is the point of all this?</p>
<p>The banner on <code>netcrashers.net</code> mentions "Law enforcement combats cybercrime both overtly and covertly". We
essentially found both of those methods. Netcrashers is the overt one, and Cyberzap is the covert one.</p>
<p>When I looked at my attack order on Cyberzap, I noticed an ID in the URL that was given to me. My request was number 15.
That means there were only 14 other "attacks" ever ordered on that site. And honestly, <strong>most of those were probably the
feds testing their own code</strong>. Because honestly, who the fuck would still fall for this website? Despite all the "work"
they put in, how much money was blown on building this fake dashboard?</p>
<p>Catching people probably isn't the only goal. By running these honeypots, the police create suspicion and paranoia in the
community. If you want to buy a DDoS attack, you now have to wonder if the website is real or just a police honeypot
logging your IP. They want people to stop trusting these services entirely.</p>
<p>So yeah, those honeypots are real and out there, so the message clearly is: "you can't trust DDoS services".
It should obviously go without saying: you just shouldn't use booter services in the first place.</p>
<p>"Operation PowerOFF" also recently uploaded an AI-slop "propaganda" video<sup id="fnref:ai-slop"><a class="footnote-ref" href="#fn:ai-slop">6</a></sup>:</p>
<video controls="" height="360" muted="" width="640">
<source src="/assets/blog/sloppy-slop.mp4" type="video/mp4"/>
    Your browser does not support the video tag.
</video>
<div class="subtext">Highest grade slop provided directly by law enforcement.</div>
<p>It showed them knocking on the door of a 16 year old kid who hit Minecraft servers offline. They made this kid look like
a final boss, and showed themselves as how incredibly tuff they are for raiding a teenager.<br/>
Is it a real story? Probably not. I suppose it is meant to scare children, like <code>netcrashers.net</code>. But it really just
feels more like feds jerking themselves off on how cool they are. 
<a href="https://www.reddit.com/r/AMA/comments/1sso4dh/guess_whos_back_the_dutch_police_involved_in/">In a Reddit AMA</a> that 
they did just a week ago, they described this monstrosity as a "cool video" on their "branding page".</p>
<p>Does this video and the honeypot have any real impact? Let's be honest: probably not. It feels like they are just
redistributing wealth from the average taxpayer to AI video slop corporations.</p>
<p>We do know that Operation PowerOFF did this exact same thing in the past. The NCA
actually wrote an article<sup id="fnref:nca-article"><a class="footnote-ref" href="#fn:nca-article">4</a></sup> in March 2023 about how they infiltrated the cyber crime market
with disguised DDoS sites. </p>
<p>We likely just stumbled across their new project. Checking the domain registration, you can see that it was created on
April 3, 2025. I also checked the internet archive. The site was captured in July 2025, and it was still empty back
then<sup id="fnref:empty"><a class="footnote-ref" href="#fn:empty">5</a></sup>, so it is questionable when they actually launched it.</p>
<p>It is honestly just funny. They spend all this money on propaganda to scare children and complex honeypots that are
still super easy to detect. And the moment someone starts digging, they panic and shut the whole thing down.</p>
<p>Sorry glowies, you'll have to try again.</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:operation-poweroff">
<p><a href="https://en.wikipedia.org/wiki/Operation_PowerOFF">https://en.wikipedia.org/wiki/Operation_PowerOFF</a> yes i am using wikipedia as a source, it's a better summary than news articles, do your own research if you want <a class="footnote-backref" href="#fnref:operation-poweroff" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:seized-fyi">
<p><a href="https://seized.fyi/operation-poweroff">https://seized.fyi/operation-poweroff</a> <a href="https://seized.fyi/operation-poweroff-2">https://seized.fyi/operation-poweroff-2</a> <a href="https://seized.fyi/operation-poweroff-3">https://seized.fyi/operation-poweroff-3</a> and more individual banners that can be found on this website <a class="footnote-backref" href="#fnref:seized-fyi" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:europol-arrests">
<p><a href="https://www.europol.europa.eu/media-press/newsroom/news/europol-supported-global-operation-targets-over-75-000-users-engaged-in-ddos-attacks">https://www.europol.europa.eu/media-press/newsroom/news/europol-supported-global-operation-targets-over-75-000-users-engaged-in-ddos-attacks</a> <a class="footnote-backref" href="#fnref:europol-arrests" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:nca-article">
<p><a href="https://archive.ph/x68v0">https://archive.ph/x68v0</a> Interestingly enough, this article is now a 404, which is why you get an archived link. <a class="footnote-backref" href="#fnref:nca-article" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:empty">
<p><a href="https://web.archive.org/web/20250714195639/http://cyberzap.fun/">https://web.archive.org/web/20250714195639/http://cyberzap.fun/</a> <a class="footnote-backref" href="#fnref:empty" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:ai-slop">
<p><a href="https://operation-poweroff.com/assets/video.mp4">https://operation-poweroff.com/assets/video.mp4</a> <a class="footnote-backref" href="#fnref:ai-slop" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
</ol>
</div>
        
            ]]></description>
        </item>
        
        <item>
            <title>We're gonna hold a talk at the 39c3!</title>
            <link>https://lina.sh/blog/39c3-talk-coming-up</link>
            <guid isPermaLink="true">https://lina.sh/blog/39c3-talk-coming-up</guid>
            <pubDate>Thu, 18 Dec 2025 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>We&#x27;re gonna hold a talk at the 39c3!</h2>
            <p><i>How Germany&#x27;s ISPs cooperate with corporations to secretly block websites</i></p>
            <img src="https://lina.sh/assets/blog/39c3.png" alt="We&#x27;re gonna hold a talk at the 39c3!">
            
            <p>Hey!
We (<a href="https://northernsi.de">Elias/Northernside</a> and me!) will hold a talk at the 39c3!
The talk will be streamed and available to be watched later in archives.
Check it out here in the <a href="https://events.ccc.de/congress/2025/hub/en/event/detail/cuii-wie-konzerne-heimlich-webseiten-in-deutschland-sperren">hub</a> or <a href="https://fahrplan.events.ccc.de/congress/2025/fahrplan/event/cuii-wie-konzerne-heimlich-webseiten-in-deutschland-sperren">fahrplan</a>.</p>
<p>The talk itself is in German, but it will be translated (I guess?)</p>
<p>The talk will be about the CUII (which we already covered here multiple times: <a href="/blog/exposing-the-cuii">1</a>, <a href="/blog/telefonica-sabotages-me">2</a> and <a href="/blog/cuii-gives-up">3</a>)<br/>
There is some new information though in this talk and some new stuff that came up! So definitely come check it out if you're interested c:</p>
<style>
@font-face {
    font-family: 'KarioDuplexVar';
    src: url('/assets/Kario39C3Var-Roman.ttf') format('truetype');
}

@font-face {
    font-family: 'OfficerSans';
    src: url('/assets/OfficerSansWeb-Regular.woff2') format('woff2');
}

@font-face {
    font-family: 'OfficerSans';
    font-weight: bold;
    src: url('/assets/OfficerSansWeb-Bold.woff2') format('woff2');
}

:root {
    --color-dark: #141414 !important;
    --color-neutral: #faf5f5 !important;
    --color-secondary: #9673ff !important; 

    --background-color: var(--color-dark) !important;
    --text-color: var(--color-neutral) !important;
    --link-color: var(--color-secondary) !important;
    --secondary-text: #b69dfe !important;
}

body {
    background-color: var(--color-dark) !important;
    color: var(--color-neutral) !important;
    font-family: 'OfficerSans', sans-serif !important;
}

h1, h2, h3, .blog-header h1 {
    font-family: 'KarioDuplexVar', sans-serif !important;
    text-transform: uppercase !important;
    letter-spacing: 1px !important;
    color: var(--color-secondary) !important;
    font-weight: 600 !important;
}

a:not(.login-buttons a) {
    color: var(--color-secondary) !important;
    transition: background-color 0.2s ease, color 0.2s ease !important;
}

a:not(.login-buttons a):hover {
    background-color: var(--color-secondary) !important;
    color: var(--color-dark) !important;
    text-decoration: none !important;
}

.top-button {
    border: 1px solid var(--color-secondary) !important;
    padding: 5px 10px !important;
    background: transparent !important;
    color: var(--color-secondary) !important;
    font-family: 'KarioDuplexVar', sans-serif !important;
    font-size: 14px !important;
}

.top-button:hover {
    background-color: var(--color-secondary) !important;
    color: var(--color-dark) !important;
}

.dark-light-img {
    filter: invert(0) !important;
}
.top-button .dark-light-img {
    filter: brightness(0) saturate(100%) invert(54%) sepia(87%) saturate(2284%) hue-rotate(218deg) brightness(101%) contrast(101%) !important;
}

.top-button:hover .dark-light-img {
    filter: invert(1) !important; /* Inverts icon to black when background becomes purple */
}

.blog-content {
    border-top: 2px solid var(--color-secondary) !important;
}

blockquote {
    border-left: 4px solid var(--color-secondary) !important;
    background: rgba(150, 115, 255, 0.05) !important;
}

::selection {
    background: var(--color-secondary) !important;
    color: var(--color-dark) !important;
}
</style>
        
            ]]></description>
        </item>
        
        <item>
            <title>Germany's private internet censorship organization gives up</title>
            <link>https://lina.sh/blog/cuii-gives-up</link>
            <guid isPermaLink="true">https://lina.sh/blog/cuii-gives-up</guid>
            <pubDate>Thu, 17 Jul 2025 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>Germany&#x27;s private internet censorship organization gives up</h2>
            <p><i>A group of major corporations blocked domains in Germany without courts. That ends now.</i></p>
            <img src="https://lina.sh/assets/blog/cuii-tomb.png" alt="Germany&#x27;s private internet censorship organization gives up">
            <img src="https://vg09.met.vgwort.de/na/12a1a27d769d4645b372738544362011" width="1" height="1" alt="">
            <p>Our internet is a little freer now, with less censorship by private companies.</p>
<h2>What was the CUII?</h2>
<p>The <em>Clearingstelle Urheberrecht im Internet</em> (CUII) is a private group formed by ISPs and copyright holders. 
They decided what websites to block, and ISPs followed, without any court ruling. No judge was involved, no legal process.</p>
<p>The members: The four largest ISPs in Germany and a <em>bunch</em> of copyright holders (the Motion Picture Association, Sky, ...).
If they decided that a site should be blocked, the ISPs just blocked the domains from being resolved. 
This ran completely outside the courts, a private system made by corporations for censorship.
Blocked sites included streaming services, but also sites like <strong>Sci-Hub</strong> or game piracy sites. </p>
<h2>What we did</h2>
<p>In <a href="/blog/exposing-the-cuii">a previous blog post</a>, I went into detail on how we trolled them:<br/>
- We leaked their secret blocklists (the list of domains was kept secret!)<br/>
- We exposed dozens of wrongful and outdated blocks.<br/>
- We made them unblock a lot of domains, including some that were blocked for years.<br/>
- ... and so much more. We just made a <em>lot</em> of bad press for them.</p>
<h2>What changed</h2>
<p>The CUII now only coordinates blocks between ISPs <em>after</em> a court order. 
That's it. No more secret votes. No more corporate censorship.
The new version of their website says:
"The CUII coordinates the conduct of judicial blocking proceedings and the implementation of judicial blocking orders."</p>
<p>It's a massive shift.
Until now, corporations acted like they were above the law with the CUII, deciding on their own what content to block across the entire German internet, 
based purely on their financial interests.
That's over. From now on, the new "Code of Conduct" requires <strong>actual legal review</strong> for new blocks to be implemented.
The old process, where rights holders submitted requests and the CUII panel approved them privately, is gone. <br/>
Instead, they now say: "Under the current Code of Conduct, judicial review of blocking claims replaces these procedural steps (the CUII's old internal decision-making process).
The CUII no longer reviews blocking claims, but instead coordinates only the initiation and conduct of proceedings, 
the implementation of judicial blocking decisions, and the unblocking of domains that are no longer infringing."</p>
<p>In practice, this means the CUII no longer decides anything. It just forwards court decisions and tells ISPs what to do.
The version of the CUII that privately censored the internet is dead. It's now rather just coordinating everything so stuff goes smoothly.
That's not because they wanted to change. It's because they had to. 
Even the Bundesnetzagentur (Germany's Federal Network Agency) told them to back off and leave the decisions to actual courts
(I reported a lot of the CUII's wrongful blocks to them).
It's a step back toward net neutrality and due process. 
Censorship decisions should never be made by a few companies behind closed doors.</p>
<p>Sadly, there's a <em>small</em> catch: <strong>the old blocks stay</strong>. 
The current blocklist still includes every site they decided to censor before now, without court orders.
But at least, this mess won't grow anymore.
We exposed them, we pushed back against their private censorship, and it seems like we won.</p>
<p>The core problem with the CUII was always that that it was a private organization, bypassing courts, 
letting powerful corporations decide what Germans are allowed to access online. 
This power finally no longer belongs to them, but now rightfully belongs in court, which is a <em>long</em> overdue step. 
They are not above the law, and they never should have been.<br/>
<br/>
You can read an article in German about this: <a href="https://netzpolitik.org/2025/die-cuii-gibt-auf-fuer-netzsperren-braucht-es-jetzt-einen-gerichtsentscheid/">https://netzpolitik.org/2025/die-cuii-gibt-auf-fuer-netzsperren-braucht-es-jetzt-einen-gerichtsentscheid/</a></p>
        
            ]]></description>
        </item>
        
        <item>
            <title>German ISPs are apparently forced to block Pornhub (again)</title>
            <link>https://lina.sh/blog/germany-blocks-pornhub-again</link>
            <guid isPermaLink="true">https://lina.sh/blog/germany-blocks-pornhub-again</guid>
            <pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>German ISPs are apparently forced to block Pornhub (again)</h2>
            <p><i>After years of nothing, Telekom has just blocked Pornhub&#x27;s new German domain.</i></p>
            <img src="https://lina.sh/assets/blog/fence.jpg" alt="German ISPs are apparently forced to block Pornhub (again)">
            
            <h2>What happened before?</h2>
<p>Back in March 2023, German ISPs were forced by the KJM (Commission for the Protection of Minors in the Media), 
a subgroup of the state media authorities, to block xHamster<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>. Probably around November, they also mandated the blocking of Pornhub for 'not protecting children well enough.'<br/>
But unlike with xHamster, no one even really noticed the block. There was almost <em>zero</em> media coverage about Pornhub being blocked. 
(Or at least I can't find any, that's why it's so hard to date the blocking. There is one article by Netzpolitik talking about the possibility of them being blocked<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>). 
The reason why there was almost no media coverage: the block likely didn't even last a day. Shortly after, pornhub.com stopped redirecting German users to de.pornhub<strong>.com</strong> and instead redirected to de.pornhub<strong>.org</strong> - which wasn't blocked. 
And that's kinda how things stayed... until now.   </p>
<p>Someone on my website just reported that <strong>Telekom has started blocking de.pornhub.org</strong>. And again, <strong>no one is talking about it</strong>.  </p>
<h2>Is this just going to keep going forever?</h2>
<p>Are regulators just gonna keep chasing one domain after the other? Blocking more and more and more? There's no transparency, no "public list" of blocked pages - 
and journalists can't even check what's on a site because, well, <strong>it's blocked</strong>.  </p>
<p>I actually heard someone say:
<em>"Well, journalists should just use a VPN or a different DNS, it's easy to bypass"</em> </p>
<p>But if that's the answer, then <strong>shouldn't everyone be able to do that?</strong> Just to check why the government is blocking something? 
And if <strong>everyone</strong> bypasses it, then what's the point of the block in the first place?  </p>
<p>At the end of the day, these blocks aren't about protecting anyone: any kid can just type "porn" into Google's search bar - typing out the full domain is a lot more challenging. 
In the end, this just limits regular people and opens the door for more and more censorship.  </p>
<p>This was my <strong>entire issue with the CUII</strong> - Germany's internet censorship is very shady. <a href="/blog/exposing-the-cuii">Read more about our secret censorship-organization here.</a> </p>
<p><em>I apologize for any errors, this was yet another quickly typed post about a new situation.</em></p>
<h2>Update: 2025-04-29</h2>
<p>I sent out multiple emails to different KJM members, which were all ignored.
I therefore sent out a FOIA request asking for a list of blocked domains.
They have confirmed the blocking of de.pornhub.org<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>, 
and are currently trying to force Vodafone to block the new domain as well<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>.</p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><a href="https://www.stern.de/digital/online/-xhamster--wird-in-deutschland-gesperrt---pornos-sind-kein-kinderprogramm--31672550.html">Stern: "XHamster wird in Deutschland gesperrt"</a> <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p><a href="https://netzpolitik.org/2023/medienaufsicht-internet-provider-sollen-pornhub-in-deutschland-sperren/">netzpolitik.org: Internet-Provider sollen Pornhub in Deutschland sperren</a> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p><a href="https://fragdenstaat.de/anfrage/liste-von-gesperrten-domains/#nachricht-996263">FOIA request to LfM NRW, "List of blocked domains"</a> <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p><a href="https://fragdenstaat.de/anfrage/ifg-antrag-zur-sperrung-von-de-pornhub-org/#nachricht-994765">FOIA request to LfM NRW, "IFG request regarding the blocking of de.pornhub.org"</a> <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>
        
            ]]></description>
        </item>
        
        <item>
            <title>A German ISP tampered with their DNS - specifically to sabotage my website</title>
            <link>https://lina.sh/blog/telefonica-sabotages-me</link>
            <guid isPermaLink="true">https://lina.sh/blog/telefonica-sabotages-me</guid>
            <pubDate>Wed, 26 Feb 2025 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>A German ISP tampered with their DNS - specifically to sabotage my website</h2>
            <p><i>One of Germany&#x27;s biggest ISPs changed how their DNS works, right after I exposed an organization that they’re part of.</i></p>
            <img src="https://lina.sh/assets/blog/sabotage.png" alt="A German ISP tampered with their DNS - specifically to sabotage my website">
            
            <h2>My website: Publishing Germany's secret internet blocklist</h2>
<p>In Germany, we have the <em>Clearingstelle Urheberrecht im Internet</em> (CUII) - literally 'Copyright Clearinghouse for the Internet', 
a private organization that decides what websites to block, corporate interests rewriting our free internet.
No judges, no transparency, just a bunch of ISPs and major copyright holders deciding what your eyes can see.<br/>
I decided to create a website, <a href="https://cuiiliste.de/">cuiiliste.de</a>, to find blocked domains, as the CUII refuses to publish such a list.
To read more about the CUII, check out <a href="/blog/exposing-the-cuii">one of my previous blog posts</a>. Germany's four biggest ISPs 
(Telekom, Vodafone, 1&amp;1 and Telefonica (o2)) are all part of the CUII.</p>
<h2>Yet another slip-up by the CUII</h2>
<p>This week, Netzpolitik.org published an article about the CUII's latest blunder<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>, based on information I gathered. 
They managed to block domains that no longer even existed: websites that had already been seized and taken offline when they were blocked.
It's not the first time the CUII has tripped over its own feet, and this mistake likely didn’t sit well with them.
In the past, it was <em>really</em> easy to find out if a domain was blocked by the CUII.
If you asked an ISP's DNS server (basically the internet's phone book) for a site and got a CNAME to <code>notice.cuii.info</code>, you knew it was blocked.<br/>
What this basically means in case you're not a tech nerd:<br/>
You can check the phone book of an ISP (the "DNS server") where to find a website, and you'd receive a note saying "This site is blocked by the CUII" if the page is blocked.
Automating this was simple, I could basically just ask "Hey, where can I find this site?" and immediately knew if it was blocked.
The CUII apparently did <em>not</em> like the fact that it was so easy for me to check if a domain was blocked. They want to keep their list secret.<br/>
ISPs like Telekom, 1&amp;1 and Vodafone actually all stopped using this response a few months ago, 
after older articles about the CUII's past failures were published. Instead, they started pretending that blocked sites didn't exist at all.
Straight up erasing entries from the phone book. You could not tell if a site was blocked or just didn't exist.
Telefonica (the parent company of for example o2, Germany's <strong>fourth-biggest ISP</strong><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>), apparently didn't get this memo, and they still used <code>notice.cuii.info</code> in their DNS responses.  </p>
<p>On cuiiliste.de, anyone can enter a domain, and see if it is blocked by the CUII, and which ISPs block it specifically.</p>
<h3>I get a new visitor</h3>
<p>Telefonica modified their DNS servers, specifically saying that <code>blau-sicherheit.info</code> was blocked by the CUII.
At 11:06 AM last Friday, someone from Telefonica's network checked if <code>blau-sicherheit.info</code> was blocked on my site. 
The twist? Telefonica seems to own this domain. Blau is one of their brands<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>, and <code>blau-sicherheit.info</code> wasn’t some piracy hub -
it appears to be a test domain of theirs. 
My tool flagged it as blocked because Telefonica's DNS servers said so. 
Why would they block their own domain?</p>
<p><a href="/assets/blog/blau-sicherheit-probe.png" style="cursor: zoom-in;" target="_blank"><img alt="Telefonica's DNS response" src="/assets/blog/blau-sicherheit-probe.png"/></a>
To recap:</p>
<ul>
<li> Telefonica blocks their own domain</li>
<li> Someone from Telefonica visits my website to check if I detect this</li>
<li> I <i>do</i> in fact detect this</li>
</ul>
<h3>Telefonica modifies how their blocking works... to mess specifically with my website</h3>
<p>Two hours after this suspicious query, I was bombarded with Notifications. 
My program thought that the CUII had suddenly unblocked hundreds of domains.<br/>
The reason: Telefonica had altered their DNS servers to stop redirecting blocked domains to <code>notice.cuii.info</code>.
Now they pretend that the domain doesn't exist at all, after they <em>specifically</em> blocked their own domain, likely to find out how my website works.<br/>
I had to spend my entire Friday afternoon fixing this mess, and now everything is fully operational again.
<a href="/assets/blog/git-pull.png" style="cursor: zoom-in;" target="_blank"><img alt="Git pull" src="/assets/blog/git-pull.png"/></a>
The fix worked, but there’s a catch: without the <code>notice.cuii.info</code> redirect, it's harder to confirm if a block is actually the CUII's doing. 
Sometimes ISPs block sites for other reasons, like terrorism content (<a href="/blog/german-isps-block-terrorist-content">I wrote about that too</a>). 
I try to compensate this by cross-checking domains against a list of known non-CUII-blocks.
<a href="/assets/blog/almanar-blocked.png" style="cursor: zoom-in;" target="_blank"><img alt="Probing a site blocked by ISPs, but not by the CUII" src="/assets/blog/almanar-blocked.png"/></a></p>
<h3>Why sabotage my website?</h3>
<p>The timing is more than suspicious. 
Right after Netzpolitik’s article exposed the CUII for blocking non-existent domains, they make it harder to track their mistakes. 
Coincidence? Or a move to bury future slip-ups? 
We can only speculate.
Regardless of intent, the result is the same: less transparency and harder oversight. And that benefits the CUII, not the public.  </p>
<p>In this context, Netzpolitik.org released another article (German): 
<a href="https://netzpolitik.org/2025/netzsperren-provider-verstecken-welche-domains-sie-sperren/">Netzpolitik.org: Provider verstecken, welche Domains sie sperren</a></p>
<h3>Sources</h3>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><a href="https://netzpolitik.org/2025/netzsperren-17-jaehriger-treibt-die-cuii-vor-sich-her/">Netzpolitik: 17-Jähriger treibt die CUII vor sich her (German)</a> <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p><a href="https://www.dslweb.de/breitband-report-deutschland.php">DSLWEB, Übersicht: Aktuelle Marktanteile Breitband</a> <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p><a href="https://www.telefonica.de/kunden/blau.html">Telefonica: Blau (German)</a> <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>
        
            ]]></description>
        </item>
        
        <item>
            <title>First major internet block in Germany for terrorist propaganda</title>
            <link>https://lina.sh/blog/german-isps-block-terrorist-content</link>
            <guid isPermaLink="true">https://lina.sh/blog/german-isps-block-terrorist-content</guid>
            <pubDate>Fri, 20 Dec 2024 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>First major internet block in Germany for terrorist propaganda</h2>
            <p><i>German ISPs now block websites for spreading &quot;unconstitutional content&quot;</i></p>
            <img src="https://lina.sh/assets/blog/terrorist-block.jpg" alt="First major internet block in Germany for terrorist propaganda">
            
            <p><em>This is just a quickly typed post to update on a recently changed situation.</em></p>
<h2>Al-Manar TV blocked by German ISPs</h2>
<p>Before net-neutrality was a thing, and ISPs just did whatever they wanted to do, there <em>were</em> a few blocks, similar to 
that, in the past (we are talking about the 2000s here). 
But now, the biggest ISPs in Germany (Telekom, Vodafone, 1&amp;1, ...) 
have been forced to block websites not related to child protection or EU sanctions. 
The Lebanese terror group Hezbollah runs the channel "<em>Al-Manar TV</em>", which also has a website, where they
had been spreading hate speech and terrorist propaganda.<br/>
The German government already outlawed the channel in 2008 for unconstitutional content, 
but it simply continued to operate online.  </p>
<p>On December 18, 2024, the Commission for Youth Media Protection (KJM) apparently ordered ISPs to block both the 
Arabic and English versions of Al-Manar TV's website. 
We were able to find two domains affected under these blocks. The ISPs now won't resolve those domains anymore. </p>
<p>Until now, German internet blocks have only targeted websites violating child protection laws 
(like porn sites without proper age verification), or sites affected by EU sanctions against Russia. 
However, those previous blocks are largely ineffective, 
with operators quickly bypassing them using new domains<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>.</p>
<h2>Opinion</h2>
<p>While blocking terrorist propaganda like Al-Manar <em>may</em> seem like a good step to keep harmful content off the internet, 
I'm concerned about where this might lead.
We can all agree this content is harmful, but this can lead to drastic consequences. 
Blocking "unconstitutional" content could lead to more censorship in the future, 
possibly affecting other types of speech that just don't match what the government or most people think.
What starts with blocking terrorism could end up limiting free speech more than what's actually needed to keep people safe.</p>
<h3>Sources</h3>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p>https://netzpolitik.org/2022/netzsperre-fuer-pornoseite-xhamster-fuehrt-medienaufsicht-vor/ <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>
        
            ]]></description>
        </item>
        
        <item>
            <title>Exposing the CUII</title>
            <link>https://lina.sh/blog/exposing-the-cuii</link>
            <guid isPermaLink="true">https://lina.sh/blog/exposing-the-cuii</guid>
            <pubDate>Wed, 18 Dec 2024 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>Exposing the CUII</h2>
            <p><i>A private organization controlling what websites to block in Germany-without courts, without transparency.</i></p>
            <img src="https://lina.sh/assets/blog/cuii.png" alt="Exposing the CUII">
            
            <h2>What is the CUII?</h2>
<p>The <em>Clearingstelle Urheberrecht im Internet</em> (CUII) is a private organization established in Germany in 2021. 
Its members include ISPs like Deutsche Telekom, Vodafone, 1&amp;1, and Telefónica (O2), alongside major copyright holders<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>. 
These ISPs alone control over 85% of the German market<sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup>.  </p>
<p>The CUII's role is to block websites allegedly commiting copyright infringement. 
However, unlike traditional legal processes, the CUII bypasses courts entirely. 
Its members find websites they want blocked, the CUII "evaluates" this and then decide which ones to block 
without requiring judicial approval.  </p>
<p>One would assume that such a powerful entity operates transparently and adheres to strict monitoring practices, 
as outlined in their own Code of Conduct (Section 8)<sup id="fnref:3"><a class="footnote-ref" href="#fn:3">3</a></sup>. Unfortunately, that's far from the case.  </p>
<hr/>
<h2>How it began: <em>cuiiliste.de</em></h2>
<p>Although the CUII decides what websites to block, it does not publicly disclose the blocked domains. 
Even Germany's Federal Network Agency (BNetzA) is not informed about mirror domains 
(Section 9 of the Code of Conduct)<sup id="fnref2:3"><a class="footnote-ref" href="#fn:3">3</a></sup>.  </p>
<p>To counter this secrecy, the website <em>cuiiliste.de</em> was created in 2021. 
It aimed to crowdsource a list of blocked domains<sup id="fnref:4"><a class="footnote-ref" href="#fn:4">4</a></sup>. 
Sadly, <em>cuiiliste.de</em> shut down in 2023<sup id="fnref:5"><a class="footnote-ref" href="#fn:5">5</a></sup>.  </p>
<p>When I discovered this, I decided to revive the concept. 
I acquired the domain and automated the process of checking and monitoring blocked websites. This included monitoring when which ISP blocked or unblocked which domain.
This is because of the CUII's refusal to publish a domain list, as described in their Code of Conduct (Appendix 1, Section 4, Paragraph 4, Letter l)<sup id="fnref3:3"><a class="footnote-ref" href="#fn:3">3</a></sup>.  </p>
<p>While I worked on this, my friend <a href="https://northernsi.de">Northernside</a> <strong>GOT HIS HANDS ON THE ACTUAL CUII DOMAIN LIST!?</strong><br/>
We won't disclose how, but this was groundbreaking.</p>
<p><a href="/assets/blog/domains.png" style="cursor: zoom-in;" target="_blank"><img alt="CUII List" src="/assets/blog/domains.png"/></a></p>
<div class="subtext">holy shit, we actually have the cuii list. holy fucking bingle. what?!? :3</div>
<hr/>
<h2>Publishing the list</h2>
<p>The leaked list revealed 284 blocked domains and subdomains. 
There are no wildcard blocks, all subdomains were individually listed.</p>
<p>Once the list was added to the database, news outlets picked up the story. 
Articles appeared on platforms like Netzpolitik.org<sup id="fnref:6"><a class="footnote-ref" href="#fn:6">6</a></sup>, Heise<sup id="fnref:8"><a class="footnote-ref" href="#fn:8">8</a></sup>, TorrentFreak<sup id="fnref:9"><a class="footnote-ref" href="#fn:9">9</a></sup>, and others. 
This made the project gained widespread attention, making the CUII’s lack of transparency more widely known.  </p>
<p>You can still view and contribute to the updated list at <a href="https://cuiiliste.de/">cuiiliste.de</a>.  </p>
<p><a href="/assets/blog/cuiiliste.png" style="cursor: zoom-in;" target="_blank"><img alt="CUII List" src="/assets/blog/cuiiliste.png"> </img></a></p>
<hr/>
<h2>The monitoring failure</h2>
<p>The CUII's members are <strong>required</strong> to monitor blocked websites regularly to ensure they still meet the criteria for blocking (Section 8 of the Code of Conduct)<sup id="fnref4:3"><a class="footnote-ref" href="#fn:3">3</a></sup>. 
This requirement is also enforced by the Federal Network Agency (BNetzA)<sup id="fnref:10"><a class="footnote-ref" href="#fn:10">10</a></sup>.  </p>
<p><a href="/assets/blog/regelmaessiges-monitoring.png" style="cursor: zoom-in;" target="_blank"><img alt="CUII Monitoring" src="/assets/blog/regelmaessiges-monitoring.png"/></a> </p>
<div class="subtext">
Translation: "The applicant &#91;CUII member&#93; has to carry out regular monitoring to check whether the conditions for the blocking claim according to §19a UrhG &#91;German Copyright Act&#93; still exist."<br/>
- Statement from the Federal Network Agency (BNetzA) in a Freedom of Information Act request
</div>
<p>Yet domains remained wrongfully blocked <strong>for years</strong>. 
For example, <code>serien.sx</code> redirected to non-infringing content (<code>serien.domains</code>) as early as April 2022 (over 2 and a half year!). 
Despite this, it remained blocked until I raised the issue with the CUII. 
While they never responded, the domain was quietly unblocked soon after.  </p>
<p>This was not an isolated case. 
Upon reviewing the blocked domains, I found that 41 out of 122 were wrongfully blocked-over one-third!<br>
News outlets like Netzpolitik.org reported on this<sup id="fnref:11"><a class="footnote-ref" href="#fn:11">11</a></sup>, forcing the CUII to lift many wrongful blocks<sup id="fnref:12"><a class="footnote-ref" href="#fn:12">12</a></sup>.</br></p>
<hr/>
<h2>Conclusion</h2>
<p>The CUII operates with little oversight, significant power, and a questionable track record.
Its members fail to perform required monitoring, leading to numerous wrongful blocks.
Transparency, the foundation of accountability, still remains absent.  </p>
<p>But how is such an organization even possible in Germany?
Net neutrality should, in theory, protect the openness of the internet, yet the existence of the CUII seems to circumvent this principle.
The pressure comes from legal and financial risks ISPs face if they do <em>not</em> block websites accused of copyright infringement.
Although the law <strong>does not</strong> mandate these blocks, the fear of potential lawsuits motivates ISPs to align 
with copyright holders and form private and secretive organizations like the CUII.  </p>
<p>This raises fundamental questions about the balance of power. 
How can private companies decide what is accessible on the internet? 
How does a system allow ISPs to bypass judicial oversight and enforce these measures themselves? 
And, most troubling, how did this lead to the creation of a secretive and unaccountable organization 
with such authority in a country that values freedom and transparency?  </p>
<p>Do we really want a future where private and secretive organizations decide what we can access online,
based on the whims of multi-billion-dollar companies?<br/>
The CUII shows how power, even in a free country, can grow under the disguise of enforcing outdated and overly broad copyright laws.
Laws that increasingly prioritize corporate interests over individual freedoms, destroying the openness, 
innovation, and equality that the internet was meant to protect.
<br/>
<br/></p>
<p>Visit <a href="https://cuiiliste.de/">cuiiliste.de</a> to see the updated list and help push for more transparency in digital censorship (German only).</p>
<h3>Sources</h3>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><a href="https://cuii.info/en/members/">cuii.info - members</a>, 2024 (<a href="https://web.archive.org/web/20240530000422/https://cuii.info/en/members/">Archive</a>) <a class="footnote-backref" href="#fnref:1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2">
<p><a href="https://www.dslweb.de/telekom.php">DSLWEB</a>, 2024 (<a href="https://web.archive.org/web/20240621043036/https://www.dslweb.de/telekom.php">Archive</a>) <a class="footnote-backref" href="#fnref:2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:3">
<p><a href="https://cuii.info/fileadmin/files/CUII_CodeofConduct_23.pdf">CUII Code of Conduct</a>, 2023 (<a href="https://web.archive.org/web/20240823231253/https://cuii.info/fileadmin/files/CUII_CodeofConduct_23.pdf">Archive</a>) <a class="footnote-backref" href="#fnref:3" title="Jump back to footnote 3 in the text">↩</a><a class="footnote-backref" href="#fnref2:3" title="Jump back to footnote 3 in the text">↩</a><a class="footnote-backref" href="#fnref3:3" title="Jump back to footnote 3 in the text">↩</a><a class="footnote-backref" href="#fnref4:3" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:4">
<p><a href="https://web.archive.org/web/20210331162058/https://cuiiliste.de/">web archive of cuiiliste.de</a>, 2021 <a class="footnote-backref" href="#fnref:4" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:5">
<p><a href="https://web.archive.org/web/20230610190529/http://cuiiliste.de/">web archive of cuiiliste.de</a>, 2023 <a class="footnote-backref" href="#fnref:5" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:6">
<p><a href="https://netzpolitik.org/2024/cuii-liste-diese-websites-sperren-provider-freiwillig/">Netzpolitik - "Diese Websites sperren Provider freiwillig"</a>, 2024 <a class="footnote-backref" href="#fnref:6" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
<li id="fn:7">
<p><a href="https://winfuture.de/news,127228.html">winfuture - "17-Jähriger legt geheime Piraterie-Blockliste deutscher Provider offen"</a>, 2024 <a class="footnote-backref" href="#fnref:7" title="Jump back to footnote 7 in the text">↩</a></p>
</li>
<li id="fn:8">
<p><a href="https://heise.de/-9847202">Heise - "Netzsperren: Schüler kritisiert "Selbstjustiz" der Clearingstelle Urheberrecht"</a>, 2024 <a class="footnote-backref" href="#fnref:8" title="Jump back to footnote 8 in the text">↩</a></p>
</li>
<li id="fn:9">
<p><a href="https://torrentfreak.com/17-year-old-student-exposes-germanys-secret-pirate-site-blocklist-240822/">Torrentfreak - "17-Year-old Student Exposes Germany's ‘Secret' Pirate Site Blocklist"</a>, 2024 <a class="footnote-backref" href="#fnref:9" title="Jump back to footnote 9 in the text">↩</a></p>
</li>
<li id="fn:10">
<p><a href="https://media.frag-den-staat.de/files/foi/914902/anlage3stellungnahmegeschwrzt.pdf">FragDenStaat an BNetzA FOI914902-Anlage 3</a>, 2024 (<a href="https://web.archive.org/web/20240927204441/https://media.frag-den-staat.de/files/foi/914902/anlage3stellungnahmegeschwrzt.pdf">Archive</a>) <a class="footnote-backref" href="#fnref:10" title="Jump back to footnote 10 in the text">↩</a></p>
</li>
<li id="fn:11">
<p><a href="https://netzpolitik.org/2024/cuii-viele-netzsperren-wirken-laenger-als-erlaubt/">Netzpolitik - "Viele Netzsperren wirken länger als erlaubt"</a>, 2024 <a class="footnote-backref" href="#fnref:11" title="Jump back to footnote 11 in the text">↩</a></p>
</li>
<li id="fn:12">
<p><a href="https://netzpolitik.org/2024/cuii-liste-internetprovider-heben-39-netzsperren-auf/">Netzpolitik - "Internetprovider heben 39 Netzsperren auf"</a>, 2024 <a class="footnote-backref" href="#fnref:12" title="Jump back to footnote 12 in the text">↩</a></p>
</li>
</ol>
</div>
        
            ]]></description>
        </item>
        
        <item>
            <title>Fully automatic updating Spotify status... without JavaScript?</title>
            <link>https://lina.sh/blog/spotify-status-without-js</link>
            <guid isPermaLink="true">https://lina.sh/blog/spotify-status-without-js</guid>
            <pubDate>Sun, 08 Dec 2024 00:00:00 +0000</pubDate>
            <description><![CDATA[
                
            <h2>Fully automatic updating Spotify status... without JavaScript?</h2>
            <p><i>How I managed to keep my website JavaScript-free while still showing my current Spotify status in real-time.</i></p>
            <img src="https://lina.sh/assets/blog/spotify-status.png" alt="Fully automatic updating Spotify status... without JavaScript?">
            <img src="https://vg09.met.vgwort.de/na/522fe25be8424078bb331594a2d7b258" width="1" height="1" alt="">
            <h2>The challenge: A real-time status using CSS only</h2>
<p>Typically, when you want real-time updates on a website, like displaying the song you're currently listening to on
Spotify, you use JavaScript. It's just what you use for fetching data and manipulating the page dynamically. 
You would never do some cursed CSS-only solution, right? How would you even fetch data without JavaScript?</p>
<p>Well, my website was built to be completely JavaScript-free, and I didn't want to "throw that away" for a single
feature. 
So my goal was: Building a <strong>fully automatic and dynamically updating</strong> Spotify status without 
writing a single line of client-side JavaScript?<br/>
It turns out this <em>is</em> possible. 
The trick involves server-side streaming and a rather silly, but effective, use of CSS.</p>
<h2>The solution: Streaming CSS updates</h2>
<p>The core idea is surprisingly simple: instead of fetching a complete HTML file and closing the connection, the server
just never closed the connection; it keeps the connection to the browser open. 
This allows the server to continuously "append" new data to the page, after the browser already loaded it.</p>
<p>Instead of changing the page content with JavaScript, I just send new <code>&lt;style&gt;</code> tags. 
Every time my Spotify status changes, the server injects a new block of CSS that overwrites the previous styles. 
All the dynamic elements you see (the song title, artist, album art, and the progress bar) 
are controlled entirely by these streamed CSS rules.</p>
<p>My friend yui (<a href="https://yui.dev/">https://yui.dev/</a>), whose website is genuinely amazing, was the one who suggested this
clever approach to me. Please check out their work!</p>
<p>Here’s a simplified example of what the server sends when a new song starts playing:</p>
<div class="codehilite"><pre><span></span><code><span class="p">&lt;</span><span class="nt">style</span><span class="p">&gt;</span>
<span class="w">    </span><span class="p">.</span><span class="nc">song-title</span><span class="p">::</span><span class="nd">before</span><span class="w"> </span><span class="p">{</span>
<span class="w">        </span><span class="k">content</span><span class="p">:</span><span class="w"> </span><span class="s2">"New Song Title"</span><span class="p">;</span>
<span class="w">    </span><span class="p">}</span>
<span class="p">&lt;/</span><span class="nt">style</span><span class="p">&gt;</span>
</code></pre></div>
<p>This new rule is added to the bottom of the document. Thanks to the "cascading" part of Cascading Style Sheets (CSS),
the last rule defined for an element wins. The new content simply overwrites the old one, and the song title on the page
changes instantly.</p>
<h2>The backend</h2>
<p>So, how does the server know when to send an update? I use a simple Python with Flask. 
The server permanently checks the Spotify API for my latest status (song title, artist, playback position).</p>
<p>When it detects a change, it generates the new CSS and sends it down all open connections. 
In Flask, this is easy to do with a python generator that <code>yield</code>s the CSS updates as events happen.</p>
<p>A grossly oversimplified version of the code looks like this:</p>
<div class="codehilite"><pre><span></span><code><span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
    <span class="c1"># This line waits for a new event (e.g., song change) to come in</span>
    <span class="n">event</span> <span class="o">=</span> <span class="n">event_queue</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
    <span class="k">if</span> <span class="n">event</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
        <span class="k">break</span>
    <span class="c1"># This sends the new CSS to the browser</span>
    <span class="k">yield</span> <span class="n">event</span>
</code></pre></div>
<p>I can add any update I want to the <code>event_queue</code>, and it gets streamed to the browser in real-time.</p>
<h2>Keeping everything perfectly in sync</h2>
<p>Now, a small problem with relying on CSS is that animations, like a progress bar, aren't always perfectly synced with
the actual status.
To solve this, my system updates the CSS in two ways:</p>
<ol>
<li><strong>Immediate Updates:</strong> If I pause, skip, or jump to a different timestamp in a song, the server detects this and
   sends a full CSS update <strong>immediately</strong>.</li>
<li><strong>Periodic Resync:</strong> To correct any potential de-sync, the server also sends a complete, fresh set of CSS rules every
   five seconds, ensuring the progress bar and other details are always accurate.</li>
</ol>
<p>Here's a look at it in action:</p>
<video controls="">
<source src="/assets/blog/spotify-playing.webm" type="video/webm"/>
<source src="/assets/blog/spotify-playing.mp4" type="video/mp4"/>
</video>
<h2>Problems... (and solutions)</h2>
<p>This approach isn't without its issues. The most obvious issue is that with a constantly open connection, the
browser's tab will show a "loading" spinner. </p>
<p>I solved this with a little trickery. 
I load the widget in an iframe, the initial HTML page loads completely and then uses a <code>Refresh</code> header to redirect to
a second page after 5 seconds. This second page is the one that uses the "open" connection. Because the initial page
finished loading, the browser considers the site "loaded", even while the Spotify element continues to receive
background updates.</p>
<p>Another issue was adding a button to open the current song in Spotify. The solution: Overlay a new <code>&lt;a&gt;</code> element, every
time the song changes, with the correct link to open the song in Spotify. This <em>does</em> mean that if you 
have my website open for hours, you will end up with hundreds of <code>&lt;a&gt;</code> elements stacked on top of each other.</p>
<p>Also, if you keep the page open for a very long time, the CSS will grow indefinitely. 
This is less of a problem than expected, as the CSS is "just text" and rather small, and browsers are quite good at 
optimizing it. Unless you plan on keeping the connection open for weeks, this shouldn't be an issue.</p>
<h2>Update: Perfectly synced live lyrics!</h2>
<p>I've since pushed this concept even further by adding live lyrics. By <em>totally</em> not breaking Spotify's ToS to fetch the
lyric data, I can get the timestamps for every line.</p>
<p>The server sends all the lyrics and their timings to the browser as a single, keyframed CSS animation when the song
first loads. This means the entire synchronization happens client-side within CSS, and the server only needs to send one
update per song change. The result is lyrics that are almost perfectly synced to what I'm hearing.</p>
<h2>Conclusion</h2>
<p>This was an incredibly fun experiment, and I spent way too many hours on it. 
Anyone sane enough should absolutely just use JavaScript for something like this; it would have been infinitely easier.</p>
<p>But nevertheless, working on this was super fun, having to figure out </p>
<p>If you're curious to see the beautiful mess of code that makes this all work, you can find it on my GitHub:
<a href="https://github.com/lina-x64/lina.sh">https://github.com/lina-x64/lina.sh</a></p>
<div class="listening-wrapper" id="status">
<iframe allowtransparency="true" class="listening-to" loading="lazy" src="/listening_to?refresh=1"></iframe>
</div>
<style>
.listening-to {
    border: none;
    background: none;
    width: 350px;
    height: 140px;
}
.listening-wrapper {
    margin-top: 20px;
    vertical-align: middle;
    display: flex;
    justify-content: center;
}
</style>
        
            ]]></description>
        </item>
        
    </channel>
    </rss>