<?xml version="1.0" encoding="utf-8"?>
<feed
  xmlns="http://www.w3.org/2005/Atom"
  xml:lang="en"
>
  <title>🌱🐈 (meow.garden)</title>
  <subtitle>I&#39;m Ash! This is my personal blog for writing about life &amp; the things that fill mine.</subtitle>
  <link href="https://meow.garden/rss.xml" rel="self" />
  <link href="https://meow.garden/" />
  <updated>2026-04-10T07:34:49Z</updated>
  <id>https://meow.garden/</id>
  <author>
    <name>Ash</name>
  </author>
  <entry>
    <title>It&#39;s time to secure your DMs... in style</title>
    <link href="https://meow.garden/secure-and-personalized-dms/" />
    <updated>2026-04-05T03:25:00Z</updated>
    <id>https://meow.garden/secure-and-personalized-dms/</id>
    <content
      type="html"
      >&lt;p&gt;Don&#39;t freak out, I&#39;m not sounding the alarm bells on anything in particular.
Take this post as an outstretched hand,
here to guide you into the world of truly secure &amp;amp; private communication.
It won&#39;t be perfect,
but there are fewer compromises involved than you might&#39;ve been led to expect,
including some options for personalization that are easily overlooked.
I think the tradeoffs are more than worth it in today&#39;s world.&lt;/p&gt;
&lt;h2&gt;An app from the heavens&lt;/h2&gt;
&lt;p&gt;Let&#39;s not bury the lede any further:
&lt;strong&gt;Signal&lt;/strong&gt; is the primary focus of this post.
Signal is an &lt;em&gt;outstandingly&lt;/em&gt; user-friendly implementation of end-to-end encryption,
requiring only a phone number
and a short &lt;abbr tabindex=&quot;0&quot; title=&quot;personal identification number&quot;&gt;PIN&lt;/abbr&gt; to get started.&lt;/p&gt;
&lt;p&gt;Some notes on those requirements:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In the distant past, your phone number &lt;em&gt;was&lt;/em&gt; your Signal handle,
meaning you had to give it to people you wanted to talk to on Signal.
This hasn&#39;t been the case for years:
Signal now has &lt;a href=&quot;https://support.signal.org/hc/en-us/articles/6712070553754-Phone-Number-Privacy-and-Usernames&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;usernames&lt;/a&gt;,
with mandatory discriminators,¹
as well as robust &amp;amp; well-documented &lt;a href=&quot;https://support.signal.org/hc/en-us/articles/6712070553754-Phone-Number-Privacy-and-Usernames&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;phone number privacy settings&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;As for PINs,
Signal developed something called &lt;a href=&quot;https://signal.org/blog/secure-value-recovery/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;secure value recovery&lt;/a&gt;
that — to explain it briefly —
stores your PIN &lt;em&gt;exclusively&lt;/em&gt; in encrypted memory on their servers,
uses encrypted computation to check PIN entry attempts and enforce a limit on failed guesses,
and mitigates platform-level attacks by distributing computation across multiple cloud providers.
So, if you read &amp;quot;PIN&amp;quot; and thought &amp;quot;can&#39;t those be brute-forced?&amp;quot;,
they&#39;re way ahead of you.
Really cool stuff!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What Signal gives you in return for these things
is a truly end-to-end encryption solution.
The only bits of information Signal can access
(such as &lt;a href=&quot;https://signal.org/bigbrother/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;to respond to subpoenas&lt;/a&gt;)
are your phone number and your account creation date.
Seriously, that&#39;s &lt;em&gt;it&lt;/em&gt;.
Not only are 100% of messages encrypted,
but all of the &lt;em&gt;metadata&lt;/em&gt; —
who you&#39;re talking to,
when you&#39;re talking to them,
your Signal profile details,
even what sticker packs you&#39;ve uploaded &amp;amp; used —
&lt;em&gt;all of it&lt;/em&gt; is encrypted.&lt;/p&gt;
&lt;p&gt;The Signal protocol has been &lt;a href=&quot;https://eprint.iacr.org/2016/1013.pdf&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;formally audited&lt;/a&gt;
by researchers across the globe,
who found &amp;quot;no major flaws in the design&amp;quot;.
Signal is the real deal;
it sets the bar for other communication apps
that make equivalent claims about privacy &amp;amp; security.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;
  ¹ Discriminators (numbers at the end of a username) are a very good thing!
    They drastically nerf the value of usernames,
    particularly those that are common names or words,
    unusually short, or otherwise sought-after.
    Having a (likely unofficial) marketplace of usernames
    would be a massive distraction from Signal&#39;s goals,
    and probably yours too.
&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;The landscape beneath Signal&lt;/h2&gt;
&lt;p&gt;Now you know where the bar is set.
I&#39;ll talk more about Signal later,
but first,
let&#39;s look at the other messaging apps out there
that claim to be secure, private, or both.&lt;/p&gt;
&lt;h3&gt;WhatsApp&lt;/h3&gt;
&lt;p&gt;WhatsApp claims to offer end-to-end encrypted messages.
I say &amp;quot;claims to&amp;quot; because it&#39;s closed-source,
meaning the veracity of this statement can&#39;t be verified externally.&lt;/p&gt;
&lt;p&gt;Furthermore, all that &lt;em&gt;metadata&lt;/em&gt; like &amp;quot;who you&#39;re talking to&amp;quot;
is certainly not end-to-end encrypted.&lt;/p&gt;
&lt;p&gt;Further-furthermore, WhatsApp is owned by Meta,
a notoriously data-hungry and anti-privacy company.
This alone means I&#39;m never touching this app with a ten-foot pole.
&lt;strong&gt;I recommend staying away from WhatsApp.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Telegram&lt;/h3&gt;
&lt;p&gt;Telegram claims to be both private and secure.
I say &amp;quot;claims to&amp;quot; for a whole mess of reasons.
Here are some of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Chats are &lt;em&gt;not&lt;/em&gt; end-to-end encrypted by default.
You have to go through a &lt;a href=&quot;https://blog.cryptographyengineering.com/2024/08/25/telegram-is-not-really-an-encrypted-messaging-app/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;bizarrely complicated sequence of steps&lt;/a&gt;
to start a &amp;quot;Secure Chat&amp;quot; on &lt;em&gt;each conversation&lt;/em&gt; you want to encrypt.
Not good!
&lt;ul&gt;
&lt;li&gt;Instead, Telegram opts to encrypt the bulk of messages at rest
using a key within their control, storing the encrypted messages and the key
across &lt;a href=&quot;https://telegram.org/faq#q-do-you-process-data-requests&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;geographically disparate data centers&lt;/a&gt;.
This is good news for some narrow threat models,
but Telegram themselves can still decrypt your non-Secure Chat messages,
so this misses Signal&#39;s bar by a long shot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Secure Chats are not available for groups, only one-on-one conversations.
Again, &lt;em&gt;all&lt;/em&gt; Signal chats (including groups) are end-to-end encrypted by default.
There&#39;s no excuse here.&lt;/li&gt;
&lt;li&gt;Telegram rolled their own encryption protocol called &amp;quot;MTProto&amp;quot;,
which is &lt;a href=&quot;https://words.filippo.io/telegram-ecdh/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;so poorly conceived&lt;/a&gt; that you might mistake some of its bugs for backdoors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I begrudgingly use Telegram because many of my friends use it,
but it offers shockingly little of value that Signal doesn&#39;t have by now.
&lt;strong&gt;I recommend migrating off of Telegram.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Matrix&lt;/h3&gt;
&lt;p&gt;Matrix claims to offer secure, decentralized communication.
I say &amp;quot;claims to&amp;quot; because their end-to-end encryption is optional for rooms (i.e. group chats).&lt;/p&gt;
&lt;p&gt;Esteemed furry blogger &amp;amp; cryptographer &lt;a href=&quot;https://soatok.blog/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;Soatok&lt;/a&gt;
has found &amp;amp; disclosed &lt;a href=&quot;https://soatok.blog/2024/08/14/security-issues-in-matrixs-olm-library/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;multiple&lt;/a&gt; &lt;a href=&quot;https://soatok.blog/2026/02/17/cryptographic-issues-in-matrixs-rust-library-vodozemac/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;vulnerabilities&lt;/a&gt; in Matrix&#39;s encryption routines
after only a cursory glance at their codebases.
The fact that these were discovered with so little effort should be alarming enough on its own, but
Matrix&#39;s responses to these vulnerabilities (&lt;a href=&quot;https://soatok.blog/2024/08/14/security-issues-in-matrixs-olm-library/#addendum-2024-08-14&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;1&lt;/a&gt;, &lt;a href=&quot;https://soatok.blog/2026/02/17/cryptographic-issues-in-matrixs-rust-library-vodozemac/#matrix-response&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;2&lt;/a&gt;)
ought to be regarded as equally alarming.
Rather than fixing any of the vulnerabilities identified,
they instead opted to discredit the findings as irrelevant.&lt;/p&gt;
&lt;p&gt;I find this &lt;a href=&quot;https://soatok.blog/2026/02/17/cryptographic-issues-in-matrixs-rust-library-vodozemac/#matrix-response:~:text=to%2E-,Well,not%20Boring&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;excerpt from Soatok&#39;s 2nd disclosure post&lt;/a&gt;
to be prescient here:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Well-implemented, well-designed cryptography is supposed to be Boring. Boring cryptography is obviously secure.&lt;/p&gt;
&lt;p&gt;Allowing a complete confidentiality break because one person sets their public key to zero is not Boring.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Regarding decentralization,
most Matrix servers are federated through a centralized Matrix.org homeserver
that manages account logins.
For a server to be fully disconnected from the graph,
it not only needs to provide its own homeserver,
but also forego various niceties like sticker packs
that go through &lt;em&gt;another&lt;/em&gt; centralized server, vector.im.&lt;/p&gt;
&lt;p&gt;Also, the &lt;abbr tabindex=&quot;0&quot; title=&quot;user experience&quot;&gt;UX&lt;/abbr&gt; is all over the place.
I would certainly not describe Matrix as &amp;quot;foolproof&amp;quot; in the same way as Signal.&lt;/p&gt;
&lt;p&gt;Despite all of the above issues,
I am using a friend&#39;s private &amp;amp; defederated Matrix install to talk to a few folks.
It&#39;s preferable to Discord on the security &amp;amp; privacy axes,
but really only because I happen to have a friend
with the time &amp;amp; technical expertise to get self-hosted Matrix running
(it was apparently a painful month-long endeavor).²
For that and all the above reasons, &lt;strong&gt;I don&#39;t recommend Matrix for most people.&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Aforementioned blogger Soatok has written about &lt;a href=&quot;https://soatok.blog/2026/02/11/on-discord-alternatives/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;Discord alternatives&lt;/a&gt;
and &lt;a href=&quot;https://soatok.blog/2024/07/31/what-does-it-mean-to-be-a-signal-competitor/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;Signal competitors&lt;/a&gt;.
He came to the same conclusion in both of these posts: there are currently none that meet the bar.
If you&#39;re willing to make compromises on the security &amp;amp; privacy of your communication apps,
you&#39;ll need to seek out the opinions of people who aren&#39;t cryptographers.&lt;/p&gt;
&lt;p&gt;Personally, I think that&#39;s a bad call to make.
We&#39;ve seen how companies throw around terms like &amp;quot;end-to-end encryption&amp;quot; and &amp;quot;privacy-first&amp;quot;
while handwaving away the limitations from their copytext.
Security needs to be rooted in solid application of cryptographic primitives,
and privacy needs to be rooted in security.
The sad truth is that meaningful encryption is extremely difficult to get right
and notoriously hard to communicate to the public (even technically inclined users!).
So, I urge you: &lt;strong&gt;listen to cryptographers.&lt;/strong&gt;
They represent an unwavering voice of truth in an increasingly user-hostile landscape.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
  &lt;p&gt;
    ² Federated Matrix servers are slow and have a huge spam problem.
      They&#39;re non-starters for me because none of my friends are going to put up with that.
  &lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Making the most of Signal&lt;/h2&gt;
&lt;p&gt;If I had to guess why so many of my friends haven&#39;t picked up Signal,
I&#39;d say it&#39;s because the app looks extremely dry at a glance.
The interface is clean &amp;amp; free of distractions,
but to a point where it feels sterile.
There are no bubbly animations,
no app-wide themes (aside from light/dark),
not even any bundled wallpaper images.
It&#39;s lacking the &lt;em&gt;sauce&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;But you &lt;em&gt;can&lt;/em&gt; make Signal feel personal,
and I&#39;ll show you how.&lt;/p&gt;
&lt;h3&gt;Set up your profile&lt;/h3&gt;
&lt;p&gt;After you&#39;ve gone through your privacy settings,
I recommend filling out your profile with a name and avatar.&lt;/p&gt;
&lt;p&gt;Don&#39;t be off-put by the first &amp;amp; last name fields!
You can set your first name to anything you want
and leave the last name blank.&lt;/p&gt;
&lt;p&gt;A lot of my friends who are on Signal don&#39;t have an avatar set.
I respect this decision,
but I don&#39;t think it offers much from a privacy standpoint,
at least for the average user.
Even if you share your username online,
random people can&#39;t see these profile details
until you accept a message request from them.&lt;/p&gt;
&lt;p&gt;Your risk profile might be different
depending on what you use Signal for.
You probably already know if that&#39;s the case,
but I&#39;ll cover this in more detail in the next section.&lt;/p&gt;
&lt;h3&gt;Add some friends&lt;/h3&gt;
&lt;p&gt;Okay, this one&#39;s obvious,
but you need to know other people who use Signal
in order to... use Signal.
Unless your only use case is sending secure notes to yourself.&lt;/p&gt;
&lt;p&gt;Some friends have asked me to use Signal to talk to them,
and I&#39;ve asked the same of various friends of mine.
Maybe you know some people who share their Signal username
(&lt;a href=&quot;https://meow.garden/contact-me&quot;&gt;hi, friends!&lt;/a&gt;).
Maybe just take this step as an exercise in humility
and become That Friend yourself.
There are certainly worse kinds of friend you could be.&lt;/p&gt;
&lt;h3&gt;Customize your emoji hotbar&lt;/h3&gt;
&lt;p&gt;Do you have a favorite heart emoji?
Are you a 😭 user but not much of a 👎 user?&lt;/p&gt;
&lt;p&gt;I have good news for you:
you can change the emoji hotbar!
This feature is tricky to discover organically,
but it&#39;s &lt;a href=&quot;https://support.signal.org/hc/en-us/articles/360039929972-Message-Reactions#:~:text=How%20do%20I%20customize%20or%20reset%20the%20default%20reactions&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;documented&lt;/a&gt;
in Signal&#39;s help center,
as most things are.&lt;/p&gt;
&lt;h3&gt;Pick a default chat background &amp;amp; color&lt;/h3&gt;
&lt;p&gt;Signal&#39;s built-in wallpapers are about as underwhelming as you could imagine.
It&#39;s just a bunch of solid colors and basic gradients.&lt;/p&gt;
&lt;p&gt;The best recommendation I have for phone wallpapers is &lt;a href=&quot;https://wallhaven.cc/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;Wallhaven&lt;/a&gt;,
which is ad-free and recently banned AI art.
It&#39;s heavily focused on anime &amp;amp; people —
the two &lt;s&gt;genders&lt;/s&gt; categories aside from &amp;quot;General&amp;quot; —
but you can still find some decent images there.
Here&#39;s a search query for &lt;a href=&quot;https://wallhaven.cc/search?q=id%3A74&amp;amp;categories=110&amp;amp;purity=100&amp;amp;ratios=portrait&amp;amp;sorting=relevance&amp;amp;order=desc&amp;amp;page=2&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;abstract portrait wallpapers&lt;/a&gt;
to get started.&lt;/p&gt;
&lt;p&gt;Whatever you end up using,
acquire your preferred wallpaper
and set it as the default background in the app&#39;s settings.
Things will instantly feel 500% more personal.
You might also consider adjusting the color of the chat bubbles to match or complement the background.&lt;/p&gt;
&lt;h3&gt;Upload (or swipe) your favorite sticker packs&lt;/h3&gt;
&lt;p&gt;This one&#39;s optional for non-furries.&lt;/p&gt;
&lt;p&gt;Sticker packs are Signal&#39;s Telegram-killer feature.
As mentioned before,
they&#39;re just as secure &amp;amp; private as everything else you can do in Signal.
You can upload sticker packs from the Signal desktop app,
or ask friends to send you stickers so you can yoink the packs for yourself.&lt;/p&gt;
&lt;p&gt;To aid in migrating from Telegram,
I registered my own personal bot with Telegram,
then ran an &lt;a href=&quot;https://github.com/FHPythonUtils/TStickers&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;open-source sticker downloader&lt;/a&gt;
to download my most-used packs.
Alternatively,
you could use one of the many public sticker downloader bots out there.
I can&#39;t vouch for any of them,
so I won&#39;t be linking any of them here.&lt;/p&gt;
&lt;p&gt;Now, I&#39;m not going to lie: uploading a sticker pack to Signal is a tedious process.
You have to manually assign each sticker an emoji,
and if you have your heart set on uploading a large (100+ sticker) pack,
you&#39;re &lt;em&gt;going&lt;/em&gt; to become intimately familiar with the emoji picker
over the next 15-30 minutes.
There are no drafts for sticker packs,
so you have to keep the sticker upload window open
from start to finish.
I uploaded my handful of sticker packs over the course of ~2 hours
and I hope I won&#39;t have to do it again.&lt;/p&gt;
&lt;h3&gt;Assign chat-specific backgrounds &amp;amp; colors?&lt;/h3&gt;
&lt;p&gt;This one&#39;s your call.
If you have a use case for per-chat backgrounds &amp;amp; chat bubble colors,
Signal supports it.
They only apply to you, not your recipient(s).&lt;/p&gt;
&lt;p&gt;Personally, I use Signal to talk to friends &amp;amp; family.
Family members get a special background &amp;amp; color
so that it&#39;s immediately obvious to me when I&#39;m in a family chat.
A few other special folks in my life get their own chat bubble colors.
I think of this feature as error correction for human mistakes.
It enables me to be comfortable sending the weirdos in my life highly-targeted stickers
using the same app I use to talk to my brother.&lt;/p&gt;
&lt;p&gt;As of a few months ago,
colors sync between desktop and your phone,
which halves the setup cost to that feature.
It&#39;s a small thing,
but one that gives me confidence that the folks at Signal
know what they&#39;re doing on the UX side, too.&lt;/p&gt;
&lt;h3&gt;Publish your first Story??&lt;/h3&gt;
&lt;p&gt;Signal has Stories.
You know, like from Instagram or whatever.&lt;/p&gt;
&lt;p&gt;I don&#39;t use this feature and I don&#39;t know anyone who does.
You can disable the feature entirely,
but I&#39;m not opposed to seeing them in case any of my friends make one.
Maybe you could be the first!&lt;/p&gt;
&lt;h2&gt;Miscellaneous grievances&lt;/h2&gt;
&lt;h3&gt;&amp;quot;I don&#39;t like that Signal is hosted in the U.S.&amp;quot;&lt;/h3&gt;
&lt;p&gt;I get the concern,
but where Signal is hosted doesn&#39;t actually matter if you trust the encryption,
which, again, has been scrutinized by researchers from all around the world
and passed every time.
Data sovereignty is second to &amp;amp; arguably &lt;a href=&quot;https://soatok.blog/2025/07/09/jurisdiction-is-nearly-irrelevant-to-the-security-of-encrypted-messaging-apps/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;obviated by proper cryptography&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;As for ethical considerations,
Signal is a 501c3 nonprofit
and has no track record of poor leadership or communication,
at least that I&#39;m aware of.&lt;/p&gt;
&lt;h3&gt;&amp;quot;Wasn&#39;t there a Signal leak in the news last year??&amp;quot;&lt;/h3&gt;
&lt;p&gt;I&#39;m sorry to be the one to tell you that
this is a wild misinterpretation of events.
In reality,
a journalist was mistakenly invited to a Signal group chat
and fulfilled his bare-minimum responsibility of &lt;em&gt;telling people that that happened.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In technical terms,
Bob can&#39;t do jack shit if Alice addresses her envelope to Mallory.&lt;/p&gt;
&lt;p&gt;This &lt;em&gt;could&lt;/em&gt; be indicative of a flaw in Signal&#39;s &lt;abbr tabindex=&quot;0&quot; title=&quot;user interface&quot;&gt;UI&lt;/abbr&gt;,
say, if it&#39;s too easy for users to send an invite by mistake,
or too hard to identify the correct recipient of an invitation.
You can check out the UI yourself;
it&#39;s a free app, after all.
I looked at it and it seems pretty straightforward to me.&lt;/p&gt;
&lt;h3&gt;&amp;quot;This post doesn&#39;t cover any non-encryption-based threats.&amp;quot;&lt;/h3&gt;
&lt;p&gt;Yeah, that&#39;s fair.
There are other settings to consider,
depending on your personal threat model:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can enable &lt;a href=&quot;https://support.signal.org/hc/en-us/articles/360007059572-Screen-Lock&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;Screen Lock&lt;/a&gt;
so that opening Signal requires a PIN or passphrase.
&lt;ul&gt;
&lt;li&gt;This prevents an actor with physical access to your (unlocked) phone
from reading your conversations.&lt;/li&gt;
&lt;li&gt;Note that biometrics like Face / Touch ID are considered &lt;em&gt;less&lt;/em&gt; secure
than PIN / passphrase in certain jurisdictions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You can &lt;a href=&quot;https://support.signal.org/hc/en-us/articles/360043273491-In-App-Notification-Options#android_change_text&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;configure your notifications&lt;/a&gt; to display &amp;quot;Name Only&amp;quot; or less information.
&lt;ul&gt;
&lt;li&gt;This prevents an actor with physical access to your (locked or unlocked) phone
from reading recent messages to you.&lt;/li&gt;
&lt;li&gt;Keep in mind sophisticated actors can unearth past push notifications on your phone,
not just notifications currently on-screen.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;You can even disregard my advice
about adding your name &amp;amp; avatar to your Signal profile.
&lt;ul&gt;
&lt;li&gt;This makes it harder for actors who have compromised your connections
to correlate your messages back to you.&lt;/li&gt;
&lt;li&gt;If this scenario seems relevant to your threat model,
I would further advise you not to identify yourself
in conversations with connections you consider to be at risk of compromise.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Whether or not to do these things is up to you.
I think Signal is still relatively secure compared to other messaging apps
even without incorporating any of these optional directives.
And you can always change your mind later.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Is it all worth it?&lt;/h2&gt;
&lt;p&gt;The peace of mind offered by Signal&#39;s rock-solid security &amp;amp; privacy
is incredibly important to me,
for reasons both philosophical and pragmatic.
I regard it as an oasis of trust
in a sea of hyper-capitalist platforms with wildly stochastic risk profiles
(among other problems).&lt;/p&gt;
&lt;p&gt;Those are some big words to say: &lt;strong&gt;yes, it&#39;s absolutely worth it&lt;/strong&gt;,
at least in my opinion.&lt;/p&gt;
&lt;p&gt;The only substantial value offered by less secure platforms,
from my perspective,
is simply their inertia.
I use Telegram because my friends use Telegram,
and because many of them do not use Signal.
I would rather use Signal for everything.
This post represents my best effort to generate whatever inertia I can scrounge up
in favor of Signal.&lt;/p&gt;
&lt;p&gt;Good encryption is boring,
but a good encryption app doesn&#39;t have to be.
Personalize your Signal install today
and join me in the serenity of actually trusting an app on your phone!&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>Growing up, revisited</title>
    <link href="https://meow.garden/growing-up-revisited/" />
    <updated>2026-03-04T02:45:00Z</updated>
    <id>https://meow.garden/growing-up-revisited/</id>
    <content
      type="html"
      >&lt;p&gt;Long ago on this blog,
before I started primarily talking about software &amp;amp; music production,
I wrote about life.
One such post was titled &amp;quot;Growing up&amp;quot;.
I&#39;ve decided it&#39;s due for a revisit —
not as a progress update on my own growth,
but as a re-examination of the topic from new perspectives.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;&amp;gt; reread&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://meow.garden/growing-up&quot;&gt;&amp;quot;Growing up&amp;quot;&lt;/a&gt;&lt;/strong&gt; was one of my better-written 2022 posts.
I don&#39;t know what inspired me to pull out &amp;quot;Dunning-Kruger valley of adulthood&amp;quot;
and &amp;quot;Get out of Tough Conversation Free card&amp;quot;
in the same sentence.
It&#39;s short;
it&#39;s worth a read just for context&#39;s sake.&lt;/p&gt;
&lt;p&gt;As for the behaviors I landed on,
&amp;quot;putting in the work&amp;quot; and &amp;quot;humility &amp;amp; ambition&amp;quot;,
I think they passed the test of time.
Just about any goal worth pursuing takes effort to realize;
knowing your limits (but pushing them) helps keep that effort focused and impactful.
If I were to update this post today
(keeping the structure intact),
I might add &amp;quot;choosing your battles wisely&amp;quot; as a third item.&lt;/p&gt;
&lt;p&gt;But I&#39;m not updating the original post,
and listing behaviors that demonstrate personal growth
isn&#39;t how I want to frame this subject anymore.
Let&#39;s look at a meme instead:&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;&amp;gt; analyze&lt;/code&gt;&lt;/h2&gt;
&lt;figure&gt;
  &lt;img style=&quot;max-width: 70%&quot; title=&quot;An image macro that reads: If you&#39;re 20-30 and your main circle isn&#39;t discussing opening businesses, investing, etc. then it&#39;s time to find a new circle&quot; src=&quot;https://meow.garden/assets/images/growing-up-revisited-network.png&quot;&gt;
  &lt;figcaption&gt;&quot;Growing up&quot; if it was written by a temporarily-embarrassed Leonardo DiCaprio&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The moment this image escaped its intended audience,
the Internet collectively ate it up and spat out a million ironic versions,
as it well deserved.
But, just for a moment,
let&#39;s put ourselves into the shoes of its intended audience (young men)
and outline the intended social effect:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are held to a standard
based on the priorities and goals of your peers.&lt;/li&gt;
&lt;li&gt;You are expected to uphold this standard
within a few years of becoming an adult.&lt;/li&gt;
&lt;li&gt;People who aren&#39;t concerned with these goals
should be excluded from your social spheres.
They&#39;re members of the &lt;em&gt;out-group&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;If &lt;em&gt;you&lt;/em&gt; do not pursue these goals,
&lt;em&gt;you&lt;/em&gt; enter the out-group.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What bothers me about the proliferation of ironic edits of this meme
is that the people who share them tend to subscribe to the exact same out-grouping formula,
just applied to different standards.&lt;/p&gt;
&lt;p&gt;Indeed, you can learn a lot about your friends
based on who they openly regard as members of the out-group.
Who, in their minds, deserves the ridicule?
Who&#39;s pushing 30 in the wrong circle?
Their answer&#39;s almost certainly not &amp;quot;people who aren&#39;t looking to start a business&amp;quot;,
but there &lt;em&gt;is&lt;/em&gt; an answer.
You could start looking for it on social media,
but if you&#39;re sufficiently neurodivergent,
you&#39;ve probably already absorbed a lot of your friends&#39; out-group signifiers
as a natural consequence of trying not to embarrass yourself before the panopticon.&lt;/p&gt;
&lt;aside&gt;
&lt;h3&gt;examples from the last decade&lt;/h3&gt;
&lt;p&gt;Off the top of my head:
a retweet of a post that frames knowing how to cook as a moral imperative
&lt;em&gt;(ugh, I should get back on that)&lt;/em&gt;.
A snide quip about that one friend who&#39;s trying to break into VTubing
&lt;em&gt;(okay, scratch that idea)&lt;/em&gt;.
A joke that reveals the author&#39;s unquestioned belief
that adults who live with their parents are losers
&lt;em&gt;(phew)&lt;/em&gt;.
An unsympathetic dunk on people with niche kinks
&lt;em&gt;(uh-oh!)&lt;/em&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;They seem random at first,
but once you&#39;ve internalized enough of these out-group signifiers,
the unifying logic becomes clear:
they&#39;re all &lt;strong&gt;adults who aren&#39;t adulting right&lt;/strong&gt;.
They&#39;re lacking the necessary skills,
or have the wrong hobbies or interests,
or don&#39;t have the resources they&#39;re supposed to by now.&lt;/p&gt;
&lt;p&gt;See, it&#39;s cute to be aimless or weird as a teenager,
and understandable when it bleeds into your adult years.
But the grace only extends so far,
and you only know for sure where it terminates after it&#39;s too late.
Missing that stop puts one at risk of immense social ostracization.
No matter what growing up means in your social circle,
your continued membership to the circle is predicated on demonstrating it.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;&amp;gt; introspect&lt;/code&gt;&lt;/h2&gt;
&lt;figure&gt;
  &lt;img title=&quot;A post that reads: all art is made from spite or horniness, and a computer cannot be spiteful or horny, so a computer should never make art&quot; src=&quot;https://meow.garden/assets/images/growing-up-revisited-art.png&quot;&gt;
  &lt;figcaption&gt;Chat, is this true?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you believe that a blog post can be art,
you may be disappointed to learn that the 2022 &amp;quot;Growing up&amp;quot; post
wasn&#39;t born from such noble causes as spite or horniness,
but rather from shame.¹
I don&#39;t have to remember how I felt at the time —
the words are drenched in it.
Not that I felt any actual disdain from my friends,
but I could sense the looming threat.
The possibility that I might forget to be &amp;amp; act like an adult,
stagnating in life until all of my thousand-odd Twitter followers could smell it on me.
One of the easiest outs when you feel the threat of criticism
is to be the first one to criticize yourself,
and so that&#39;s what I did.&lt;/p&gt;
&lt;p&gt;My priorities have changed a lot since 2022.
For one,
I&#39;m no longer under the illusion
that my social media follower count meant anything, ever.
I&#39;m not a public figure
and I have no obligation to perform personal growth for an audience.
That&#39;s not to say my goals were wrong,
but the psychological underpinnings were on shaky ground.
I needed a better reason to clock into life
than the threat of disappointing others.&lt;/p&gt;
&lt;p&gt;This one&#39;s more subtle, but arguably more important:
I no longer regard growing up as a move toward some platonic ideal of humanity.
The behaviors we commonly associate with adulthood
are indeed conducive to a wide variety of goals,
but they don&#39;t form a moral code.
That is to say, people who don&#39;t demonstrate
the kinds of personal growth that people look for
aren&#39;t evil, or bad, or any other intrinsic pejorative.
That line of reasoning starts with vilifying &amp;quot;lazy&amp;quot; people
and ends in various flavors of fascist rhetoric,
such as ableist eugenics.
An extreme example, for sure,
but one I&#39;d rather distance my personal ideology from.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;¹ If it wasn&#39;t obvious, &lt;i&gt;this&lt;/i&gt; post is made out of spite, aimed in too many directions to list.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;p&gt;To close things out,
I&#39;d like to disentangle these concepts of &amp;quot;growing up&amp;quot; and &amp;quot;adulthood&amp;quot; from each other.
I treated them as synonymous in the original post;
here, I&#39;d like to discuss the latter separately.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;&amp;gt; reframe&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;Adulthood is a natural phenomenon that almost no one feels equipped for.
Don&#39;t believe me?
Try telling anyone in your life &amp;quot;I don&#39;t feel like an adult yet&amp;quot;
and wait for them to respond with the old reliable &amp;quot;well, nobody does&amp;quot;.
It&#39;s a meme that the whole world is in on,
and it says more about us than we give it credit for.&lt;/p&gt;
&lt;p&gt;Growing up, in contrast,
is a nebulous set of coded behaviors that are often associated with adults —
responsibility, home skills, social finesse, and so on.
Despite that association,
children frequently embody these traits,
whether of their own volition or (more likely) due to circumstances.
So do many of those same adults who feel under-equipped for adulthood!&lt;/p&gt;
&lt;p&gt;There&#39;s no contradiction here.
One is a label that get assigned to you at a certain age;
the other is a bunch of things that you do,
often starting around that age.
Nothing binds them together
until we start talking about them like they&#39;re the same thing.&lt;/p&gt;
&lt;p&gt;I&#39;m not just being pedantic for its own sake.
Conflating adulthood with growing up does people of all ages a disservice:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For young adults,
it obfuscates the effort required to put personal growth into motion,
as though it&#39;s an innate part of turning 18.&lt;/li&gt;
&lt;li&gt;For older adults struggling to acquire growth signifiers,
it makes the threat of being cast to the out-group more severe,
as though they somehow failed a test
that everyone else who turned 18 passed without trying.&lt;/li&gt;
&lt;li&gt;And as for children,
this false equivalence is just one of the myriad rhetorical tools
used to deny their autonomy,
as though they &lt;em&gt;definitionally&lt;/em&gt; lack some requisite skills needed
to make decisions about their own lives.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many more thousands of words could be written
on the topic of children&#39;s autonomy,
and perhaps someday I&#39;ll feel equipped to write that post.
For now, though,
let&#39;s acknowledge that being a child in the modern era
is a horribly isolating experience,
and instead discuss what that means for adults.&lt;/p&gt;
&lt;p&gt;First,
&lt;strong&gt;show kids some grace,&lt;/strong&gt;
even when they&#39;re being annoying or otherwise immature.
Not only because they&#39;re adults-in-training,
but because they&#39;re people, today.
Frankly,
I think this has every reason to be considered
one of the core &amp;quot;growing up&amp;quot; behaviors.
It&#39;s upsetting just how many people
wear their disdain for children on their sleeves.
Remember before 2025
when people would wax poetic about how much better the Internet would be
if all those pesky kids got cordoned off to their own, separate Internet?
Do you think any of those smarmy fuckers
came to terms with the weight of their own words?&lt;/p&gt;
&lt;p&gt;On that note,
&lt;strong&gt;go to bat for children&lt;/strong&gt; when it counts.
If you agree that children deserve to be more than a political weapon,
tell your elected leaders to oppose legislation that wields them as such.
I&#39;m not typically one to bang the &amp;quot;call your senators&amp;quot; drum,
but in most jurisdictions,
kids literally don&#39;t have any legal foothold to stand up for themselves.
They &lt;em&gt;need&lt;/em&gt; compassionate adults to step in.&lt;/p&gt;
&lt;p&gt;Finally,
if you struggle to empathize with the modern child,
remember that &lt;strong&gt;you, too, were a child once.&lt;/strong&gt;
It&#39;s one of the only labels
that applies to everybody in the entire world at some point!
And though the chemicals that make up your being change every day,
you will never Ship-of-Theseus yourself into a completely different person.
As such, growing up isn&#39;t a total reinventing of the self,
but rather a gradient of new experiences and responsibilities.
Breaking down this dichotomy is the first step toward
a healthier relationship to both adulthood and your inner child —
whatever nurturing that looks like for you.&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;&amp;gt; conclude&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;...wait, when did the section headers
turn into text adventure game prompts??&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;That&#39;s better.
We don&#39;t play &lt;em&gt;games&lt;/em&gt; on this blog;
after all, I&#39;m an adult.
A normal, well-adjusted adult
with regular hobbies and taste in media.
Look, I write about computers!
And I make things sometimes!
I&#39;ll bet you&#39;ve never seen a more employable adult human being
in your entire life.&lt;/p&gt;
&lt;p&gt;Jokes aside,
I&#39;ve wanted to revisit this topic for months,
and I think I did it more justice than last time.
Thanks for sticking around
if you read all of that;
keeping this blog&#39;s topics broad
inoculates it against readers with mismatched expectations,
so if you&#39;re still here,
you&#39;re in the right place.&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>This blog is now Tailwind-free</title>
    <link href="https://meow.garden/no-more-tailwind/" />
    <updated>2026-02-15T06:50:00Z</updated>
    <id>https://meow.garden/no-more-tailwind/</id>
    <content
      type="html"
      >&lt;p&gt;When I &lt;a href=&quot;https://meow.garden/redesign&quot;&gt;redesigned this blog&lt;/a&gt; 2 years ago,
I decided to give the Tailwind CSS framework a spin.
Fast-forward to today:
Tailwind is now entirely gone,
replaced by some simple, well-structured &lt;a href=&quot;https://sass-lang.com&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Sass&lt;/a&gt; code.
This was not an easy transition —
it took me over 8 hours of dedicated effort,
with no way to automate the task at hand.
I think that in and of itself might be an argument against Tailwind,
but that probably sounds like circular reasoning if you don&#39;t understand the &lt;em&gt;why&lt;/em&gt;,
so allow me to elaborate.&lt;/p&gt;
&lt;h2&gt;Why Tailwind in the first place?&lt;/h2&gt;
&lt;p&gt;The author of Tailwind wrote a lengthy explanation
for &lt;a href=&quot;https://adamwathan.me/css-utility-classes-and-separation-of-concerns/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;why Tailwind exists&lt;/a&gt;
in the form of an exploratory blog post.
His argument stems from the dependencies created by writing HTML &amp;amp; CSS the &amp;quot;traditional&amp;quot; way,
where you define class names in HTML and then use those names as entrypoints for CSS styles.
It&#39;s a well-articulated thought experiment,
and it was good enough to convince me at the time.&lt;/p&gt;
&lt;p&gt;As for the actual experience of using Tailwind:
it&#39;s generally fine.
The tooling meshes well with my static site generator (Eleventy).
It enabled me to whip up a decent-looking blog with not much effort.
And, indeed,
it mostly eliminates the cross-language dependency
between HTML classes and CSS specifiers.&lt;/p&gt;
&lt;p&gt;But there were also some immediate annoyances,
along with some slow-burning pain points
that would gradually make tweaking the site&#39;s design more and more frustrating.&lt;/p&gt;
&lt;h2&gt;Why no Tailwind now?&lt;/h2&gt;
&lt;p&gt;I&#39;ll try to sum it up in a couple of reasons.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tailwind destroys the relationships between similarly-designed components.&lt;/strong&gt;
In the aforementioned blog post,
those relationships are framed as a thorn in the developer&#39;s side,
forcing a choice between coupling, duplicating, or extending code —
with no clear winner among the three.
After fully utili-fying the example CSS into Tailwind classes,
the author ceases to use &amp;quot;separation of concerns&amp;quot; or &amp;quot;dependency direction&amp;quot; as rhetorical tools,
which might cause the reader to miss the tradeoff that was made:
Tailwind chooses duplication of code and then &lt;em&gt;obfuscates it&lt;/em&gt; by spreading it across the HTML.&lt;/p&gt;
&lt;p&gt;This is how my blog ended up with the exact Tailwind incantation
&lt;code&gt;flex flex-wrap gap-x-4 items-baseline&lt;/code&gt;
repeated &lt;em&gt;seven times&lt;/em&gt; across 5 different files.
One of them had &lt;code&gt;text-sm text-shadows-500&lt;/code&gt; tacked onto the end,
and another one existed in a container with twice as much vertical spacing as the rest.
Going into the conversion process,
I had &lt;em&gt;no idea&lt;/em&gt; that two of them were notably different, let alone &lt;em&gt;why&lt;/em&gt; they were different!&lt;/p&gt;
&lt;p&gt;Maybe this isn&#39;t a problem for everyone,
but it&#39;s a problem for me.
I like to have a decent mental model of how my site is styled,
so that when I go to add something new, I know where to find existing styles to copy or reuse.
Under Tailwind,
I would likely end up copying one of them at random for the 8th instance,
essentially rolling the dice on which &amp;quot;version&amp;quot; of the component gets to propagate.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Tailwind&#39;s naming conventions are all over the place.&lt;/strong&gt;
Quick, tell me what each of these Tailwind classes expands to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;items-baseline&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;justify-center&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;content-start&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;align-middle&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you know CSS but not Tailwind,
you can probably spot the problem here immediately.
All of these correlate to 3-word incantations in CSS
(a 2-word property followed by a single-word value),
but each one drops a word,
and it is nearly impossible to intuit the mapping:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;&lt;u&gt;align&lt;/u&gt;-items: baseline;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;justify-&lt;u&gt;content&lt;/u&gt;: center;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;&lt;u&gt;align&lt;/u&gt;-content: start;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;font-mono&quot;&gt;&lt;u&gt;vertical&lt;/u&gt;-align: middle;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sometimes
Tailwind pulls a new word out of a hat,
casting away CSS&#39;s naming conventions for the sake of terseness.
&lt;code&gt;letter-spacing&lt;/code&gt;? No, we call that &lt;code&gt;tracking&lt;/code&gt; around here.
&lt;code&gt;line-height&lt;/code&gt;? Nah, look it up, it&#39;s &lt;code&gt;leading&lt;/code&gt; now.&lt;/p&gt;
&lt;p&gt;Sometimes it changes things just enough to throw you off,
like dropping the hyphen from CSS&#39;s &lt;code&gt;white-space&lt;/code&gt; property
in favor of &lt;code&gt;whitespace&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sometimes Tailwind just doesn&#39;t have a standardized keyword value for a property.
That was going to be its own subsection,
but I&#39;m struggling to find where this happened to me
and it&#39;s too general of a problem to search for online.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Circling back to the intro:
&lt;strong&gt;Tailwind is easy to add, but obnoxious to remove.&lt;/strong&gt;
In case you weren&#39;t aware of how it works,
you give it a file pattern (say, &lt;code&gt;&amp;quot;./src/**/*.liquid&amp;quot;, &amp;quot;./src/**/*.html&amp;quot;&lt;/code&gt;)
and it scans all the matching files &lt;em&gt;as plain text&lt;/em&gt;
for any substrings that look like Tailwind classes.
Once it&#39;s tallied up all the matches,
it writes a CSS file containing exactly the utility classes it thinks it saw.
Any false positives will slightly increase the size of the output file,
but otherwise have no effect.&lt;/p&gt;
&lt;p&gt;The fact that Tailwind doesn&#39;t care what language(s) you&#39;re using
is kind of genius for adoption.
While competing platforms like Sass have to maintain bindings for various languages,
Tailwind brings the equivalent of &lt;code&gt;grep&lt;/code&gt; to the table
and instantly covers all those languages and more.&lt;/p&gt;
&lt;p&gt;Unfortunately, this property of Tailwind
is also (part of) why it&#39;s so hard to remove from a project.
All the functionality encapsulated in the Tailwind class lists
gets mixed into a soup of alphabetized utility classes,
completely lacking any semblance of semantic relationship by design.
Tailwind doesn&#39;t know about the abstract syntax tree of your HTML;
there is no parser to throw in to reverse.
All you can do is comb through your site,
name your nameless classes,
and carefully substitute every instance of &lt;code&gt;my-2&lt;/code&gt; with &lt;code&gt;margin: 0.5rem 0;&lt;/code&gt;
and so on.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Finally, &lt;strong&gt;I &lt;em&gt;like&lt;/em&gt; the CSS platform and I want to use it.&lt;/strong&gt;
This is why I committed to ditching Tailwind,
despite the significant time investment.
Its value proposition isn&#39;t strong enough
to make me want to write Tailwind class strings
when I could write CSS classes instead.&lt;/p&gt;
&lt;p&gt;The Sass-ified version of the website
has slightly different metrics on nearly every page.
There were more than a few cases where I realized
my Tailwind design led to unnecessary stacking of margins / padding.
My line heights were also all over the place
because Tailwind likes to specify it in &lt;code&gt;rem&lt;/code&gt;
and then change it in tandem with the font size,
rather than setting a ratio like &lt;code&gt;1.75&lt;/code&gt;.
Ultimately, the conversion process was a good opportunity to use my eyes
and undo whatever weird decisions Tailwind pigeonholed me into.
Despite the extremely monotonous &amp;amp; mechanical process,
I think the site came out looking slightly better.&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>Compo is back, baby</title>
    <link href="https://meow.garden/compo-is-back/" />
    <updated>2026-01-26T05:15:00Z</updated>
    <id>https://meow.garden/compo-is-back/</id>
    <content
      type="html"
      >&lt;p&gt;Every Sunday evening,
a couple of music-making nerds join the &lt;abbr title=&quot;Internet Relay Chat&quot; tabindex=&quot;0&quot;&gt;IRC&lt;/abbr&gt; channel &lt;code&gt;#mod_shrine&lt;/code&gt;,
download a ZIP file of ~20-30 samples,
and spend the next hour using &lt;em&gt;only&lt;/em&gt; those samples to make a song.
Then they listen to all the songs people made,
vote on their favorites,
and find out who got 1st place.¹&lt;/p&gt;
&lt;p&gt;I&#39;m one of those nerds.
You could join us, too!&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;¹ This text originally linked to &lt;a href=&quot;https://coda.s3m.us/blog/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;coda&#39;s blog.&lt;/a&gt;
  coda does not post all the winning entries.
  He just wins these events a &lt;i&gt;lot&lt;/i&gt;.&lt;/p&gt;
&lt;/div&gt;
&lt;h3&gt;Wait, a whole song in 1 hour?&lt;/h3&gt;
&lt;p&gt;Okay, lower your expectations a bit.
Most of these audio files are between 0:30 and 2:00 long,
and are perhaps more accurately described as ideas than full-fledged songs.
I&#39;ll call them &amp;quot;entries&amp;quot; from now on.&lt;/p&gt;
&lt;p&gt;You can listen to the most recent one-hour compos
at &lt;a href=&quot;https://s3m.it/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;s3m.it.&lt;/a&gt;
You may need VLC Media Player to play back some of the entries.&lt;/p&gt;
&lt;p&gt;Despite the ranked outcome,
compo is a very low-pressure environment.
Musicians at all parts of their respective journeys are welcome,
and the threat of last place pales in comparison to the joy of
&lt;em&gt;making something in 1 hour and then calling it done&lt;/em&gt;.
This was a huge part of my development as a musician for awhile!&lt;/p&gt;
&lt;h3&gt;This sounds fun! How can I join?&lt;/h3&gt;
&lt;p&gt;First, pick an IRC client.²
If you don&#39;t want to download a program,
you can create a free account on &lt;a href=&quot;https://www.irccloud.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;IRCCloud&lt;/a&gt; instead.
I would advise against using open-access web clients
as they are often banned by major IRC servers due to abuse.&lt;/p&gt;
&lt;p&gt;Your client might have a dropdown that includes &lt;a href=&quot;https://www.esper.net/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;EsperNet,&lt;/a&gt;
but if not, use the host &lt;code&gt;irc.esper.net&lt;/code&gt; and port &lt;code&gt;6697&lt;/code&gt; with SSL enabled.
Once you&#39;re connected, type &lt;code&gt;/join #mod_shrine&lt;/code&gt; and marvel at the lack of chat history.
(You should see a non-empty list of connected users, though!)&lt;/p&gt;
&lt;p&gt;In its current iteration, we&#39;re doing compo on Sundays at 19:00 Pacific time;
any deviations from this should be mentioned in the channel topic.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;² Personally, I self-host an instance of &lt;a href=&quot;https://github.com/thelounge/thelounge&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;The Lounge,&lt;/a&gt;
  but this is overkill even for my own use case.&lt;/p&gt;
&lt;/div&gt;
&lt;hr&gt;
&lt;h2&gt;A history I&#39;m not qualified to tell&lt;/h2&gt;
&lt;p&gt;Compo is a long-running IRC tradition
that used to span many channels and servers,
dating back to at least 1993.
#mod_shrine in particular started around 1998 per the &lt;a href=&quot;https://wiki.s3m.us/mod_shrine-history&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;wiki.&lt;/a&gt;
I was invited to join during the height of COVID quarantine in 2020,
long after this wiki&#39;s last update.&lt;/p&gt;
&lt;p&gt;Originally, compo was exclusively for &lt;a href=&quot;https://en.wikipedia.org/wiki/Music_tracker&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;tracker&lt;/a&gt; users,
who would upload their entries as modfiles (&lt;code&gt;.mod&lt;/code&gt; / &lt;code&gt;.xm&lt;/code&gt; / &lt;code&gt;.s3m&lt;/code&gt; / &lt;code&gt;.it&lt;/code&gt;) —
extremely compact formats that are closer in function to MIDI than MP3 files.
Ever since I joined, &lt;code&gt;#mod_shrine&lt;/code&gt; has been &amp;quot;allgear&amp;quot;,
meaning all &lt;abbr title=&quot;Digital audio workstation&quot; tabindex=&quot;0&quot;&gt;DAW&lt;/abbr&gt;s are allowed, and &lt;code&gt;.mp3&lt;/code&gt; uploads are permitted.
Entrants are still expected to use the provided samples, though.&lt;/p&gt;
&lt;p&gt;I hear the tracker purists still run their own compo in &lt;code&gt;#modulez&lt;/code&gt;.
I hope they&#39;re having fun!&lt;/p&gt;
&lt;aside&gt;
&lt;h3&gt;further reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Everything2 has an illuminating page on &lt;a href=&quot;https://everything2.com/title/compo&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;compo&lt;/a&gt;,
written by long-time chiptuner &lt;a href=&quot;http://b-e-e-k.bandcamp.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;beek&lt;/a&gt; in 2000.&lt;/li&gt;
&lt;li&gt;Also around Y2K,
Trax in Space was a site for tracker enthusiasts that served many purposes,
purportedly including compo.
Tens of thousands of the modfiles they hosted
have been &lt;a href=&quot;https://tis.roncli.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;meticulously archived&lt;/a&gt; by roncli
(whose name I recognize from the Crypt of the NecroDancer community — neat!)&lt;/li&gt;
&lt;li&gt;As for modern-day compo, &lt;a href=&quot;https://battleofthebits.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Battle of the Bits&lt;/a&gt;
sports a decades-strong community with a charmingly dated website.&lt;/li&gt;
&lt;/ul&gt;
&lt;/aside&gt;
&lt;p&gt;Interest in &lt;code&gt;#mod_shrine&lt;/code&gt;&#39;s 2020 iteration waned sometime in 2022,
but we&#39;re bringing it back for 2026.
By &amp;quot;we&amp;quot; I mostly mean my friend Dylan,
who&#39;s done all the heavy lifting of assembling sample packs,
hosting sessions,
and recruiting oldheads &amp;amp; new blood to join.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Some curated entries of mine&lt;/h2&gt;
&lt;p&gt;I&#39;ve been inconsistently uploading my compo entries to my alt SoundCloud profile.
Here are some of the better ones:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://soundcloud.com/altastral/infiniteupscale&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;&amp;quot;infiniteupscale&amp;quot;&lt;/a&gt;
was my first real winning entry.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://soundcloud.com/altastral/shadows&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;&amp;quot;shadows&amp;quot;&lt;/a&gt;
was a rare case where I managed to convey an emotion with my entry.
That&#39;s pretty neat!&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://soundcloud.com/altastral/empty-dares-and-chunky-snares&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;&amp;quot;empty dares and chunky snares&amp;quot;&lt;/a&gt;
and &lt;a href=&quot;https://soundcloud.com/altastral/community-milk&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;&amp;quot;community milk&amp;quot;&lt;/a&gt;
were two of my most fun &amp;amp; chaotic entries.&lt;/li&gt;
&lt;li&gt;My actual song &amp;quot;relentless future&amp;quot;
&lt;a href=&quot;https://soundcloud.com/altastral/relentless-future/s-XCipBLYxdGd&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;started as a compo tune!&lt;/a&gt;
Now you know what &amp;quot;greets to #mod_shrine&amp;quot; in the description meant all that time.&lt;/li&gt;
&lt;li&gt;I got lazy about uploading my entries in 2022,
but I remember logging back into my alt account just to post
&lt;a href=&quot;https://soundcloud.com/altastral/last-hope&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;&amp;quot;last hope&amp;quot;.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Anyway, that&#39;s more than enough examples.
I&#39;ve participated in over a hundred of these songwriting rituals,
and almost all of the results are slop —
organic, handmade slop, but nevertheless.
That&#39;s not a dig at myself,
it&#39;s just the nature of the task at hand.&lt;/p&gt;
&lt;p&gt;Don&#39;t bother listening to my 2026 uploads, by the way.
I&#39;m using compo as an excuse to dive head-first into Bitwig Studio.
Anyone who did compo with me in my FL era
can tell how much catching up I have left to do.
Again, not self-deprecation, just the facts.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Anyway, that&#39;s it!
That&#39;s the blog post!
Come compo with us and you, too, will learn to love the General MIDI pan flute.&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>How I broke &amp; fixed my chronological music library</title>
    <link href="https://meow.garden/chronological-music-library-fix/" />
    <updated>2026-01-14T07:40:00Z</updated>
    <id>https://meow.garden/chronological-music-library-fix/</id>
    <content
      type="html"
      >&lt;p&gt;My music library is a fountain of memories
I&#39;d otherwise have forgotten by now.
I can tell you which Monstercat compilation I was listening to
the first time I played hooky from college,
driving 2 hours to visit my first partner.
I can picture the hotel room I was sitting in
while listening to &lt;em&gt;Rossz Csillag Alatt Született&lt;/em&gt; that one time.
And &lt;em&gt;Mouth Silence&lt;/em&gt; was the unofficial soundtrack of my senior year college job.&lt;/p&gt;
&lt;p&gt;But those are just a few sparse anchor points.
What if I wanted to know &lt;em&gt;what else&lt;/em&gt; I was listening to around these times?&lt;/p&gt;
&lt;p&gt;Well,
if you stick to one music player for life,
you can sort your library by &amp;quot;Date Added&amp;quot;.
Sounds implausible, but this was actually my situation for a long time!
I was vendor-locked into &lt;strong&gt;iTunes&lt;/strong&gt;
from my teenage years up until very recently.
Even at the points when I reinstalled my OS (Windows back then),
I made sure to copy my &lt;code&gt;iTunes Media&lt;/code&gt; folder over,
ensuring my chronological timeline stayed pristine.
But &lt;a href=&quot;https://meow.garden/divesting-big-tech&quot;&gt;nothing lasts forever&lt;/a&gt;,
and my switch to Linux meant a lot of things were going to change all at once.&lt;/p&gt;
&lt;p&gt;I know this sounds preposterous, but — bear with me —
I actually have very little desire to run iTunes under Wine.
Its allure was never more than convenience,
and syncing songs from my PC to the stock Music app on my phone
was no longer the easy path.
So, my first order of business was to find alternative software.
I had a Plex instance languishing on my &lt;abbr title=&quot;Network-attached storage&quot; tabindex=&quot;0&quot;&gt;NAS&lt;/abbr&gt;,
and I must admit I enjoyed my short stint with Plexamp on my phone,
but the mere idea of self-hosted software requiring a centralized log-in
always felt gross to me.
After giving both Jellyfin and Emby a trial run,
I found that Jellyfin had a somewhat more vibrant ecosystem,
with apps that worked and felt comfortable enough to use.&lt;/p&gt;
&lt;p&gt;Luckily for me,
Jellyfin has a &amp;quot;Date Added&amp;quot; sort mode
that leans on the filesystem&#39;s modified timestamps during initial import.
I&#39;ve always been invested in preserving this kind of metadata,
and I&#39;ve &lt;em&gt;usually&lt;/em&gt; succeeded at that goal!&lt;/p&gt;
&lt;h2&gt;The problem: even good software is bad&lt;/h2&gt;
&lt;p&gt;Unluckily for me,
sometimes the technology you trust changes,
with or without your knowledge.
Specifically: &lt;a href=&quot;https://syncthing.net/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;syncthing&lt;/a&gt;,
which I recently used to migrate my files from my Windows desktop to my Linux laptop,
&lt;a href=&quot;https://forum.syncthing.net/t/sync-modified-time-of-folders/13151/4&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;stopped preserving directory timestamps&lt;/a&gt;
around the end of last decade.
And in the chaos of upending my entire personal tech stack,
I didn&#39;t realize my mistake until it was too late to re-transfer the original files.&lt;/p&gt;
&lt;aside&gt;
  &lt;h3&gt;in hindsight...&lt;/h3&gt;
&lt;p&gt;The correct way to do this is to use &lt;code&gt;rsync&lt;/code&gt; with the &lt;code&gt;-a&lt;/code&gt; (&amp;quot;archive&amp;quot;) flag.&lt;/p&gt;
&lt;p&gt;The problem is that writing files to a directory
updates the modified timestamp of that directory;
the solution is for the file transfer software to fix the timestamp
after the directory&#39;s contents have been fully populated.
This has to be specifically accounted for (as &lt;code&gt;rsync -a&lt;/code&gt; does),
and I can imagine why software as general-purpose as syncthing
attempting to implement this transparently would lead to a pile of edge cases.&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;Not all is lost, though!
This gap in syncthing&#39;s functionality &lt;em&gt;only&lt;/em&gt; affects directories, never files.
For my purposes, I still had all the metadata I needed —
it just needed to be propagated upward from the files to the directories.&lt;/p&gt;
&lt;h2&gt;The fix: Python and a little &lt;code&gt;touch&lt;/code&gt;-up&lt;/h2&gt;
&lt;p&gt;To that end,
I wrote a Python script to fix the directory timestamps.
I&#39;d share it here if it were less tailored to my music organization system,
or if it had unit tests,
but I&#39;m not in the mood to write &amp;amp; maintain a new open-source software project today.
I&#39;ll give you the general recipe, though:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scan the root music library folder &lt;strong&gt;depth-first&lt;/strong&gt;.
&lt;ul&gt;
&lt;li&gt;In Python, I recommend the standard &lt;code&gt;os.scandir&lt;/code&gt; to do this one layer at a time,
then wrapping that in your own recursive function.&lt;/li&gt;
&lt;li&gt;Alternatively, you could use &lt;code&gt;os.walk&lt;/code&gt;,
but because you&#39;ll need to perform certain tasks at the end of a directory scan,
I found the recommended approach to be easier to conceptualize.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For each directory, keep track of the latest file modified timestamp.
Initialize it to 0 (representing the Unix epoch).&lt;/li&gt;
&lt;li&gt;Recurse into nested directories and return the latest modified timestamp,
so that the outer directories&#39; new timestamps account for nested files.
&lt;ul&gt;
&lt;li&gt;Consider whether you want to take &lt;em&gt;any&lt;/em&gt; file&#39;s timestamp, or just certain kinds of files.
(Personally, I only took &lt;code&gt;.mp3&lt;/code&gt; / &lt;code&gt;.flac&lt;/code&gt; / &lt;code&gt;.ogg&lt;/code&gt; files&#39; timestamps into account.)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Once your scan through a directory is complete,
check if the latest modified timestamp you gathered
is &lt;em&gt;earlier&lt;/em&gt; than its current modified timestamp,
but &lt;em&gt;later&lt;/em&gt; than the default value of 0.
If so, update it!
&lt;ul&gt;
&lt;li&gt;In Python, use the standard &lt;code&gt;os.utime&lt;/code&gt; to update modified timestamps.
The timestamps it accepts are a 2-tuple of the form &lt;code&gt;(atime, mtime)&lt;/code&gt;.
You&#39;re probably only concerned with updating &lt;abbr title=&quot;modified time&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;mtime&lt;/code&gt;&lt;/abbr&gt;,
so for &lt;abbr title=&quot;accessed time&quot; tabindex=&quot;0&quot;&gt;&lt;code&gt;atime&lt;/code&gt;&lt;/abbr&gt;,
take the &lt;code&gt;DirEntry&lt;/code&gt; object (let&#39;s call it &lt;code&gt;entry&lt;/code&gt;) from &lt;code&gt;os.scandir&lt;/code&gt; —
the one corresponding to the directory whose timestamp you&#39;re currently updating —
and pass in &lt;code&gt;entry.stat().st_atime&lt;/code&gt; for that first tuple member
to preserve its existing value.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;aside&gt;
  &lt;h3&gt;why not just post the script?&lt;/h3&gt;
&lt;p&gt;A lot of the details I&#39;ve glossed over are specific to my use case —
safeguards that would force me to manually look at unusual directory structures,
exceptions for edge cases in my library,
stuff like that.&lt;/p&gt;
&lt;p&gt;Oh, and I sort of lied about the recursion;
I actually just copy-pasted the relevant code for each layer of the directory structure
into nested for-loops.
A refactor would&#39;ve been necessary soon,
but my half-baked script did what I needed it to do,
and the gap between its current state and its hypothetical &amp;quot;worth-putting-online&amp;quot; state
is much larger than a simple refactor.&lt;/p&gt;
&lt;p&gt;If you need something like this,
I would really encourage you to think through your specific problem
and write the script yourself,
perhaps only taking the relevant tidbits from my recipe.
Recursively modifying every directory in a tree is not an operation to be taken lightly!&lt;/p&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;p&gt;After tweaking &amp;amp; running my script a few times,
the timestamps finally looked perfect.
From there, I had one more step,
which was to update my NAS&#39;s copy of my music library with the same dates.
One option would be to blow it all away and &lt;code&gt;rsync&lt;/code&gt; the updated files over from my laptop,
but I instead opted to mount the NAS copy as an &lt;abbr title=&quot;Network File System&quot; tabindex=&quot;0&quot;&gt;NFS&lt;/abbr&gt; share from my laptop,
then tweaked my Python script to output a sequence of
&lt;code&gt;touch --reference=&amp;quot;/home/ash/Music/dir/path&amp;quot; &amp;quot;/mnt/Music/dir/path&amp;quot;&lt;/code&gt;
commands, which I could spot-check and then run en masse.
This was lightning fast compared to a re-transfer,
and probably even faster than re-running the Python script on the (&lt;abbr title=&quot;Hard disk drive&quot; tabindex=&quot;0&quot;&gt;HDD&lt;/abbr&gt;-based) NAS.&lt;/p&gt;
&lt;p&gt;It&#39;s worth noting that this solution is only valid
if you don&#39;t edit your music files after adding them to your library.
Otherwise, you&#39;ll end up with modified dates that are &lt;em&gt;actually&lt;/em&gt; the date they were modified,
not also incidentally the date they were initially added!
I&#39;ve always treated metadata cleanup
as a mandatory step of adding music to my library,
and I&#39;ve never made any sweeping changes to the existing library,
so this wasn&#39;t a problem for me.&lt;/p&gt;
&lt;h2&gt;Some actual conclusions&lt;/h2&gt;
&lt;p&gt;Ultimately,
this is a pretty inconsequential story to be telling on my blog.
I borked my files and then I fixed them.
No, you can&#39;t have the script.
But I did it!
Aren&#39;t you proud of me?&lt;/p&gt;
&lt;p&gt;But...
I think there&#39;s a lesson worth communicating in all of this.
It&#39;s a lesson about &lt;em&gt;learned helplessness&lt;/em&gt;,
particularly when it comes to software getting worse &amp;amp; more opaque,
and how learning a scripting language can combat that.&lt;/p&gt;
&lt;p&gt;See, I was aware of this problem for the last few months,
but rather than fixing it,
I sat on my hands.
I was frustrated with the involved software,
and I really didn&#39;t feel like writing a throwaway script
when I could be working on a dozen other more fulfilling things.
It wasn&#39;t even clear to me if writing &amp;amp; running such a script would solve my problem!
Different apps care about different timestamps,
and certain kinds of filesystem timestamps are
&lt;a href=&quot;https://unix.stackexchange.com/questions/556040&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;much harder to change&lt;/a&gt;
than others.&lt;/p&gt;
&lt;p&gt;All that to say:
gathering the motivation to fix this kind of problem is hard enough
even when you have 80% of the necessary technical knowledge.
I can&#39;t imagine how much more helpless it would feel
if I wasn&#39;t already deeply comfortable in Python.&lt;/p&gt;
&lt;p&gt;Breaking away from big tech
(arguably the reason why I ended up in this mess)
isn&#39;t just a matter of principled decision-making.
It&#39;s a journey that demands your time and patience,
along with a knack for problem-solving.
Those solutions don&#39;t always require code,
but even then, it&#39;s usually a matter of proportion;
to use my situation as an example,
I have over 1,500 albums and obviously would not want to fix their timestamps by hand.
I think this is a selling point
that the &amp;quot;learn how to code&amp;quot; evangelists of the last decade
underappreciated &amp;amp; largely overlooked.
Having a scripting language under your belt
is the digital equivalent of having a toolbox in your home
and knowing how to do basic maintenance &amp;amp; repair.&lt;/p&gt;
&lt;p&gt;At a time when corporate giants
are building walled gardens,
abstracting away the details of how things work,
and instructing customers to &lt;a href=&quot;https://forums.redflagdeals.com/proof-destruction-2365828/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;destroy faulty products on camera&lt;/a&gt;
rather than offering repair...
don&#39;t be afraid to get your hands dirty.&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>Dynamic backdrops for Jellyfin</title>
    <link href="https://meow.garden/jellyfin-dynamic-backdrops/" />
    <updated>2026-01-11T23:50:00Z</updated>
    <id>https://meow.garden/jellyfin-dynamic-backdrops/</id>
    <content
      type="html"
      >&lt;p&gt;I wrote some custom CSS to bestow Jellyfin&#39;s web client
with a blurred backdrop on detail pages.
The code is mildly cursed,
but I&#39;m quite fond of how the result looks.
You can use it too if you want!&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;figure&gt;
  &lt;img title=&quot;Screenshot of Jellyfin&#39;s detail view for Chicory: The Sounds of Picnic Province&quot; src=&quot;https://meow.garden/assets/images/jellyfin-dynamic-backdrop-chicory.jpg&quot;&gt;
  &lt;figcaption&gt;The color banding is mostly JPEG compression; it&#39;s far less noticeable in situ¹&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img title=&quot;Screenshot: if by kamome sano&quot; src=&quot;https://meow.garden/assets/images/jellyfin-dynamic-backdrop-if.jpg&quot;&gt;
&lt;figcaption&gt;Stays readable when the image is white...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img title=&quot;Screenshot: Closer by Noisia&quot; src=&quot;https://meow.garden/assets/images/jellyfin-dynamic-backdrop-closer.jpg&quot;&gt;
&lt;figcaption&gt;...and goes decently deep when it&#39;s black&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img title=&quot;Screenshot: Sonic Firestorm by Dragonforce&quot; src=&quot;https://meow.garden/assets/images/jellyfin-dynamic-backdrop-sonic-firestorm.jpg&quot;&gt;
&lt;figcaption&gt;Colors aren&#39;t too in-your-face...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img title=&quot;Screenshot: If It Will by garlagan&quot; src=&quot;https://meow.garden/assets/images/jellyfin-dynamic-backdrop-if-it-will.jpg&quot;&gt;
&lt;figcaption&gt;...unless the album art wants them to be&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img title=&quot;Screenshot: the movie Hackers&quot; src=&quot;https://meow.garden/assets/images/jellyfin-dynamic-backdrop-hackers.jpg&quot;&gt;
&lt;figcaption&gt;Works on movie pages, too...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;img title=&quot;Screenshot: the anime Sherlock Hound&quot; src=&quot;https://meow.garden/assets/images/jellyfin-dynamic-backdrop-sherlock-hound.jpg&quot;&gt;
&lt;figcaption&gt;...and TV shows!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I&#39;m pleased with the balance of legibility and saturation
that I struck with my CSS filters.
Nearly-white images don&#39;t wash out the page,
yet highly-saturated artwork retains its full color in the backdrop.
The filters are at the very bottom of the CSS block below,
if you want to tweak them yourself.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;¹ If you have a monitor that can display more than 8 bits of color,
  you&#39;ll likely find that Chromium-based browsers render the backdrop
  with less color banding than Firefox-based ones.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;How to use&lt;/h2&gt;
&lt;p&gt;On the User → Display configuration screen,
paste this into the &amp;quot;Custom CSS code&amp;quot; field:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;.detailPagePrimaryContainer .detailImageContainer .card,
.detailPagePrimaryContainer .detailImageContainer .cardBox,
.detailPagePrimaryContainer .detailImageContainer .cardScalable {
  contain: style !important;
}
.detailPagePrimaryContainer,
.detailImageContainer .card {
  z-index: auto !important;
}
.layout-mobile .detailImageContainer .card {
  filter: none !important;
  -webkit-filter: none !important;
}
.backgroundContainer {
  z-index: -2 !important;
}
.detailPagePrimaryContainer + .detailPageSecondaryContainer {
  background: none !important;
}
.detailPagePrimaryContainer .detailImageContainer .blurhash-canvas {
  position: fixed !important;
  opacity: .5 !important;
  border-radius: 0 !important;
  filter: contrast(50%) brightness(50%) saturate(300%);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You&#39;ll also want to assign these settings:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Theme: &lt;strong&gt;Dark&lt;/strong&gt; (Light or Apple TV work too)&lt;/li&gt;
&lt;li&gt;Enable blurred placeholders for images: &lt;strong&gt;On&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Details Banner: &lt;strong&gt;Off&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;why these settings?&lt;/h3&gt;
&lt;p&gt;I tuned the CSS filter for the Dark theme,
but the Light and Apple TV themes happen to look decent too.
The other themes &lt;em&gt;technically&lt;/em&gt; work,
but they all set their own backdrop
and it tends to clash with the custom backdrop.&lt;/p&gt;
&lt;p&gt;This hack repurposes the blurred placeholder image
that appears until the primary image (e.g. album art) loads.
How nice of Jellyfin to do the heavy lifting of blurring the image for us!&lt;/p&gt;
&lt;p&gt;When the details banner is enabled,
my z-index hacks cause it to bleed below the info banner,
again clashing with the custom backdrop.
There might be a way to fix this,
but I prefer this feature off anyway.&lt;/p&gt;
&lt;h3&gt;what about the Now Playing page?&lt;/h3&gt;
&lt;p&gt;Unfortunately, not every page has a blurred backdrop
accessible in the DOM.
You could get partway there by repurposing the album art image,
but I&#39;m not interested in sacrificing the album art for the blurred backdrop.&lt;/p&gt;
&lt;h2&gt;Technical details&lt;/h2&gt;
&lt;p&gt;The blurred placeholder is normally set to &lt;code&gt;opacity: 0&lt;/code&gt; after the image loads,
but it remains in the DOM indefinitely.
The custom CSS block is concerned with three things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Breaking the placeholder out of its square box
&lt;ul&gt;
&lt;li&gt;Various parent elements use the CSS &lt;code&gt;contain&lt;/code&gt; attribute
to optimize performance
by narrowing where on the page child elements can draw.
The values on these &lt;code&gt;contain&lt;/code&gt; attributes vary by element,
but they all include &lt;code&gt;paint&lt;/code&gt;;
forcibly setting them to &lt;code&gt;contain: style&lt;/code&gt; excludes &lt;code&gt;paint&lt;/code&gt;
and allows the placeholder to be drawn elsewhere.&lt;/li&gt;
&lt;li&gt;This &lt;em&gt;might&lt;/em&gt; noticeably lower the performance of the page,
depending on your computer &amp;amp; browser.
There&#39;s no way to avoid this
without introducing custom JavaScript or modifying Jellyfin itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Putting the placeholder behind everything else
&lt;ul&gt;
&lt;li&gt;Some of the placeholder&#39;s ancestors set their own &lt;code&gt;z-index&lt;/code&gt;,
which creates a stacking context
that constrains the effective range of child elements&#39; z-index values.
Forcibly assigning &lt;code&gt;z-index: auto&lt;/code&gt; to these ancestor elements
gets rid of their stacking contexts.&lt;/li&gt;
&lt;li&gt;...But then the page background (a non-ancestor element)
gets drawn above the placeholder,
so its &lt;code&gt;z-index&lt;/code&gt; is lowered to -2.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Making the placeholder function as a backdrop
&lt;ul&gt;
&lt;li&gt;Because the placeholder is so heavily blurred already,
it doesn&#39;t need any additional blurring on the CSS side.
Thus, we are only concerned with massaging the colors
to fit in with the page.&lt;/li&gt;
&lt;li&gt;Setting &lt;code&gt;opacity&lt;/code&gt; to 50% isn&#39;t strictly necessary
(you could achieve a similar effect in the existing &lt;code&gt;filter&lt;/code&gt; property),
but conceding half of the color to the default background
gives it some cross-theme support.
Otherwise, the custom backdrop would be way too dark
in the Light and Apple TV themes.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;contrast&lt;/code&gt; and &lt;code&gt;brightness&lt;/code&gt; filters
are intended to limit the overall brightness range,
but they have the side effect of clamping the colors&#39; vibrancy, too.
Amplifying the &lt;code&gt;saturation&lt;/code&gt; compensates for this.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;This custom CSS is provided &lt;strong&gt;as-is&lt;/strong&gt; for anyone who wants to use it.
Because I know nothing about your Jellyfin setup
(and, frankly, not much about Jellyfin in general),
I can&#39;t offer technical support.
But, if you&#39;re feeling chatty,
&lt;a href=&quot;https://meow.garden/contact-me&quot;&gt;let me know&lt;/a&gt; if you end up using it,
and tell me what you changed!&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>Divesting from Big Tech in 2025</title>
    <link href="https://meow.garden/divesting-big-tech/" />
    <updated>2025-12-24T01:15:00Z</updated>
    <id>https://meow.garden/divesting-big-tech/</id>
    <content
      type="html"
      >&lt;p&gt;About 20 years ago,
Google shook the world with its newest product:
Gmail, a free email service with an entire gigabyte of storage attached.
It was the start of a beautiful, connected world.
Apple then casually dropped the most revolutionary computing device of the century,
and Microsoft remembered how to make a good operating system with Windows 7.
Streaming services like Netflix and Spotify completely reshaped how we consume media,
while social platforms like Facebook and Twitter did the same for our online conversations.
Consumer technology was taking over our lives, and we ate it up.
Guys, the free market works!
It really works!!&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;A Tumblr reblog chain from 2016 touting Discord as a replacement for Skype, capped with a 2024 reaction image expressing despair&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-get-discord-instead.png&quot;&gt;
  &lt;figcaption&gt;Environmental storytelling via timestamps&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;In the age of surveillance &amp;amp; subscriptions,
nobody&#39;s thrilled about any of this stuff anymore.
Big Tech took our money,
bought out the competition,
and pulled the rug from under our feet.
It&#39;s hard to reconcile with how much of our lives
we handed over to these massive corporations.&lt;/p&gt;
&lt;p&gt;I&#39;d like to try to claw mine back.&lt;/p&gt;
&lt;p&gt;One of my long-term missions
has been to replace these Big Tech products
with alternatives throughout my life,
particularly &lt;abbr tabindex=&quot;0&quot; title=&quot;Free &amp; open-source software&quot;&gt;FOSS&lt;/abbr&gt; options whenever possible.
Some of them are drop-in replacements for their Big Tech counterparts;
others require substantial lifestyle changes.
You almost certainly won&#39;t like every decision on this list,
but they all made sense for me,
and I&#39;d like to catalogue them for anyone interested.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;My operating system&lt;/h2&gt;
&lt;p&gt;The last time Microsoft gave me a good reason to stay on Windows
was when they released PowerToys;
it&#39;s all been downhill from there.
I mentioned the issues with Microsoft that actually matter
in my blog post on &lt;a href=&quot;https://meow.garden/fl-studio-linux&quot;&gt;running FL Studio on Linux&lt;/a&gt;,
but to air out some of my less pressing gripes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My desktop computer is precisely one CPU generation too old
to be eligible for a Windows 11 upgrade.
&lt;ul&gt;
&lt;li&gt;Does that mean it won&#39;t bother nagging me
about Windows 10&#39;s impending &lt;abbr tabindex=&quot;0&quot; title=&quot;End of life&quot;&gt;EOL&lt;/abbr&gt;?
Of course not!&lt;/li&gt;
&lt;li&gt;Did I actually &lt;em&gt;want&lt;/em&gt; to upgrade this PC,
which already ran all my games &amp;amp; programs just fine?
Not really!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Deferring system updates is a constant game of cat-and-mouse
between Microsoft and the common wisdom online.
It&#39;s infantilizing.
&lt;ul&gt;
&lt;li&gt;Set your update time range to a tiny sliver in the middle of the night!
Oh, that doesn&#39;t work anymore.
Well, just hold Shift when you click the power icon for the normal shutdown options.
What do you mean that doesn&#39;t work either?!&lt;/li&gt;
&lt;li&gt;Now when you search for this information,
you&#39;ll find redditors gleefully whinging about how people are &lt;em&gt;sooo scared&lt;/em&gt; of a little update...
as if Windows updates aren&#39;t known for
discarding unsaved work,
interrupting games,
and &lt;a href=&quot;https://old.reddit.com/r/Windows10/comments/zqo2cw/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;bricking computers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AI blah blah blah telemetry blah blah ads
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.neowin.net/news/microsoft-finally-admits-almost-all-major-windows-11-core-features-are-broken/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;lol. lmao&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, I finally caved and went back to Linux,
ending my decade-long stint with Windows.
My first choice of distro was &lt;a href=&quot;https://fedoraproject.org/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Fedora&lt;/a&gt; (version 42, KDE spin).
This wasn&#39;t an especially principled decision —
it was just one of the officially supported distros for my new Framework laptop.&lt;/p&gt;
&lt;aside&gt;
    &lt;h3&gt;just a heads-up&lt;/h3&gt;
    &lt;p&gt;
        Framework, by the way, is no longer a company I can recommend in good conscience.
        Their hardware is good,
        but they&#39;ve apparently put their money towards &lt;a href=&quot;https://community.frame.work/t/framework-supporting-far-right-racists/75986/1&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;some questionable organizations &amp; individuals&lt;/a&gt;.
        Research this in more depth if you want;
        I&#39;m not sifting through 2,000 posts on the most scrolling-hostile forum interface ever designed.
        As for myself, I don&#39;t foresee making any additional purchases from them.
    &lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;But back to operating systems.
Fedora is a perfectly usable &amp;amp; polished OS;
I think it&#39;s a good choice for anyone who stands to benefit from the cutting-edge hardware support
but doesn&#39;t want to deal with an unstable or more advanced distro.
I might&#39;ve stuck with Fedora longer-term if it weren&#39;t for a single critical piece of software:&lt;/p&gt;
&lt;h2&gt;My DAW&lt;/h2&gt;
&lt;p&gt;Before I talk about migrating away from FL Studio,
I should clarify that its developers, Image-Line,
are in no way implicated by my divestment journey.
The accessibility of FL Studio is the reason why I make music today.
Their &amp;quot;free updates for life&amp;quot; promise has only gotten more &amp;amp; more compelling with the passing years.
I don&#39;t agree with all of their product decisions —
especially the ones that involve embedding ChatGPT into a creative software suite —
but I respect them as a leading force among &lt;abbr tabindex=&quot;0&quot; title=&quot;Digital audio workstation&quot;&gt;DAW&lt;/abbr&gt;s
and admire their dedication to the users-first pricing model.&lt;/p&gt;
&lt;p&gt;Sadly, FL Studio runs unacceptably poorly on Linux.
That&#39;s only their fault insofar as they decided not to prioritize Linux development,
but the impact on my creative output is the same either way.
So, recently I&#39;ve been cooking with something new:&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Screenshot of Bitwig Studio running on my multi-monitor setup&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-bitwig-sm.png&quot;&gt;
  &lt;br&gt;
  &lt;img title=&quot;That classic photo of a laptop + two CRT displays with the giant text &#39;3 monitors kicks ass&#39; spanning all 3 displays&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-3-monitors.jpg&quot;&gt;
  &lt;figcaption&gt;
    How it feels to be able to use my entire screen real estate again
    (&lt;a href=&quot;https://meow.garden/assets/images/divesting-big-tech-bitwig-lg.png&quot;&gt;full res&lt;/a&gt;)
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&lt;a href=&quot;https://bitwig.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Bitwig Studio&lt;/a&gt; is not the same as FL Studio,
and the learning curve has been steep for me.
But it&#39;s really cool on its own merits.
It&#39;s built by a bunch of ex-Ableton engineers who wanted to do better,
and I feel like they&#39;ve succeeded,
although I can&#39;t say that authoritatively.
They&#39;ve clearly thought a lot about how a DAW can enable the songwriting process.
And with the latest update (Bitwig 6 beta),
they&#39;ve dialed in a lot of the fundamental app interactions.
I have a lot more to say about this DAW,
but I&#39;m saving most of it for a dedicated blog post.&lt;/p&gt;
&lt;p&gt;Importantly for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bitwig runs natively on Linux — no messing around with Wine needed!
&lt;ul&gt;
&lt;li&gt;...unless you intend to bridge Windows &lt;abbr tabindex=&quot;0&quot; title=&quot;Virtual Studio Technology&quot;&gt;VST&lt;/abbr&gt; plugins — see below.&lt;/li&gt;
&lt;li&gt;Fortunately, Bitwig&#39;s plugin sandboxing model means that misbehaving plugins
generally won&#39;t crash the entire DAW.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Bitwig&#39;s multi-monitor support is pretty good. Not perfect, but workable for me.
&lt;ul&gt;
&lt;li&gt;I&#39;m &lt;em&gt;so&lt;/em&gt; relieved I don&#39;t have to stick to a single monitor like I thought I might with FL under Wine.&lt;/li&gt;
&lt;li&gt;I wish the devices panel would stick to the arrangement window,
and I wish the other windows wouldn&#39;t randomly swap places on startup.
But that&#39;s small potatoes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bridging Windows VSTs is done using &lt;a href=&quot;https://github.com/robbert-vdh/yabridge&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;yabridge&lt;/a&gt;,
made by the same author as Spectral Compressor — cool dude!
It doesn&#39;t work any miracles,
but it vastly reduces the headache of managing plugin-specific Wine configurations.
In general, if a plugin &lt;em&gt;can&lt;/em&gt; be made to work under Wine,
it can work in tandem with everything else using yabridge,
even if it requires a bespoke version of Wine.&lt;/p&gt;
&lt;h2&gt;My (new) operating system&lt;/h2&gt;
&lt;p&gt;All this yabridge stuff works beautifully once it&#39;s set up,
but it&#39;s not bulletproof.
In fact, it&#39;s the reason why I ended up switching from Fedora to &lt;a href=&quot;https://kubuntu.org/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Kubuntu&lt;/a&gt; (version 25.10).
I&#39;ll try to explain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Bitwig for Linux is available in two packaging flavors: Flatpak and Debian (&lt;code&gt;.deb&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Between those two options, only Flatpak is usable on Fedora,
because it&#39;s an RPM-based distro (as opposed to Debian-based).&lt;/li&gt;
&lt;li&gt;yabridge is &lt;a href=&quot;https://github.com/robbert-vdh/yabridge/issues/135&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;fundamentally incompatible&lt;/a&gt;
with DAWs distributed as Flatpak applications.
The process isolation model just wasn&#39;t designed for use cases like this.&lt;/li&gt;
&lt;li&gt;While I had success naïvely running Bitwig 5&#39;s Flatpak binary outside of the Flatpak environment,
this hack stopped working with Bitwig 6,
leaving me with no practical way to use VSTs inside my DAW.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My new choice of distro, Kubuntu, solves this problem
by enabling me to install Bitwig as a &lt;code&gt;.deb&lt;/code&gt; package instead.
Simple as that!&lt;/p&gt;
&lt;p&gt;Anyway, if you&#39;re shopping for your first Linux distro,
I recommend just picking one you vibe with
and not worrying too much about the details.
Research is always good,
but it&#39;ll never replace the hands-on experience you get
by installing &amp;amp; daily-driving the software.
All things considered, I&#39;m glad I tried Fedora,
even if I ended up switching due to unforeseen compatibility issues.&lt;/p&gt;
&lt;p&gt;Regarding desktop environments,
I still wholeheartedly recommend &lt;a href=&quot;https://kde.org&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;KDE&lt;/a&gt;
for anyone who wants to really customize their desktop experience.
KDE was the next major criterion for my new OS after Debian-ness,
and I made sure to carry over the configuration from my Fedora install.
But, for everyone else,
GNOME and its descendants like Cinnamon work just fine out-of-the-box.
Linux Mint, Pop! OS, and plain old Ubuntu are all perfectly usable options
from what I&#39;ve heard.
Advanced Linuxheads may be interested in EndeavourOS or CachyOS,¹
but if that&#39;s you, you probably don&#39;t need my advice.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;¹ I&#39;m using CachyOS on my old desktop computer,
    which now serves as our home&#39;s dance game PC.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;My browser&lt;/h2&gt;
&lt;p&gt;I&#39;ve been using Firefox since around 2018
(when Chrome&#39;s Manifest V3 was announced),
maybe a little later.
Prior to that, I used Ungoogled Chromium,
a popular fork of Chrome&#39;s open-source codebase.
Browser forks, in general, have always felt unpolished to me —
there&#39;s always something that gets in the way of the intended UX.
Firefox just &lt;em&gt;worked&lt;/em&gt;,
and that was good enough for me.&lt;/p&gt;
&lt;p&gt;But Mozilla, in its infinite wisdom,
looked down its pants and got a great idea for how to use a hammer.²
And now Firefox is bad, too.&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Recursive screenshot of Zen Browser&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-zen-browser.png&quot;&gt;
  &lt;figcaption style=&quot;margin-top: 0&quot;&gt;
      I took this screenshot by putting my monitor in between two mirrors
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As of this month, I&#39;m using &lt;a href=&quot;https://zen-browser.app/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Zen Browser&lt;/a&gt;.
I don&#39;t particularly care for a lot of its unique features —
workspaces feel awkwardly bolted onto Firefox&#39;s &amp;quot;Containers&amp;quot; primitive,
and while pinned tabs look &amp;amp; feel like pretty bookmarks,
it&#39;s way too easy to accidentally replace their contents with an unwanted URL.
But, the positives:
I love side tabs and am excited to see a browser that isn&#39;t Arc lean into this paradigm.
The keyboard shortcuts they&#39;ve added can be customized, even removed if they just get in the way of things.
It&#39;s also one of the most visually appealing browser forks I&#39;ve tried.&lt;/p&gt;
&lt;p&gt;My friend Dylan wrote &lt;a href=&quot;https://dylanjames.xyz/manifest-v3/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;a good blog post about browsers&lt;/a&gt;.
He&#39;s tried more of the modern offerings than I have,
and he landed on Brave, despite its many faults (he&#39;ll be the first to tell you about them).
The one other browser I would toss into the ring is &lt;a href=&quot;https://helium.computer/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Helium&lt;/a&gt;,
a privacy-centric fork of Chrome based on Ungoogled Chromium.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;² h/t &lt;a href=&quot;https://mastodon.social/@TheZeldaZone/114082180124431864&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;@TheZeldaZone@mastodon.social&lt;/a&gt; for this analogy&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;My web search provider&lt;/h2&gt;
&lt;p&gt;For as much as the Google Search experience has deteriorated over the decades,
the sheer breadth of their web index is still best-in-class.
When I tried switching to DuckDuckGo a few years ago,
I found myself re-querying the same terms on Google time and time again,
to the point where I gave up and set Google back to my default.&lt;/p&gt;
&lt;p&gt;I don&#39;t think this was entirely my fault:
DuckDuckGo, too, has become a noticeably worse experience over the years.
Their results often contain as many ads as Google,
and they push their own AI stuff in front of you on the default settings
(which I find myself on often, for various reasons).
I think this is sort of unavoidable in the free web search market:
if it&#39;s free, that means &lt;em&gt;you&#39;re&lt;/em&gt; the product, no matter who&#39;s running it.
And I&#39;m sick of being the product.&lt;/p&gt;
&lt;p&gt;So, I&#39;m on the paid search engine &lt;a href=&quot;https://kagi.com&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Kagi&lt;/a&gt; now.&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Screenshot of Kagi.com when logged in&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-kagi.png&quot;&gt;
  &lt;figcaption style=&quot;margin-top: 0&quot;&gt;
      The mascot is cute
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you balk at the thought of paying for web search,
I completely understand &amp;amp; agree.
I wrote the thought off as an unnecessary luxury for a long time.
But, after giving the free trial a spin,
I found it hard to deny that it was vastly better than all the free options.
The results are not only good out-of-the-box, but &lt;em&gt;fine-tunable&lt;/em&gt; on a per-domain basis!
The inclusion of bangs is nostalgic, and maybe one day useful to me.
There are AI features around,
but they don&#39;t shove themselves into my face or run without my permission.
Kagi respects my time &amp;amp; my intelligence as a user
and I&#39;ve learned well enough to appreciate that.&lt;/p&gt;
&lt;p&gt;Kagi even lets you upload custom CSS,
and it works everywhere you&#39;re signed in — even on your phone!
I nuked the Assistant link at the top of the homepage using custom CSS
and saw it disappear from my phone the instant I refreshed
and I felt like a &lt;em&gt;god&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, this is not an ad,
and to that end I should mention what I don&#39;t like about Kagi.
The lowest-priced plan includes 300 searches per month,
which I think is too low for most people,
and definitely myself.
I apparently average 25 web searches per day!
The way Privacy Pass works is weird —
it kicks you out of your login session,
which makes sense from a technical standpoint,
but I wish they had just used a subdomain instead.
Finally, while the &amp;quot;small web&amp;quot; lens sounds charming,
it&#39;s pretty underwhelming in scope;
none of the blogs I care about are on it.³&lt;/p&gt;
&lt;p&gt;For most people, DuckDuckGo is probably fine;
I did ultimately switch to it from Google earlier this year,
despite my past struggles to commit.
But Kagi has made me realize how &lt;em&gt;crap&lt;/em&gt; the free search user experience has become.
It&#39;s one of the only non-essential subscription services
I currently allow into my life.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;³ Submitting small websites for inclusion is done by
    creating a pull request on a &lt;a href=&quot;https://github.com/kagisearch/smallweb&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;public GitHub repo&lt;/a&gt;,
    which is clearly a stopgap solution,
    but strange nonetheless for a privacy-oriented company.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;My email&lt;/h2&gt;
&lt;p&gt;Email sort of sits in the middle of the &amp;quot;self-hostable&amp;quot; to &amp;quot;just sign up somewhere&amp;quot; spectrum.
Yes, &lt;em&gt;technically&lt;/em&gt; you can operate a mail server yourself,
but everyone with domain knowledge will scream at you
to save your future self the many headaches.
Email is a ridiculously complex &amp;amp; overgrown technology,
and the list of self-hosting pitfalls is probably longer than this blog post.&lt;/p&gt;
&lt;p&gt;Email is also a service that most people I know don&#39;t pay for,
or think about that much.
But I think the case for paying for email is stronger than web search,
especially from a privacy standpoint.
I don&#39;t need to hand an advertisement company a list of every account I&#39;ve ever created
and everything I&#39;ve ever paid for,
no matter what their privacy policy says.&lt;/p&gt;
&lt;p&gt;I&#39;ve been paying for &lt;a href=&quot;https://fastmail.com/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Fastmail&lt;/a&gt; since 2017.
It grants all of my domains the ability to send &amp;amp; receive emails (including meow.garden),
and even offers catch-all aliases for maximum ease of use.
Their service has remained nearly the same for the last 8 years,
which gives me confidence that they&#39;re not pursuing infinite growth,
and so will likely survive the next 8 years too.
This is &lt;em&gt;objectively good&lt;/em&gt; for a service as essential as email.
I&#39;m not sure if they&#39;ve ever given me anything to complain about.&lt;/p&gt;
&lt;p&gt;This is admittedly petty, but
I also like that Fastmail doesn&#39;t pay YouTubers for ad reads,
in contrast to Proton.&lt;/p&gt;
&lt;h2&gt;My media library&lt;/h2&gt;
&lt;p&gt;When I tell you that I&#39;ve never paid for Spotify, Netflix,
or any of the dozens of streaming services for TV channels &amp;amp; media moguls...
I don&#39;t &lt;em&gt;entirely&lt;/em&gt; mean it as a flex.
The truth is that I&#39;m fully out-of-touch with mainstream media,
precisely due to this insistence of mine!
It&#39;s a big part of why my interests as a consumer are so decidedly niche.
That can be a blessing at times,
but trying to interact with, like, normal people —
the kind who have watched Breaking Bad and Severance and know what movies came out this year —
really turns it into a curse.
And I &lt;em&gt;need&lt;/em&gt; those people in my life to maintain my perspective on what&#39;s normal!!!&lt;/p&gt;
&lt;p&gt;So, you probably shouldn&#39;t take anything in this section as advice.
But I&#39;ll mention where I am with it anyway,
because it&#39;s a huge part of my mission,
whether I&#39;m happy with where I currently am or not.&lt;/p&gt;
&lt;figure&gt;
    &lt;img title=&quot;Screenshot of my music collection in Jellyfin&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-jellyfin-music-sm.png&quot;&gt;
  
  &lt;figcaption style=&quot;margin-top: 0&quot;&gt;
    A vanishingly small window into the 2,000 albums I&#39;ve amassed
    (&lt;a href=&quot;https://meow.garden/assets/images/divesting-big-tech-jellyfin-music-lg.png&quot;&gt;full res&lt;/a&gt;)
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;One of my big projects this year
was to overhaul my personal &lt;abbr tabindex=&quot;0&quot; title=&quot;Network-attached storage&quot;&gt;NAS&lt;/abbr&gt; computer into a home-wide NAS,
featuring a media server that my housemates and I can upload to.
Our collection isn&#39;t expansive by any means,
but it has all the shows &amp;amp; movies we actually want to watch together,
and it grows every month.
We use the official &amp;quot;Swiftfin&amp;quot; client on our Apple TV —
a recommendation from a friend that I agree was a solid one-time purchase.
The NAS itself is just a computer I built a couple years ago,
running TrueNAS, &lt;a href=&quot;https://jellyfin.org/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Jellyfin&lt;/a&gt;, and &lt;a href=&quot;https://github.com/9001/copyparty&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;copyparty&lt;/a&gt; for file transfers.&lt;/p&gt;
&lt;p&gt;This same server also hosts my full personal music collection (pictured above) —
over 300 GB of audio files, accessible anywhere on the network.
I use the unofficial &amp;quot;Fintunes&amp;quot; client to listen to music on my phone.
Depressingly, I &lt;em&gt;still&lt;/em&gt; haven&#39;t settled on a music client for Linux
because nearly all of them handle transcoded copies of albums poorly.
This is Apple&#39;s fault for never bothering to support &lt;abbr tabindex=&quot;0&quot; title=&quot;Free Lossless Audio Codec&quot;&gt;FLAC&lt;/abbr&gt;
and my fault for using iOS&#39;s stock Music app for so long.&lt;/p&gt;
&lt;aside&gt;
    &lt;h3&gt;intermission&lt;/h3&gt;
    &lt;p&gt;
        It&#39;s been a long year.
        And this has been a long post.
    &lt;/p&gt;
    &lt;p&gt;
        If you&#39;d honor a request from yours truly:
        take an hour to listen to my &lt;abbr tabindex=&quot;0&quot; title=&quot;Album of the year&quot;&gt;AOTY&lt;/abbr&gt;, &lt;b&gt;Sunk Cost Fallacy&lt;/b&gt; by Fox Stevenson —
        perhaps on &lt;a href=&quot;https://foxstevenson.bandcamp.com/album/sunk-cost-fallacy&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Bandcamp&lt;/a&gt;
        where you can also buy it.
        You might also consider pausing reading here,
        but that&#39;s up to you.
    &lt;/p&gt;
    &lt;p&gt;
        If we&#39;ve talked before,
        you should &lt;a href=&quot;https://meow.garden/contact-me&quot;&gt;send me&lt;/a&gt; your favorite release of the year,
        whether as a Bandcamp link or even just the title and artist.
        Or send me whatever you want!
        Or you can do none of those things and press along.
        I&#39;m glad you&#39;re here either way.
    &lt;/p&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;h2&gt;My password manager&lt;/h2&gt;
&lt;p&gt;This one&#39;s simple:
I self-host &lt;a href=&quot;https://github.com/dani-garcia/vaultwarden&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Vaultwarden&lt;/a&gt;,
an unofficial Rust implementation of the Bitwarden server &lt;abbr tabindex=&quot;0&quot; title=&quot;Application programming interface&quot;&gt;API&lt;/abbr&gt;.
The official Bitwarden client supports self-hosted servers on all platforms,
so this has always worked seamlessly for me.
I host the server on a cheap VPS that also runs a bunch of other things I operate online.
Vaultwarden is pleasantly lightweight and plays nice with shared resources,
especially compared to the official Bitwarden server image.&lt;/p&gt;
&lt;p&gt;Insofar as this counts as Big Tech divestment:
I cannot fathom entrusting my credentials or payment details to my browser vendor.
Not that I think Google or Mozilla will ever misuse that information,
but they can choose to revoke access to your account at any time,
and that&#39;s about as unacceptable of a risk
when it comes to the keys to my entire digital life!&lt;/p&gt;
&lt;h2&gt;How I stay ~connected~&lt;/h2&gt;
&lt;p&gt;The social media landscape is a hot mess right now.
Twitter&#39;s heyday is over,
Tumblr &amp;amp; Bluesky have destroyed their goodwill with terrible moderation,
and Meta&#39;s products are about as appealing as licking a poisonous frog.
Don&#39;t ask me what&#39;s going on with Mastodon;
I&#39;m not here to sell you on the next underfunded &amp;amp; understaffed platform.
In fact, I&#39;m already done talking about social media.
This section is about &lt;abbr tabindex=&quot;0&quot; title=&quot;Really Simple Syndication&quot;&gt;RSS&lt;/abbr&gt;!&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Screenshot of FreshRSS, with a &#39;You are connected&#39; login toast at the top of the page&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-freshrss.png&quot;&gt;
  &lt;figcaption style=&quot;margin-top: 0&quot;&gt;
      &quot;You are connected&quot; I sure am, buddy
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;One of the other self-hosted pieces of software I use is &lt;a href=&quot;https://freshrss.org/index.html&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;FreshRSS&lt;/a&gt;,
an RSS feed manager that interoperates with various other clients.
I typically read it on my phone;
there, I use the free, open-source, and ad-free(!) iOS app NetNewsWire.
When I was still on Windows, I was happy with the Fluent Reader app.
I haven&#39;t found a similarly polished client for Linux,
but I&#39;m not especially missing having a desktop solution.
Some of my friends use the Firefox extension Feedbro and are happy with it.&lt;/p&gt;
&lt;p&gt;I use RSS to follow a couple dozen friends&#39; &amp;amp; acquaintances&#39; blogs,
and I&#39;ll curate a short list of them for a future blog post.
You can also use RSS to follow GitHub releases;
it&#39;s a decent way to keep tabs on security patches
for self-hosted server software.
Is it a replacement for social media?
Of course not.
But I love that RSS is still usable in this era.
It feels &lt;em&gt;punk&lt;/em&gt; in a way that few other web technologies do.&lt;/p&gt;
&lt;h2&gt;My code editor&lt;/h2&gt;
&lt;p&gt;In a vacuum,
Microsoft&#39;s VS Code got a lot of things right.
It&#39;s the least Electron-feeling Electron app ever made,
which is all the more impressive given its scale.
Language servers are such an obviously good idea,
and they&#39;ve improved the code authoring experience
for folks across a variety of editors.
I don&#39;t feel compelled to fiddle with it;
it&#39;s unobtrusive, productive.&lt;/p&gt;
&lt;p&gt;But, well,
now we&#39;re in the second paragraph of this section.
You know what&#39;s coming.
&lt;em&gt;I&lt;/em&gt; know what&#39;s coming.
Do I even need to say it?
Does anyone mind if I just skip it this time?&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;wanted&lt;/em&gt; to tell you that I switched to Kate, KDE&#39;s in-house editor.
Kate has &lt;abbr tabindex=&quot;0&quot; title=&quot;Language Server Protocol&quot;&gt;LSP&lt;/abbr&gt; support,
Vim mode, some nice themes, and a seamless visual identity
in tandem with the rest of the KDE ecosystem.
It&#39;s a native desktop app written in good old Qt.
It should be perfect for me!&lt;/p&gt;
&lt;p&gt;But it&#39;s not quite there yet,
and it seems like progress is slow
(it&#39;s crowdfunded open-source, after all).
The file panel hides &lt;code&gt;.gitignore&lt;/code&gt;&#39;d items,
as well as empty directories,
which makes performing basic file operations frustrating.
Its integration with Python&#39;s LSP
causes the text cursor to jump to the bottom of the file
on each save that formats the code.
I wish I could dismiss these as infrequent nuisances,
but they&#39;re not.
They&#39;re incredibly disruptive bugs
that pull me out of my workflow
and make me switch apps or micromanage my code editor instead.
I blame no one who works on Kate for this —
from what I recall researching,
these are both documented issues on the bug trackers of its dependencies.&lt;/p&gt;
&lt;p&gt;So, it&#39;s with a heavy heart that I must inform you
that I&#39;m using &lt;a href=&quot;https://zed.dev/&quot; target=&quot;_blank&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Zed&lt;/a&gt; now.&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Screenshot of Zed as I edit this blog post&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-zed.png&quot;&gt;
  &lt;figcaption&gt;
      No witty caption for this one, I&#39;m just sad
  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Zed&#39;s makers are not aligned with my priorities.
They have a heavy focus on AI,
and their product includes telemetry and an account system,
but all of those elements can be disabled with a toggle or two.
The codebase is open-source,
but the stewards are funded by venture capital,
so I fully expect the product to either get worse or lose funding
sometime in the next few years.
Maybe the community will pick up where they left off when that happens.
Either way, this is the least principled
(and probably least permanent)
element of my journey.&lt;/p&gt;
&lt;p&gt;Oh, right, the positives:
the user interface is rendered entirely on the &lt;abbr tabindex=&quot;0&quot; title=&quot;Graphics processing unit&quot;&gt;GPU&lt;/abbr&gt;,
making it &lt;strong&gt;the&lt;/strong&gt; most responsive code editor I&#39;ve ever used.
The keybinding system is flexible enough for my needs,
and they didn&#39;t overbake the file panel.
It hits a lot of the same &amp;quot;unobtrusively productive&amp;quot; notes
as VS Code did back in the day.&lt;/p&gt;
&lt;p&gt;For most folks,
VSCodium is probably the correct move.⁴
I found it performed noticeably worse on Linux than VS Code did on Windows,
but it&#39;s not clear whether the editor or the OS is at fault.
Give it a shot if you just want to deprive Microsoft of telemetry &amp;amp; market share
without learning your way around a new piece of software.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;⁴ Sublime Text might also work for you;
  I get terrible performance,
  but I&#39;m led to suspect this is the fault of my AMD GPU.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;My game library&lt;/h2&gt;
&lt;p&gt;I guess I&#39;m done with Minecraft.
That&#39;s fine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Wrapping up&lt;/h2&gt;
&lt;p&gt;Despite how long &amp;amp; detailed this post got,
I&#39;ve not been spending nearly as much time on the computer
as you might be led to believe.
I&#39;ve been spending more and more of my time in the real world,
cooking meals for myself and my housemates
and being a good friend where I can.
But, again, that&#39;s not entirely a flex.
I need to get better at time management
in order to reap the benefits
of all these adjustments to my digital life.
I need to listen to &amp;amp; write more music.
I need to work on my side projects again.&lt;/p&gt;
&lt;p&gt;To close things out,
I have a request for you, dear reader:
if we&#39;ve talked before,
and if you find a social platform that isn&#39;t shadily funded or terribly moderated,
I&#39;d love to hear about your experience.
Nothing has filled the void in my life where &lt;a href=&quot;https://meow.garden/goodbye-cohost&quot;&gt;cohost&lt;/a&gt; once was,
and the Internet feels lonelier than ever as a result.
I&#39;m lucky to have &lt;abbr tabindex=&quot;0&quot; title=&quot;In real life&quot;&gt;IRL&lt;/abbr&gt; support,
but I can&#39;t imagine how much lonelier it feels
for my online friends who lack that interpersonal network.
This is the one part of my life where I have not managed to escape Big Tech.
It sucks.&lt;/p&gt;
&lt;p&gt;That would be a pretty sour note to end on, though,
so here&#39;s my plushie tower to balance things out.
Yaaay plushies :)&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;A dresser full of plushies&quot; src=&quot;https://meow.garden/assets/images/divesting-big-tech-plushies.jpg&quot;&gt;
  &lt;figcaption&gt;
      Remember that &lt;a href=&quot;https://meow.garden/you-can-do-anything-at-all&quot;&gt;you can do anything at all&lt;/a&gt; on your blog
  &lt;/figcaption&gt;
&lt;/figure&gt;
</content
    >
  </entry>
  <entry>
    <title>Undertale: a good enough game</title>
    <link href="https://meow.garden/undertale-good-enough/" />
    <updated>2025-09-15T22:08:00Z</updated>
    <id>https://meow.garden/undertale-good-enough/</id>
    <content
      type="html"
      >&lt;p&gt;Today is &lt;em&gt;Undertale&lt;/em&gt;&#39;s 10th anniversary.
In case you weren&#39;t aware, this game used to be a cornerstone of my online identity;
I used its sprites as my avatars and cherry-picked its flavor text for my social media bios.
I cared about this game a lot, and I still feel the shockwaves of its emotional impact on me when I revisit it.
So, today&#39;s anniversary seems like an appropriate time to write about the thesis statement that&#39;s been brewing in my head:
Undertale was a &lt;em&gt;good enough&lt;/em&gt; game to become my all-time favorite game, at least for a couple years.&lt;/p&gt;
&lt;p&gt;The game wasn&#39;t perfect, or anywhere close.
I suspect many of the people who hype it up to this degree are allowing their perception to be colored by the game&#39;s context -
factoids like its miniscule team
(&lt;em&gt;not&lt;/em&gt; &amp;quot;solo dev&amp;quot; as is commonly claimed),
Toby&#39;s background being primarily in music rather than games,
and the indie success narrative it helped to weave.
There&#39;s a time and place where these details are relevant,
but it&#39;s not going to be the pitch or the review
(not that this blog post is either of those things).&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Sans suggests that sometimes it&#39;s better to take what&#39;s given to you&quot; src=&quot;https://meow.garden/assets/images/undertale-good-enough/sans-dinner.png&quot;&gt;
  &lt;figcaption&gt;If I didn&#39;t include this screenshot, the rest below would lead you to believe the game takes place in a black void&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I don&#39;t mean to deny the game&#39;s intrinsic merits, though;
Undertale being &amp;quot;good enough&amp;quot; implies that it is also, on its own terms, &lt;em&gt;good&lt;/em&gt;.
As a plain old videogame, it brings some interesting ideas to the table, particularly during combat.
The dialogue and pacing are both solid, though with plenty of room for improvement.
And its soundtrack is, of course, &lt;a target=&quot;_blank&quot; href=&quot;https://tobyfox.bandcamp.com/track/undertale&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;stellar&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But none of these qualities are quite what I would point to
if someone asked me &lt;em&gt;why&lt;/em&gt; Undertale was my favorite game for so long.
My answer is simple, though highly personal:
the emotional climax of the pacifist route struck a chord that I desperately needed to feel at that time.&lt;/p&gt;
&lt;hr&gt;
&lt;aside&gt;
&lt;h3&gt;Spoiler warning&lt;/h3&gt;
&lt;p&gt;The rest of this post assumes you are generally familiar with &lt;i&gt;Undertale&lt;/i&gt;&#39;s pacifist route.
If you haven&#39;t played it yet, it will come across as immediate &amp;amp; blatant spoilers.
You&#39;ve had 10 years, but I&#39;m warning you anyway.&lt;/p&gt;
&lt;/aside&gt;
&lt;hr&gt;
&lt;h2&gt;This part&#39;s about myself&lt;/h2&gt;
&lt;p&gt;2015 was a complicated year for me.
I graduated college, started my first real &amp;quot;industry&amp;quot; job, and moved in with my soon-to-be ex.
My friends were exclusively online and, as I recall, exclusively at arm&#39;s length from me.
There was a stretch of a couple months where I cried myself to sleep every other night.
I felt broken; I questioned if I was unlovable.
You know, standard early 20s depression stuff.&lt;/p&gt;
&lt;p&gt;What I really needed at the time was a therapist,
or at least a better way to confide in friends than a private Twitter account.
What I got instead was a cutscene where you hug a sad, kinda-dead-but-it&#39;s-complicated goat kid.&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Frisk looking at Asriel, with a prompt to either &#39;Comfort him&#39; or &#39;Do not&#39;&quot; src=&quot;https://meow.garden/assets/images/undertale-good-enough/comfort-him.png&quot;&gt;
  &lt;figcaption&gt;The second option is only there for speedrunners and the Pope&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Fiction though it may be,
this was the closest thing to a heartfelt hug I had experienced all year.
I cried and cried, and barely had the words to explain why.
Undertale marked the start of my recovery from this low point in my life.&lt;/p&gt;
&lt;h2&gt;And that&#39;s &lt;em&gt;in spite of&lt;/em&gt; the game!&lt;/h2&gt;
&lt;p&gt;Here&#39;s the thing:
I &lt;em&gt;barely&lt;/em&gt; understood what the fuck was going on during this sequence.&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Asriel&#39;s god form &amp;amp; name revealed&quot; src=&quot;https://meow.garden/assets/images/undertale-good-enough/asriel-reveal.jpg&quot;&gt;
  &lt;figcaption&gt;Also this was the 3rd or 4th time I thought I had reached the True Final Boss&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Sorry, &amp;quot;Asriel Dreemurr&amp;quot;?
Is this like, Asgore&#39;s final form?
Or, oh, was that the name those random monsters told me about on my way to the throne room?
Because that happened &lt;em&gt;yesterday&lt;/em&gt; in real life
and I didn&#39;t know what relevance their story had to anything to know what tidbits of information to retain.
Is that the same kid as the mysterious voice in those True Lab tapes?
Am &lt;em&gt;I&lt;/em&gt; the same kid from those tapes???&lt;/p&gt;
&lt;p&gt;The way this part of the story is set up I would describe, mostly pejoratively, as &lt;em&gt;clever&lt;/em&gt;.
It all holds up to scrutiny after a couple plays,
or once your game has a wiki to reference.
But on my first playthrough,
on the first week of the game&#39;s release,
I had none of those things.
I was completely lost.
It was only after I went back to play the game again,
with the context of a couple reddit trawls &amp;amp; wiki reads,
that the true emotional weight of the scene finally settled in my head.
It still hit on that first playthrough,
but it&#39;s kind of a miracle that my utter confusion didn&#39;t get in the way.&lt;/p&gt;
&lt;p&gt;And this isn&#39;t just a problem with Asriel&#39;s story.
The whole gotcha where you &amp;quot;name the fallen human&amp;quot;,
see it in the UI during every battle,
and then find out that you actually named the &lt;em&gt;first&lt;/em&gt; human who fell
instead of the one you&#39;ve been controlling this whole time?
None of that clicked on first playthrough.
I don&#39;t even think I would&#39;ve figured it on my second playthrough
without reading supplementary materials about the game.&lt;/p&gt;
&lt;p&gt;Most characters&#39; plot threads weren&#39;t nearly as convoluted as Asriel and Chara&#39;s,
but much of the main cast has characterization issues of their own.
Near the end of the pacifist route,
I was informed that I had &amp;quot;befriended&amp;quot; all of the other main characters,
and they talked about me as such.
I hadn&#39;t said more than 10 prompt-based words to any of these monsters,
and the &amp;quot;dates&amp;quot; a few of us went on were just extremely silly (yet mandatory, as I would learn) cutscenes.&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Toriel talking about all the &#39;great friends&#39; we&#39;ve made&quot; src=&quot;https://meow.garden/assets/images/undertale-good-enough/everyone-is-here.png&quot;&gt;
  &lt;figcaption&gt;More than half of the people in this room have tried to kill me&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I see what the game wants me to feel; I just don&#39;t think I earned any of it.
Should &lt;em&gt;any&lt;/em&gt; of these characters consider me their friend?
Maybe Toriel, even though she accidentally¹ killed me in battle and then left me to die in the underground (god forbid a woman does anything).
Maaaybe Papyrus, given that he was even more careful about never killing me (and is emotionally naive enough that him believing we&#39;re friends feels in-character).
But the rest of the cast singing my praises right before the Asriel fight just felt &lt;em&gt;weird&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;I will concede that I don&#39;t know how to solve this problem without at least doubling the length of the game.
The crux of it is that Undertale isn&#39;t anywhere near long enough for a silent protagonist to develop a meaningful relationship with the other characters.
That&#39;s not to say that Undertale&#39;s short length was the only issue with its writing, though;
hell, I&#39;d argue that Deltarune Chapter 1 develops its cast more thoroughly than Undertale&#39;s entire pacifist route,
despite being less than half as long!
Sure, Undertale had to tie up all the loose threads in one self-contained experience,
while Deltarune Chapter 1 had the luxury of setting up plot beats to revisit in any of the next 6 chapters.
All I&#39;m saying is that the story Undertale was trying to tell needed more dialogue -
more time &amp;amp; circumstances for the characters to develop -
to really earn the emotional weight it swings around.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;¹ Toriel&#39;s bullets are programmed to avoid hitting you once your health drops below a threshold,
  but if your turn ends just above that threshold and you get hit a bunch,
  she can &quot;accidentally&quot; kill you.
  She puts on a shocked expression for about 2 frames before the Game Over plays.
  It&#39;s hard to hold a grudge over this when it&#39;s also really funny.&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;But, like, it&#39;s still a good game&lt;/h2&gt;
&lt;p&gt;So, the part of the game that had the greatest impact on me is marred by some glaring flaws.
So what?
It still succeeded in tugging at my heartstrings!
Wherever the narrative didn&#39;t quite resonate,
there was always &lt;em&gt;something&lt;/em&gt; to fill in the gap.
That something could&#39;ve been a joke that landed at just the right time,
a fourth-wall break that snapped me out of the gamer&#39;s trance,
or a song that conveyed the emotions the story didn&#39;t have time to tell.&lt;/p&gt;
&lt;figure&gt;
  &lt;img title=&quot;Flowey post-defeat, with options for Fight or Mercy&quot; src=&quot;https://meow.garden/assets/images/undertale-good-enough/flowey-fight-or-mercy.png&quot;&gt;
  &lt;figcaption&gt;You are doing some trolley problem shit to me&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;I&#39;ll always remember Asgore shattering the Mercy button,
and the catharsis of seeing it pieced back together after defeating him.
I&#39;ll always remember how genuinely upsetting the Photoshop Flowey fight was,
and how I actually had to &lt;em&gt;think&lt;/em&gt; about the Fight / Mercy option after defeating him
(in a game that&#39;s all about picking Mercy over Fight).
And I&#39;ll always, always remember how hugging Asriel in the game
felt like receiving a hug in real life.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;It&#39;s no stretch to say that Undertale changed my perception of what art can do for its audience.
When I think about the music I was writing around this time,
I remember that my only real goal was to make something that sounded good or cool -
something that could land me on a well-respected label.
Nowadays, I couldn&#39;t care less about that.
I&#39;ve been writing music with the intent to make people &lt;em&gt;feel&lt;/em&gt; things.
It might not be as commercially viable as Riddim Fusion or whatever my rhythm game songs lean towards,
but that&#39;s fine by me.
I&#39;d rather my art be genuine than pristine.
It worked for Undertale and I think it&#39;ll work for me, too.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Undertale&lt;/em&gt;, divorced from all context of its inception &amp;amp; creation, is an 8/10 game at best.
I have no doubt that I could find a &amp;quot;better&amp;quot; RPG out there - that is, one I&#39;d ascribe a higher number to.
But I don&#39;t care about the number.
Undertale was &lt;em&gt;good enough&lt;/em&gt;.
It was my favorite game for a long time,
and it earned that title not through flawless execution,
but through its willingness to try anyway.&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>Goodbye and good riddance, Spotify</title>
    <link href="https://meow.garden/good-riddance-spotify/" />
    <updated>2025-07-27T22:43:00Z</updated>
    <id>https://meow.garden/good-riddance-spotify/</id>
    <content
      type="html"
      >&lt;p&gt;As of today, I&#39;ve pulled my music catalog from Spotify.
I refuse to be an accomplice to the murderous whims of a CEO
who&#39;s gotten far too comfortable flaunting his stolen wealth and moral bankruptcy.
If you publish music on streaming platforms, I think you should follow suit.
Compromising on human rights isn&#39;t worth any amount of money,
but &lt;em&gt;especially&lt;/em&gt; not the table scraps Spotify pays artists like us.&lt;/p&gt;
&lt;figure&gt;
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube-nocookie.com/embed/LQRtKD4gx1k&quot; title=&quot;Leaving Spotify: What Every Musician Needs to Know&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;a target=&quot;_blank&quot; href=&quot;https://www.youtube.com/@RedMeansRecording&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Red Means Recording&lt;/a&gt; explains the details better than I could&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you listened to my music on Spotify, I have a few things to say:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thanks for enjoying my music, and sorry for the inconvenience.&lt;/li&gt;
&lt;li&gt;If I were you, I would strongly consider finding another platform for listening to music.
I am not the right person to ask for recommendations here,
unless you&#39;re interested in building a local music collection on your hard drive.&lt;/li&gt;
&lt;li&gt;Buying songs on &lt;a href=&quot;https://ashastral.bandcamp.com/&quot; rel=&quot;noreferrer nofollow noopener external&quot; target=&quot;_blank&quot;&gt;Bandcamp&lt;/a&gt; is the best way to support me &amp;amp; many other small artists,
and a great way to start building a local music collection as mentioned above.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&#39;s hoping to a brighter, more peaceful world.&lt;/p&gt;
</content
    >
  </entry>
  <entry>
    <title>The fruit peg goes in the penguin hole</title>
    <link href="https://meow.garden/fl-studio-linux/" />
    <updated>2025-07-04T03:23:00Z</updated>
    <id>https://meow.garden/fl-studio-linux/</id>
    <content
      type="html"
      >&lt;p&gt;&lt;em&gt;(or, Running FL Studio on Linux)&lt;/em&gt; &lt;br&gt;&lt;/p&gt;
&lt;p&gt;I&#39;m not sure exactly where I draw the line between software vendors I will and won&#39;t use, but I know it lies somewhere between &amp;quot;riddled with ads&amp;quot; and &amp;quot;actively facilitating a genocide&amp;quot;. Unfortunately, that leaves me with a tough decision at the very bottom of my productivity stack, namely my operating system. The best things Windows has going for it are that (1) I&#39;m already using it and (2) it supports FL Studio and every VST I&#39;ve ever used. It&#39;s a foregone conclusion that I&#39;ll be giving up the first point, so it&#39;s time to see how far I can push the second point.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/screenshot-fl-studio-on-linux.jpg&quot; alt=&quot;&quot; title=&quot;Screenshot showing FL Studio &amp;amp; various plugins running on Fedora Linux&quot;&gt;&lt;/p&gt;
&lt;p&gt;Yes, on Linux. The proverbial oil to the waters of music production!&lt;/p&gt;
&lt;p&gt;The good news is that I&#39;m already quite familiar with Linux. I use a Linux VPS to host this &amp;amp; all my other websites. On my Windows desktop, I used WSL extensively for development. And many years ago, I used Ubuntu as my daily driver; back then, I would run FL Studio inside VirtualBox running Windows XP, which went about as well as you would expect.&lt;/p&gt;
&lt;p&gt;I&#39;m not going down that path this time. Instead, I&#39;m using Wine to run the necessary software directly within Linux. If that sounds like a bad idea, it&#39;s because it probably is! But many of the best ideas sound ridiculous until you&#39;ve actually tried them, or, something like that. Who knows? Maybe Wine has matured enough to the point where you can run a complete music production stack. I&#39;m sure it won&#39;t be perfect, but it could be good enough. There&#39;s only one way to find out.&lt;/p&gt;
&lt;p&gt;&lt;i&gt;&amp;quot;But Ash, why not get a Mac? Doesn&#39;t OSX support FL Studio and most VSTs?&amp;quot;&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;I had to use a Macbook for work for the last 4 years and I hated it. I will not be elaborating in this post.&lt;/p&gt;
&lt;h2&gt;FL Studio&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-with-workaround.png&quot; alt=&quot;&quot; title=&quot;Works with Workaround&quot;&gt;&lt;/p&gt;
&lt;p&gt;I&#39;ve used FL Studio from the very start of my music-making days. I&#39;m willing to try other DAWs that have better Linux support, but I don&#39;t look forward to the prospect. It would be a relief if I could just get FL working on Linux.&lt;/p&gt;
&lt;p&gt;Here&#39;s how this went for me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Attempting to run the FL Studio installer directly using Wine is a non-starter.&lt;/li&gt;
&lt;li&gt;Bottles (a GUI / management layer for Wine) with default settings doesn&#39;t seem to accept the installer, either.
&lt;ul&gt;
&lt;li&gt;Oh, but Bottles has a community-maintained &amp;quot;installer&amp;quot; for FL Studio! ...which is also broken, but for a different, silly reason (its hardcoded download link to the specific FL version installer returns a 404 error). Seems fixable, but let&#39;s try something else.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Searching online turns up a lot of old results for outdated versions of FL... but one particular result, &lt;a target=&quot;_blank&quot; href=&quot;https://github.com/Torbuntu/fl-studio-linux-setup&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;FL Studio Linux Setup Guide&lt;/a&gt;, is mere &lt;em&gt;months&lt;/em&gt; old and turned out to have exactly the information I needed. I recommend consulting that page for any updated guidance, but here&#39;s the gist of what I needed to do in Bottles:
&lt;ul&gt;
&lt;li&gt;Create a bottle for FL Studio with default settings.&lt;/li&gt;
&lt;li&gt;Make sure DXVK and VKD3D are both enabled.&lt;/li&gt;
&lt;li&gt;Set the runner to &lt;code&gt;kron4ek&lt;/code&gt;. (You&#39;ll need to enable that runner in Bottles-wide settings - press &lt;code&gt;Ctrl-Comma&lt;/code&gt; to open the settings dialog.)&lt;/li&gt;
&lt;li&gt;Install the &lt;code&gt;allfonts&lt;/code&gt; dependency, then download &lt;a target=&quot;_blank&quot; href=&quot;https://github.com/FSKiller/Microsoft-Fonts/blob/main/msgothic.ttc&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;another font&lt;/a&gt; &amp;amp; copy it to the bottle&#39;s &lt;code&gt;Windows/Fonts&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Set the compatibility version to Windows 11.&lt;/li&gt;
&lt;li&gt;Run the installer, hopefully successfully this time!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This brought FL Studio to a usable state, but I quickly learned that my multi-monitor setup caused graphical glitches all over the place. To mitigate this, I&#39;m just keeping FL Studio on my new laptop&#39;s built-in monitor for now. Sacrificing all that screen real estate is a tough sell, but if my intent is to start producing from places other than my bedroom, getting used to the single-monitor workflow seems like a wise idea. Maybe.&lt;/p&gt;
&lt;h2&gt;Plugins (VSTs)&lt;/h2&gt;
&lt;p&gt;Before I start rattling off the problems I encountered, I feel the need to put this in big rainbow text:&lt;/p&gt;
&lt;aside&gt;
&lt;h3 style=&quot;font-size: calc(min(250%, 5vw));&quot;&gt;&lt;span style=&quot;position:absolute;height:1px;width:1px;overflow:hidden;clip:rect(1px, 1px, 1px, 1px);white-space: nowrap&quot;&gt;This is all my own fault&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;p&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-4.85s&quot;&gt;&lt;span style=&quot;color:#E83A22&quot;&gt;T&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-4.65s&quot;&gt;&lt;span style=&quot;color:#D14D1A&quot;&gt;h&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-4.45s&quot;&gt;&lt;span style=&quot;color:#BA5F12&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-4.24s&quot;&gt;&lt;span style=&quot;color:#A3720A&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-4.04s&quot;&gt;&lt;span style=&quot;color:#8D8402&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-3.84s&quot;&gt;&lt;span style=&quot;color:#738B01&quot;&gt;i&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-3.64s&quot;&gt;&lt;span style=&quot;color:#598E03&quot;&gt;s&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-3.44s&quot;&gt;&lt;span style=&quot;color:#3F9104&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-3.24s&quot;&gt;&lt;span style=&quot;color:#259406&quot;&gt;a&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-3.03s&quot;&gt;&lt;span style=&quot;color:#0A9807&quot;&gt;l&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-2.83s&quot;&gt;&lt;span style=&quot;color:#009818&quot;&gt;l&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-2.63s&quot;&gt;&lt;span style=&quot;color:#009733&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-2.43s&quot;&gt;&lt;span style=&quot;color:#00964D&quot;&gt;m&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-2.23s&quot;&gt;&lt;span style=&quot;color:#009568&quot;&gt;y&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-2.02s&quot;&gt;&lt;span style=&quot;color:#009483&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-1.82s&quot;&gt;&lt;span style=&quot;color:#00929B&quot;&gt;o&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-1.62s&quot;&gt;&lt;span style=&quot;color:#008EB0&quot;&gt;w&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-1.42s&quot;&gt;&lt;span style=&quot;color:#008BC4&quot;&gt;n&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-1.22s&quot;&gt;&lt;span style=&quot;color:#0087D9&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-1.01s&quot;&gt;&lt;span style=&quot;color:#0084EE&quot;&gt;f&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-0.81s&quot;&gt;&lt;span style=&quot;color:#097CFE&quot;&gt;a&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-0.61s&quot;&gt;&lt;span style=&quot;color:#3363FE&quot;&gt;u&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-0.41s&quot;&gt;&lt;span style=&quot;color:#5E4AFE&quot;&gt;l&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:inline-block;animation:1s bounce linear infinite;animation-delay:-0.21s&quot;&gt;&lt;span style=&quot;color:#8932FE&quot;&gt;t&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/h3&gt;
The following claims are specifically for running the &lt;b&gt;Windows version of the plugin under Wine on Linux&lt;/b&gt;, with FL Studio as the host. I am under no illusion that I am owed any support for this ridiculous use case. All of the software mentioned here works fine when you&#39;re not mixing operating systems like a strong cocktail.
&lt;/aside&gt;
&lt;p&gt;I hope you&#39;ll forgive me for getting a little spicy in this section - dealing with the full gamut of usability between Wine and a plethora of software vendors is tedious and often frustrating. Keeping it a little whimsical is my alternative to cussing all over the place, and I think it makes for a more interesting post anyway. These aren&#39;t sorted in any meaningful way; it&#39;s just the order in which I (tried to) install them.&lt;/p&gt;
&lt;h3&gt;FabFilter (Pro-C, Pro-Q, Pro-R)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;All of these installed perfectly &amp;amp; work just fine out-of-the-box. What a pleasant start to my journey.&lt;/p&gt;
&lt;h3&gt;Xfer Serum&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-with-workaround.png&quot; alt=&quot;&quot; title=&quot;Works with Workaround&quot;&gt;&lt;/p&gt;
&lt;p&gt;Disabling &lt;code&gt;d2d1&lt;/code&gt; in Wine&#39;s DLL Override config as mentioned &lt;a target=&quot;_blank&quot; href=&quot;https://www.youtube.com/watch?v=qzrQwmYF7YQ&amp;t=232s&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;here&lt;/a&gt; seems to enable Serum to run perfectly. Without this, it froze immediately after entering my serial key &amp;amp; would freeze FL upon each attempt to load.&lt;/p&gt;
&lt;h3&gt;Xfer Serum 2&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/does-not-work.png&quot; alt=&quot;&quot; title=&quot;Doesn&#39;t Work&quot;&gt;&lt;/p&gt;
&lt;p&gt;Serum 2 doesn&#39;t load in FL under Wine. Seems like Wine has a long way to go to support Direct2D, which both editions of Serum use, but only Serum 2 requires. Big bummer.&lt;/p&gt;
&lt;h3&gt;Kilohearts (Phase Plant, etc.)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;Installed &amp;amp; runs perfectly, even with nested effect hosts, such as a Multipass instance inside Phase Plant. Nice!&lt;/p&gt;
&lt;h3&gt;Goodhertz (Lossy, etc.)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-but-not-great.png&quot; alt=&quot;&quot; title=&quot;Works, But It&#39;s Not Great&quot;&gt;&lt;/p&gt;
&lt;p&gt;All of Goodhertz&#39;s plugins have the same issue where the UI flickers unpleasantly as long as they&#39;re receiving sound. Toggling on both &amp;quot;Make bridged&amp;quot; and &amp;quot;External window&amp;quot; in the plugin&#39;s FL configuration tab removes the flickering, but then you have to deal with it being in an external window. Don&#39;t turn on &amp;quot;Make bridged&amp;quot; without &amp;quot;External window&amp;quot; or it&#39;ll freeze the whole DAW.&lt;/p&gt;
&lt;h3&gt;iZotope (Ozone 8, Neutron 2, etc.)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/thwarted-by-anti-piracy.png&quot; alt=&quot;&quot; title=&quot;Thwarted by Anti-Piracy&quot;&gt;&lt;/p&gt;
&lt;p&gt;While the plugins superficially appear to load, I was unable to authorize my purchased copies of these plugins, neither via serial + account credentials nor via offline validation. Apparently this happens because Wine&#39;s crypt32 implementation is missing some key features. Reddit says to install a cracked version. Thanks&lt;/p&gt;
&lt;h3&gt;Minimal Audio Rift&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/does-not-work.png&quot; alt=&quot;&quot; title=&quot;Doesn&#39;t Work&quot;&gt;&lt;/p&gt;
&lt;p&gt;FL won&#39;t even successfully add this as a plugin. Dang.&lt;/p&gt;
&lt;h3&gt;Polyverse (Manipulator, I Wish)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/installer-does-not-work.png&quot; alt=&quot;&quot; title=&quot;Installer Doesn&#39;t Work&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;&amp;quot;I Wish&amp;quot; the installers for these plugins would even run!!!!!!&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;I... don&#39;t know what I changed. I tried running the installers again and they just worked. Both VSTs work perfectly, too. Dunno what to tell you here.&lt;/p&gt;
&lt;h3&gt;Kazrog KClip 3&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-with-workaround.png&quot; alt=&quot;&quot; title=&quot;Works with Workaround&quot;&gt;&lt;/p&gt;
&lt;p&gt;The UI initially flickers constantly like the Goodhertz plugins, but turning off &amp;quot;Use OpenGL graphics&amp;quot; in the plugin&#39;s settings fixes this. Ironically, it actually works &lt;em&gt;better on Linux than Windows&lt;/em&gt;, because the tooltips don&#39;t get redrawn in a slightly different position on every frame as you mouse over the controls! I use this plugin on almost every channel these days, so I&#39;m relieved this one works nearly out-of-the-box.&lt;/p&gt;
&lt;p&gt;(This prompted me to check if Goodhertz&#39;s plugins had a similar toggle, but unfortunately their &amp;quot;GPU Acceleration&amp;quot; menus only have &amp;quot;Enabled&amp;quot; and &amp;quot;Reduced&amp;quot; options, neither of which fixes the flickering.)&lt;/p&gt;
&lt;p&gt;The installer seems to freeze after installing VC++ redistributables, but the plugin is already usable by that point. The installer eventually unfroze itself anyway, so nothing actually went awry, but you try to install it and you&#39;ll probably think it&#39;s frozen too.&lt;/p&gt;
&lt;h3&gt;Soundtoys (Crystallizer, Little AlterBoy)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/thwarted-by-anti-piracy.png&quot; alt=&quot;&quot; title=&quot;Thwarted by Anti-Piracy&quot;&gt;&lt;/p&gt;
&lt;p&gt;This has nothing to do with Wine, but the download link that was emailed to me 4 years ago is no longer valid. Their shop still has my order ID in the system, but it points me to the same deleted download link. And there isn&#39;t a download option on the website that would let me just install &amp;amp; register my copy. And, no, I don&#39;t have a copy of the installer laying around in my Downloads folder anymore. I&#39;ll email support, but this really shouldn&#39;t be necessary, especially considering &lt;em&gt;every other vendor&lt;/em&gt; I&#39;ve purchased plugins from let me redownload my licensed software with no fuss!&lt;/p&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/screenshot-soundtoys-file-not-found.png&quot; alt=&quot;Soundtoys download page that says &#39;Item no longer available&#39;&quot;&gt;
    &lt;figcaption&gt;Thank goodness no one ever has to reinstall their legally-purchased software&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;On the bright side, this means I don&#39;t have to contend with iLok yet. Hooray! &lt;strong&gt;This is foreshadowing.&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;Illformed Glitch2&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;No issues here. Not a huge surprise, considering there&#39;s a native Linux version as well. I used the Windows version since, y&#39;know, Wine.&lt;/p&gt;
&lt;p&gt;Glitch2 is distributed as a plain ZIP rather than an installer, so you&#39;ll need to copy-paste the plugin folder(s) into your VST directory (e.g. &lt;code&gt;Program Files/Common Files/VST2&lt;/code&gt;). Hit &amp;quot;Browse files...&amp;quot; from the three-dot menu in Bottles to find your bottle&#39;s C drive. The user guide PDF tells you everything you need to know. It&#39;s not complicated, just unusual among VSTs.&lt;/p&gt;
&lt;h3&gt;ValhallaDSP (Room, Shimmer, etc.)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;Valhalla&#39;s authorization popups spawn behind everything else, so if things look frozen upon loading, maybe check for that.&lt;/p&gt;
&lt;h3&gt;Youlean Loudness Meter 2&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-with-workaround.png&quot; alt=&quot;&quot; title=&quot;Works with Workaround&quot;&gt;&lt;/p&gt;
&lt;p&gt;I had to switch my Bottles runner from &lt;code&gt;kron4ek&lt;/code&gt; to &lt;code&gt;soda&lt;/code&gt; in order for the installer to run (and &lt;em&gt;only&lt;/em&gt; the installer - I switched back to &lt;code&gt;kron4ek&lt;/code&gt; afterward). The plugin itself works fine, although it repaints the UI poorly while its window is being dragged - far from a dealbreaker.&lt;/p&gt;
&lt;h3&gt;NIH-plug (Spectral Compressor, Safety Limiter, etc.)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;I installed the latest Windows CLAP builds and they worked with no issues.&lt;/p&gt;
&lt;h3&gt;oeksound soothe2&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/does-not-work-and-wasted-my-time.png&quot; alt=&quot;&quot; title=&quot;Doesn&#39;t Work AND Wasted My Time&quot;&gt;&lt;/p&gt;
&lt;p&gt;iLok plugins have a tall bar to reach: they have to be worth installing iLok just to run them. This feels especially wrong on Linux.&lt;/p&gt;
&lt;p&gt;soothe2 supports 2 &amp;quot;seats&amp;quot; (installs) per license, so I tried entering the activation code I was emailed, but it said it had already been redeemed. I thought that meant I had used both of my seats (perhaps due to reinstalling Windows a couple years ago) and spent a good amount of time trying to figure out whether I could transfer that seat to my new setup.&lt;/p&gt;
&lt;p&gt;It turns out I was doing it wrong from the start - what I really had to do was log into my iLok account (that I forgot I had) and activate the license from there, not using the activation code I was emailed. That&#39;s one of the many things &lt;a target=&quot;_blank&quot; href=&quot;https://oeksound.com/support/managing-activations/&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;this support page&lt;/a&gt; was trying to communicate:&lt;/p&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/screenshot-soothe2-managing-activations.png&quot; alt=&quot;oeksound&#39;s support article for managing activations, with various annotations explaining how I read &amp; misinterpreted the information&quot;&gt;
    &lt;figcaption&gt;The first rule of technical writing is that no one is going to read it&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;As a conscientious end-user, I can take some responsibility for the details I missed here. But as a (once professional) technical writer, I can immediately list off 3 ways in which this information could be rearranged for comprehensibility. Still, I empathize with the author of this article. My issues with this page say more about iLok&#39;s labyrinthine system than about anyone&#39;s technical writing skills.&lt;/p&gt;
&lt;p&gt;But there&#39;s something extra-grating about this particular vendor, who presents itself as a modern option with highly refined &amp;amp; legible design, opting for the dinosaur juggernaut of a copy protection system that&#39;s universally hated among independent audio engineers. It gives me the impression that their design sensibilities are exclusively aesthetic, with minimal regard to the user experience when there&#39;s money on the line.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/screenshot-oeksound-vs-teenage-engineering.png&quot; alt=&quot;oeksound &amp; teenage engineering&#39;s websites side-by-side&quot;&gt;
    &lt;figcaption&gt;Not a flattering comparison&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Anyway, the plugin doesn&#39;t work under Wine.&lt;/p&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/Screenshot_20250620_211915.png&quot; alt=&quot;Wine error message from attempting to load soothe2&quot;&gt;
    &lt;figcaption&gt;This is the only part I won&#39;t blame them for&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3&gt;Native Instruments (Kontakt, FM8, etc.)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/installer-does-not-work.png&quot; alt=&quot;&quot; title=&quot;Installer Doesn&#39;t Work&quot;&gt;&lt;/p&gt;
&lt;figure&gt;
    &lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/screenshot-install-native-access-2.png&quot; alt=&quot;Instructions for installing Native Access 2 under Wine&quot;&gt;
    &lt;figcaption&gt;One of many exciting ways you could spend your weekend&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Step 3 out of 14(!) in this guide failed for me and my patience has worn too thin to try to get farther. Maybe I&#39;ll look into &lt;a target=&quot;_blank&quot; href=&quot;https://audiogridder.com/server/&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;AudioGridder&lt;/a&gt; for these sorts of plugins. Or maybe I&#39;ll replace Kontakt with MuseScore for orchestral sounds - did you know it&#39;s &lt;a target=&quot;_blank&quot; href=&quot;https://www.youtube.com/watch?v=n7UgN69e2Y8&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;really good at that&lt;/a&gt; nowadays?&lt;/p&gt;
&lt;h3&gt;Vital&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;Another case of a plugin with an official Linux build whose Windows build works perfectly under Wine. Good stuff.&lt;/p&gt;
&lt;h3&gt;(un)familiar.&#39;s spectralsand2&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/does-not-work.png&quot; alt=&quot;&quot; title=&quot;Doesn&#39;t Work&quot;&gt;&lt;/p&gt;
&lt;p&gt;spectralsand2 is a paid patch for plugdata, which is a free visual programming tool for audio generators &amp;amp; effects. plugdata installs fine (with some minor visual glitches), but unfortunately spectralsand2 completely hoses mouse &amp;amp; keyboard input for the whole DAW, including itself. Making it bridged in an external window just isolates the input issues to its own window - still unusable.&lt;/p&gt;
&lt;p&gt;This isn&#39;t to say it doesn&#39;t work on Linux - plugdata supports Linux natively! But the Windows version seems to not work under Wine, which means I can&#39;t use it in FL under Wine. Refer to the huge rainbow text above.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;spectralsand v1:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://meow.garden/assets/images/fl-studio-linux/works-perfectly.png&quot; alt=&quot;&quot; title=&quot;Works Perfectly&quot;&gt;&lt;/p&gt;
&lt;p&gt;Fortunately, the old standalone VST version of the plugin works just fine.&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;Is this good enough?&lt;/h2&gt;
&lt;p&gt;Let&#39;s take stock of what I can and can&#39;t do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Most of the synthesizers I care about work fine. Serum is my go-to VST for basic sound design, and Phase Plant is what I reach for when I need something with more flexibility. These would be absolute dealbreakers if they didn&#39;t work.&lt;/li&gt;
&lt;li&gt;Most of the effects I consider critical to my workflow work fine, too. It would be a pretty rough transition if my FabFilter, Valhalla, or Kazrog plugins didn&#39;t work.&lt;/li&gt;
&lt;li&gt;A lot of the more heavyweight instruments and effects have blocking issues. No Native Instruments means I lose Kontakt&#39;s realistic pianos, band instruments, and guitars. No Serum 2, Rift, or spectralsand2 means I don&#39;t get to have quite as much fun in the DAW.&lt;/li&gt;
&lt;li&gt;No iZotope plugins means my mastering chain is gone. Fortunately, it&#39;s not as critical now that I&#39;m doing Baphometrix&#39;s &lt;a target=&quot;_blank&quot; href=&quot;https://www.youtube.com/watch?v=e8exCOjGJSA&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;Clip-to-Zero&lt;/a&gt; mixing strategy. I could probably replace Ozone&#39;s maximizer with a basic limiter nowadays and no one would notice.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If I were to stop there, you might be led to believe that this is a pretty good setup with just a couple unflattering compromises. Unfortunately, the music production process isn&#39;t just a matter of dragging plug-ins into the right slots. I&#39;ve left a lot of papercuts unmentioned, simply because they &lt;i&gt;technically&lt;/i&gt; aren&#39;t blockers. Here are a few examples:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hardware changes don&#39;t propagate to FL Studio while it&#39;s running, so if I plug in my audio interface or MIDI keyboard, I need to restart the app to see it.&lt;/li&gt;
&lt;li&gt;File dialogs and many plugin windows are eensy&lt;sup&gt;1&lt;/sup&gt; on this laptop&#39;s high-DPI screen. FL Studio&#39;s main interface can be scaled, and some plugins have drag handles that scale them up, but that will only take you so far.&lt;/li&gt;
&lt;li&gt;FL Studio&#39;s process model means that misbehaving plugins are liable to hose the entire DAW, unless they&#39;re loaded in &amp;quot;bridged mode&amp;quot;, which comes with its own aesthetic &amp;amp; ergonomic issues. Trying to load the wrong plugin might force you to restart the application &amp;amp; lose your work.&lt;/li&gt;
&lt;li&gt;Dragging the main volume knob up immediately slams it to the maximum value of +5.6 dB. Also, it stays at the maximum value until you un-click and re-click the knob, so you can&#39;t just drag it back down in the same motion. &lt;i&gt;Also also,&lt;/i&gt; the cursor mysteriously disappears around the knob &lt;i&gt;only&lt;/i&gt; when this happens, as if to rub salt in the wound while you frantically try to restore the old volume! I typically write music with the main volume set to between -18 and -12 dB, so this failure mode is not just unpleasant, but potentially dangerous for my hearing.&lt;/li&gt;
&lt;li&gt;Detaching certain windows, such as the Mixer, causes a blank window to spawn &amp;amp; close indefinitely, which makes it extremely difficult to do anything in the &lt;b&gt;entire OS!&lt;/b&gt; The act of spawning a window cancels transient interfaces like menus and steals focus from anything that might be used to regain control. And because the detached state is persisted, it&#39;ll happen again when you close &amp;amp; reopen FL Studio. I don&#39;t know how I got out of this state when it happened and I&#39;m terrified to reproduce it again.&lt;/li&gt;
&lt;li&gt;I already mentioned the massive multi-monitor problems, but it bears repeating here because of how bad it sucks. I can get behind learning the single-monitor workflow for when I&#39;m away from my desk, but having to stick to the 13&amp;quot; laptop screen when I have multiple, much larger monitors within reach is baloney.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;footnotes&quot;&gt;
&lt;p&gt;¹ Thank you, Tantacrul, for embedding this word into my head. &lt;i&gt;Thantacrul.&lt;/i&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;Conclusions&lt;/h2&gt;
&lt;p&gt;Despite my motivations, I do not believe that everyone who uses a computer is morally obligated to migrate away from Windows. Macintosh computers are luxury items, and the technical barrier of entry to Linux is still quite high, especially if you intend to use it for anything you can&#39;t do on a smartphone. I&#39;m able to sink my time into this problem because I&#39;m immensely privileged, not because I&#39;m some stalwart of ethics in tech.&lt;/p&gt;
&lt;p&gt;Nonetheless, if you think you&#39;re able to switch to Linux, I would recommend giving it a try. KDE / Plasma 6 offers a remarkably polished &amp;amp; performant desktop environment, much moreso than anything I&#39;ve tried in years prior.&lt;/p&gt;
&lt;p&gt;I don&#39;t think I can deal with FL-under-Wine&#39;s jank, but I&#39;m not giving up. There &lt;em&gt;are&lt;/em&gt; native options for DAWs on Linux, however scarce they may be. I&#39;ve got my eyes set on Bitwig, with Reaper as a fallback if that doesn&#39;t pan out. Renoise has a Linux build, too, but I&#39;ll leave that particular DAW to Frums because tracker interfaces confound &amp;amp; scare me.&lt;/p&gt;
&lt;p&gt;It&#39;s worth mentioning that native Linux DAWs can still run Windows-only plugins under Wine, using something like &lt;a target=&quot;_blank&quot; href=&quot;https://github.com/robbert-vdh/yabridge&quot; rel=&quot;noreferrer nofollow noopener external&quot;&gt;yabridge&lt;/a&gt; as the glue. Together with a more flexible plugin sandboxing model, this should lead to greater simultaneous support across the gamut of VSTs, as Wine can be tweaked on a per-plugin basis, but I don&#39;t have the data to back up that claim yet. Maybe in a future blog post...?&lt;/p&gt;
</content
    >
  </entry>
</feed>
