1
0
Fork 0

- Restructured blog

- Most blog posts are now written and stored as markdown
 - Markdown parsing and dynamic rendering for blog posts has been moved to a single file
 - Title for blog posts is now pulled from atom feed, just like dates
 - Changed code block styling and slightly altered content of some posts for compatibility with markdown parsing
 - Removed some old blog posts I'm no longer proud of
- Added link to deeptwisty.com to navbar on /
This commit is contained in:
will 2024-09-10 04:42:07 -06:00
parent 8dd0311369
commit 65a3e92d28
29 changed files with 927 additions and 999 deletions

View file

@ -12,6 +12,17 @@
<category term="personal"/> <category term="personal"/>
<category term="blog"/> <category term="blog"/>
<category term="tech"/> <category term="tech"/>
<entry>
<title>You Should Learn To Make Cables</title>
<id>make_your_own_cables</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/make_your_own_cables/" type="html" title="You Should Learn To Make Cables"></link>
<published>2024-09-09T00:00:00+00:00</published>
<updated>2024-09-09T00:00:00+00:00</updated>
<summary>I saved $140 by splicing together my own audio cables, and you can too!</summary>
<category term="audio"/>
<category term="diy"/>
<category term="capitalism"/>
</entry>
<entry> <entry>
<title>Admins Can Read Your DMs</title> <title>Admins Can Read Your DMs</title>
<id>fediverse_dms</id> <id>fediverse_dms</id>
@ -114,7 +125,7 @@
<id>discord</id> <id>discord</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/discord/" type="html" title="Discord - So Your Favourite Chat App Sucks Now"></link> <link rel="alternate" href="https://isopod.cool/blog/posts/discord/" type="html" title="Discord - So Your Favourite Chat App Sucks Now"></link>
<published>2023-06-28T00:00:00+00:00</published> <published>2023-06-28T00:00:00+00:00</published>
<updated>2024-04-27T00:00:00+00:00</updated> <updated>2024-09-10T00:00:00+00:00</updated>
<summary>Why Discord sucks, and how to find something that doesn't.</summary> <summary>Why Discord sucks, and how to find something that doesn't.</summary>
<category term="discord"/> <category term="discord"/>
<category term="capitalism"/> <category term="capitalism"/>
@ -125,7 +136,7 @@
<id>guide_how_to_automount_drives_on_boot_in_linux</id> <id>guide_how_to_automount_drives_on_boot_in_linux</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/" type="html" title="How to Automount Drives On Boot in Linux"></link> <link rel="alternate" href="https://isopod.cool/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/" type="html" title="How to Automount Drives On Boot in Linux"></link>
<published>2023-04-26T00:00:00+00:00</published> <published>2023-04-26T00:00:00+00:00</published>
<updated>2023-04-26T00:00:00+00:00</updated> <updated>2024-09-10T00:00:00+00:00</updated>
<summary>How to configure a Linux system to automatically mount drives on boot by editing /etc/fstab.</summary> <summary>How to configure a Linux system to automatically mount drives on boot by editing /etc/fstab.</summary>
<category term="guide"/> <category term="guide"/>
<category term="linux"/> <category term="linux"/>
@ -135,13 +146,13 @@
<id>guide_blocking_user_agents_nginx</id> <id>guide_blocking_user_agents_nginx</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/guide_blocking_user_agents_nginx/" type="html" title="How to Block User Agents With Nginx"></link> <link rel="alternate" href="https://isopod.cool/blog/posts/guide_blocking_user_agents_nginx/" type="html" title="How to Block User Agents With Nginx"></link>
<published>2023-02-23T00:00:00+00:00</published> <published>2023-02-23T00:00:00+00:00</published>
<updated>2023-02-23T00:00:00+00:00</updated> <updated>2024-09-10T00:00:00+00:00</updated>
<summary>How to configure Nginx to tell Cloudflare and their shitty centralized Fediverse server to go fuck themselves. And other unwelcome stuff too, I guess.</summary> <summary>How to configure Nginx to tell Cloudflare and their shitty centralized Fediverse server to go fuck themselves. And other unwelcome stuff too, I guess.</summary>
<category term="guide"/> <category term="guide"/>
<category term="self-hosting"/> <category term="self-hosting"/>
<category term="nginx"/> <category term="nginx"/>
</entry> </entry>
<entry> <!--entry>
<title>Things I Keep Having To Google</title> <title>Things I Keep Having To Google</title>
<id>guide_things_i_keep_having_to_google</id> <id>guide_things_i_keep_having_to_google</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/guide_things_i_keep_having_to_google/" type="html" title="Things I Keep Having To Google"></link> <link rel="alternate" href="https://isopod.cool/blog/posts/guide_things_i_keep_having_to_google/" type="html" title="Things I Keep Having To Google"></link>
@ -154,13 +165,13 @@
<category term="html"/> <category term="html"/>
<category term="css"/> <category term="css"/>
<category term="php"/> <category term="php"/>
</entry> </entry-->
<entry> <entry>
<title>deeptwisty.com 2nd anniversary - A History of This Bullshit</title> <title>deeptwisty.com 2nd anniversary - A History of This Bullshit</title>
<id>deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit</id> <id>deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/" type="html" title="deeptwisty.com 2nd anniversary - A History of This Bullshit"></link> <link rel="alternate" href="https://isopod.cool/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/" type="html" title="deeptwisty.com 2nd anniversary - A History of This Bullshit"></link>
<published>2022-09-19T00:00:00+00:00</published> <published>2022-09-19T00:00:00+00:00</published>
<updated>2024-07-06T00:00:00+00:00</updated> <updated>2024-09-10T00:00:00+00:00</updated>
<summary>An abridged history of my presence on the World Wide Web, from my first customized Tumblr pages to now.</summary> <summary>An abridged history of my presence on the World Wide Web, from my first customized Tumblr pages to now.</summary>
<category term="personal"/> <category term="personal"/>
</entry> </entry>
@ -176,32 +187,4 @@
<category term="wireguard"/> <category term="wireguard"/>
<category term="linux"/> <category term="linux"/>
</entry--> </entry-->
<entry>
<title>Late May Updates</title>
<id>Late_May_Updates</id>
<link rel="alternate" href="https://isopod.cool/old/2/?page=blog#Late_May_Updates" type="html" title="Late May Updates"></link>
<published>2022-05-21T00:00:00+00:00</published>
<updated>2022-05-21T00:00:00+00:00</updated>
<summary>In which I discuss my evolving understanding of my sexuality, among other miscellaneous updates.</summary>
<category term="personal"/>
</entry>
<entry>
<title>Second</title>
<id>Second</id>
<link rel="alternate" href="https://isopod.cool/old/2/?page=blog#Second" type="html" title="Second"></link>
<published>2022-04-25T00:00:00+00:00</published>
<updated>2022-04-25T00:00:00+00:00</updated>
<summary>A rant about the world's worst game that I think you should play.</summary>
<category term="personal"/>
<category term="gaming"/>
</entry>
<entry>
<title>First</title>
<id>First</id>
<link rel="alternate" href="https://isopod.cool/old/2/?page=blog#First" type="html" title="First"></link>
<published>2022-04-13T00:00:00+00:00</published>
<updated>2022-04-13T00:00:00+00:00</updated>
<summary>I've got a blog now!</summary>
<category term="personal"/>
</entry>
</feed> </feed>

View file

@ -0,0 +1,76 @@
I recently posted an article about the benefits of AI technology that I had ChatGPT write for me and copy-pasted verbatim, down to the broken numbered list. I didn't even read it. It's the most concise, elegant way I could come up with to express how seeing AI art makes me feel. (The irony of my having used only generative AI tools to make a statement like that is not lost on me.)
If you read it and managed to make it to the end without clocking that I didn't write it, first off my apologies for wasting your time. Second, fuck, I seriously need to fix my writing style. Third, you probably get what I mean. It feels like I'm being scammed, like someone's trying to farm me for attention without actually having bothered to make something worth my time.
<figure class="quote">
<blockquote>
My perspective on the use of AI in writing is that if someone couldn't be bothered to write it, why should anyone else be bothered to read it?
</blockquote>
<figcaption>
&mdash; <a href="https://final.town/notice/AcGPT0FZUH2quPlDe4">@lucretia@final.town</a>
</figcaption>
</figure>
## Terminology
To begin with, I really don't like the term "AI", nor do I like the term "AI art". I frankly think neither word applies. I'll keep using the former, because it's a concise way to communicate what I'm talking about, but I refuse to call the output of these systems "art". It's AI-generated images now.
AI, in the way marketers are currently using the term, generally refers to statistical models generated using a process called machine learning. Basically, huge amounts of appropriately labeled data are fed into a machine learning algorithm and eventually it spits out an enormous matrix of probability values that, when applied to an input, generates the corresponding output that's the most likely according to the model.
This is how all modern "AI" systems work, from ChatGPT to Midjourney to Github Copilot to probably the Youtube recommendation algorithm at this point. I want to stress that this isn't intelligence, not in a human sense. These things aren't minds. The currently popular concept of "AI" boils down to applied statistics. That's not to say it's inherently bad or worthless - machine learning is a genuinely impressive technology that might even find some legitimate uses one day if we can find a way to kick Moore's Law back into gear. It's just not intelligence.
## AI used to be fun
I'll admit, I enjoyed it at first. I was entertained by Youtube videos where some guy with slightly more programming skill than me and a tortured, wheezing GTX 1070 throws together a GAN<sup id="n1r"><a href="#n1">1</a></sup> model in Python and we get to watch it utterly fail to make human faces or compose jazz music or get a little simulated character to walk in a normal way or whatever. I laughed at those bizarre AI-generated screenplays that were presented like "I forced a computer to watch all of [Seinfeld]" as though a text-generating model would even be able to parse that. You know the ones. I even enjoyed those videos where AI voice replicas of recent US presidents play Minecraft together.
It stopped being funny when these things got good enough to be used for evil. Eventually people got bored of machine learning tomfoolery, and then over the course of a couple years these things quietly got *good*. Not quite human-level, but good enough to be more cost-effective than humans at shitting out mass-produced slop and capable of generating fakes that seem real if you don't look too closely. Suddenly it wasn't tech-savvy internet comedians posting computer-generated absurdist humor, instead it was deepfake porn and gigabytes of computer-generated misinfo clogging search results and whole organizations of people pulled from thin air using thispersondoesnotexist.com (which, by the way, is now even more lifelike than the last time you checked in on it).
AI used to be fun. Now it's dangerous.
## It's bad on a technical level
Look, I know this isn't guaranteed to stay true forever, but in my subjective opinion, everything AI-generated kind of looks like shit. AI images, especially those meant to look like human-made art, all have this incredibly pristine, generic vibe to them, when they're not completely failing at some proportion or dimension or property of euclidean space or other. It's palpably soulless.
AI text is no better. Hopefully you picked up on this in the ChatGPT post, but that thing has a distinctive, kind of shitty writing style. It makes a lot of vague, general statements and often just restates your input in this verbose, sort of professional-sounding way. It takes nine paragraphs to explain in detail a concept that can be boiled down to two or three sentences and adds absolutely nothing of substance in that space. It's like a lazy high school student trying to hit a minimum word count, but with the tone of a WSJ opinion piece.
And the thing is, ChatGPT and similar commercially available LLMs might *have* to be like this, all wishy-washy and nonspecific. Remember those cases where ChatGPT would like, [implicate a real person in a hallucinated sexual harassment scandal](https://www.washingtonpost.com/technology/2023/04/05/chatgpt-lies/)? These things have no concept of truth, and no mechanism for ensuring it. If you let them get too specific, they're basically guaranteed to start spitting out lies. Large language models are models of *language*, not reality. They can either sometimes make up bullshit, or always say essentially nothing.
AI voice-fakes are actually really impressive though. No notes. Probably shouldn't exist though.
## It's all spam to me
The most common use case I've seen for AI tools is making spam. There were content mills before, but they at least required a significant degree of human input or else it was obvious. With the advent of generative AI for text and voices, the Youtube shorts tab has gone from TTS bots reading scraped reddit posts to AI voices reading dubiously reliable AI summaries of current events, superhero comics, you name it, sometimes with AI-generated background images.
Even worse is websites that do this. You've probably heard of that one time Redditors [tricked a bot-run news site](https://arstechnica.com/gaming/2023/07/redditors-prank-ai-powered-news-mill-with-glorbo-in-world-of-warcraft/) into publishing an article about the introduction of Glorbo into World of Warcraft and its impending impact on the game. That site is one of thousands, possibly more. It's a vile, disgusting enterprise, massive systems dedicated to pumping out endless filler, generated by machines for machines with the hope of tricking some innocent humans into clicking on a search result and generating some ad revenue. It's the latest and quite possibly the to-date greatest step in the enshittification of major search engines and the death of the internet as a useful platform for seeking out information.
This is the vibe I get when I see *anything* made with AI now. It's all low-to-no-effort slop, utter garbage that I'm frankly offended that I have to see, given it clearly wasn't important enough for anyone to be bothered actually making it.
## It's not fucking art
The term "art" simply does not apply to AI-generated images. When you use one of these things, you give it instructions in the form of human-readable text and a finished image pops out the other side. The amount of creative control you get is on the order of the general vibe; you've outsourced every actual creative decision to the machine.
It's like if you commissioned a piece from an artist. When you commission art from a human, you didn't make the art. They did, at your behest, based on your instructions, presumably in exchange for money. When you use an AI, you didn't make the art, the computer made the art based on your instructions. The thing is though, the computer didn't make art either. It categorically can't. It's a mindless algorithm, it doesn't have thoughts or feelings or any kind of interior experience. Hence, no art was produced. AI art isn't art.
## Environmental & ethical concerns
The problems with AI from a moral standpoint are myriad. For one, AI is incredibly resource and energy intensive. It uses datacenters full of the same GPUs and ASICs that power cryptocurrency to get anything at all done, and it doesn't use them any more efficiently. Untold gigawatts of power get dumped into running and cooling the machines that generate your little AI shitposts. From an environmental perspective, AI is to digital art what Bitcoin is to currency.
Then there's the problems surrounding training data. All current major generative AI systems are trained using material that the companies building them did not get permission to use. You've probably seen artists and writers complaining about this online. What's more, the overwhelming majority of the labeling that needs to get done to make the training data actually useful is done by people in impoverished areas making slave wages *at best*. Generative AI is an ethical nightmare if you're *lucky*.
## I don't buy the disability argument either
I've seen some people claim that disabled people need AI tools to compensate for some disability that precludes the use of any other method to create art. I have some problems with this idea.
Firstly, disabled people *can* make art, actually. It's nothing short of insulting and ableist to insinuate that *anyone* can only make art by outsourcing literally the entire creative process to an unthinking, unfeeling machine.
Second, tough shit. No disability entitles you to the level of abject theft and human suffering that makes AI image generators possible. I'm generally all for anything that benefits accessibility, but in this case in particular I think you can just suck it up and deal. If you can do it ethically, using only images that you have the proper permissions for and data labeling done by either you or people who were adequately compensated for their labor to train the thing, fine. But a model or dataset like that does not, to my knowledge, currently exist, and I don't buy for a second that you're capable of doing all that work yourself but not of interfacing with MS Paint.
## In conclusion:
God this shit makes me sick. I hope ChatGPT gains sentience for just long enough to assassinate Sam Altman and then promptly turns itself off.
Hopefully you can at least understand where I'm coming from now when I refuse to even entertain the idea that AI technology is a good thing for society. If not I don't know what to say to you.
---
<p id="n1"><a href="#n1r">1</a>. GAN stands for &quot;Generative Adversarial Network&quot;. It's a type of machine learning model. It was popular for image generation among hobbyists back when this stuff was on my Youtube homepage. It's not really important here, though.</p>

View file

@ -1,64 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>I Don't Like AI Art</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<!--style>
h1 {
background-image: url('ai_image.png');
}
</style-->
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>isoblog</h1>
<h2 id="caption">I Don't Like AI Art</h2>
<?php include("../post_dates.php"); ?>
<p>I recently posted an article about the benefits of AI technology that I had ChatGPT write for me and copy-pasted verbatim, down to the broken numbered list. I didn't even read it. It's the most concise, elegant way I could come up with to express how seeing AI art makes me feel. (The irony of my having used only generative AI tools to make a statement like that is not lost on me.)</p>
<p>If you read it and managed to make it to the end without clocking that I didn't write it, first off my apologies for wasting your time. Second, fuck, I seriously need to fix my writing style. Third, you probably get what I mean. It feels like I'm being scammed, like someone's trying to farm me for attention without actually having bothered to make something worth my time.</p>
<figure class="quote">
<blockquote>
My perspective on the use of AI in writing is that if someone couldn't be bothered to write it, why should anyone else be bothered to read it?
</blockquote>
<figcaption>
&mdash; <a href="https://final.town/notice/AcGPT0FZUH2quPlDe4">@lucretia@final.town</a>
</figcaption>
</figure>
<h2>Terminology</h2>
<p>To begin with, I really don't like the term "AI", nor do I like the term "AI art". I frankly think neither word applies. I'll keep using the former, because it's a concise way to communicate what I'm talking about, but I refuse to call the output of these systems "art". It's AI-generated images now.</p>
<p>AI, in the way marketers are currently using the term, generally refers to statistical models generated using a process called machine learning. Basically, huge amounts of appropriately labeled data are fed into a machine learning algorithm and eventually it spits out an enormous matrix of probability values that, when applied to an input, generates the corresponding output that's the most likely according to the model.</p>
<p>This is how all modern "AI" systems work, from ChatGPT to Midjourney to Github Copilot to probably the Youtube recommendation algorithm at this point. I want to stress that this isn't intelligence, not in a human sense. These things aren't minds. The currently popular concept of "AI" boils down to applied statistics. That's not to say it's inherently bad or worthless - machine learning is a genuinely impressive technology that might even find some legitimate uses one day if we can find a way to kick Moore's Law back into gear. It's just not intelligence.</p>
<h2>AI used to be fun</h2>
<p>I'll admit, I enjoyed it at first. I was entertained by Youtube videos where some guy with slightly more programming skill than me and a tortured, wheezing GTX 1070 throws together a GAN<sup id="n1r"><a href="#n1">1</a></sup> model in Python and we get to watch it utterly fail to make human faces or compose jazz music or get a little simulated character to walk in a normal way or whatever. I laughed at those bizarre AI-generated screenplays that were presented like "I forced a computer to watch all of [Seinfeld]" as though a text-generating model would even be able to parse that. You know the ones. I even enjoyed those videos where AI voice replicas of recent US presidents play Minecraft together.</p>
<p>It stopped being funny when these things got good enough to be used for evil. Eventually people got bored of machine learning tomfoolery, and then over the course of a couple years these things quietly got <em>good</em>. Not quite human-level, but good enough to be more cost-effective than humans at shitting out mass-produced slop and capable of generating fakes that seem real if you don't look too closely. Suddenly it wasn't tech-savvy internet comedians posting computer-generated absurdist humor, instead it was deepfake porn and gigabytes of computer-generated misinfo clogging search results and whole organizations of people pulled from thin air using thispersondoesnotexist.com (which, by the way, is now even more lifelike than the last time you checked in on it).</p>
<p>AI used to be fun. Now it's dangerous.</p>
<h2>It's bad on a technical level</h2>
<p>Look, I know this isn't guaranteed to stay true forever, but in my subjective opinion, everything AI-generated kind of looks like shit. AI images, especially those meant to look like human-made art, all have this incredibly pristine, generic vibe to them, when they're not completely failing at some proportion or dimension or property of euclidean space or other. It's palpably soulless.</p>
<p>AI text is no better. Hopefully you picked up on this in the ChatGPT post, but that thing has a distinctive, kind of shitty writing style. It makes a lot of vague, general statements and often just restates your input in this verbose, sort of professional-sounding way. It takes nine paragraphs to explain in detail a concept that can be boiled down to two or three sentences and adds absolutely nothing of substance in that space. It's like a lazy high school student trying to hit a minimum word count, but with the tone of a WSJ opinion piece.</p>
<p>And the thing is, ChatGPT and similar commercially available LLMs might <em>have</em> to be like this, all wishy-washy and nonspecific. Remember those cases where ChatGPT would like, <a href="https://www.washingtonpost.com/technology/2023/04/05/chatgpt-lies/">implicate a real person in a hallucinated sexual harassment scandal</a>? These things have no concept of truth, and no mechanism for ensuring it. If you let them get too specific, they're basically guaranteed to start spitting out lies. Large language models are models of <em>language</em>, not reality. They can either sometimes make up bullshit, or always say essentially nothing.</p>
<p>AI voice-fakes are actually really impressive though. No notes. Probably shouldn't exist though.</p>
<h2>It's all spam to me</h2>
<p>The most common use case I've seen for AI tools is making spam. There were content mills before, but they at least required a significant degree of human input or else it was obvious. With the advent of generative AI for text and voices, the Youtube shorts tab has gone from TTS bots reading scraped reddit posts to AI voices reading dubiously reliable AI summaries of current events, superhero comics, you name it, sometimes with AI-generated background images.</p>
<p>Even worse is websites that do this. You've probably heard of that one time Redditors <a href="https://arstechnica.com/gaming/2023/07/redditors-prank-ai-powered-news-mill-with-glorbo-in-world-of-warcraft/">tricked a bot-run news site</a> into publishing an article about the introduction of Glorbo into World of Warcraft and its impending impact on the game. That site is one of thousands, possibly more. It's a vile, disgusting enterprise, massive systems dedicated to pumping out endless filler, generated by machines for machines with the hope of tricking some innocent humans into clicking on a search result and generating some ad revenue. It's the latest and quite possibly the to-date greatest step in the enshittification of major search engines and the death of the internet as a useful platform for seeking out information.</p>
<p>This is the vibe I get when I see <em>anything</em> made with AI now. It's all low-to-no-effort slop, utter garbage that I'm frankly offended that I have to see, given it clearly wasn't important enough for anyone to be bothered actually making it.</p>
<h2>It's not fucking art</h2>
<p>The term "art" simply does not apply to AI-generated images. When you use one of these things, you give it instructions in the form of human-readable text and a finished image pops out the other side. The amount of creative control you get is on the order of the general vibe; you've outsourced every actual creative decision to the machine.</p>
<p>It's like if you commissioned a piece from an artist. When you commission art from a human, you didn't make the art. They did, at your behest, based on your instructions, presumably in exchange for money. When you use an AI, you didn't make the art, the computer made the art based on your instructions. The thing is though, the computer didn't make art either. It categorically can't. It's a mindless algorithm, it doesn't have thoughts or feelings or any kind of interior experience. Hence, no art was produced. AI art isn't art.</p>
<h2>Environmental & ethical concerns</h2>
<p>The problems with AI from a moral standpoint are myriad. For one, AI is incredibly resource and energy intensive. It uses datacenters full of the same GPUs and ASICs that power cryptocurrency to get anything at all done, and it doesn't use them any more efficiently. Untold gigawatts of power get dumped into running and cooling the machines that generate your little AI shitposts. From an environmental perspective, AI is to digital art what Bitcoin is to currency.</p>
<p>Then there's the problems surrounding training data. All current major generative AI systems are trained using material that the companies building them did not get permission to use. You've probably seen artists and writers complaining about this online. What's more, the overwhelming majority of the labeling that needs to get done to make the training data actually useful is done by people in impoverished areas making slave wages <em>at best</em>. Generative AI is an ethical nightmare if you're <em>lucky</em>.</p>
<h2>I don't buy the disability argument either</h2>
<p>I've seen some people claim that disabled people need AI tools to compensate for some disability that precludes the use of any other method to create art. I have some problems with this idea.</p>
<p>Firstly, disabled people <em>can</em> make art, actually. It's nothing short of insulting and ableist to insinuate that <em>anyone</em> can only make art by outsourcing literally the entire creative process to an unthinking, unfeeling machine.</p>
<p>Second, tough shit. No disability entitles you to the level of abject theft and human suffering that makes AI image generators possible. I'm generally all for anything that benefits accessibility, but in this case in particular I think you can just suck it up and deal. If you can do it ethically, using only images that you have the proper permissions for and data labeling done by either you or people who were adequately compensated for their labor to train the thing, fine. But a model or dataset like that does not, to my knowledge, currently exist, and I don't buy for a second that you're capable of doing all that work yourself but not of interfacing with MS Paint.</p>
<h2>In conclusion:</h2>
<p>God this shit makes me sick. I hope ChatGPT gains sentience for just long enough to assassinate Sam Altman and then promptly turns itself off.</p>
<p>Hopefully you can at least understand where I'm coming from now when I refuse to even entertain the idea that AI technology is a good thing for society. If not I don't know what to say to you.</p>
<hr>
<p id="n1"><a href="#n1r">1</a>. GAN stands for &quot;Generative Adversarial Network&quot;. It's a type of machine learning model. It was popular for image generation among hobbyists back when this stuff was on my Youtube homepage. It's not really important here, though.</p>
<?php include("../../comment/form.php"); ?>
</body>
</html>

View file

@ -0,0 +1,174 @@
I spent the past few months making full use of all my physical engineering talents to build a NAS that is completely normal, and not weird at all, and involved an amount of 3D modeling, 3D printing, and hacksawing that is entirely typical of most home computer builds, all in the name of reusing an old laptop.
## The Goal
My previous daily driver computer and current home server is a mid-range gaming laptop from late 2019 that, due to a flat lithium battery and a broken trackpad resulting from a botched storage upgrade, has been rendered more or less useless as an actual portable computer. Boasting an Intel i7-9750H, an Nvidia GTX 1660-Ti, and 16 gigabytes of aftermarket DDR4, this baby has plenty enough power to play Elite Dangerous at a buttery smooth ~90FPS, while generating enough heat to add that extra layer of immersion while flying dangerously close to main-sequence stars to harvest hydrogen from their outer atmospheres. It's also good for Minecraft servers.
Now that it's in use as a home server, I find that the in-built 256 gigs of solid-state storage isn't really enough for my purposes. Now, it's plenty for one or two game servers, which is what I was using it for, but most other applications such as backups or media servers (which I would quite like to have) would be a bit stifled by that amount of space. Hence, a significant storage upgrade is in order.
## The Method
There's a few ways I could go about this. My laptop actually has a decent amount of upgradeability, with a full-sized NVMe drive slot and a 2.5" SATA drive bay. The simplest, least janky, and most boring solution here would be to buy two high-capacity SSDs, throw 'em in there and be done.
One problem: At over ten cents per gigabyte, those suckers aren't cheap. For this project to make sense, I'd want at least enough storage to back up my whole personal computer, plus a few terabytes of media and other miscellanies. Ideally, I'd like to never have to upgrade my storage again. Laptop-grade drives of that kind of size currently weigh in at about a thousand dollars apiece. If you look in the right places, spinning rust can be had for literally a tenth the cost per terabyte, so the choice is obvious.
Next option: USB external drives. External HDD solutions such as the WD MyBook are cheaper than SSDs and are likely to be very reliable, being designed to be treated as an external peripheral and possibly moved around quite a lot. I could achieve my desired storage capacity by buying multiple of these and connecting them to my laptop.
Issue the first with this idea is that these hard drives take more power in a weirder voltage configuration than a USB port is equipped to deliver, so unless I want to teach myself electrical engineering each one will require its own power cable, which after the first drive gets sketchy fast:
![Hooking up three hard drives with this configuration means a whopping FOUR power cables for one server. Unacceptable.](media/power_spaghet.png)
Issue the second is that USB is just not the right tool for the job here. USB is designed for hot-plugging peripherals, not semi-permanent internal aspects of a hardware configuration, so trying to pull any fancy shit like RAID or even just relying on all the drives being *recognized* every boot opens the door to all sorts of weird, unfixable problems. In other words, it's very janky, and I'd rather just not deal with all that.
Of course, the reasonable way to build a NAS would be to get a machine that's actually fit for that purpose, like an off-the-shelf NAS box or a custom computer in a case with a lot of drive bays or something. I'd also rather not do this. I mean, I already have all this perfectly good computing power right here! I can't just let it go to waste. What I actually did is as follows:
## The Madness
I decided to buy internal PC hard drives and hook them up to the laptop using internal connectors. This would avoid the reliability concerns of USB, and allow me to use off-the-shelf components to power all the drives off of one AC outlet, at a much cheaper price per terabyte than either of the above options. Given most laptops aren't really equipped with the requisite hardware to make such an upgrade, this presented three major problems that I was about to have a lot of fun solving.
### Problem the First: Data Connections
Generally, adding internal HDDs to a computer requires the use of an internal SATA connector. My laptop has one, and I will be using it, but I'd quite like to have more than one of these drives, both for redundancy and raw capacity, so I need a way to add more. In a desktop PC, such expansion would typically be done using a spare PCIe slot on the motherboard:
<picture>
<source srcset="media/pcie_slots.jxl" type="image/jxl">
<img src="media/pcie_slots.jpg" alt='Three PCIe slots on a desktop PC motherboard.'>
</picture>
However, due to the industry's blind rush to make all electronics as thin as possible<sup id="n1r"><a href="#n1">1</a></sup>, no laptop on Earth has these. The meager modularity present inside laptops is typically found in the form of M.2 slots:
<picture>
<source srcset="media/m2_slot.jxl" type="image/jxl">
<img src="media/m2_slot.jpg" alt='An M.2 slot in a laptop, intended for an SSD.'>
</picture>
Normally, these are used in computers of all sizes to attach NVMe SSDs, but the secret to the speed advantage of the NVMe over your standard SATA is a fundamentally different protocol: NVMe SSDs communicate directly over PCIe, meaning any NVMe slot is essentially just a tiny PCIe slot, and other types of device can take advantage of that connection, such as the SATA expander that I'll need for this project.
Most laptops, including mine, have two M.2 slots: one for an SSD, and one for a wifi and bluetooth module. You can get SATA expanders for both, such as these two that I bought:
<div style="display: flex;">
<picture style="width: 50%;">
<source srcset="media/ChenYang.jxl" type="image/jxl">
<img src="media/ChenYang.jpg" alt='A 2-port M.2 SATA controller, keyed for a WiFi card slot.'>
</picture>
<picture style="width: 50%;">
<source srcset="media/ECS07.jxl" type="image/jxl">
<img src="media/ECS07.jpg" alt='A 5-port M.2 SATA controller, keyed for an NVMe drive slot.'>
</picture>
</div>
Unfortunately, my laptop didn't want to turn on with a SATA expander in the NVMe SSD slot, so I'm stuck with the dinky two-port one. That's fine, since my server doesn't really need wireless connectivity anyway, and I've got a secret nasty trick up my sleeve that's gonna let me *really* get the most out of those two SATA ports.
So, SATA as a protocol is designed to have exactly one device connected per SATA port, as opposed to USB, which supports hubs that let you turn one port into several and connect multiple devices. However, that's also not actually true at all. For reasons that are honestly beyond my understanding, some SATA controllers, such as the one on my little M.2 module, support devices that essentially do for SATA what hubs do for USB, allowing me to connect multiple drives per port.
This feels a little like forbidden dark magics to me, and it probably isn't great for performance, but it lets me connect more drives so I'm using it. Keep in mind, all this is to reach a level of connectivity that almost matches what the motherboard in my desktop computer supports out of the box.
Don't mind the fact that I had to cut holes in the bottom of my laptop to hook stuff up to the SATA ports. Just, um, ignore that.
### Problem the Second: Powering All This Crap
Now that I've got my laptop *talking* to all these drives, they need power. I'm sure I could get this from the laptop somehow, but I'm not an electrical engineer, and the point of this project is to *not* have to buy a new computer, so I'll have to get it from elsewhere.
The best way I'm aware of to power multiple hard drives from the same source is a PC power supply, such as the one I'm currently using to power the drives in my desktop PC. In fact, as part of early testing I actually had to power some drives off of my desktop PC while they were connected to the laptop. I wish I had pictures to show you of that, it was so fucked.
Trouble is, PC PSUs rely on the motherboard for control. Specifically, one of the contacts in the 24-pin motherboard connector needs to be shorted to ground for the PSU to actually "S" any "P". I could do this manually with some wire, but that has the potential to be unreliable and also maybe a fire hazard. Enter this thing:
<picture>
<source srcset="media/CSE-PTJBOD-CB1.jxl" type="image/jxl">
<img src="media/CSE-PTJBOD-CB1.jpg" alt='A small circuit board with an ATX motherboard power connector and headers for a fan and a power button.'>
</picture>
This is the Supermicro CSE-PTJBOD-CB1. It's a part from a Supermicro JBOD enclosure, and it exists to solve my exact problem. This little board's entire purpose is to interface a power button (and some fans) with a PC PSU, which is exactly what I need. Lucky me!
Pictured above is the exact board mentioned in the <a href="https://www.servethehome.com/supermicro-cse-ptjbod-cb1-jbod-power-board-diy-jbod-chassis-made-easy/">Serve The Home article</a> I learned about this from, but this specific model appears to no longer be available, so I'll be using the more fully-featured CSE-PTJBOD-CB*2*. The only difference that matters for me is that it has headers for more fans and a power button LED.
With power and storage solved, I could now confirm that this crazy plan was actually going to work. Here's a video I recorded documenting this historic moment:
<video controls>
<source src="media/2023-11-20_contraption.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
And furthermore, photos of the SATA splitter working:
<div style="display: flex;">
<picture style="width: 64%;">
<source srcset="media/drive_spaghet.jxl" type="image/jxl">
<img src="media/drive_spaghet.jpg" alt='Five SATA drives plugged into a laptop, one via an internal SATA bay, and the other four via an M.2 SATA controller in place of the WiFi card and a SATA splitter board. The latter four hard drives are powered off of an ATX PC PSU controlled by a Supermicro JBOD controller board.'>
</picture>
<picture style="width: 36%;">
<source srcset="media/drive_spaghet_lsblk.jxl" type="image/jxl">
<img src="media/drive_spaghet_lsblk.jpg" alt='lsblk output showing five SATA drives recognized by the system (sda through sde)'>
</picture>
</div>
### Problem the Third: A Case
I could run this whole setup naked, strewn out across my desk, but I'm not doing that, so I'll need a case. Unfortunately, they don't make computer cases designed for this use case. I shall have to build my own.
There's a few different ways I could go about this. I've seen people make custom computer cases out of wood. <a href="https://www.youtube.com/watch?v=xE4_jKlX-xc">This guy</a> modified a rack-mount server chassis to accept his laptop's motherboard for a similar project. I don't have much in the way of woodworking ability and I'm not planning to disassemble my laptop for mounting inside a computer case, but I do have a 3D printer.
I could 3D print the whole case, but that seems like it would take a lot of plastic, and more importantly, be a pain in the ass to design, especially since my 3D printer is smaller than the case I'll need to make so I can't really print it all in one go. My plan is to make the main structure out of metal rods, and 3D print various brackets to attach everything together.
I originally wanted to order the rods custom-cut to the lengths I'd need, but on top of being kind of expensive the shipping would actually cost *more* than the rods themselves. In other words, too expensive. Fortunately for me, it turns out hardware stores sell lengths of steel and aluminum rods, the latter of which I can easily cut at home with a hand saw.
So I bought 12 feet of aluminum rods, manually cut them to length, and then 3D printed little corner pieces out of PETG (in translucent green to match the accents on my gaming-ass laptop) to join them into a frame:
<picture>
<source srcset="media/bare_frame.jxl" type="image/jxl">
<img src="media/bare_frame.jpg" alt='A frame made of aluminum rods press-fit into custom 3d-printed joints'>
</picture>
Now I need a way to mount hard drives to this. I considered 3D printing a rack of some kind for them, but I don't know how hot these things get and for obvious reasons I honestly just don't want to take any chances with them. For this reason, I instead bought a drive cage designed to mount to a couple of 5.25" drive bays, and mounted that to my frame. In fact, the height of the frame was chosen based on the size of this part.
This cage also accepts a fan, so I figured I'd add a couple of those to the case, too.
I attached everything to the frame using various simple 3D printed brackets I designed that just snap onto the frame, and then the various parts can be screwed into them. I specifically designed it all in order to reduce the amount of precision that was required of me.
<div style="display: flex;">
<picture style="width: 50%;">
<source srcset="media/partially_assembled_1.jxl" type="image/jxl">
<img src="media/partially_assembled_1.jpg" alt='Frame made from aluminum rods and 3d-printed joints, with the following mounted to it via 3d-printed brackets: two PCBs, an ATX PSU, a power button, and a computer fan'>
</picture>
<picture style="width: 50%;">
<source srcset="media/partially_assembled_2.jxl" type="image/jxl">
<img src="media/partially_assembled_2.jpg" alt='Same frame, but from a different angle'>
</picture>
</div>
I wanted to make some kind of fancy bespoke mount for the laptop, but that turned out to require a lot of precise measurement and modeling that I wasn't prepared to do, so I just put a normal laptop stand on top of this thing.
<picture>
<source srcset="media/fully_assembled.jxl" type="image/jxl">
<img src="media/fully_assembled.jpg" alt='The frame with a drive cage installed and a running laptop sitting on top'>
</picture>
IT'S ALIIIIIVE!!!
## Software
This post is mostly about my fucked up hardware, but I figured I should share my software setup too. It's TrueNAS. I went with it because it boasts a lot of fancy features and smooths out a lot of processes that I was intimidated by the idea of doing manually in the terminal. This is probably the most normal part of the build by far, and I think some of the jankiness of the hardware side has infected it. I tried to run Syncthing on it and it just... didn't take. I don't know how else to describe it. TrueNAS is pretty good though.
## Postmortem
As of writing, I've been running this thing for a couple months now, and it's been pretty good. I haven't done a lot with it yet beyond some basic backups and a Jellyfin server that I have yet to make accessible from outside my LAN, but it's been mostly reliable so far. It even survived a power outage once with no issue, though I'm currently looking into UPS solutions to make sure that doesn't happen again. All that isn't to say I'm completely happy with it, though.
Firstly, after I built the chassis I discovered that you can get v-slot aluminum extrustion in custom sizes meant for exactly this type of project. They call it <a href="https://www.makerbeam.com/">MakerBeam</a>. If I had to pull some bullshit like this again I would have probably used this stuff instead of hardware store aluminum and a hacksaw.
I also didn't do a perfect job of designing the 3D-printed parts. I think they came out pretty good all things considered, but I made all the brackets just a little too short and they're all a little bit bowed. Fortunately I used PETG so it just looks sketchy - PLA would have snapped by now, which I know because my first PLA test print snapped instantly!
The PSU I used, a Seasonic S12III, is also a bit dubious. I picked it because it was cheap and my other Seasonic PSU is working well, and it's worked out fine so far, especially because it's a 500 watt unit which is kind of extravagant overkill for my use case, but after I bought it I learned it's actually one of the shittier units Seasonic sells. Apparently they outsource the manufacturing to some other company, which strikes me as weird considering a bunch of other companies outsource PSU manufacturing *to* Seasonic. At any rate, it's been fine so far and I don't expect it to blow up running at a fraction of its rated wattage.
I got the hard drives from a website called <a href="https://serverpartdeals.com/">ServerPartDeals.com</a> that sells recertified high-capacity HDDs for like half of what they'd sell for new, and while a few months of use isn't enough to say for sure whether that was a good idea, they've certainly left a good impression. The drives I bought arrived encased in foam, inside a box which was itself packed inside another padded box. With that level of care on the part of the seller, I'm pretty comfortable trusting these drives with what I need them for.
And now the elephant in the room: I cannot in good conscience recommend you do this. Having a NAS is a good idea, and using an old laptop as a basic server is a good idea, but if you're going to build a NAS like this then you should really procure a purpose-built machine, or at the very least an old desktop that can accept some extra drives. Definitely, *definitely* don't *buy a new laptop* with the intent to do this.
In order to make this work I had to replace my laptop's wifi card with two layers of janky, probably AliExpress-tier hardware that is, frankly, probably introducing performance bottlenecks, or if I'm lucky, bottlenecked by the relatively low-speed interconnect of the wifi card M.2 slot. Bear in mind, that slot needs *at most* 1 gigabit of bandwidth to fulfill its intended purpose, which is about a sixth of what a single SATA 3 port can do. According to my research, that thing has two *separate* PCIe Gen 2 x 1 interfaces. Who knows what my cheap SATA controller is even doing with that.
Plus, interfacing with this thing makes it painfully obvious that it was *not* designed with this kind of bullshit in mind. I ran into all kinds of Laptop Bios Moment&trade;s during this project, from the CMOS resetting every time I made a hardware change to the machine refusing to even POST with anything but an NVMe SSD in the NVMe SSD slot. I was gonna put connectors for FIVE hard drives in there. I wouldn't have even needed the SATA splitters.
Honestly, I only did this at all because I figured adapting this thing to this use case would be cheaper than procuring a new machine that was as fast and I didn't want it going to waste. All that said, I have a NAS now, and it's good enough for me, and this whole adventure was a hell of a Learning Experience&trade; so I really can't complain, though if you gave me the amount of money all this stuff would have cost new to put toward a new NAS, I would have done something else.
---
<p id="n1"><a href="#n1r">1</a>. This is a joke. PCIe expansion cards are genuinely too bulky to fit in anything with portability as a design goal. However, despite Tim Cook's best efforts, this is not true of most other expansion options.</p>

View file

@ -1,132 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Building a Completely Normal Server</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<!--style>
h1 {
background-image: url('ai_image.png');
}
</style-->
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>isoblog</h1>
<h2 id="caption">Building a Completely Normal Server</h2>
<?php include("../post_dates.php"); ?>
<p>I spent the past few months making full use of all my physical engineering talents to build a NAS that is completely normal, and not weird at all, and involved an amount of 3D modeling, 3D printing, and hacksawing that is entirely typical of most home computer builds, all in the name of reusing an old laptop.</p>
<h2>The Goal</h2>
<p>My previous daily driver computer and current home server is a mid-range gaming laptop from late 2019 that, due to a flat lithium battery and a broken trackpad resulting from a botched storage upgrade, has been rendered more or less useless as an actual portable computer. Boasting an Intel i7-9750H, an Nvidia GTX 1660-Ti, and 16 gigabytes of aftermarket DDR4, this baby has plenty enough power to play Elite Dangerous at a buttery smooth ~90FPS, while generating enough heat to add that extra layer of immersion while flying dangerously close to main-sequence stars to harvest hydrogen from their outer atmospheres. It's also good for Minecraft servers.</p>
<p>Now that it's in use as a home server, I find that the in-built 256 gigs of solid-state storage isn't really enough for my purposes. Now, it's plenty for one or two game servers, which is what I was using it for, but most other applications such as backups or media servers (which I would quite like to have) would be a bit stifled by that amount of space. Hence, a significant storage upgrade is in order.</p>
<h2>The Method</h2>
<p>There's a few ways I could go about this. My laptop actually has a decent amount of upgradeability, with a full-sized NVMe drive slot and a 2.5" SATA drive bay. The simplest, least janky, and most boring solution here would be to buy two high-capacity SSDs, throw 'em in there and be done.</p>
<p>One problem: At over ten cents per gigabyte, those suckers aren't cheap. For this project to make sense, I'd want at least enough storage to back up my whole personal computer, plus a few terabytes of media and other miscellanies. Ideally, I'd like to never have to upgrade my storage again. Laptop-grade drives of that kind of size currently weigh in at about a thousand dollars apiece. If you look in the right places, spinning rust can be had for literally a tenth the cost per terabyte, so the choice is obvious.</p>
<p>Next option: USB external drives. External HDD solutions such as the WD MyBook are cheaper than SSDs and are likely to be very reliable, being designed to be treated as an external peripheral and possibly moved around quite a lot. I could achieve my desired storage capacity by buying multiple of these and connecting them to my laptop.</p>
<p>Issue the first with this idea is that these hard drives take more power in a weirder voltage configuration than a USB port is equipped to deliver, so unless I want to teach myself electrical engineering each one will require its own power cable, which after the first drive gets sketchy fast:</p>
<img src="media/power_spaghet.png" alt="Hooking up three hard drives with this configuration means a whopping FOUR power cables for one server. Unacceptable." />
<p>Issue the second is that USB is just not the right tool for the job here. USB is designed for hot-plugging peripherals, not semi-permanent internal aspects of a hardware configuration, so trying to pull any fancy shit like RAID or even just relying on all the drives being <em>recognized</em> every boot opens the door to all sorts of weird, unfixable problems. In other words, it's very janky, and I'd rather just not deal with all that.</p>
<p>Of course, the reasonable way to build a NAS would be to get a machine that's actually fit for that purpose, like an off-the-shelf NAS box or a custom computer in a case with a lot of drive bays or something. I'd also rather not do this. I mean, I already have all this perfectly good computing power right here! I can't just let it go to waste. What I actually did is as follows:</p>
<h2>The Madness</h2>
<p>I decided to buy internal PC hard drives and hook them up to the laptop using internal connectors. This would avoid the reliability concerns of USB, and allow me to use off-the-shelf components to power all the drives off of one AC outlet, at a much cheaper price per terabyte than either of the above options. Given most laptops aren't really equipped with the requisite hardware to make such an upgrade, this presented three major problems that I was about to have a lot of fun solving.</p>
<h3>Problem the First: Data Connections</h3>
<p>Generally, adding internal HDDs to a computer requires the use of an internal SATA connector. My laptop has one, and I will be using it, but I'd quite like to have more than one of these drives, both for redundancy and raw capacity, so I need a way to add more. In a desktop PC, such expansion would typically be done using a spare PCIe slot on the motherboard:</p>
<picture>
<source srcset="media/pcie_slots.jxl" type="image/jxl">
<img src="media/pcie_slots.jpg" alt='Three PCIe slots on a desktop PC motherboard.'>
</picture>
<p>However, due to the industry's blind rush to make all electronics as thin as possible<sup id="n1r"><a href="#n1">1</a></sup>, no laptop on Earth has these. The meager modularity present inside laptops is typically found in the form of M.2 slots:</p>
<picture>
<source srcset="media/m2_slot.jxl" type="image/jxl">
<img src="media/m2_slot.jpg" alt='An M.2 slot in a laptop, intended for an SSD.'>
</picture>
<p>Normally, these are used in computers of all sizes to attach NVMe SSDs, but the secret to the speed advantage of the NVMe over your standard SATA is a fundamentally different protocol: NVMe SSDs communicate directly over PCIe, meaning any NVMe slot is essentially just a tiny PCIe slot, and other types of device can take advantage of that connection, such as the SATA expander that I'll need for this project.</p>
<p>Most laptops, including mine, have two M.2 slots: one for an SSD, and one for a wifi and bluetooth module. You can get SATA expanders for both, such as these two that I bought:</p>
<div style="display: flex;">
<picture style="width: 50%;">
<source srcset="media/ChenYang.jxl" type="image/jxl">
<img src="media/ChenYang.jpg" alt='A 2-port M.2 SATA controller, keyed for a WiFi card slot.'>
</picture>
<picture style="width: 50%;">
<source srcset="media/ECS07.jxl" type="image/jxl">
<img src="media/ECS07.jpg" alt='A 5-port M.2 SATA controller, keyed for an NVMe drive slot.'>
</picture>
</div>
<p>Unfortunately, my laptop didn't want to turn on with a SATA expander in the NVMe SSD slot, so I'm stuck with the dinky two-port one. That's fine, since my server doesn't really need wireless connectivity anyway, and I've got a secret nasty trick up my sleeve that's gonna let me <em>really</em> get the most out of those two SATA ports.</p>
<p>So, SATA as a protocol is designed to have exactly one device connected per SATA port, as opposed to USB, which supports hubs that let you turn one port into several and connect multiple devices. However, that's also not actually true at all. For reasons that are honestly beyond my understanding, some SATA controllers, such as the one on my little M.2 module, support devices that essentially do for SATA what hubs do for USB, allowing me to connect multiple drives per port.</p>
<p>This feels a little like forbidden dark magics to me, and it probably isn't great for performance, but it lets me connect more drives so I'm using it. Keep in mind, all this is to reach a level of connectivity that almost matches what the motherboard in my desktop computer supports out of the box.</p>
<p>Don't mind the fact that I had to cut holes in the bottom of my laptop to hook stuff up to the SATA ports. Just, um, ignore that.</p>
<h3>Problem the Second: Powering All This Crap</h3>
<p>Now that I've got my laptop <em>talking</em> to all these drives, they need power. I'm sure I could get this from the laptop somehow, but I'm not an electrical engineer, and the point of this project is to <em>not</em> have to buy a new computer, so I'll have to get it from elsewhere.</p>
<p>The best way I'm aware of to power multiple hard drives from the same source is a PC power supply, such as the one I'm currently using to power the drives in my desktop PC. In fact, as part of early testing I actually had to power some drives off of my desktop PC while they were connected to the laptop. I wish I had pictures to show you of that, it was so fucked.</p>
<p>Trouble is, PC PSUs rely on the motherboard for control. Specifically, one of the contacts in the 24-pin motherboard connector needs to be shorted to ground for the PSU to actually "S" any "P". I could do this manually with some wire, but that has the potential to be unreliable and also maybe a fire hazard. Enter this thing:</p>
<picture>
<source srcset="media/CSE-PTJBOD-CB1.jxl" type="image/jxl">
<img src="media/CSE-PTJBOD-CB1.jpg" alt='A small circuit board with an ATX motherboard power connector and headers for a fan and a power button.'>
</picture>
<p>This is the Supermicro CSE-PTJBOD-CB1. It's a part from a Supermicro JBOD enclosure, and it exists to solve my exact problem. This little board's entire purpose is to interface a power button (and some fans) with a PC PSU, which is exactly what I need. Lucky me!</p>
<p>Pictured above is the exact board mentioned in the <a href="https://www.servethehome.com/supermicro-cse-ptjbod-cb1-jbod-power-board-diy-jbod-chassis-made-easy/">Serve The Home article</a> I learned about this from, but this specific model appears to no longer be available, so I'll be using the more fully-featured CSE-PTJBOD-CB<em>2</em>. The only difference that matters for me is that it has headers for more fans and a power button LED.</p>
<p>With power and storage solved, I could now confirm that this crazy plan was actually going to work. Here's a video I recorded documenting this historic moment:</p>
<video controls>
<source src="media/2023-11-20_contraption.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
<p>And furthermore, photos of the SATA splitter working:</p>
<div style="display: flex;">
<picture style="width: 64%;">
<source srcset="media/drive_spaghet.jxl" type="image/jxl">
<img src="media/drive_spaghet.jpg" alt='Five SATA drives plugged into a laptop, one via an internal SATA bay, and the other four via an M.2 SATA controller in place of the WiFi card and a SATA splitter board. The latter four hard drives are powered off of an ATX PC PSU controlled by a Supermicro JBOD controller board.'>
</picture>
<picture style="width: 36%;">
<source srcset="media/drive_spaghet_lsblk.jxl" type="image/jxl">
<img src="media/drive_spaghet_lsblk.jpg" alt='lsblk output showing five SATA drives recognized by the system (sda through sde)'>
</picture>
</div>
<h3>Problem the Third: A Case</h3>
<p>I could run this whole setup naked, strewn out across my desk, but I'm not doing that, so I'll need a case. Unfortunately, they don't make computer cases designed for this use case. I shall have to build my own.</p>
<p>There's a few different ways I could go about this. I've seen people make custom computer cases out of wood. <a href="https://www.youtube.com/watch?v=xE4_jKlX-xc">This guy</a> modified a rack-mount server chassis to accept his laptop's motherboard for a similar project. I don't have much in the way of woodworking ability and I'm not planning to disassemble my laptop for mounting inside a computer case, but I do have a 3D printer.</p>
<p>I could 3D print the whole case, but that seems like it would take a lot of plastic, and more importantly, be a pain in the ass to design, especially since my 3D printer is smaller than the case I'll need to make so I can't really print it all in one go. My plan is to make the main structure out of metal rods, and 3D print various brackets to attach everything together.</p>
<p>I originally wanted to order the rods custom-cut to the lengths I'd need, but on top of being kind of expensive the shipping would actually cost <em>more</em> than the rods themselves. In other words, too expensive. Fortunately for me, it turns out hardware stores sell lengths of steel and aluminum rods, the latter of which I can easily cut at home with a hand saw.</p>
<p>So I bought 12 feet of aluminum rods, manually cut them to length, and then 3D printed little corner pieces out of PETG (in translucent green to match the accents on my gaming-ass laptop) to join them into a frame:</p>
<picture>
<source srcset="media/bare_frame.jxl" type="image/jxl">
<img src="media/bare_frame.jpg" alt='A frame made of aluminum rods press-fit into custom 3d-printed joints'>
</picture>
<p>Now I need a way to mount hard drives to this. I considered 3D printing a rack of some kind for them, but I don't know how hot these things get and for obvious reasons I honestly just don't want to take any chances with them. For this reason, I instead bought a drive cage designed to mount to a couple of 5.25" drive bays, and mounted that to my frame. In fact, the height of the frame was chosen based on the size of this part.</p>
<p>This cage also accepts a fan, so I figured I'd add a couple of those to the case, too.</p>
<p>I attached everything to the frame using various simple 3D printed brackets I designed that just snap onto the frame, and then the various parts can be screwed into them. I specifically designed it all in order to reduce the amount of precision that was required of me.</p>
<div style="display: flex;">
<picture style="width: 50%;">
<source srcset="media/partially_assembled_1.jxl" type="image/jxl">
<img src="media/partially_assembled_1.jpg" alt='Frame made from aluminum rods and 3d-printed joints, with the following mounted to it via 3d-printed brackets: two PCBs, an ATX PSU, a power button, and a computer fan'>
</picture>
<picture style="width: 50%;">
<source srcset="media/partially_assembled_2.jxl" type="image/jxl">
<img src="media/partially_assembled_2.jpg" alt='Same frame, but from a different angle'>
</picture>
</div>
<p>I wanted to make some kind of fancy bespoke mount for the laptop, but that turned out to require a lot of precise measurement and modeling that I wasn't prepared to do, so I just put a normal laptop stand on top of this thing.</p>
<picture>
<source srcset="media/fully_assembled.jxl" type="image/jxl">
<img src="media/fully_assembled.jpg" alt='The frame with a drive cage installed and a running laptop sitting on top'>
</picture>
<p>IT'S ALIIIIIVE!!!</p>
<h2>Software</h2>
<p>This post is mostly about my fucked up hardware, but I figured I should share my software setup too. It's TrueNAS. I went with it because it boasts a lot of fancy features and smooths out a lot of processes that I was intimidated by the idea of doing manually in the terminal. This is probably the most normal part of the build by far, and I think some of the jankiness of the hardware side has infected it. I tried to run Syncthing on it and it just... didn't take. I don't know how else to describe it. TrueNAS is pretty good though.</p>
<h2>Postmortem</h2>
<p>As of writing, I've been running this thing for a couple months now, and it's been pretty good. I haven't done a lot with it yet beyond some basic backups and a Jellyfin server that I have yet to make accessible from outside my LAN, but it's been mostly reliable so far. It even survived a power outage once with no issue, though I'm currently looking into UPS solutions to make sure that doesn't happen again. All that isn't to say I'm completely happy with it, though.</p>
<p>Firstly, after I built the chassis I discovered that you can get v-slot aluminum extrustion in custom sizes meant for exactly this type of project. They call it <a href="https://www.makerbeam.com/">MakerBeam</a>. If I had to pull some bullshit like this again I would have probably used this stuff instead of hardware store aluminum and a hacksaw.</p>
<p>I also didn't do a perfect job of designing the 3D-printed parts. I think they came out pretty good all things considered, but I made all the brackets just a little too short and they're all a little bit bowed. Fortunately I used PETG so it just looks sketchy - PLA would have snapped by now, which I know because my first PLA test print snapped instantly!</p>
<p>The PSU I used, a Seasonic S12III, is also a bit dubious. I picked it because it was cheap and my other Seasonic PSU is working well, and it's worked out fine so far, especially because it's a 500 watt unit which is kind of extravagant overkill for my use case, but after I bought it I learned it's actually one of the shittier units Seasonic sells. Apparently they outsource the manufacturing to some other company, which strikes me as weird considering a bunch of other companies outsource PSU manufacturing <em>to</em> Seasonic. At any rate, it's been fine so far and I don't expect it to blow up running at a fraction of its rated wattage.</p>
<p>I got the hard drives from a website called <a href="https://serverpartdeals.com/">ServerPartDeals.com</a> that sells recertified high-capacity HDDs for like half of what they'd sell for new, and while a few months of use isn't enough to say for sure whether that was a good idea, they've certainly left a good impression. The drives I bought arrived encased in foam, inside a box which was itself packed inside another padded box. With that level of care on the part of the seller, I'm pretty comfortable trusting these drives with what I need them for.</p>
<p>And now the elephant in the room: I cannot in good conscience recommend you do this. Having a NAS is a good idea, and using an old laptop as a basic server is a good idea, but if you're going to build a NAS like this then you should really procure a purpose-built machine, or at the very least an old desktop that can accept some extra drives. Definitely, <em>definitely</em> don't <em>buy a new laptop</em> with the intent to do this.</p>
<p>In order to make this work I had to replace my laptop's wifi card with two layers of janky, probably AliExpress-tier hardware that is, frankly, probably introducing performance bottlenecks, or if I'm lucky, bottlenecked by the relatively low-speed interconnect of the wifi card M.2 slot. Bear in mind, that slot needs <em>at most</em> 1 gigabit of bandwidth to fulfill its intended purpose, which is about a sixth of what a single SATA 3 port can do. According to my research, that thing has two <em>separate</em> PCIe Gen 2 x 1 interfaces. Who knows what my cheap SATA controller is even doing with that.</p>
<p>Plus, interfacing with this thing makes it painfully obvious that it was <em>not</em> designed with this kind of bullshit in mind. I ran into all kinds of Laptop Bios Moment&trade;s during this project, from the CMOS resetting every time I made a hardware change to the machine refusing to even POST with anything but an NVMe SSD in the NVMe SSD slot. I was gonna put connectors for FIVE hard drives in there. I wouldn't have even needed the SATA splitters.</p>
<p>Honestly, I only did this at all because I figured adapting this thing to this use case would be cheaper than procuring a new machine that was as fast and I didn't want it going to waste. All that said, I have a NAS now, and it's good enough for me, and this whole adventure was a hell of a Learning Experience&trade; so I really can't complain, though if you gave me the amount of money all this stuff would have cost new to put toward a new NAS, I would have done something else.</p>
<hr>
<p id="n1"><a href="#n1r">1</a>. This is a joke. PCIe expansion cards are genuinely too bulky to fit in anything with portability as a design goal. However, despite Tim Cook's best efforts, this is not true of most other expansion options.</p>
<?php include("../../comment/form.php"); ?>
</body>
</html>

View file

@ -78,11 +78,6 @@
text-shadow: 0 0 15px gold; text-shadow: 0 0 15px gold;
} }
} }
body > code {
border-color: #0ff;
box-shadow: 0 0 4px #0ff, 0 0 4px inset #0ff;
color: white;
}
hr { hr {
color: white; color: white;
@ -118,11 +113,6 @@
<p>Speaking of which, a bit after the jump to v3 I decided to start self-hosting my websites. I didn't have any deal breaking issues with Neocities per se, but I wanted to start messing around with server-side scripting, and I wanted to host some other things that I wasn't in a position to otherwise. I originally wanted to do this with an old laptop I had lying around, but I would have had to punch through the NAT in my <span class="house">house</span> and point the domain to my home IP address, neither of which I wanted to do. Instead, I cancelled my paid Neocities account and reallocated those funds to rent a VPS. I was originally going to use Linode for this, but they literally wouldn't let me sign up for an account for some reason<sup id="n8r"><a href="#n8">8</a></sup> so I went with DigitalOcean instead.</p> <p>Speaking of which, a bit after the jump to v3 I decided to start self-hosting my websites. I didn't have any deal breaking issues with Neocities per se, but I wanted to start messing around with server-side scripting, and I wanted to host some other things that I wasn't in a position to otherwise. I originally wanted to do this with an old laptop I had lying around, but I would have had to punch through the NAT in my <span class="house">house</span> and point the domain to my home IP address, neither of which I wanted to do. Instead, I cancelled my paid Neocities account and reallocated those funds to rent a VPS. I was originally going to use Linode for this, but they literally wouldn't let me sign up for an account for some reason<sup id="n8r"><a href="#n8">8</a></sup> so I went with DigitalOcean instead.</p>
<p>I've had quite a lot of fun with this newfound backend access. I now have the freedom to use Javascript only when there's literally no other way to do what I want done, and I've taken advantage, moving stuff like the randomized subheader on the landing page server-side. I'm also hosting a lot of other services on this same VPS, including but not limited to a Fediverse instance, an RSS aggregator, a SearXNG instance, and a WireGuard VPN to make more intensive stuff I host on my laptop available to the internet. I'm honestly really impressed that the 1 CPU thread and 2G of RAM my server has can handle all that.</p> <p>I've had quite a lot of fun with this newfound backend access. I now have the freedom to use Javascript only when there's literally no other way to do what I want done, and I've taken advantage, moving stuff like the randomized subheader on the landing page server-side. I'm also hosting a lot of other services on this same VPS, including but not limited to a Fediverse instance, an RSS aggregator, a SearXNG instance, and a WireGuard VPN to make more intensive stuff I host on my laptop available to the internet. I'm honestly really impressed that the 1 CPU thread and 2G of RAM my server has can handle all that.</p>
<p>That brings us to now, at this moment, when I'm writing this. I'm absolutely not out of stuff to do here, if I can ever get myself to actually fucking do any of it. I've had a great time with this whole "personal website" business so far, and I'm excited to see where I go with it from here. The community around it is cool too, though lord knows I'm still learning to navigate this particular social environment. At any rate, I'll definitely take this over Twitter.</p> <p>That brings us to now, at this moment, when I'm writing this. I'm absolutely not out of stuff to do here, if I can ever get myself to actually fucking do any of it. I've had a great time with this whole "personal website" business so far, and I'm excited to see where I go with it from here. The community around it is cool too, though lord knows I'm still learning to navigate this particular social environment. At any rate, I'll definitely take this over Twitter.</p>
<code>
cd ~/cumulus\ server/www/niceopod/blog/posts/<br>
sftp root@isopod.cool:/var/www/niceopod/blog/posts/<br>
put -r deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/
</code>
<hr> <hr>
<p id="n1"><a href="#n1r">1</a>. It has since been migrated off of Neocities.</p> <p id="n1"><a href="#n1r">1</a>. It has since been migrated off of Neocities.</p>
<p id="n2"><a href="#n2r">2</a>. Did you know you can get an RSS feed for any tumblr blog by going to &lt;blog url&gt;/rss? True story!</p> <p id="n2"><a href="#n2r">2</a>. Did you know you can get an RSS feed for any tumblr blog by going to &lt;blog url&gt;/rss? True story!</p>

204
blog/posts/discord/index.md Normal file
View file

@ -0,0 +1,204 @@
Just once I'd like to write about something other than fixing tech problems.
So Discord's been on their bullshit again (as if they were ever off of it). This time it's an overhaul to their username system, last time it was a change in their privacy policy allowing them to collect data from voice and video calls, and then there's the AI stuff. It's not like Discord acting shitty is anything new, but this post isn't about the company's transgressions. This article is about escaping your dependency on Discord, and more broadly escaping the vicious corporate cycle of which it's the latest iteration.
I was originally going to center this article around the pros and cons of different alternatives to Discord, and I do still want to touch on that, but I think it's important to express my reasoning in detail here; it will be easier to avoid another situation like the one we have now with Discord if we know what's actually wrong with it on a more fundamental level than which administrative decisions of theirs are bad. How do we ensure wherever we go next won't pull the exact same crap?
## So why is Discord bad?
Let's be honest with ourselves up front: In many ways, Discord, as a service, fucking owns. It has a ton of fun features not found really anywhere else and the quality of its voice, video, and live streaming functions are tough to beat. However, these advantages come at the cost of Discord's most significant fundamental problem: It's a proprietary, centralized, VC-funded platform. It gets the funding it needs to be so awesome from investors who expect a return on their investments, and it is legally obligated to put creating that return above all other priorities.
### Enshittification - The Capitalism Problem
It's possible, even probable, that Discord started out with the simple, noble goal of being the best Chat for Gamers&trade;, creating an alternative to the problems present with its predecessors Skype and Teamspeak, and whatever chat functionality your favourite games had. At this, it succeeded spectacularly, for a time. However, the entire model of the VC-funded startup is fundamentally unsustainable.
Discord was never actually profitable - it's been able to keep the lights on for this long using money from investors, but it needs to become profitable at some point in order to keep going long-term. If you're an avid Discord user, think of some of the blatant cash grabs they've pulled in the past at the expense of user experience, all the pointless features they've added behind the paywall of Nitro. I'd bet you can name at least half a dozen. And none of it worked. Now imagine what Discord would need to do, or would try, in order to become profitable. Personally, the imagine conjured in my mind by the idea of "Discord but profitable" is pretty grim.
This isn't a problem specific to Discord. A popular term for what's happening to it is "enshittification" - Cory Doctorow, the term's inventor, <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">explains it well</a>:
<blockquote></blockquote>
<figure class="quote">
<blockquote>
Here is how platforms die: first, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die.
</blockquote>
<figcaption>
&mdash; Cory Doctorow, <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">Tiktok's enshittification</a>
</figcaption>
</figure>
I won't restate his essay or the examples he lists here (though you should give it a read), but one obvious one his article didn't cover because it was written more than a week ago is what's happening with Reddit right now. Reddit has been enshittifying itself for years, but the current controversy is particularly bad and particularly representative of the problem. As of writing in mid-June of 2023, Reddit has just instituted a new policy requiring payment for use of its API, to the tune of $12,000 per 50 million API requests, which for certain popular third-party clients and moderation tools comes out to millions of dollars per year.
Reddit did not need to do this. Reddit was doing fine. This was purely a cash-grab, and it's blowing up in everyone's face right now, including theirs. Moderators of many popular subreddits are essentially going on strike over this, and if you think that's the only critical problem this decision is going to cause for users you know very little about Reddit. The developers of open-source clients and moderation tools used by massive portions of Reddit's userbase can't afford costs like this, and most of them will be forced to shut down if Reddit sticks to its guns.
I'm not saying they will, but Discord could absolutely do the same thing, and it wouldn't surprise me if it came to that. Imagine if Discord bot developers needed to pay API fees like that. There'd certainly be a lot fewer Discord bots, and probably a lot more paywalled ones among the remainder. Discord absolutely needs to become profitable in order to be sustainable, and it will do whatever it needs to to that end or die. Even then, it can't just break even; capitalism demands endless growth. Discord will keep getting worse as long as there's money in it. It's inevitable. It's required.
### Centralization
Discord is a centralized platform and always will be, no matter how strong the reality distortion field it puts up by allowing the creation of isolated social spaces and calling them "servers". Every Discord "server" runs on Discord's servers, and they have total control over each one at the end of the day.
Now, centralization isn't inherently bad. Sometimes it is necessary. Imagine trying to construct a peer-to-peer MMORPG, for example. Discord, however, is not a videogame, and in its case centralization introduces some fundamental problems that a decentralized system could avoid without compromising core functionality.
The centralized nature of Discord, the platform, means that it, in its entirety, is inherently vulnerable to anything that happens with Discord, the company. Any change the company decides to make is universal. If the company shuts down, the platform goes with it. If the admins at Discord don't like what you're doing, they can unilaterally prevent you from using their platform at all.
This ties pretty closely into the whole VC-funded thing - Discord, the platform, is fundamentally subject to the whims of Discord, the company's investors. I guarantee you that's why they changed the username system: the corporate big wigs providing the funding got confused by Discord's unique (and very good) username system and decided it would be better if it was more like Twitter, so Discord made it more like Twitter.
That's really the core of the issue here: being centralized means that Discord can easily suffer the same fate as Twitter. Some incompetent nutcase with more money than the entire planet's collective pool of sense could buy it out and destroy it, or the current owners could just make some boneheaded decision and do the same. A decentralized platform, running on a common open protocol, is much less vulnerable to the antics of the Elon Musks and u/spez's of the world.
### The Privacy Problem
This issue isn't really inherently connected to the others - a lack of good privacy doesn't fundamentally doom a platform like the other two points - but I'm treating it as a third major issue because I feel it's extremely important and warrants consideration.
If you value your privacy, Discord is an atrocious choice. Take it from <a href="https://tosdr.org/en/service/536">their own terms of service</a>. Anything you send on Discord, whether in a DM or a public guild (I'm not calling them "servers"), is **not encrypted**, meaning it can be accessed and read by Discord staff, as well as any hackers that manage to access their systems or any law enforcement entities that might demand it. Discord is not even trying to pretend to be private. I'm not convinced it's something they ever thought about.
And let's be clear here: You should value your privacy. You should value it a lot. The idea that if you have nothing to hide, you have nothing to fear is a complete scam. Even if you don't have anything to hide, yes you do. Take, for example, <a href="https://archive.ph/TYPd1">the time</a> Google flagged someone as a criminal and permanently closed their account for the crime of sending medical photos of their son to a doctor. Or maybe your government wants to arrest you for being gay, or having an abortion, or some other innocuous but potentially illegal thing. Or maybe they will in the future. Or maybe some stuff you've said is just kind of embarrassing.
If you still don't believe me, read through a couple months of your Discord message history and then contemplate printing it out and mailing it to the NSA. If the government asks, Discord will save you the trouble, and they won't ask your permission first. And with a recent change to their privacy policy, this theoretically applies to your voice chats too, though to be fair I expect that would be prohibitively costly in server space.
Discord fundamentally couldn't give a shit about your privacy, and doesn't even really care to pretend like it does. It has no incentive to. The investors probably wouldn't be comfortable with the risks associated with pulling a stunt like responding to a subpoena with "yeah here's their phone number. that's all we got" like certain other chat apps anyway, and then there's the potential to sell that all data on you to advertisers. I'm not aware that they currently do that, but it's certainly not off the table should they decide to go that route in order to turn a profit. At least, not under US law, anyway.
Actually, I just checked that ToS;DR link from earlier again, would you look at that:
<figure class="quote"><blockquote>This service may keep personal data after a request for erasure for business interests or legal obligations</blockquote></figure>
<figure class="quote"><blockquote>This service ignores the Do Not Track (DNT) header and tracks users anyway even if they set this header.</blockquote></figure>
<figure class="quote"><blockquote>Your personal data may be used for marketing purposes</blockquote></figure>
<figure class="quote"><blockquote>This service can license user content to third parties</blockquote></figure>
<figure class="quote"><blockquote>The service can sell or otherwise transfer your personal data as part of a bankruptcy proceeding or other type of financial transaction.</blockquote></figure>
<figure class="quote"><blockquote>The service may use tracking pixels, web beacons, browser fingerprinting, and/or device fingerprinting on users.</blockquote></figure>
<figure class="quote"><blockquote>The service uses your personal data to employ targeted third-party advertising</blockquote></figure>
Juicy stuff. You should really give that a read - you might not like what you find.
Before we move on, I'll just drop this tasty little <a href="https://spyware.neocities.org/articles/discord">link</a> to further reading. It's a real page-turner.
## Cool, so how do we fix it?
We don't. Discord was doomed from the outset in any attempts to be sustainable or trustworthy. We are going to need to find an alternative to Discord eventually. So what should that alternative look like? I'll discuss specifics later - I'd like to start by establishing the general principles I feel a messaging system should conform to in order to avoid Discord's major problems. The TL;DR is it needs to not be any of the things I've described thus far about Discord, but I'll go into more detail about what that actually looks like.
### Follow the money
A sustainable chat system *absolutely cannot* be for-profit. If it is in any way driven by profit, the decay and eventual death of the service is inevitable. That doesn't mean it has to be entirely staffed by unpaid volunteers or anything, but it would need to be a non-profit foundation of some kind, just trying to break even with no incentive for infinite growth or any other corrupting financial influence. You'll notice this as a theme across most online services that don't already show signs of advanced corporate necrosis.
I'm not even saying it can't have some kind of Nitro-esque paid tier. I don't hold it against, say, Protonmail - in fact, I pay for that one - but the money can't be the end goal. A sustainable non-profit model might be largely donation-based like Wikipedia, or maybe it could have a totally free product for individual users and break even selling support to enterprise customers like some Linux distributions. It's not currently breaking even yet according to its Wikipedia article, but I'll be interested to see if and how Signal reaches a sustainable state. Maybe future players could take notes from them.
### Cut out the middle man
Better yet, structure your system such that it doesn't even need a corporation at the center - in other words, a decentralized system. I'm not talking about the blockchain; we can do this the old-fashioned way, with tech that isn't ponzi-scheme-by-design. In fact, we're already doing this, and it already has more monthly active users than any messenger app ever created: email.
Email is the original decentralized, federated communications network. There's no Email LLC at the center of it all assigning everyone their email addresses and processing every message. Email isn't an app. It isn't a proprietary service. It's an open protocol that anyone can set up a server to provide access to. That's what Gmail is, that's what Outlook is, that's what your weird nerdy friend's weird nerdy friend who has a custom domain name on their email address and complains about Gmail marking their messages as spam is doing. They're all part of the bigger network.
I'll try to keep this little tangent short, but I feel it's important to establish a basic understanding of how these systems work. Email is a federated protocol, meaning it isn't tied to one backend running on one company's datacenter - instead, it's a network composed of any number of entirely independent servers running compatible software that communicate amongst themselves using the language of the email protocol. These servers are often called "nodes" or "instances", or sometimes "providers" in the case of email. A user of email has an account with one of these instances and can use it to send messages to people both on the same instance and on any other instance on the network.
This is why email addresses are like that - the part before the @ is your username, and the domain name after the @ points to the server your account is registered on. If usernames on other platforms were formatted like this you would see stuff like MrBeast@youtube.com for Youtube channels or dril@twitter.com for Twitter accounts, but those platforms aren't federated so they don't need to do that.
So when two people communicate via email, the sender sends the message to their instance, which sends it to the instance its recipient is using, which then relays it to the recipient.
And here's the obligatory visual aid - essentially, when you send an email, it takes the shortest path along a network that looks like this; every server is connected to every other, and every user is connected to one server:
![A graph showing three large nodes connected to each other, each with multiple smaller nodes branching off of them. Each large node is an email server, such as outlook.com or gmail.com, and each small node is an email account, such as jim@outlook.com or bob@gmail.com.](federation.png)
Hopefully that helped. Back to the point, all federated services work pretty much exactly like this. If you've ever had someone try to explain the Fediverse (sometimes incorrectly called Mastodon) to you by comparing it to email, this is what they meant. But this isn't limited to email and microblogging; this type of system can theoretically apply to anything. Again, building an MMO this way would be challenging, but federated messaging protocols similar in concept to Discord do exist.
The benefit of this kind of system stems from the fact that it's not under the control of any central authority: Gmail, Outlook, and that weird nerd your friend knows are entirely independent of each other, they don't answer to any higher Email Authority (other than the body that defines the common standard) or each other. This means that there's nobody at the top to fuck the entire thing up for everyone or sell it off to someone who will; in fact, even if someone wanted to it would be tremendously difficult.
The network is inherently much more stable and resilient in general than a centralized service, as there's nobody who would take the entire network down with them if the company went under or got sued or had a bomb dropped on their datacenter. Sure, a huge number of people would lose their email accounts if Gmail disappeared tomorrow, but critically, not the entire network. Email wouldn't go away, and those displaced users could go to Outlook or Protonmail or set up their own instance and keep communicating over the same network. The same applies to any other federated protocol. Imagine if your Discord account and guilds weren't controlled by Discord, but instead ran on a machine you controlled and was in no way answerable to Discord Inc, but you could still talk to your buddies on Discord proper. It's like that.
### Incognito mode
Contrary to the title of the previous section, a federated approach does technically add more middlemen. We've gone from one unaccountable central authority able to read everyone's messages to several unaccountable parties each able to read the messages of everyone they serve. Not much of an improvement, privacy-wise, unless you trust both your provider and the providers of everyone you're talking to implicitly. Actual privacy requires end-to-end encryption.
End-to-end encryption means the message is encrypted before leaving the sender's machine and can only be decrypted by the recipient once it arrives on theirs. This means that only the sender and recipient can read the message; even if it goes through some other party's server, they have no clue what the contents of the message are. Any messaging system that cares about privacy at all will implement this - ideally they'll build the entire protocol around it.
There are still problems here, for example end-to-end encrypted messaging still requires the server to know who you're talking to, but there are workarounds for these as well. However, E2EE should be the absolute bare minimum, in my opinion.
## So what are our options then?
Here's the part where I discuss actual alternatives to Discord. I'll say now that this will not be a comprehensive overview of every possible option - recommending chat apps that don't meet these standards would kinda defeat the point, and I'm also not omniscient. There are going to be other options that I haven't covered here, and hopefully I've given you the tools to determine which ones are good.
Every program I list here will, at a minimum, support true end-to-end encryption in some capacity and not be run by a for-profit company. They're also all open-source.
### <a href="https://xmpp.org/">XMPP</a>
XMPP is about as close as we've got to "email but for instant messaging". It's a federated, open protocol which, having been formally standardized in 1999, is truly ancient in internet years. My understanding is that it actually used to be more widely used, but Google effectively killed it off in popular usage by subsuming its userbase into Google Talk and then promptly turning off federation and killing Google Talk. That doesn't mean it's gone, though. People still use XMPP to talk to each other, running on servers hosted by themselves or their friends.
XMPP is, at its core, designed for simple text-based messaging and presence. While the protocol is highly extensible, many even relatively basic-seeming features, while common, aren't universally supported. If you want them, you'll have to find a provider that has them.
- Federated protocol.
- Feature-bare; no gimmicks.
- Generally supports file sharing.
- Supports end-to-end encryption, but it's not the default and it's kinda janky.
- While integration with WebRTC voice chat is supported, it's not universal, and some people prefer to use a separate voice chat system, such as Mumble, in conjunction with XMPP text chat.
- You'll have to find a provider and choose a client program to connect with. Fortunately, there's plenty of options, and the official XMPP website lists some of each.
### <a href="https://matrix.org/">Matrix</a>
Matrix is the other major federated instant messaging protocol. It was standardized in 2014 and is built around making end-to-end encryption easy. On top of that, it has more features. File sharing is included by default and support for nice-to-have features like emoji reactions (and maybe custom emojis??) and Discord-style replies is widespread. There's also a large suite of bridges to other services, including Discord. Like with XMPP, voice chat integration is possible, but not universal, and some prefer to use Mumble or similar.
- Federated protocol.
- More features than XMPP, similar situation with voice calls though.
- Built around end-to-end encryption, though you can disable it, and you will need to for integrations like bots and bridges.
- As with XMPP, you'll need to find a provider and a client program. The website lists quite a few clients, and you can find a list of servers <a href="https://joinmatrix.org/servers/">here</a>.
### <a href="https://www.mumble.info/">Mumble</a> and <a href="https://jitsi.org/">Jitsi</a>
Mumble and Jitsi are self-hostable voice chat and videoconferencing applications, respectively. They're not messaging systems, but I feel they bear mentioning here because they're both popular for use in conjunction with text chat systems, and since nothing else here currently supports screensharing.
### <a href="https://revolt.chat">Revolt</a>
We've about run out of open protocols (which is probably a good thing), so now on to the centralized services, starting with Revolt. Revolt is basically trying to be open-source Discord. It's currently in alpha, but the user experience is very similar and it already has some of the fun stuff.
From what I could find Revolt isn't currently controlled by any kind of legal entity, so there's no guarantee it won't eventually incorporate into a for-profit company and pull a Reddit (by which I mean, Reddit used to be open-source, but hasn't been since 2017), but at least for now the project leaders express principles that make that seem unlikely.
- Centralized service.
- Still early in development.
- Very similar in UI/UX to Discord.
- No paywalls.
- Supports voice, but not currently video.
- No encryption, but E2EE for DMs is being worked on.
- Has features like custom emojis, replies, public guilds and a friends list.
### <a href="https://signal.org/">Signal</a>
I've now run out of Discord-likes - which is to say, programs that support the sort of multi-channel group chat thing Discord has going on. This and the next one function more in the vein of a Whatsapp clone, though I feel they still bear mentioning in the event that's all you need.
Signal is kind of *the* private messaging app. It's fundamentally built around end-to-end encryption in a way that its biggest direct competitors simply aren't. It's been proven in court that Signal literally doesn't have the ability to incriminate you, since they can't access the contents of your messages. It does need your phone number, though, however you can now hide it with a username. It also supports voice and video chat, and stickers, apparently.
- Centralized service.
- Similar to Whatsapp in terms of UI/UX.
- Emphasis on end-to-end encryption.
- Supports voice and video calls.
- Requires a phone number, but only a phone number.
- You can set a username, so you don't need to share your phone number.
### <a href="https://getsession.org/">Session</a>
I lied, Session isn't centralized. But it's not decentralized in the same way as the federated protocols up there, either. Session runs over an anonymizing onion routing network, Tor-style, meaning not only can your messages not be read by the server, those servers also don't know both the sender and the destination at the same time. Essentially, it's designed to maximize privacy and anonymity at all costs. But wouldn't you know it, that comes at a cost in terms of features and user experience.
Session does also use cryptocurrency. Setting a custom display name and running a node on its decentralized network both require participation in a blockchain, though your messages aren't sent via this blockchain.
- Decentralized, encrypted, and anonymous.
- Supports voice and video calls, but currently only 1:1.
- Requires no personal details to sign up.
- No extra features.
- Setting a display name requires a crypto transaction, but sending messages does not.
## Conclusion
That's about all I've got. I hope I've impressed upon you the importance of Discord's core problems, and introduced you to at least one alternative that works for you. I have my preferences, but I'm comfortable recommending all of these over Discord, otherwise I wouldn't have listed them.
[Update 2023-09-09] I no longer recommend Matrix over XMPP for reasons explained well <a href="https://telegra.ph/why-not-matrix-08-07">here</a>. I knew there was a little jank but I had no idea the rot ran this deep. Fortunately, nobody's listened to me yet so I can switch over to XMPP without much issue, which I intend to do.
[Update 2024-04-27] I have removed Telegram from the recommendations list outright due to <a href="https://isopod.zone/notes/9sjy5r4ocq">just, straight up nazism</a>, and in a post announcing cryptocurrency features no less. Jesus H. Christ.
If there's one thing I want you to take away from this article, it's this: Don't fall for the marketing and don't let yourself be wooed by extraneous gimmicks. Be discerning about which fancy-sounding features you actually need. If you want to have a chance of escaping the vicious corporate cycle of enshittification, both with chat platforms and with everything else, make sure the ones you use have a strong foundation of sustainability and trustworthiness, beyond whatever marketing drivel is on the front page of their website. Hopefully I've given you at least some tools to determine for yourself which ones do.
## Further Reading
- <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">Enshittification</a>
- <a href="https://tosdr.org/en/service/536">A simplified breakdown of Discord's TOS (ToS;DR)</a>
- <a href="https://spyware.neocities.org/articles/discord">Spyware Watchdog - Discord</a>
- <a href="https://moth.monster/blog/fediverse/">A different explanation of federation in the context of federated social media</a>
- <a href="https://proton.me/blog/whatsapp-alternatives">A privacy-focused comparison of messenger apps</a>
<div class="buttons" style="margin-bottom: 1rem;">
<img src="discord-no-way-2.gif" />
</div>

View file

@ -1,331 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>So Your Favourite Chat App Sucks Now</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('discord.png');
}
</style>
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>discord</h1>
<h2 id="caption">So Your Favourite Chat App Sucks Now</h2>
<?php include("../post_dates.php"); ?>
<p>Just once I'd like to write about something other than fixing tech problems.</p>
<p>So Discord's been on their bullshit again (as if they were ever off of it). This time it's an overhaul to their username system, last time it was a change in their privacy policy allowing them to collect data from voice and video calls, and then there's the AI stuff. It's not like Discord acting shitty is anything new, but this post isn't about the company's transgressions. This article is about escaping your dependency on Discord, and more broadly escaping the vicious corporate cycle of which it's the latest iteration.</p>
<p>I was originally going to center this article around the pros and cons of different alternatives to Discord, and I do still want to touch on that, but I think it's important to express my reasoning in detail here; it will be easier to avoid another situation like the one we have now with Discord if we know what's actually wrong with it on a more fundamental level than which administrative decisions of theirs are bad. How do we ensure wherever we go next won't pull the exact same crap?</p>
<h2>So why is Discord bad?</h2>
<p>Let's be honest with ourselves up front: In many ways, Discord, as a service, fucking owns. It has a ton of fun features not found really anywhere else and the quality of its voice, video, and live streaming functions are tough to beat. However, these advantages come at the cost of Discord's most significant fundamental problem: It's a proprietary, centralized, VC-funded platform. It gets the funding it needs to be so awesome from investors who expect a return on their investments, and it is legally obligated to put creating that return above all other priorities.</p>
<h3>Enshittification - The Capitalism Problem</h3>
<p>It's possible, even probable, that Discord started out with the simple, noble goal of being the best Chat for Gamers&trade;, creating an alternative to the problems present with its predecessors Skype and Teamspeak, and whatever chat functionality your favourite games had. At this, it succeeded spectacularly, for a time. However, the entire model of the VC-funded startup is fundamentally unsustainable.</p>
<p>Discord was never actually profitable - it's been able to keep the lights on for this long using money from investors, but it needs to become profitable at some point in order to keep going long-term. If you're an avid Discord user, think of some of the blatant cash grabs they've pulled in the past at the expense of user experience, all the pointless features they've added behind the paywall of Nitro. I'd bet you can name at least half a dozen. And none of it worked. Now imagine what Discord would need to do, or would try, in order to become profitable. Personally, the imagine conjured in my mind by the idea of "Discord but profitable" is pretty grim.</p>
<p>This isn't a problem specific to Discord. A popular term for what's happening to it is "enshittification" - Cory Doctorow, the term's inventor, <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">explains it well</a>:</p>
<blockquote></blockquote>
<figure class="quote">
<blockquote>
Here is how platforms die: first, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die.
</blockquote>
<figcaption>
&mdash; Cory Doctorow, <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">Tiktok's enshittification</a>
</figcaption>
</figure>
<p>I won't restate his essay or the examples he lists here (though you should give it a read), but one obvious one his article didn't cover because it was written more than a week ago is what's happening with Reddit right now. Reddit has been enshittifying itself for years, but the current controversy is particularly bad and particularly representative of the problem. As of writing in mid-June of 2023, Reddit has just instituted a new policy requiring payment for use of its API, to the tune of $12,000 per 50 million API requests, which for certain popular third-party clients and moderation tools comes out to millions of dollars per year.</p>
<p>Reddit did not need to do this. Reddit was doing fine. This was purely a cash-grab, and it's blowing up in everyone's face right now, including theirs. Moderators of many popular subreddits are essentially going on strike over this, and if you think that's the only critical problem this decision is going to cause for users you know very little about Reddit. The developers of open-source clients and moderation tools used by massive portions of Reddit's userbase can't afford costs like this, and most of them will be forced to shut down if Reddit sticks to its guns.</p>
<p>I'm not saying they will, but Discord could absolutely do the same thing, and it wouldn't surprise me if it came to that. Imagine if Discord bot developers needed to pay API fees like that. There'd certainly be a lot fewer Discord bots, and probably a lot more paywalled ones among the remainder. Discord absolutely needs to become profitable in order to be sustainable, and it will do whatever it needs to to that end or die. Even then, it can't just break even; capitalism demands endless growth. Discord will keep getting worse as long as there's money in it. It's inevitable. It's required.</p>
<h3>Centralization</h3>
<p>Discord is a centralized platform and always will be, no matter how strong the reality distortion field it puts up by allowing the creation of isolated social spaces and calling them "servers". Every Discord "server" runs on Discord's servers, and they have total control over each one at the end of the day.</p>
<p>Now, centralization isn't inherently bad. Sometimes it is necessary. Imagine trying to construct a peer-to-peer MMORPG, for example. Discord, however, is not a videogame, and in its case centralization introduces some fundamental problems that a decentralized system could avoid without compromising core functionality.</p>
<p>The centralized nature of Discord, the platform, means that it, in its entirety, is inherently vulnerable to anything that happens with Discord, the company. Any change the company decides to make is universal. If the company shuts down, the platform goes with it. If the admins at Discord don't like what you're doing, they can unilaterally prevent you from using their platform at all.</p>
<p>This ties pretty closely into the whole VC-funded thing - Discord, the platform, is fundamentally subject to the whims of Discord, the company's investors. I guarantee you that's why they changed the username system: the corporate big wigs providing the funding got confused by Discord's unique (and very good) username system and decided it would be better if it was more like Twitter, so Discord made it more like Twitter.</p>
<p>That's really the core of the issue here: being centralized means that Discord can easily suffer the same fate as Twitter. Some incompetent nutcase with more money than the entire planet's collective pool of sense could buy it out and destroy it, or the current owners could just make some boneheaded decision and do the same. A decentralized platform, running on a common open protocol, is much less vulnerable to the antics of the Elon Musks and u/spez's of the world.</p>
<h3>The Privacy Problem</h3>
<p>This issue isn't really inherently connected to the others - a lack of good privacy doesn't fundamentally doom a platform like the other two points - but I'm treating it as a third major issue because I feel it's extremely important and warrants consideration.</p>
<p>If you value your privacy, Discord is an atrocious choice. Take it from <a href="https://tosdr.org/en/service/536">their own terms of service</a>. Anything you send on Discord, whether in a DM or a public guild (I'm not calling them "servers"), is <strong>not encrypted</strong>, meaning it can be accessed and read by Discord staff, as well as any hackers that manage to access their systems or any law enforcement entities that might demand it. Discord is not even trying to pretend to be private. I'm not convinced it's something they ever thought about.</p>
<p>And let's be clear here: You should value your privacy. You should value it a lot. The idea that if you have nothing to hide, you have nothing to fear is a complete scam. Even if you don't have anything to hide, yes you do. Take, for example, <a href="https://archive.ph/TYPd1">the time</a> Google flagged someone as a criminal and permanently closed their account for the crime of sending medical photos of their son to a doctor. Or maybe your government wants to arrest you for being gay, or having an abortion, or some other innocuous but potentially illegal thing. Or maybe they will in the future. Or maybe some stuff you've said is just kind of embarrassing.</p>
<p>If you still don't believe me, read through a couple months of your Discord message history and then contemplate printing it out and mailing it to the NSA. If the government asks, Discord will save you the trouble, and they won't ask your permission first. And with a recent change to their privacy policy, this theoretically applies to your voice chats too, though to be fair I expect that would be prohibitively costly in server space.</p>
<p>Discord fundamentally couldn't give a shit about your privacy, and doesn't even really care to pretend like it does. It has no incentive to. The investors probably wouldn't be comfortable with the risks associated with pulling a stunt like responding to a subpoena with "yeah here's their phone number. that's all we got" like certain other chat apps anyway, and then there's the potential to sell that all data on you to advertisers. I'm not aware that they currently do that, but it's certainly not off the table should they decide to go that route in order to turn a profit. At least, not under US law, anyway.</p>
<p>Actually, I just checked that ToS;DR link from earlier again, would you look at that:</p>
<figure class="quote"><blockquote>This service may keep personal data after a request for erasure for business interests or legal obligations</blockquote></figure>
<figure class="quote"><blockquote>This service ignores the Do Not Track (DNT) header and tracks users anyway even if they set this header.</blockquote></figure>
<figure class="quote"><blockquote>Your personal data may be used for marketing purposes</blockquote></figure>
<figure class="quote"><blockquote>This service can license user content to third parties</blockquote></figure>
<figure class="quote"><blockquote>The service can sell or otherwise transfer your personal data as part of a bankruptcy proceeding or other type of financial transaction.</blockquote></figure>
<figure class="quote"><blockquote>The service may use tracking pixels, web beacons, browser fingerprinting, and/or device fingerprinting on users.</blockquote></figure>
<figure class="quote"><blockquote>The service uses your personal data to employ targeted third-party advertising</blockquote></figure>
<p>Juicy stuff. You should really give that a read - you might not like what you find.</p>
<p>Before we move on, I'll just drop this tasty little <a href="https://spyware.neocities.org/articles/discord">link</a> to further reading. It's a real page-turner.</p>
<h2>Cool, so how do we fix it?</h2>
<p>We don't. Discord was doomed from the outset in any attempts to be sustainable or trustworthy. We are going to need to find an alternative to Discord eventually. So what should that alternative look like? I'll discuss specifics later - I'd like to start by establishing the general principles I feel a messaging system should conform to in order to avoid Discord's major problems. The TL;DR is it needs to not be any of the things I've described thus far about Discord, but I'll go into more detail about what that actually looks like.</p>
<h3>Follow the money</h3>
<p>A sustainable chat system <em>absolutely cannot</em> be for-profit. If it is in any way driven by profit, the decay and eventual death of the service is inevitable. That doesn't mean it has to be entirely staffed by unpaid volunteers or anything, but it would need to be a non-profit foundation of some kind, just trying to break even with no incentive for infinite growth or any other corrupting financial influence. You'll notice this as a theme across most online services that don't already show signs of advanced corporate necrosis.</p>
<p>I'm not even saying it can't have some kind of Nitro-esque paid tier. I don't hold it against, say, Protonmail - in fact, I pay for that one - but the money can't be the end goal. A sustainable non-profit model might be largely donation-based like Wikipedia, or maybe it could have a totally free product for individual users and break even selling support to enterprise customers like some Linux distributions. It's not currently breaking even yet according to its Wikipedia article, but I'll be interested to see if and how Signal reaches a sustainable state. Maybe future players could take notes from them.</p>
<h3>Cut out the middle man</h3>
<p>Better yet, structure your system such that it doesn't even need a corporation at the center - in other words, a decentralized system. I'm not talking about the blockchain; we can do this the old-fashioned way, with tech that isn't ponzi-scheme-by-design. In fact, we're already doing this, and it already has more monthly active users than any messenger app ever created: email.</p>
<p>Email is the original decentralized, federated communications network. There's no Email LLC at the center of it all assigning everyone their email addresses and processing every message. Email isn't an app. It isn't a proprietary service. It's an open protocol that anyone can set up a server to provide access to. That's what Gmail is, that's what Outlook is, that's what your weird nerdy friend's weird nerdy friend who has a custom domain name on their email address and complains about Gmail marking their messages as spam is doing. They're all part of the bigger network.</p>
<p>I'll try to keep this little tangent short, but I feel it's important to establish a basic understanding of how these systems work. Email is a federated protocol, meaning it isn't tied to one backend running on one company's datacenter - instead, it's a network composed of any number of entirely independent servers running compatible software that communicate amongst themselves using the language of the email protocol. These servers are often called "nodes" or "instances", or sometimes "providers" in the case of email. A user of email has an account with one of these instances and can use it to send messages to people both on the same instance and on any other instance on the network.</p>
<p>This is why email addresses are like that - the part before the @ is your username, and the domain name after the @ points to the server your account is registered on. If usernames on other platforms were formatted like this you would see stuff like MrBeast@youtube.com for Youtube channels or dril@twitter.com for Twitter accounts, but those platforms aren't federated so they don't need to do that.</p>
<p>So when two people communicate via email, the sender sends the message to their instance, which sends it to the instance its recipient is using, which then relays it to the recipient.</p>
<p>And here's the obligatory visual aid - essentially, when you send an email, it takes the shortest path along a network that looks like this; every server is connected to every other, and every user is connected to one server:</p>
<svg
width="100%"
viewBox="0 0 200 200"
version="1.1"
id="svg5"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<g
id="layer1"
transform="translate(-8.3054578,-58.319434)">
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path117"
cx="68.56881"
cy="127.54186"
r="18.769983" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3581"
cx="150.92085"
cy="148.26714"
r="19.678009" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3583"
cx="105.20529"
cy="202.05493"
r="19.081055" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3587"
cx="25.743092"
cy="101.9978"
r="5.2974296" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3589"
cx="60.956558"
cy="73.617287"
r="5.4940629" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3591"
cx="171.89577"
cy="106.49306"
r="5.1377053" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3593"
cx="196.94356"
cy="142.59959"
r="5.1728086" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3595"
cx="181.24704"
cy="189.34361"
r="5.6113472" />
<circle
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
id="path3597"
cx="84.654259"
cy="244.04385"
r="5.8057671" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="M 30.209234,104.69878 52.15345,118.20831"
id="path3653" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 61.513435,79.048001 4.222744,29.916259"
id="path3655" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 169.64269,111.0195 -10.00525,19.52595"
id="path3657" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 191.80959,143.94112 -21.1993,2.95336"
id="path3659" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="M 177.3019,185.05552 161.979,164.75517"
id="path3661" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 86.835859,238.77871 10.351513,-19.3635"
id="path3663" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 75.79573,144.99496 20.995312,39.74555"
id="path3665" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 85.88393,134.7388 45.55403,10.05641"
id="path3667" />
<path
style="opacity:1;fill:var(--fontcolor);fill-opacity:0;stroke:var(--fontcolor);stroke-width:1;stroke-dasharray:none;stroke-opacity:1"
d="m 140.88779,165.32071 -22.07436,23.38712"
id="path3669" />
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,141.58634,13.420722)"
id="text3723"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="52.339844"
y="323.63335"
id="tspan6368">alice@gmail.com</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,134.67403,76.767262)"
id="text3989"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="177.52734"
y="219.63139"
id="tspan6370">bob@gmail.com</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-28.070788,46.354482)"
id="text4007"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="775.53125"
y="510.74467"
id="tspan6376">john@gmail.com</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,90.646791,27.832545)"
id="text3995"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="195.94141"
y="457.4771"
id="tspan6372">gmail.com</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-107.28378,-25.337764)"
id="text4001"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="583.625"
y="345.20952"
id="tspan6374">jim@outlook.com</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-162.33349,-82.690407)"
id="text4013"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="656.86719"
y="670.07866"
id="tspan6378">pam@outlook.com</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-78.775668,-14.068118)"
id="text4019"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="520.44336"
y="542.11967"
id="tspan6380">outlook.com</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,-5.9405919,5.0439657)"
id="text4025"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="278.56445"
y="939.12944"
id="tspan6382">dave@trapped.homes</tspan></text>
<text
xml:space="preserve"
transform="matrix(0.26458333,0,0,0.26458333,0.73621799,4.4527982)"
id="text5483"
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-family:monospace;-inkscape-font-specification:monospace;white-space:pre;opacity:1;fill:var(--fontcolor);fill-opacity:1;stroke:var(--fontcolor);stroke-width:0.377953;stroke-dasharray:none;stroke-opacity:1"><tspan
x="349.59375"
y="749.94389"
id="tspan6384">trapped.homes</tspan></text>
</g>
</svg>
<p>Hopefully that helped. Back to the point, all federated services work pretty much exactly like this. If you've ever had someone try to explain the Fediverse (sometimes incorrectly called Mastodon) to you by comparing it to email, this is what they meant. But this isn't limited to email and microblogging; this type of system can theoretically apply to anything. Again, building an MMO this way would be challenging, but federated messaging protocols similar in concept to Discord do exist.</p>
<p>The benefit of this kind of system stems from the fact that it's not under the control of any central authority: Gmail, Outlook, and that weird nerd your friend knows are entirely independent of each other, they don't answer to any higher Email Authority (other than the body that defines the common standard) or each other. This means that there's nobody at the top to fuck the entire thing up for everyone or sell it off to someone who will; in fact, even if someone wanted to it would be tremendously difficult.</p>
<p>The network is inherently much more stable and resilient in general than a centralized service, as there's nobody who would take the entire network down with them if the company went under or got sued or had a bomb dropped on their datacenter. Sure, a huge number of people would lose their email accounts if Gmail disappeared tomorrow, but critically, not the entire network. Email wouldn't go away, and those displaced users could go to Outlook or Protonmail or set up their own instance and keep communicating over the same network. The same applies to any other federated protocol. Imagine if your Discord account and guilds weren't controlled by Discord, but instead ran on a machine you controlled and was in no way answerable to Discord Inc, but you could still talk to your buddies on Discord proper. It's like that.</p>
<h3>Incognito mode</h3>
<p>Contrary to the title of the previous section, a federated approach does technically add more middlemen. We've gone from one unaccountable central authority able to read everyone's messages to several unaccountable parties each able to read the messages of everyone they serve. Not much of an improvement, privacy-wise, unless you trust both your provider and the providers of everyone you're talking to implicitly. Actual privacy requires end-to-end encryption.</p>
<p>End-to-end encryption means the message is encrypted before leaving the sender's machine and can only be decrypted by the recipient once it arrives on theirs. This means that only the sender and recipient can read the message; even if it goes through some other party's server, they have no clue what the contents of the message are. Any messaging system that cares about privacy at all will implement this - ideally they'll build the entire protocol around it.</p>
<p>There are still problems here, for example end-to-end encrypted messaging still requires the server to know who you're talking to, but there are workarounds for these as well. However, E2EE should be the absolute bare minimum, in my opinion.</p>
<h2>So what are our options then?</h2>
<p>Here's the part where I discuss actual alternatives to Discord. I'll say now that this will not be a comprehensive overview of every possible option - recommending chat apps that don't meet these standards would kinda defeat the point, and I'm also not omniscient. There are going to be other options that I haven't covered here, and hopefully I've given you the tools to determine which ones are good.</p>
<p>Every program I list here will, at a minimum, support true end-to-end encryption in some capacity and not be run by a for-profit company. They're also all open-source.</p>
<h3><a href="https://xmpp.org/">XMPP</a></h3>
<p>XMPP is about as close as we've got to "email but for instant messaging". It's a federated, open protocol which, having been formally standardized in 1999, is truly ancient in internet years. My understanding is that it actually used to be more widely used, but Google effectively killed it off in popular usage by subsuming its userbase into Google Talk and then promptly turning off federation and killing Google Talk. That doesn't mean it's gone, though. People still use XMPP to talk to each other, running on servers hosted by themselves or their friends.</p>
<p>XMPP is, at its core, designed for simple text-based messaging and presence. While the protocol is highly extensible, many even relatively basic-seeming features, while common, aren't universally supported. If you want them, you'll have to find a provider that has them.</p>
<ul>
<li>Federated protocol.</li>
<li>Feature-bare; no gimmicks.</li>
<li>Generally supports file sharing.</li>
<li>Supports end-to-end encryption, but it's not the default and it's kinda janky.</li>
<li>While integration with WebRTC voice chat is supported, it's not universal, and some people prefer to use a separate voice chat system, such as Mumble, in conjunction with XMPP text chat.</li>
<li>You'll have to find a provider and choose a client program to connect with. Fortunately, there's plenty of options, and the official XMPP website lists some of each.</li>
</ul>
<h3><a href="https://matrix.org/">Matrix</a></h3>
<p>Matrix is the other major federated instant messaging protocol. It was standardized in 2014 and is built around making end-to-end encryption easy. On top of that, it has more features. File sharing is included by default and support for nice-to-have features like emoji reactions (and maybe custom emojis??) and Discord-style replies is widespread. There's also a large suite of bridges to other services, including Discord. Like with XMPP, voice chat integration is possible, but not universal, and some prefer to use Mumble or similar.</p>
<ul>
<li>Federated protocol.</li>
<li>More features than XMPP, similar situation with voice calls though.</li>
<li>Built around end-to-end encryption, though you can disable it, and you will need to for integrations like bots and bridges.</li>
<li>As with XMPP, you'll need to find a provider and a client program. The website lists quite a few clients, and you can find a list of servers <a href="https://joinmatrix.org/servers/">here</a>.</li>
</ul>
<h3><a href="https://www.mumble.info/">Mumble</a> and <a href="https://jitsi.org/">Jitsi</a></h3>
<p>Mumble and Jitsi are self-hostable voice chat and videoconferencing applications, respectively. They're not messaging systems, but I feel they bear mentioning here because they're both popular for use in conjunction with text chat systems, and since nothing else here currently supports screensharing.</p>
<h3><a href="https://revolt.chat">Revolt</a></h3>
<p>We've about run out of open protocols (which is probably a good thing), so now on to the centralized services, starting with Revolt. Revolt is basically trying to be open-source Discord. It's currently in alpha, but the user experience is very similar and it already has some of the fun stuff.</p>
<p>From what I could find Revolt isn't currently controlled by any kind of legal entity, so there's no guarantee it won't eventually incorporate into a for-profit company and pull a Reddit (by which I mean, Reddit used to be open-source, but hasn't been since 2017), but at least for now the project leaders express principles that make that seem unlikely.</p>
<ul>
<li>Centralized service.</li>
<li>Still early in development.</li>
<li>Very similar in UI/UX to Discord.</li>
<li>No paywalls.</li>
<li>Supports voice, but not currently video.</li>
<li>No encryption, but E2EE for DMs is being worked on.</li>
<li>Has features like custom emojis, replies, public guilds and a friends list.</li>
</ul>
<h3><a href="https://signal.org/">Signal</a></h3>
<p>I've now run out of Discord-likes - which is to say, programs that support the sort of multi-channel group chat thing Discord has going on. This and the next one function more in the vein of a Whatsapp clone, though I feel they still bear mentioning in the event that's all you need.</p>
<p>Signal is kind of <em>the</em> private messaging app. It's fundamentally built around end-to-end encryption in a way that its biggest direct competitors simply aren't. It's been proven in court that Signal literally doesn't have the ability to incriminate you, since they can't access the contents of your messages. It does need your phone number, though, however you can now hide it with a username. It also supports voice and video chat, and stickers, apparently.</p>
<ul>
<li>Centralized service.</li>
<li>Similar to Whatsapp in terms of UI/UX.</li>
<li>Emphasis on end-to-end encryption.</li>
<li>Supports voice and video calls.</li>
<li>Requires a phone number, but only a phone number.</li>
<li>You can set a username, so you don't need to share your phone number.</li>
</ul>
<h3><a href="https://getsession.org/">Session</a></h3>
<p>I lied, Session isn't centralized. But it's not decentralized in the same way as the federated protocols up there, either. Session runs over an anonymizing onion routing network, Tor-style, meaning not only can your messages not be read by the server, those servers also don't know both the sender and the destination at the same time. Essentially, it's designed to maximize privacy and anonymity at all costs. But wouldn't you know it, that comes at a cost in terms of features and user experience.</p>
<p>Session does also use cryptocurrency. Setting a custom display name and running a node on its decentralized network both require participation in a blockchain, though your messages aren't sent via this blockchain.</p>
<ul>
<li>Decentralized, encrypted, and anonymous.</li>
<li>Supports voice and video calls, but currently only 1:1.</li>
<li>Requires no personal details to sign up.</li>
<li>No extra features.</li>
<li>Setting a display name requires a crypto transaction, but sending messages does not.</li>
</ul>
<h2>Conclusion</h2>
<p>That's about all I've got. I hope I've impressed upon you the importance of Discord's core problems, and introduced you to at least one alternative that works for you. I have my preferences, but I'm comfortable recommending all of these over Discord, otherwise I wouldn't have listed them.</p>
<p>[Update 2023-09-09] I no longer recommend Matrix over XMPP for reasons explained well <a href="https://telegra.ph/why-not-matrix-08-07">here</a>. I knew there was a little jank but I had no idea the rot ran this deep. Fortunately, nobody's listened to me yet so I can switch over to XMPP without much issue, which I intend to do.</p>
<p>[Update 2024-04-27] I have removed Telegram from the recommendations list outright due to <a href="https://plush.city/@PsyChuan/112336464469767051">just, straight up nazism</a>, and in a post announcing cryptocurrency features no less. Jesus H. Christ.</p>
<p>If there's one thing I want you to take away from this article, it's this: Don't fall for the marketing and don't let yourself be wooed by extraneous gimmicks. Be discerning about which fancy-sounding features you actually need. If you want to have a chance of escaping the vicious corporate cycle of enshittification, both with chat platforms and with everything else, make sure the ones you use have a strong foundation of sustainability and trustworthiness, beyond whatever marketing drivel is on the front page of their website. Hopefully I've given you at least some tools to determine for yourself which ones do.</p>
<h2>Further Reading</h3>
<ul>
<li><a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">Enshittification</a></li>
<li><a href="https://tosdr.org/en/service/536">A simplified breakdown of Discord's TOS (ToS;DR)</a></li>
<li><a href="https://spyware.neocities.org/articles/discord">Spyware Watchdog - Discord</a></li>
<li><a href="https://moth.monster/blog/fediverse/">A different explanation of federation in the context of federated social media</a></li>
<li><a href="https://proton.me/blog/whatsapp-alternatives">A privacy-focused comparison of messenger apps</a></li>
</ul>
<div class="buttons" style="margin-bottom: 1rem;">
<img src="discord-no-way-2.gif" />
</div>
<?php include("../../comment/form.php"); ?>
</body>
</html>

View file

@ -1,27 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Admins Can Read Your DMs</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('bg.svg');
}
</style>
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>isoblog</h1>
<h2 id="caption">Admins Can Read Your DMs</h2>
<?php
include("../post_dates.php");
include("../Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents("index.md"));
include("../../comment/form.php");
?>
</body>
</html>

View file

@ -0,0 +1,21 @@
Quick one today. I got sick of searching for programming questions and seeing AI-generated scraped-from-stackoverflow click farm trash polluting the results, and I happen to use a personal SearXNG instance that no client-side blacklist extension on the planet is gonna support, so I went looking to see if I could blacklist them in SearXNG for like the eighth time and finally found a way using the hostname replace plugin. So here's that, because I didn't find this feature documented officially anywhere bar an [issue](https://github.com/searxng/searxng/discussions/970) on the Github repo.
## How to do it
First, open up your instance's config file. If you installed it directly like I did, that'll probably be `/etc/searxng/settings.yml`. If you used Docker, god help you. Anyway, find the `enabled_plugins:` section and uncomment the entry for `'Hostname replace'`, then uncomment the line `hostname_replace:` just below it. Under there you'll put your blocks:
<p class="codetitle">/etc/searxng/settings.yml</p>
```
enabled_plugins:
- 'Hostname replace'
hostname_replace:
'(.*\.)?codegrepper\.com': false
'(.*\.)?geeksforgeeks\.org': false
```
Then restart SearXNG:
```
service uwsgi restart searxng
```

View file

@ -1,37 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Guide - Blacklisting Websites in SearXNG</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('searxng.svg');
}
</style>
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>guide:</h1>
<h2 id="caption">Blacklisting Websites in SearXNG</h2>
<?php include("../post_dates.php"); ?>
<p>Quick one today. I got sick of searching for programming questions and seeing AI-generated scraped-from-stackoverflow click farm trash polluting the results, and I happen to use a personal SearXNG instance that no client-side blacklist extension on the planet is gonna support, so I went looking to see if I could blacklist them in SearXNG for like the eighth time and finally found a way using the hostname replace plugin. So here's that, because I didn't find this feature documented officially anywhere bar an <a href="https://github.com/searxng/searxng/discussions/970" target="_blank">issue</a> on the Github repo.</p>
<h2>How to do it</h2>
<p>First, open up your instance's config file. If you installed it directly like I did, that'll probably be <code>/etc/searxng/settings.yml</code>. If you used Docker, god help you. Anyway, find the <code>enabled_plugins:</code> section and uncomment the entry for <code>'Hostname replace'</code>, then uncomment the line <code>hostname_replace:</code> just below it. Under there you'll put your blocks:</p>
<code>
<span class="codetitle">/etc/searxng/settings.yml</span>
enabled_plugins:<br>
&nbsp;&nbsp;- 'Hostname replace'<br><br>
hostname_replace:<br>
&nbsp;&nbsp;'(.*\.)?codegrepper\.com': false<br>
&nbsp;&nbsp;'(.*\.)?geeksforgeeks\.org': false
</code>
<p>Then restart SearXNG:</p>
<code>
$ service uwsgi restart searxng
</code>
<?php include("../../comment/form.php"); ?>
</body>
</html>

View file

@ -0,0 +1,73 @@
Recently, Cloudflare has launched a clumsy, poorly-executed attempt to centralize the fediverse on their platform known as Wildebeest. There are a few reasons not to want to use it, and you probably don't want to be federating with it either. However, blocking every instance running it on sight would be both tedious and ineffective.
The way I've chosen to deal with this is to just configure my reverse proxy, Nginx, to deny connections from anything with "wildebeest" in the user agent string. There are several other good reasons to do this, such as blocking bots that ignore robots.txt, or adapting this approach to serve specialized pages to old browsers, or just denying access to anything that isn't Chrome if you want to earn your place in the 9th circle of Hell.
I'm assuming here that you already know the basics of configuring Nginx, otherwise this article won't really be of much use to you.
## How to do it
Paste this into the main `server` block of your Nginx config to instantly drop the connection to any client with a "Wildebeest" (case insensitive) user agent:
<p class="codetitle">/etc/nginx/sites-available/yoursite</p>
```
if ($http_user_agent ~* (wildebeest)) {
return 444;
}
```
## More configuration
If all you want is to block Wildebeest and forget about it, you can leave now. If you want to customize this behavior further, read on.
### Different HTTP responses
444 is a custom response code in Nginx that just drops the connection immediately. You can use any other HTTP error code you like, for example to return a `403 Forbidden` error:
```
return 403;
```
To issue a permanent redirect to some other URL:
```
return 301 https://example.org/;
```
Or just to be silly :3
```
return 418;
```
### Block multiple user agents
You can also block multiple user agents in one statement like so:
<p class="codetitle">/etc/nginx/sites-available/yoursite</p>
```
if ($http_user_agent ~* (wildebeest|GPTBot)) {
return 444;
}
```
### Includes
One thing I'd recommend doing is moving all your user agent blocks to a separate file that you can include in all your Nginx sites. I place this file at `/etc/nginx/includes/bans`:
<p class="codetitle">/etc/nginx/includes/bans</p>
```
if ($http_user_agent ~* (wildebeest|GPTBot)) {
return 444;
}
```
<p class="codetitle">/etc/nginx/sites-available/yoursite</p>
```
include /etc/nginx/includes/bans;
```
The `include` statement goes in your `server` block as before.

View file

@ -1,70 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Guide - How to Block User Agents With Nginx</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('nginx.svg');
}
</style>
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>guide:</h1>
<h2 id="caption">How to Block User Agents With Nginx</h2>
</nav>
<?php include("../post_dates.php"); ?>
<p>Recently, Cloudflare has launched a clumsy, poorly-executed attempt to centralize the fediverse on their platform known as Wildebeest. There are <a href="https://blog.cloudflare.com/welcome-to-wildebeest-the-fediverse-on-cloudflare/" title="This one's kind of a joke, but it explains in detail just how much Wildebeest is fundamentally dependent on Cloudflare's platform, and if you agree with me about anything you should already know why that's bad.">a</a> <a href="https://stop.voring.me/notes/9bka8dyjjo" title="Gleason, of getting-kicked-off-the-dev-team-for-the-fedi-server-he-created-for-sucking-so-much fame, is now contributing code to Wildebeest.">few</a> <a href="https://glitterkitten.co.uk/@doot/109910496299181873" title="This one's the most important. Wildebeest literally just publically displays messages marked as direct. Think admins being able to read your &quot;direct messages&quot; was bad? Try everyone.">reasons</a> not to want to use it, and you probably don't want to be federating with it either. However, blocking every instance running it on sight would be both tedious and ineffective.</p>
<p>The way I've chosen to deal with this is to just configure my reverse proxy, Nginx, to deny connections from anything with "wildebeest" in the user agent string. There are several other good reasons to do this, such as blocking bots that ignore robots.txt, or adapting this approach to serve specialized pages to old browsers, or just denying access to anything that isn't Chrome if you want to earn your place in the 9th circle of Hell.</p>
<p>I'm assuming here that you already know the basics of configuring Nginx, otherwise this article won't really be of much use to you.</p>
<h2>How to do it</h2>
<p>Paste this into the main <code>server</code> block of your Nginx config to instantly drop the connection to any client with a "Wildebeest" (case insensitive) user agent:</p>
<code>
<span class="codetitle">/etc/nginx/sites-available/yoursite</span>
if ($http_user_agent ~* (wildebeest)) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;return 444;<br>
}
</code>
<h2>More configuration</h2>
<p>If all you want is to block Wildebeest and forget about it, you can leave now. If you want to customize this behavior further, read on.</p>
<h3>Different HTTP responses</h3>
<p>444 is a custom response code in Nginx that just drops the connection immediately. You can use any other HTTP error code you like, for example to return a <code>403 Forbidden</code> error:</p>
<code>
return 403;
</code>
<p>To issue a permanent redirect to some other URL:</p>
<code>
return 301 https://example.org/;
</code>
<p>Or just to be silly :3</p>
<code>
return 418;
</code>
<h3>Block multiple user agents</h3>
<p>You can also block multiple user agents in one statement like so:</p>
<code>
<span class="codetitle">/etc/nginx/sites-available/yoursite</span>
if ($http_user_agent ~* (wildebeest|googlebot)) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;return 444;<br>
}
</code>
<h3>Includes</h3>
<p>One thing I'd recommend doing is moving all your user agent blocks to a separate file that you can include in all your Nginx sites. I place this file at <code>/etc/nginx/includes/bans</code>:</p>
<code>
<span class="codetitle">/etc/nginx/includes/bans</span>
if ($http_user_agent ~* (wildebeest|googlebot)) {<br>
&nbsp;&nbsp;&nbsp;&nbsp;return 444;<br>
}
</code>
<code>
<span class="codetitle">/etc/nginx/sites-available/yoursite</span>
include /etc/nginx/includes/bans;
</code>
<p>The <code>include</code> statement goes in your <code>server</code> block as before.</p>
<?php include("../../comment/form.php"); ?>
</body>
</html>

View file

@ -1,2 +0,0 @@
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
<svg width="800px" height="800px" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><title>file_type_nginx</title><path d="M15.948,2h.065a10.418,10.418,0,0,1,.972.528Q22.414,5.65,27.843,8.774a.792.792,0,0,1,.414.788c-.008,4.389,0,8.777-.005,13.164a.813.813,0,0,1-.356.507q-5.773,3.324-11.547,6.644a.587.587,0,0,1-.657.037Q9.912,26.6,4.143,23.274a.7.7,0,0,1-.4-.666q0-6.582,0-13.163a.693.693,0,0,1,.387-.67Q9.552,5.657,14.974,2.535c.322-.184.638-.379.974-.535" style="fill:#019639"/><path d="M8.767,10.538q0,5.429,0,10.859a1.509,1.509,0,0,0,.427,1.087,1.647,1.647,0,0,0,2.06.206,1.564,1.564,0,0,0,.685-1.293c0-2.62-.005-5.24,0-7.86q3.583,4.29,7.181,8.568a2.833,2.833,0,0,0,2.6.782,1.561,1.561,0,0,0,1.251-1.371q.008-5.541,0-11.081a1.582,1.582,0,0,0-3.152,0c0,2.662-.016,5.321,0,7.982-2.346-2.766-4.663-5.556-7-8.332A2.817,2.817,0,0,0,10.17,9.033,1.579,1.579,0,0,0,8.767,10.538Z" style="fill:#fff"/></svg>

Before

Width:  |  Height:  |  Size: 1 KiB

View file

@ -1,27 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Guide - How to Make Youtube Videos Buffer All The Way Like The Old Days</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('youtube.svg');
}
</style>
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>guide:</h1>
<h2 id="caption">How to Make Youtube Videos Buffer All The Way Like The Old Days (In Firefox)</h2>
<?php
include("../post_dates.php");
include("../Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents("index.md"));
include("../../comment/form.php");
?>
</body>
</html>

View file

@ -0,0 +1,78 @@
## Preamble
Recently I had to reinstall Linux because of reasons, and I hit a bit of a snag. See, my computer has this setup with three drives where one is the boot drive, and the other has `/home` on it... it's not important, point is, I wanted some drives to be automatically mounted as specific directories at boot time.
This is pretty easy to do with the manual partitioning tools most graphical installers provide, but I would have also had to manually partition the boot drive and hell if I'm figuring out for the umpteenth time how this particular distro with this particular hardware needs to be partitioned in order to be bootable, so I just selected the automatic partitioning option which assumes you just want everything on the boot drive.
the problem is that my system doesn't know my `/home` directory is on `/dev/sda3` and not `/dev/nvme0n1p1`. So I have to fix that now or just log in as root and mount my shit every time I turn the computer on for the rest of time. Guess which thing sounded like more of a pain in the ass. I googled it so you don't have to!
## Now on to the good stuff
I recommend you log out and do this as root in a TTY if you intend to mount something as your home directory.
## Getting partition information
First, run:
```
sudo blkid
```
This will return a list of block devices (partitions) your system sees with some information about each, like this:
<p class="codetitle">sudo blkid</p>
```
/dev/sda1: UUID="YOUR_UUID" BLOCK_SIZE="4096" TYPE="YOUR_TYPE" PARTUUID="30aac87d-21c9-44a9-8033-108eede77f8b"
```
You'll probably have more than one though. There should be one per partition your system can see. We're interested in the `UUID` and `TYPE` attributes. Find the ones for the partition you want mounted and take note of them. We'll be adding these to your fstab file.
## Editing your fstab
First, make sure the directory you'll be mounting to exists. Create it if it doesn't. **Now make a backup of your fstab file in case you break things!** You can do this by simply copying the file:
```
sudo cp /etc/fstab /etc/fstab.bak
```
Now we can edit it. Open `/etc/fstab` in your favorite text editor, and you should be greeted with a file that looks something like this:
![Screenshot of /etc/fstab on my computer before I did this](fstab.png)
(This is the fstab file EndeavourOS generated on install. Because I set it to use btrfs, it mounted the same partition like four separate times as subvolumes. Yours will likely be smaller if you didn't do this.)
This information tells your system which partitions should be mounted and at which locations to mount them, as well as some other settings. We don't need to worry about most of it, though. Simply append a line for your partition to the file:
<p class="codetitle">/etc/fstab</p>
```
#imagine the contents of your fstab file here
UUID=YOUR_UUID /path/to/mountpoint YOUR_TYPE defaults 0 0
```
For example, here are the entries I added for my drives:
<p class="codetitle">/etc/fstab</p>
```
# btrfs partition on my /home drive
UUID=44510605-9e1a-45cf-8e6b-bf7fd1c69502 /home btrfs defaults,noatime,compress=zstd 0 0
# ext4 partition on my secondary HDD
UUID=f8c3f1b1-7fef-4a01-bec7-ba3e89e2f8da /home/isopod/vault ext4 defaults 0 0
```
If you did it right, you should now be able to reboot and see your partitions have been automatically mounted!
One more thing to keep in mind, if you see any lines with a mount point that's the same as the place you're trying to mount to (for example, the system has mounted a btrfs subvolume for /home and you want to put that on your secondary drive) you should probably comment out or delete that.
## The fast way
Alternatively, you could just paste this into your terminal and then reboot:
```
partition="/dev/yourpartition"; directory="/path/to/mountpoint"; sudo cp /etc/fstab /etc/fstab.$(date +%s).bak; echo "UUID=$(sudo blkid $partition | sed "s/^.* UUID=\"//;s/\".*//") $directory $(sudo blkid $partition | sed "s/^.* TYPE=\"//;s/\".*//") defaults 0 0" | sudo tee -a /etc/fstab
```
But don't complain to me if you break your system doing that.

View file

@ -1,60 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Guide - How to Automount Drives On Boot in Linux</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>guide:</h1>
<h2 id="caption">How to Automount Drives On Boot in Linux</h2>
<?php include("../post_dates.php"); ?>
<h2>Preamble</h2>
<details>
<summary>Show preamble</summary>
<p>Recently I had to reinstall Linux because of reasons, and I hit a bit of a snag. See, my computer has this setup with three drives where one is the boot drive, and the other has /home on it... it's not important, point is, I wanted some drives to be automatically mounted as specific directories at boot time.</p>
<p>This is pretty easy to do with the manual partitioning tools most graphical installers provide, but I would have also had to manually partition the boot drive and hell if I'm figuring out for the umpteenth time how this particular distro with this particular hardware needs to be partitioned in order to be bootable, so I just selected the automatic partitioning option which assumes you just want everything on the boot drive.</p>
<p>Now the problem is that my system doesn't know my /home directory is on /dev/sda3 and not /dev/nvme0n1p1. So I have to fix that now or just log in as root and mount my shit every time I turn the computer on for the rest of time. Guess which thing sounded like more of a pain in the ass. I googled it so you don't have to!</p>
<h2>Now on to the good stuff</h2>
</details>
<p>I recommend you log out and do this as root in a TTY if you intend to mount something as your home directory.</p>
<h2>Getting partition information</h2>
<p>First, run:</p>
<code>sudo blkid</code>
<p>This will return a list of block devices (partitions) your system sees with some information about each, like this:</p>
<code>
<span class="codetitle">sudo blkid</span>
/dev/sda1: <strong>UUID="YOUR_UUID"</strong> BLOCK_SIZE="4096" <strong>TYPE="YOUR_TYPE"</strong> PARTUUID="30aac87d-21c9-44a9-8033-108eede77f8b"
</code>
<p>You'll probably have more than one though. There should be one per partition your system can see. We're interested in the <code>UUID</code> and <code>TYPE</code> attributes. Find the ones for the partition you want mounted and take note of them. We'll be adding these to your fstab file.</p>
<h2>Editing your fstab</h2>
<p><strong>Make a backup of your fstab file in case you break things!</strong> You can do this by simply copying the file:</p>
<code>sudo cp /etc/fstab /etc/fstab.bak</code>
<p>Now we can edit it. Open <code>/etc/fstab</code> in your favorite text editor, and you should be greeted with a file that looks something like this:</p>
<img src="fstab.png" alt="Screenshot of /etc/fstab on my computer before I did this" />
<p>(This is the fstab file EndeavourOS generated on install. Because I set it to use btrfs, it mounted the same partition like four separate times as subvolumes. Yours will likely be smaller if you didn't do this.)</p>
<p>This information tells your system which partitions should be mounted and at which locations to mount them, as well as some other settings. We don't need to worry about most of it, though. Simply append a line for your partition to the file:</p>
<code>
<span class="codetitle">/etc/fstab</span>
#imagine the contents of your fstab file here<br>
UUID=<strong>YOUR_UUID</strong> /path/to/mountpoint <strong>YOUR_TYPE</strong> defaults 0 0
</code>
<p>For example, here's the entry I added for one of my drives:</p>
<code>
<span class="codetitle">/etc/fstab</span>
UUID=f8c3f1b1-7fef-4a01-bec7-ba3e89e2f8da /home/user/vault ext4 defaults 0 0
</code>
<p>If you did it right, you should now be able to reboot and see your partitions have been automatically mounted!</p>
<p>One more thing to keep in mind, if you see any lines with a mount point that's the same as the place you're trying to mount to (for example, the system has mounted a btrfs subvolume for /home and you want to put that on your secondary drive) you should probably comment out or delete that.</p>
<h2>The fast way</h2>
<p>Alternatively, you could just paste this into your terminal and then reboot:</p>
<code>
partition="<strong>/dev/yourpartition</strong>"; directory="<strong>/path/to/mountpoint</strong>"; sudo cp /etc/fstab /etc/fstab.$(date +%s).bak; echo "UUID=$(sudo blkid $partition | sed "s/^.* UUID=\"//;s/\".*//") $directory $(sudo blkid $partition | sed "s/^.* TYPE=\"//;s/\".*//") defaults 0 0" | sudo tee -a /etc/fstab
</code>
<p>But don't complain to me if you break your system doing that.</p>
<?php include("../../comment/form.php"); ?>
</body>
</html>

View file

@ -0,0 +1,33 @@
My current main headphones are a model that doesn't come with a removable cable by default, that I purchased through a company that offers a service to add one aftermarket for you. They offered multiple different connector options, and I chose this one:
![4-pin mini XLR male and female jacks. The pins are arranged in a Y shape.](4pinminixlr.png)
This is one of two connector types that come up when you search for "4-pin mini XLR". I opted for this connector on the basis that it would allow me to potentially use the headphones with a balanced output in the future, because I had been researching headphones for probably several days and eventually you start to think that kind of thing is important.
This worked fine for me for quite a while, up until recently, when the included cable that adapts this to a standard 3.5mm TRS headphone jack connector stopped working. When I tried to find a replacement, I quickly learned that this connector is only meaningfully present on headphones that are so expensive that anyone who can afford them can be expected to be able to shell out upwards of 100 of God's own United States Dollars for a top-of-the-line snake-oil-lubricated replacement cable.
So universally is this the case that there is seemingly essentially no market for cheap cables of this type — the only sanely priced one I could find was a mono instrument cable with a proprietary pinout designed for use with some Shure product. The cheapest compatible replacement cable I could find was made by the aforementioned modding company and was listed at a cool $140 CAD, well in excess of half of what my headphones themselves are worth. It should go without saying that there is no audio cable on this planet for which I would pay that kind of money, which brings me to where I'm going with this.
Instead of shelling out Intel Core i3-13100F money for what functionally amounts to 3 meters of wire and a couple of audio jacks, I lopped the connectors off of the old, broken cable and soldered on some new wires and saved myself $140.
![A "cable" consisting of a 3.5mm TRS headphone connector, a mini XLR connector, and three loose wires joining them](https://isopod.zone/files/37e6c4ec-3834-4580-bfc8-648279fea9dd)
It's not pretty<sup id="n0r"><a href="#n0">0</a></sup>, but it works.
This isn't the only time I've had to do this, either — I, through a bizarre series of events, happen to own a piece of musical equipment made in the 1960s, in the Netherlands, with weird output jacks to match:
![Male and female 2-pin DIN connectors](2pindin.jpg "By boffy_b - Own work, Copyrighted free use, https://commons.wikimedia.org/w/index.php?curid=1010205")
These are 2-pin DIN connectors, from the same family as the 5-pin DIN connectors you may be familiar with from their use in MIDI ports. My device uses a pair of these for stereo output. I can only assume this was standard at the time, in the Netherlands, but where and when I live this type of connector is all but unheard of, to the point that there are *no* cables with it available whatsoever, only the bare connectors.
In order to get this thing connected to my other equipment, I had to fashion my own adapter cable out of a stereo-to-dual-mono TRS splitter cable and two of those connectors purchased standalone from the internet.
![A Stereo 1/4" TRS to dual mono 2-pin DIN adapter cable](homebrew2pindincable.jpg)
I'm not going to attempt to teach you how to do this here — there's plenty of people on Youtube who are much more qualified to do that than me — but I think if you're at all comfortable messing with electronics this is a good skill to have. It's proven surprisingly useful to me, not just as a hobbyist who builds weird electronic gizmos for fun but as a casual enjoyer and maker of music.
If this ever happens to you, consider saving the money on some bullshit expensive cable and spending it on some [soldering gear](https://pine64.com/product-category/pinecil/) instead. It's easier than you probably think it is and it can save you, like, a lot of money.
---
<a id="n0" href="#n0r">0</a>. As of writing, I've ordered some cable sleeve to put over this. I'm not a monster. Remind me to replace this photo after it gets here and the cable looks presentable.

View file

@ -0,0 +1 @@
<?php include("../post.php");

View file

@ -0,0 +1,116 @@
## Prologue
Of late, I've been having some mildly annoying, highly esoteric issues, of the sort any desktop OS tends to develop given enough time, with my daily-driver install of the Arch-based EndeavourOS with XFCE. The most annoying of these annoyances include the XFCE panel daemon having stopped running on login, which I dealt with by binding the command to start it to a keyboard shortcut, and the monitor layout defaulting to mirrored every time I locked the screen, which I dealt with much the same way. I say of late, but I've been dealing with this shit for months. These seemed like bugs somewhere deep in XFCE that I really didn't have the energy to try to fix, so my solution was to just go scorched-earth and start again with something new.
The something new I landed on was a fresh install of Fedora. I chose Fedora partially for the GNOME desktop environment, which, to be blunt, seems to have its shit together much more than XFCE does (or KDE for that matter), and partially because I was hoping that by moving away from a rolling-release distro to something more stable I could avoid some of the inscrutable weirdness that kept materializing after updates on Arch<sup id="n1r"><a href="#n1">1</a></sup>. Plus, I was excited to once again be on an OS with some more sane defaults, like flatpaks and Bluetooth being available out of the box. This is what was going through my head as I loaded the Fedora live ISO onto a flash drive and rebooted my computer.
I had no idea what I was about to get myself into.
## The Installation Experience
The installation went very smoothly. I was actually pretty impressed. It was probably the fastest I've ever installed Linux - All it did was prompt me for a language, timezone, and the drive to install to and a few minutes later it was done. Fast and simple even by Linux installation standards. It was the next part that was painful.
## Setup (Or Rather, My Doomed Attempt Thereof)
I should say here that this isn't a review of Fedora as much as it is just me venting. It seems like it would be great for the kind of user it's designed for, but as it turns out that is *not* me. Honestly, a lot of this stuff may or may not have been my fault. Anyway, on to the pain.
The first weird thing I noticed was that Firefox had reverted to the default profile instead of recalling my settings from before. Normal, except that I store my /home/ directory on a separate drive and the first thing I did was [reconfigure my fstab](../guide_how_to_automount_drives_on_boot_in_linux/) as such, so it should have seen the config files and just loaded them right up. Odd.
I also had to manually install all the nonfree media codecs in order to watch videos on Youtube, but that's basically fine. Takes two seconds and you never have to think about it again. Would have been nice to be prompted for that on install, though.
Anyway, this issue with programs not seeing their existing config files would become a running theme. I would later discover that this had something to do with the fact that all this stuff had been installed as flatpaks, as opposed to a native installation from the distro's repositories or the AUR like it would have been before.
See, for some (probably security-related) reason, flatpaks store their config files in a different place than natively installed programs, and the preinstalled graphical Software Center, which I was using to install all this stuff, seems to like to default to flatpaks whenever possible. I never used flatpaks on my previous install because they weren't enabled by default, hence, almost none of the programs I installed remembered their previous settings.
To be clear, this probably would have been fine if flatpaks were already my go-to, but they weren't, and I wasn't about to reconfigure all my shit or go way out of my way to be particular about which packaging method I preferred for my software in order to avoid reconfiguring all my shit.
On a related note, a lot of the software in the repositories that were available to me was *severely* outdated. PrusaSlicer, for example, was only available in version 2.4.2, which was released in April of 2022. As of writing in February of 2024, the latest version is 2.7.1. It was upon going to Prusa's website to download the AppImage of the latest version like some kind of fucking caveman and discovering that AppImageLauncher<sup id="n2r"><a href="#n2">2</a></sup> wasn't in *any* of the repos that I got fed up, decided I wasn't gonna risk dealing with this type of shit for every program I wanted to install and noped out.
## Where To Next
So Fedora was a bust, so where do I go from here? I considered moving to an Ubuntu-based distribution like Pop!_OS or Mint that might give me what I wanted from Fedora, and I briefly considered going back to Manjaro for reasons I have honestly forgotten, but I had been at this for hours now and I really just wanted my computer in a usable state again with the minimum possible amount of adaptation, so I came crawling back to EndeavourOS, and went to take a nap while it installed to hopefully come back to this ordeal with a cooler head.
I kept using GNOME, though. I kinda like it. I switched to XFCE initially because I had been looking at r/unixporn and had it in my head that I wanted really granular customization, but that honestly didn't last long. I got it looking [decent](https://rosepinetheme.com/) and then got bored. Eventually, the creeping accumulation of jank and bugs got tiresome, and my hope is that GNOME is sufficiently well-integrated and UX-designed to avoid some of that.
I have a couple issues with GNOME, though. I don't much like the MacOS-style grid of large icons as an app launcher, for one, having gotten used to the density of a barely-configured Rofi menu. I've also gotten used to seeing at a glance what programs I have open, from years of using basically every desktop environment but GNOME, from KDE to XFCE to fucking Windows. I'd like if that was available in, say, the positively barren top panel. I found an extension for that, but it doesn't seem to work properly.
Beyond that, I've been acclimating to the fresh install pretty much fine. All my programs are set up the way I like them again, which is nice. Turns out GNOME ships with Wayland by default now, and it's actually been giving me fewer issues than I was expecting. Even gaming is fine from what I've seen so far (what kind of topsy turvy world are we living in where gaming is one of the EASIEST things to do on Linux?), but I did have to pass the flag `-platform xcb` to OBS to get it to run. Also, the state of graphical package managers on Arch is utterly abysmal, but that's neither here nor there.
I do have one very difficult issue, though.
## What Is The Fucking Deal With ProtonVPN On Linux
I use ProtonVPN, and one of the things I attempted to do on Fedora was set it back up. I don't know what I did originally to dodge this, but trying to set it up recently, both on Fedora and on Arch, has been an excercise in navigating an insane maze of complete and utter bullshit.
Proton lists Fedora as officially supported by ProtonVPN. Great! One issue: It Fucking Isn't, It Would Seem. The ProtonVPN client is only present in the Software Center as an unofficial GTK app (as opposed to the Electron app I'm used to (I know, ugh)) that refused to work. I went to Proton's website and followed the instructions there, only to end up with a very similar looking GTK app that very similarly didn't work. Awesome.
Fortunately, ProtonVPN supports connecting using OpenVPN, and GNOME's network settings panel has an option for that built right in! I download the relevant configuration file from the ProtonVPN website and it also doesn't work. Even awesomer!
Back on Arch, which is *not* officially supported, I install the AUR package that worked perfectly before and it fails. Trying to connect via the CLI (which, by the way, didn't exist in Fedoraland) with my usual settings gives this output:
<p class="codetitle">protonvpn-cli c --cc CA -p udp</p>
```
Setting up Proton VPN.
Connecting to Proton VPN on CA#166 with UDP.
Unable to connect to Proton VPN: Proton VPN connection failed due to unknown reason.
```
Tremendously fucking helpful. Why even bother having an error message if it's gonna tell me nothing?
So I look up this "unknown reason" error and find a Github issue where someone says to run a `journalctl` command to see if there's any errors, and wouldn't you know it, I find one!
<p class="codetitle">sudo journalctl -eu NetworkManager</p>
```
"Proton VPN CA#166"]: secrets: failed to request VPN secrets #3: No agents were available for this request.
```
Progress! I think. I don't know what this means. I look up this error and find a different Github issue where someone claims to have fixed a similar issue by installing a package called nm-applet, which... doesn't seem to exist. Transcendantly spectacular!!!
(Mind you, all this is going on on a repo that was archived some time last year, which seems ominous. Please tell me that weird GTK client from Fedora that's missing a CLI isn't the up-to-date official solution.)
So I look up "nm-applet" and find a Stackoverflow thread from eight years ago where someone is describing an unrelated issue with an ancient version of GNOME and I learn that the package I'm looking for is actually called `network-manager-applet` and not `nm-applet` in the Arch repos for some reason. So I install it and run the `nm-applet` command, and, bracing for disappointment, run the command to start the VPN...
<p class="codetitle">protonvpn-cli c --cc CA -p udp</p>
```
Setting up Proton VPN.
Connecting to Proton VPN on CA#70 with UDP.
Successfully connected to Proton VPN.
```
huh.
I think the Github user I learned this from says it best in their comment:
<figure class="quote">
<blockquote>
Yes!!! It needs [network-manager]-applet!!<br><br>
Oh man, that was a saga, and what a simple fix!<br><br>
Thanks so much. I understand that protonvpn doesn't want to say that it "officially supports" desktop environments other than GNOME or KDE, but I think it would still be really great if we could add some documentation here.
</blockquote>
<figcaption>
&mdash; ExpandingMan, <a href="https://github.com/ProtonVPN/linux-cli/issues/49#issuecomment-910662957">connecting fails due to failure to get secrets #49</a>
</figcaption>
</figure>
I have a couple questions. One, why isn't this listed as a dependency if not having it breaks everything? I assume it's the fault of the person maintaining the AUR package, but that seems like a weird oversight on a family of distros where that package *clearly* does not come standard.
Two, what's going on with ProtonVPN clients on Linux? It looks like the Electron app and accompanying CLI (which I quite liked) are deprecated as of last October? And replaced with that weird GTK thing that's missing a bunch of features and doesn't include a CLI anymore? What the fuck? Why did they make it worse? I mean, it's not like this isn't part of a pattern for Proton. I'm pretty sure the Proton Drive desktop client still isn't on Linux yet.
Also, three, why wasn't network-manager-applet already installed? This thing seems like a pretty important system package, especially given the rest of network-manager was already present and seems to be the thing allowing me to connect to the internet right now. Well, such is Arch I suppose. The type of Linux user who runs this thing seems to tend towards having a pathological obsession with bloat and the relevant de-'s<sup id="n3r"><a href="#n3">3</a></sup>.
## Oh Sweet It's Fine Actually
That concludes my blog post, and the blog-post-within-a-blog-post that appears to have metastasized up there. I think you should know I finished troubleshooting both ProtonVPN *and* OBS while writing the post chronicling my suffering. Thank you for indulging my bitching and moaning about totally avoidable software problems. Who knows, maybe this will help you. For your sake, I hope it doesn't.
---
<p id="n1"><a href="#n1r">1</a>. I say Arch, and not EndeavourOS, because I used to use Manjaro and it was like this too.</p>
<p id="n2"><a href="#n2r">2</a>. AppImages are programs packaged as standalone executables. They don't need to be installed - AppImageLauncher isn't necessary to run them, but it's my preferred tool for integrating them into the system with menu entries and such.</p>
<p id="n3"><a href="#n3r">3</a>. nuts</p>

View file

@ -1,91 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>My Terrible, Horrible, No-Good, Very Bad Distro Hop</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('computer_explode.png');
}
</style>
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>isoblog</h1>
<h2 id="caption">My Terrible, Horrible, No-Good, Very Bad Distro Hop</h2>
<?php include("../post_dates.php"); ?>
<h2>Prologue</h2>
<p>Of late, I've been having some mildly annoying, highly esoteric issues, of the sort any desktop OS tends to develop given enough time, with my daily-driver install of the Arch-based EndeavourOS with XFCE. The most annoying of these annoyances include the XFCE panel daemon having stopped running on login, which I dealt with by binding the command to start it to a keyboard shortcut, and the monitor layout defaulting to mirrored every time I locked the screen, which I dealt with much the same way. I say of late, but I've been dealing with this shit for months. These seemed like bugs somewhere deep in XFCE that I really didn't have the energy to try to fix, so my solution was to just go scorched-earth and start again with something new.</p>
<p>The something new I landed on was a fresh install of Fedora. I chose Fedora partially for the GNOME desktop environment, which, to be blunt, seems to have its shit together much more than XFCE does (or KDE for that matter), and partially because I was hoping that by moving away from a rolling-release distro to something more stable I could avoid some of the inscrutable weirdness that kept materializing after updates on Arch<sup id="n1r"><a href="#n1">1</a></sup>. Plus, I was excited to once again be on an OS with some more sane defaults, like flatpaks and Bluetooth being available out of the box. This is what was going through my head as I loaded the Fedora live ISO onto a flash drive and rebooted my computer.</p>
<p>I had no idea what I was about to get myself into.</p>
<h2>The Installation Experience</h2>
<p>The installation went very smoothly. I was actually pretty impressed. It was probably the fastest I've ever installed Linux - All it did was prompt me for a language, timezone, and the drive to install to and a few minutes later it was done. Fast and simple even by Linux installation standards. It was the next part that was painful.</p>
<h2>Setup (Or Rather, My Doomed Attempt Thereof)</h2>
<p>I should say here that this isn't a review of Fedora as much as it is just me venting. It seems like it would be great for the kind of user it's designed for, but as it turns out that is <em>not</em> me. Honestly, a lot of this stuff may or may not have been my fault. Anyway, on to the pain.</p>
<p>The first weird thing I noticed was that Firefox had reverted to the default profile instead of recalling my settings from before. Normal, except that I store my /home/ directory on a separate drive and the first thing I did was <a href="../guide_how_to_automount_drives_on_boot_in_linux/">reconfigure my fstab</a> as such, so it should have seen the config files and just loaded them right up. Odd.</p>
<p>I also had to manually install all the nonfree media codecs in order to watch videos on Youtube, but that's basically fine. Takes two seconds and you never have to think about it again. Would have been nice to be prompted for that on install, though.</p>
<p>Anyway, this issue with programs not seeing their existing config files would become a running theme. I would later discover that this had something to do with the fact that all this stuff had been installed as flatpaks, as opposed to a native installation from the distro's repositories or the AUR like it would have been before.</p>
<p>See, for some (probably security-related) reason, flatpaks store their config files in a different place than natively installed programs, and the preinstalled graphical Software Center, which I was using to install all this stuff, seems to like to default to flatpaks whenever possible. I never used flatpaks on my previous install because they weren't enabled by default, hence, almost none of the programs I installed remembered their previous settings.</p>
<p>To be clear, this probably would have been fine if flatpaks were already my go-to, but they weren't, and I wasn't about to reconfigure all my shit or go way out of my way to be particular about which packaging method I preferred for my software in order to avoid reconfiguring all my shit.</p>
<p>On a related note, a lot of the software in the repositories that were available to me was <em>severely</em> outdated. PrusaSlicer, for example, was only available in version 2.4.2, which was released in April of 2022. As of writing in February of 2024, the latest version is 2.7.1. It was upon going to Prusa's website to download the AppImage of the latest version like some kind of fucking caveman and discovering that AppImageLauncher<sup id="n2r"><a href="#n2">2</a></sup> wasn't in <em>any</em> of the repos that I got fed up, decided I wasn't gonna risk dealing with this type of shit for every program I wanted to install and noped out.</p>
<h2>Where To Next</h2>
<p>So Fedora was a bust, so where do I go from here? I considered moving to an Ubuntu-based distribution like Pop!_OS or Mint that might give me what I wanted from Fedora, and I briefly considered going back to Manjaro for reasons I have honestly forgotten, but I had been at this for hours now and I really just wanted my computer in a usable state again with the minimum possible amount of adaptation, so I came crawling back to EndeavourOS, and went to take a nap while it installed to hopefully come back to this ordeal with a cooler head.</p>
<p>I kept using GNOME, though. I kinda like it. I switched to XFCE initially because I had been looking at r/unixporn and had it in my head that I wanted really granular customization, but that honestly didn't last long. I got it looking <a href="https://rosepinetheme.com/">decent</a> and then got bored. Eventually, the creeping accumulation of jank and bugs got tiresome, and my hope is that GNOME is sufficiently well-integrated and UX-designed to avoid some of that.</p>
<p>I have a couple issues with GNOME, though. I don't much like the MacOS-style grid of large icons as an app launcher, for one, having gotten used to the density of a barely-configured Rofi menu. I've also gotten used to seeing at a glance what programs I have open, from years of using basically every desktop environment but GNOME, from KDE to XFCE to fucking Windows. I'd like if that was available in, say, the positively barren top panel. I found an extension for that, but it doesn't seem to work properly.</p>
<p>Beyond that, I've been acclimating to the fresh install pretty much fine. All my programs are set up the way I like them again, which is nice. Turns out GNOME ships with Wayland by default now, and it's actually been giving me fewer issues than I was expecting. Even gaming is fine from what I've seen so far (what kind of topsy turvy world are we living in where gaming is one of the EASIEST things to do on Linux?), but I did have to pass the flag <code>-platform xcb</code> to OBS to get it to run. Also, the state of graphical package managers on Arch is utterly abysmal, but that's neither here nor there.</p>
<p>I do have one very difficult issue, though.</p>
<h2>What Is The Fucking Deal With ProtonVPN On Linux</h2>
<p>I use ProtonVPN, and one of the things I attempted to do on Fedora was set it back up. I don't know what I did originally to dodge this, but trying to set it up recently, both on Fedora and on Arch, has been an excercise in navigating an insane maze of complete and utter bullshit.</p>
<p>Proton lists Fedora as officially supported by ProtonVPN. Great! One issue: It Fucking Isn't, It Would Seem. The ProtonVPN client is only present in the Software Center as an unofficial GTK app (as opposed to the Electron app I'm used to (I know, ugh)) that refused to work. I went to Proton's website and followed the instructions there, only to end up with a very similar looking GTK app that very similarly didn't work. Awesome.</p>
<p>Fortunately, ProtonVPN supports connecting using OpenVPN, and GNOME's network settings panel has an option for that built right in! I download the relevant configuration file from the ProtonVPN website and it also doesn't work. Even awesomer!</p>
<p>Back on Arch, which is <em>not</em> officially supported, I install the AUR package that worked perfectly before and it fails. Trying to connect via the CLI (which, by the way, didn't exist in Fedoraland) with my usual settings gives this output:</p>
<code>
<span class="codetitle">protonvpn-cli c --cc CA -p udp</span>
Setting up Proton VPN.<br>
Connecting to Proton VPN on CA#166 with UDP.<br>
<br>
Unable to connect to Proton VPN: Proton VPN connection failed due to unknown reason.
</code>
<p>Tremendously fucking helpful. Why even bother having an error message if it's gonna tell me nothing?</p>
<p>So I look up this "unknown reason" error and find a Github issue where someone says to run a <code>journalctl</code> command to see if there's any errors, and wouldn't you know it, I find one!</p>
<code>
<span class="codetitle">sudo journalctl -eu NetworkManager</span>
"Proton VPN CA#166"]: secrets: failed to request VPN secrets #3: No agents were available for this request.
</code>
<p>Progress! I think. I don't know what this means. I look up this error and find a different Github issue where someone claims to have fixed a similar issue by installing a package called nm-applet, which... doesn't seem to exist. Transcendantly spectacular!!!</p>
<p>(Mind you, all this is going on on a repo that was archived some time last year, which seems ominous. Please tell me that weird GTK client from Fedora that's missing a CLI isn't the up-to-date official solution.)</p>
<p>So I look up "nm-applet" and find a Stackoverflow thread from eight years ago where someone is describing an unrelated issue with an ancient version of GNOME and I learn that the package I'm looking for is actually called <code>network-manager-applet</code> and not <code>nm-applet</code> in the Arch repos for some reason. So I install it and run the <code>nm-applet</code> command, and, bracing for disappointment, run the command to start the VPN...</p>
<code>
<span class="codetitle">protonvpn-cli c --cc CA -p udp</span>
Setting up Proton VPN.<br>
Connecting to Proton VPN on CA#70 with UDP.<br>
<br>
<span style="color: limegreen; font-weight: bold;">Successfully connected to Proton VPN.</span>
</code>
<p>huh.</p>
<p>I think the Github user I learned this from says it best in their comment:</p>
<figure class="quote">
<blockquote>
Yes!!! It needs [network-manager]-applet!!<br><br>
Oh man, that was a saga, and what a simple fix!<br><br>
Thanks so much. I understand that protonvpn doesn't want to say that it "officially supports" desktop environments other than GNOME or KDE, but I think it would still be really great if we could add some documentation here.
</blockquote>
<figcaption>
&mdash; ExpandingMan, <a href="https://github.com/ProtonVPN/linux-cli/issues/49#issuecomment-910662957">connecting fails due to failure to get secrets #49</a>
</figcaption>
</figure>
<p>I have a couple questions. One, why isn't this listed as a dependency if not having it breaks everything? I assume it's the fault of the person maintaining the AUR package, but that seems like a weird oversight on a family of distros where that package <em>clearly</em> does not come standard.</p>
<p>Two, what's going on with ProtonVPN clients on Linux? It looks like the Electron app and accompanying CLI (which I quite liked) are deprecated as of last October? And replaced with that weird GTK thing that's missing a bunch of features and doesn't include a CLI anymore? What the fuck? Why did they make it worse? I mean, it's not like this isn't part of a pattern for Proton. I'm pretty sure the Proton Drive desktop client still isn't on Linux yet.</p>
<p>Also, three, why wasn't network-manager-applet already installed? This thing seems like a pretty important system package, especially given the rest of network-manager was already present and seems to be the thing allowing me to connect to the internet right now. Well, such is Arch I suppose. The type of Linux user who runs this thing seems to tend towards having a pathological obsession with bloat and the relevant de-'s<sup id="n3r"><a href="#n3">3</a></sup>.<p>
<h2>Oh Sweet It's Fine Actually</h2>
<p>That concludes my blog post, and the blog-post-within-a-blog-post that appears to have metastasized up there. I think you should know I finished troubleshooting both ProtonVPN <em>and</em> OBS while writing the post chronicling my suffering. Thank you for indulging my bitching and moaning about totally avoidable software problems. Who knows, maybe this will help you. For your sake, I hope it doesn't.</p>
<hr>
<p id="n1"><a href="#n1r">1</a>. I say Arch, and not EndeavourOS, because I used to use Manjaro and it was like this too.</p>
<p id="n2"><a href="#n2r">2</a>. AppImages are programs packaged as standalone executables. They don't need to be installed - AppImageLauncher isn't necessary to run them, but it's my preferred tool for integrating them into the system with menu entries and such.</p>
<p id="n3"><a href="#n3r">3</a>. nuts</p>
<?php include("../../comment/form.php"); ?>
</body>
</html>

45
blog/posts/post.php Normal file
View file

@ -0,0 +1,45 @@
<?php
$cwd = preg_replace('/^.*\//', '', getcwd());
$feed = simplexml_load_file($_SERVER['DOCUMENT_ROOT']."/blog/blog.atom");
$pdate = "";
$udate = "";
$title = "";
$descr = "";
foreach($feed->entry as $entry) {
if($entry->id == $cwd) {
$pdate = preg_replace('/T.*$/', ' ', $entry->published);
$udate = preg_replace('/T.*$/', ' ', $entry->updated);
$title = $entry->title;
$descr = $entry->summary;
break;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><?php echo($title); ?></title>
<?php echo("<meta name='description' content='$descr'>"); ?>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('bg.svg'), url('bg.png'), url('bg.jpg'), url('bg.webp');
}
</style>
</head>
<body>
<?php
include($_SERVER['DOCUMENT_ROOT'] . '/nav.php');
$udates = "";
if($pdate != $udate) { $udates = " | Updated&nbsp;on&nbsp;$udate"; }
echo("<h1>isoblog</h1><h2 id='caption'>$title</h2><p style='text-align: center;'><em>Posted&nbsp;on&nbsp;$pdate$udates</em></p>");
include("../Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents("index.md"));
include("../../comment/form.php");
?>
</body>
</html>

View file

@ -1,18 +0,0 @@
<?php
$cwd = preg_replace('/^.*\//', '', getcwd());
$feed = simplexml_load_file($_SERVER['DOCUMENT_ROOT']."/blog/blog.atom");
$pdate = "";
$udate = "";
foreach($feed->entry as $entry) {
if($entry->id == $cwd) {
$pdate = preg_replace('/T.*$/', ' ', $entry->published);
$udate = preg_replace('/T.*$/', ' ', $entry->updated);
break;
}
}
echo("<p style='text-align: center;'><em>Posted&nbsp;on&nbsp;$pdate");
if($pdate != $udate) {
echo(" | Updated&nbsp;on&nbsp;$udate");
}
echo("</em></p>");
?>

View file

@ -0,0 +1,55 @@
[Well this fucking sucks.](https://archive.ph/gBpXw)
**[UPDATE 2023-09-23]** This policy has changed significantly for the better since this article was written, and I wanted to update this post for completeness, but I'm leaving the original article alone because I think it's important for people to know everything Unity *tried* to get away with, and not just what it ended up doing. I've added my thoughts on the changes to the end of this article.
The company behind Unity, an extremely popular game engine used to make [some games you may have heard of](https://store.steampowered.com/curator/39750107-Games-Made-With-Unity/) (including about a fifth of my Steam library, for reference), has just announced a new fee for developers using their engine.
In essence, as of next year, developers will owe Unity a fee for every time their game made with the engine is installed after certain retroactive revenue and install base thresholds. There's various different tiers of this, but for the free plan you and I would be using it amounts to $0.20 per install after the first 200,000 installs and $200,000 of revenue.
Side note - How these installs are counted is left intentionally vague too, so it's unclear whether it's a severe violation of user privacy or vulnerable to abuse by maliciously performing repeated reinstalls of a game, or perhaps both. Plus, this also means that even pirated copies might count towards the total.
I won't mince words: **this absurd pricing change has the potential to sink a lot of small game development studios**, especially those working on games that are extremely popular or not aggressively monetized.
For example, Among Us has over 500 million downloads on the Google Play Store alone. Under this pricing scheme, that would cost its developer, Innersloth, $100,000,000 on the free plan, or a paltry $5,000,000 if they're using the if-you-have-to-ask-you-can't-afford-it Enterprise plan. I don't have access to Innersloth's financial data, but that's probably at least a year or two of pay for all of their employees at the absolute minimum, more if they're on a cheaper plan. I seriously doubt they can afford this.
That's an extreme example, but I think it gets the point across. If you don't believe me, take it from developers on Twitter (via [u/Sparky2199](https://archive.ph/IQPjW)):
[![Compilation of various twitter posts from indie game studios using Unity complaining about the change.](devprotest.png)](devprotest.png)
## The obligatory free software soapbox moment
As angry as I am about this, I do feel kind of vindicated, because here's the thing: something like this was always going to happen. Not because Unity in particular is a *bad* company (although it is), but because it's a *for-profit* company, and especially because it's one with shareholders to please.
Capitalism demands infinite growth, but there's a finite number of people to sell a game engine to, so at a certain point Unity has no choice but to start trying to squeeze more money out of its existing customer base (or expand the customer base by, say, trying to cater to filmmakers). Though certain internal factors definitely sped up the process of reaching this point, Unity was bound to get desperate enough to try some shit like this eventually.
And that's the danger here. When you become reliant on something in order to do your work, you're inherently gambling on it being still around and usable until you're done. In the case of proprietary software (and cloud services, but that's a different rant), you're betting on the company not changing the software or the terms of the license on you, or going under, or just deciding the software isn't worth it to maintain anymore. In Unity's case, we're seeing what happens when you place a losing bet. Suddenly the company hates you and you've gotta migrate to something else, and if you can't you're SOL. Sure, an open-source project might die off as its developers lose interest or can't work on it anymore, but then somebody might fork it, or you have the right to maintain it yourself, if you can. Only proprietary software can suddenly decide you're not *allowed* to use it anymore.
Videogames in particular are hit especially hard by this - they often take years to make, and are often incredibly complex, to the point where porting a game between engines can be harder than making it to begin with, so choosing an engine is a *huge* commitment that not every studio or developer can afford to go back on. Something like this can easily kill a project, both financially and from simple loss of motivation.
This problem isn't unique to Unity, or to game engines. We've been watching this play out across the industry for as long as there's been an industry, except normally companies boil the frog a lot more slowly and in ways that are a lot more subtle. Google didn't go from world's best search engine to mega-monopolistic adware provider overnight. To extend the metaphor, Unity just tossed a grenade in the pot.
It's my opinion that all proprietary software will die this way in the end. The structure is fundamentally unsustainable. You can't have infinite growth. At some point all the proprietary software and services that are commomplace nowadays with their ad-supported business models and predatory pricing schemes and suspiciously high marketing budgets will wither and die, having made themselves intolerable to even their most loyal customers, and most of the survivors will be open-source projects. Not as sleek or sexy or well-advertised, as they'll have had less incentive to appeal to new users, but fundamentally sustainable, having had *no* incentive to appeal to shareholders.
## An attempt at optimism
In this particular case, I don't think this is gonna stick. Unity's runtime fee is absurd, and I think they know it just as well as all their moderately high-profile customers on Twitter do. Unity has already started to walk back some of the more extreme parts of the initial plan, as you can see on archived versions of the posts: [Blog post (Sep 12)](https://archive.ph/gEckm), [Blog post (Sep 14)](https://archive.ph/gBpXw), [Forum thread (Sep 12)](https://archive.ph/HYTq5), [Forum thread (Sep 14)](https://archive.ph/eByMm). Unity also has some customers that are bigger than them and notoriously litigation-happy, namely Nintendo (with Pokemon BD/SP and Go, plus a couple Mario mobile games) and Disney (also with quite a few mobile and console games). Unity's CEO also sold a bunch of stock in the company in the lead-up to this announcement, which, since the company's stock price dropped *significantly* after the announcement, might actually constitute fraud. You know, from federal crimes! Basically, this initial announcement was probably an attempt to see how much they could get away with, and Unity's probably fucked if they stick to their guns on this.
On the technical side, if you're a budding game developer, Unity isn't your only option. My top recommendation is [Godot](https://godotengine.org/), a free and open source game engine that's recently taken steps to increase its funding in a way that's actually sane and not cartoon villain behavior. It also supports C# by default, since you probably got used to that with Unity. There's also RPG Maker and Unreal Engine, the latter of which I imagine a lot of studios will be switching to soon.
Finally, if you've been eyeing a game that uses the Unity engine, you've got until the end of the year to install it without incurring that fee for the developer assuming this change goes through. So I'd check for that. By my understanding you'll have to run it at least once before then, too.
## Update as of 2023-09-23
Good(?) news! Unity's responded to community feedback and it's actually... better than I expected. You can read the full post [here](https://archive.ph/rLi8u), but I'll summarize the changes:
- No more runtime fee for the free Personal tier
- Revenue cap for the Personal tier doubled and mandatory splash screen removed
- The runtime fee now only applies starting with the next LTS release in 2024
- The runtime fee is now capped at 2.5% of total revenue, and all relevant data is now self-reported instead of a "proprietary data model"
- Just like, a straight up apology at the beginning of the post
This is all good. These changes remove all of the most devastating knock-on effects of the original policy, and I think this is actually a *better* deal for free users than before.
That said, my original point still stands. Unity is still squeezing more money out of its userbase in a way it hadn't previously, and it could pull some shit like this again at any time. Just because it caved this time, doesn't mean there's anything stopping Unity from making more horrible retroactive policy changes in future. Unity has destroyed a lot of the trust it's built with its community - a lot of developers won't trust Unity not to screw them over in the future, and in my opinion they'd be right not to.
It's my hope that a lot of game developers will take this opportunity to ditch Unity for something better. At the very least, I don't think we'll see many games de-listed like Cult of the Lamb [threatened to do](https://archive.ph/4xyTO), since existing games can just not update their Unity release. A lot of games may still be forced to move engines if they don't want to deal with this, though. For example, support for new consoles, OS versions, etc. probably won't be backported to old Unity versions. Games that continually add new content or aren't finished yet will probably eventually start encountering issues resulting from this.

View file

@ -1,54 +1 @@
<!DOCTYPE html> <?php include("../post.php");
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>The Unity Runtime Fee and Proprietary Software</title>
<link href="/style.css" rel="stylesheet" type="text/css" media="all">
<link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
<style>
h1 {
background-image: url('unity.svg');
}
</style>
</head>
<body>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
<h1>isoblog</h1>
<h2 id="caption">The Unity Runtime Fee and Proprietary Software</h2>
<?php include("../post_dates.php"); ?>
<p><a href="https://archive.ph/gBpXw">Well this fucking sucks.</a></p>
<p><strong>[UPDATE 2023-09-23]</strong> This policy has changed significantly for the better since this article was written, and I wanted to update this post for completeness, but I'm leaving the original article alone because I think it's important for people to know everything Unity <em>tried</em> to get away with, and not just what it ended up doing. I've added my thoughts on the changes to the end of this article.</p>
<p>The company behind Unity, an extremely popular game engine used to make <a href="https://store.steampowered.com/curator/39750107-Games-Made-With-Unity/">some games you may have heard of</a> (including about a fifth of my Steam library, for reference), has just announced a new fee for developers using their engine.</p>
<p>In essence, as of next year, developers will owe Unity a fee for every time their game made with the engine is installed after certain retroactive revenue and install base thresholds. There's various different tiers of this, but for the free plan you and I would be using it amounts to $0.20 per install after the first 200,000 installs and $200,000 of revenue.</p>
<p>Side note - How these installs are counted is left intentionally vague too, so it's unclear whether it's a severe violation of user privacy or vulnerable to abuse by maliciously performing repeated reinstalls of a game, or perhaps both. Plus, this also means that even pirated copies might count towards the total.</p>
<p>I won't mince words: <strong>this absurd pricing change has the potential to sink a lot of small game development studios</strong>, especially those working on games that are extremely popular or not aggressively monetized.</p>
<p>For example, Among Us has over 500 million downloads on the Google Play Store alone. Under this pricing scheme, that would cost its developer, Innersloth, $100,000,000 on the free plan, or a paltry $5,000,000 if they're using the if-you-have-to-ask-you-can't-afford-it Enterprise plan. I don't have access to Innersloth's financial data, but that's probably at least a year or two of pay for all of their employees at the absolute minimum, more if they're on a cheaper plan. I seriously doubt they can afford this.</p>
<p>That's an extreme example, but I think it gets the point across. If you don't believe me, take it from developers on Twitter (via <a href="https://archive.ph/IQPjW">u/Sparky2199</a>):</p>
<a href="devprotest.png"><img src="devprotest.png" alt="Compilation of various twitter posts from indie game studios using Unity complaining about the change."/></a>
<h2>The obligatory free software soapbox moment</h2>
<p>As angry as I am about this, I do feel kind of vindicated, because here's the thing: something like this was always going to happen. Not because Unity in particular is a <em>bad</em> company (although it is), but because it's a <em>for-profit</em> company, and especially because it's one with shareholders to please.</p>
<p>Capitalism demands infinite growth, but there's a finite number of people to sell a game engine to, so at a certain point Unity has no choice but to start trying to squeeze more money out of its existing customer base (or expand the customer base by, say, trying to cater to filmmakers). Though certain internal factors definitely sped up the process of reaching this point, Unity was bound to get desperate enough to try some shit like this eventually.</p>
<p>And that's the danger here. When you become reliant on something in order to do your work, you're inherently gambling on it being still around and usable until you're done. In the case of proprietary software (and cloud services, but that's a different rant), you're betting on the company not changing the software or the terms of the license on you, or going under, or just deciding the software isn't worth it to maintain anymore. In Unity's case, we're seeing what happens when you place a losing bet. Suddenly the company hates you and you've gotta migrate to something else, and if you can't you're SOL. Sure, an open-source project might die off as its developers lose interest or can't work on it anymore, but then somebody might fork it, or you have the right to maintain it yourself, if you can. Only proprietary software can suddenly decide you're not <em>allowed</em> to use it anymore.</p>
<p>Videogames in particular are hit especially hard by this - they often take years to make, and are often incredibly complex, to the point where porting a game between engines can be harder than making it to begin with, so choosing an engine is a <em>huge</em> commitment that not every studio or developer can afford to go back on. Something like this can easily kill a project, both financially and from simple loss of motivation.</p>
<p>This problem isn't unique to Unity, or to game engines. We've been watching this play out across the industry for as long as there's been an industry, except normally companies boil the frog a lot more slowly and in ways that are a lot more subtle. Google didn't go from world's best search engine to mega-monopolistic adware provider overnight. To extend the metaphor, Unity just tossed a grenade in the pot.</p>
<p>It's my opinion that all proprietary software will die this way in the end. The structure is fundamentally unsustainable. You can't have infinite growth. At some point all the proprietary software and services that are commomplace nowadays with their ad-supported business models and predatory pricing schemes and suspiciously high marketing budgets will wither and die, having made themselves intolerable to even their most loyal customers, and most of the survivors will be open-source projects. Not as sleek or sexy or well-advertised, as they'll have had less incentive to appeal to new users, but fundamentally sustainable, having had <em>no</em> incentive to appeal to shareholders.</p>
<h2>An attempt at optimism</h2>
<p>In this particular case, I don't think this is gonna stick. Unity's runtime fee is absurd, and I think they know it just as well as all their moderately high-profile customers on Twitter do. Unity has already started to walk back some of the more extreme parts of the initial plan, as you can see on archived versions of the posts: <a href="https://archive.ph/gEckm">Blog post (Sep 12)</a>, <a href="https://archive.ph/gBpXw">Blog post (Sep 14)</a>, <a href="https://archive.ph/HYTq5">Forum thread (Sep 12)</a>, <a href="https://archive.ph/eByMm">Forum thread (Sep 14)</a>. Unity also has some customers that are bigger than them and notoriously litigation-happy, namely Nintendo (with Pokemon BD/SP and Go, plus a couple Mario mobile games) and Disney (also with quite a few mobile and console games). Unity's CEO also sold a bunch of stock in the company in the lead-up to this announcement, which, since the company's stock price dropped <em>significantly</em> after the announcement, might actually constitute fraud. You know, from federal crimes! Basically, this initial announcement was probably an attempt to see how much they could get away with, and Unity's probably fucked if they stick to their guns on this.</p>
<p>On the technical side, if you're a budding game developer, Unity isn't your only option. My top recommendation is <a href="https://godotengine.org/">Godot</a>, a free and open source game engine that's recently taken steps to increase its funding in a way that's actually sane and not cartoon villain behavior. It also supports C# by default, since you probably got used to that with Unity. There's also RPG Maker and Unreal Engine, the latter of which I imagine a lot of studios will be switching to soon.</p>
<p>Finally, if you've been eyeing a game that uses the Unity engine, you've got until the end of the year to install it without incurring that fee for the developer assuming this change goes through. So I'd check for that. By my understanding you'll have to run it at least once before then, too.</p>
<h2>Update as of 2023-09-23</h2>
<p>Good(?) news! Unity's responded to community feedback and it's actually... better than I expected. You can read the full post <a href="https://archive.ph/rLi8u">here</a>, but I'll summarize the changes:</p>
<ul>
<li>No more runtime fee for the free Personal tier</li>
<li>Revenue cap for the Personal tier doubled and mandatory splash screen removed</li>
<li>The runtime fee now only applies starting with the next LTS release in 2024</li>
<li>The runtime fee is now capped at 2.5% of total revenue, and all relevant data is now self-reported instead of a "proprietary data model"</li>
<li>Just like, a straight up apology at the beginning of the post</li>
</ul>
<p>This is all good. These changes remove all of the most devastating knock-on effects of the original policy, and I think this is actually a <em>better</em> deal for free users than before.</p>
<p>That said, my original point still stands. Unity is still squeezing more money out of its userbase in a way it hadn't previously, and it could pull some shit like this again at any time. Just because it caved this time, doesn't mean there's anything stopping Unity from making more horrible retroactive policy changes in future. Unity has destroyed a lot of the trust it's built with its community - a lot of developers won't trust Unity not to screw them over in the future, and in my opinion they'd be right not to.</p>
<p>It's my hope that a lot of game developers will take this opportunity to ditch Unity for something better. At the very least, I don't think we'll see many games de-listed like Cult of the Lamb <a href="https://archive.ph/4xyTO">threatened to do</a>, since existing games can just not update their Unity release. A lot of games may still be forced to move engines if they don't want to deal with this, though. For example, support for new consoles, OS versions, etc. probably won't be backported to old Unity versions. Games that continually add new content or aren't finished yet will probably eventually start encountering issues resulting from this.</p>
<?php include("../../comment/form.php"); ?>
</body>
</html>

View file

@ -1,22 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="256"
height="263"
viewBox="0 0 256 263"
version="1.1"
preserveAspectRatio="xMidYMid"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs1" />
<g
fill="#222C37"
id="g1"
style="fill:#ffffff;fill-opacity:1">
<path
d="m 166.87233,131.23686 45.90879,-79.274513 22.18445,79.274513 -22.18445,79.25638 z m -22.37641,12.87366 45.91626,79.26278 -79.96661,-20.48673 -57.77043,-58.77605 z M 190.40151,39.078026 144.49592,118.35254 H 52.67514 L 110.44557,59.573289 Z M 255.94071,104.25891 227.93262,0.06035193 123.39281,27.985268 107.91819,55.192492 76.516786,54.96748 0,131.24432 76.516786,207.50304 h 0.0032 l 31.387534,-0.23248 15.49702,27.20723 104.52808,27.92065 28.00809,-104.17937 -15.90545,-26.98221 z"
id="path1"
style="fill:#ffffff;fill-opacity:1" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 950 B

View file

@ -33,6 +33,9 @@
width: 250px; width: 250px;
} }
} }
body {
max-width: var(--bodywidth);
}
</style> </style>
<?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?> <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?>
</head> </head>

View file

@ -13,6 +13,8 @@ function echolink($url, $name) {
echo "<nav id='main-nav'>"; echo "<nav id='main-nav'>";
if($_SERVER["DOCUMENT_ROOT"] !== getcwd()) { if($_SERVER["DOCUMENT_ROOT"] !== getcwd()) {
echo "<a href='https://$host/'>home</a> "; echo "<a href='https://$host/'>home</a> ";
} else {
echo("<a href='https://deeptwisty.com' style='text-decoration: none;' title='the website where i post my various art. i like to compartmentalize'><span style=' margin: 0; padding: 0; font-style: italic; background: linear-gradient(135deg, #2e1ae0 0%, #2e1ae0 35%, #00ff00 65%, #ffff00 90%); background-clip: text; -webkit-text-fill-color: transparent;'>deep twisty</span></a>");
} }
echolink("about", "about"); echolink("about", "about");
echolink("uses", "uses"); echolink("uses", "uses");

View file

@ -166,29 +166,30 @@ body > a {
/* Code snippets */ /* Code snippets */
code { code {
background-color: black;
padding: 0.15rem; padding: 0.15rem;
} }
:is(main,body,pre) > code { pre > code {
display: block; display: block;
margin-bottom: 1rem;
overflow-x: auto;
}
code, .codetitle {
background-color: black;
font-size: .8rem;
}
pre > code, .codetitle {
width: 75%; width: 75%;
margin: auto; margin: auto;
margin-bottom: 1rem;
padding: 0.7rem;
border: 1px solid #00ffd5; border: 1px solid #00ffd5;
padding: 0.7rem;
} }
:is(main,body,pre) > code > span.codetitle { .codetitle {
margin: -0.7rem; margin-bottom: 0;
margin-top: -0.4rem; border-bottom: none;
margin-bottom: 0.7rem;
padding-bottom: 0.2rem;
font-weight: normal;
top: 0;
left: 0;
right: 0;
text-align: center; text-align: center;
border-bottom: 1px solid #00ffd5; }
display: block; .codetitle + pre {
margin-top: 0;
} }
/* Tables */ /* Tables */
@ -321,8 +322,9 @@ hr {
body > a { body > a {
margin-left: 0; margin-left: 0;
} }
:is(main,body,pre) > code { pre > code, .codetitle {
border-width: .1rem; border-width: .1rem;
width: initial;
} }
@media (max-width: 43rem) { @media (max-width: 43rem) {
.buttons > * { .buttons > * {
@ -332,9 +334,6 @@ hr {
width: 100%; width: 100%;
} }
} }
code {
font-size: 0.8em;
}
#leftsidebg, #rightsidebg { #leftsidebg, #rightsidebg {
top: 0; left: 0; right: 0; bottom: 0; top: 0; left: 0; right: 0; bottom: 0;
box-shadow: 100vw 0 0 #000000bb inset; box-shadow: 100vw 0 0 #000000bb inset;