<?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>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>