<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on The Thumbs Up Blog</title><link>https://thumbsup.me/posts/</link><description>Recent content in Posts on The Thumbs Up Blog</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sun, 24 May 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://thumbsup.me/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Tinkering with Linux! Part Deux</title><link>https://thumbsup.me/posts/vim-everywhere-on-linux/</link><pubDate>Sun, 24 May 2026 12:00:00 +0000</pubDate><guid>https://thumbsup.me/posts/vim-everywhere-on-linux/</guid><description>&lt;p&gt;Hey friends 👋&lt;/p&gt;
&lt;p&gt;If you read &lt;a href="https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/" target="_blank" rel="noopener noreferrer"&gt;my last blog post&lt;/a&gt;, you&amp;rsquo;ll know that I picked up a used Thinkpad on ebay to experiment with Linux. In that post I talked about my many experiences with Linux through the years and I recounted my distro-hopping adventure, as it relates to this new laptop.&lt;/p&gt;
&lt;p&gt;By the end of that post, I had landed on using &lt;a href="https://projectbluefin.io/" target="_blank" rel="noopener noreferrer"&gt;Bluefin&lt;/a&gt;, an &lt;em&gt;immutable&lt;/em&gt; Linux distribution with a lot of thoughtful modern considerations. But I bought this Thinkpad because I wanted to tinker, and Bluefin presented too many limitations that I didn&amp;rsquo;t know how to overcome. Without a package manager of its own (it relies on a combination of Homebrew and flatpak for almost all software), you lose out on a lot of the more community-driven tools that can enable the kind of tinkering I was looking for.&lt;/p&gt;</description><content:encoded>
<![CDATA[<p>Hey friends 👋</p>
<p>If you read <a href="https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/" target="_blank" rel="noopener noreferrer">my last blog post</a>, you&rsquo;ll know that I picked up a used Thinkpad on ebay to experiment with Linux. In that post I talked about my many experiences with Linux through the years and I recounted my distro-hopping adventure, as it relates to this new laptop.</p>
<p>By the end of that post, I had landed on using <a href="https://projectbluefin.io/" target="_blank" rel="noopener noreferrer">Bluefin</a>, an <em>immutable</em> Linux distribution with a lot of thoughtful modern considerations. But I bought this Thinkpad because I wanted to tinker, and Bluefin presented too many limitations that I didn&rsquo;t know how to overcome. Without a package manager of its own (it relies on a combination of Homebrew and flatpak for almost all software), you lose out on a lot of the more community-driven tools that can enable the kind of tinkering I was looking for.</p>
<p>We&rsquo;ll talk about which distro I ended up on in a bit. But I want to start by talking about the specific tinkering I was trying to do.</p>
<p>First off, my Thinkpad has a fingerprint sensor. It&rsquo;s well supported on Linux and on Gnome—the desktop environment which Bluefin comes with—there&rsquo;s even a nice GUI in the settings menu for enrolling fingerprints. You simply go to <strong>Settings &gt; System &gt; Users &gt; Fingerprint Login</strong> and you should be able to enroll multiple fingerprints for authentication.</p>
<p>However, before you can enroll fingerprints, on certain distros, you may have to install a set of packages called <code>fprintd</code> and/or <code>libfprint</code> in order for the fingerprint sensor to be recognized by the system. This was the case for me on Bluefin, and due to the limitations of Bluefin&rsquo;s package options, there was seemingly no way to install these particular packages.</p>
<p>That wasn&rsquo;t a deal breaker though.</p>
<h2 id="the-vim-ultimatum">The Vim Ultimatum</h2>
<p>A few years ago on my Mac, when I began using the terminal-based text editor <a href="https://neovim.io/" target="_blank" rel="noopener noreferrer">Neovim</a> more and more, I fell in love with home row navigation. For those who are unaware, in the text editors Vim and Neovim, you do absolutely everything with the keyboard. This allows for a lot of unique key commands to move and manipulate your way through code and text; most of which is well beyond the scope of this post. The core functionality though is the use of the home row letters h, j, k, and l as substitutes for the arrow keys.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Vim Primer</p>
        <p>h = left<br>
j = down<br>
k = up<br>
l = right</p>
    </blockquote><p>This can take a bit of getting used to, but the key benefit is that you never need to move your hands out of the standard home row typing position, making it both more efficient and a lot more comfortable.</p>
<p>In fact, once I got familiar with this approach to cursor movement, I found it really annoying anytime I had to move using the keyboard&rsquo;s actual directional keys, which require one to reposition the right hand down and to the right and then reset to the home row to begin typing again. The more often you alternate between moving and typing the more unpleasant this becomes.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 10px; min-width: 0;">
      <img src="/original_10245280551282026412_hu_81f4ab19ec4e089a.webp" style="width: 40px; height: 40px; border-radius: 50%; flex-shrink: 0; object-fit: cover; margin: 0 !important;" />
      <div style="display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem; white-space: nowrap;">Thumbs Up</span><span style="color: var(--color-neso-fg3); font-size: 0.85rem;">in</span>
        <span style="display: inline-flex; align-items: center; gap: 4px; background: var(--color-neso-deco3); border-radius: 999px; padding: 2px 8px 2px 4px; font-size: 0.85rem; font-weight: 600; color: var(--color-neso-fg2); white-space: nowrap;"><img src="/bafkreigbei45ni5zsliszzeivotgee5auj2ykkh6zrzjwvm4izviidusny_14760476115126135129_hu_c1d9cd1b92e0f9a8.webp" style="width: 16px; height: 16px; border-radius: 50%; object-fit: cover; flex-shrink: 0; margin: 0 !important;" />dev</span></div>
    </div>
    <a href="https://farcaster.xyz/thumbsup.eth/0xb80e5e7d" target="_blank" style="color: #6A3CFF; align-self: flex-start; margin-top: 2px; transition: transform 0.2s; display: flex; flex-shrink: 0; width: 28px; height: 28px;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 200 175" fill="currentColor" xmlns="http://www.w3.org/2000/svg" style="display: block; margin: 0 !important;"><path d="M200 0V23.6302H176.288V47.2404H183.553V47.2483H200V175H160.281L160.256 174.883L139.989 79.3143C138.057 70.2043 133 61.9616 125.751 56.0995C118.502 50.2376 109.371 47.0108 100.041 47.0108H99.9613C90.631 47.0108 81.5 50.2376 74.251 56.0995C67.0023 61.9616 61.9453 70.2073 60.013 79.3143L39.7223 175H0V47.2453H16.4475V47.2404H23.7114V23.6302H0V0H200Z"/></svg>
    </a>
  </div>

  <div style="font-size: 1.05rem; line-height: 1.5; margin-bottom: 12px; color: var(--color-neso-fg1);">I've gotten so used to my caps lock + hjkl = arrow keys that it's super hard for me to use computers when that's not configured. I imagine this is how it is for people who use keyboards with layers.
  </div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-04-12T17:13:12Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Apr 12, 2026 at 5:13 PM UTC</time>
    <a href="https://farcaster.xyz/thumbsup.eth/0xb80e5e7d" target="_blank" style="color: #6A3CFF; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8C66FF'" onmouseout="this.style.color='#6A3CFF'">View on Farcaster</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>
<p>Fortunately, I&rsquo;m not the only person who loves using Vim navigation, so people have invented a number of ways to integrate this into your workflow. Code editors based on VS Code have extensions to add full Vim command support, and the incredible open-source alternative, <a href="https://zed.dev/" target="_blank" rel="noopener noreferrer">Zed</a> has unparalleled Vim support baked-in. There&rsquo;s also browser extensions like <a href="https://chromewebstore.google.com/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?pli=1" target="_blank" rel="noopener noreferrer">Vimium</a> that add pretty elaborate keyboard based navigation to any Chromium-based browser. And there are even niche web browsers like <a href="https://qutebrowser.org/index.html" target="_blank" rel="noopener noreferrer">qutebrowser</a> which have vim navigation as the default.</p>
<p>But none of that was enough for me. I wanted system wide Vim navigation. Nothing fancy. Just a way to enable Vim navigation when I want it, without affecting my ability to input text, or making my computer unusable by anyone other than me.</p>
<p>That&rsquo;s where an app called <a href="https://karabiner-elements.pqrs.org/" target="_blank" rel="noopener noreferrer">Karabiner Elements</a> comes in. This Mac-only app gives your computer superpowers. Through a relatively simple GUI, you can enable custom key-mappings from the most simple to the unimaginably elaborate. And what&rsquo;s more, there&rsquo;s a whole community of users sharing their templates, which they call <em>rules</em>.</p>
<p>There&rsquo;s actually several predefined rules that do exactly what I wanted. Originally I used one called <code>Use CAPS LOCK for vi navigation</code> which was
great and I would recommend to most people.</p>
<figure><img src="/posts/vim-everywhere-on-linux/caps-lock-vim.png"
    alt="Karabiner Elements rule: Use CAPS LOCK for vi navigation">
</figure>

<p>But I&rsquo;m a <em>hyper key</em> user. What does that mean? Well, as someone who uses a lot of professional software on Mac (Adobe Suite, Final Cut Pro, Affinity, Ableton), I need to make use of program-specific keyboard shortcuts all the time. So as a result, any custom keyboard shortcuts I create and use on my system need to be free of conflict in all other programs.</p>
<p>The easiest way to avoid conflict is to introduce a hyper key, which is a key that your computer recognizes as a cluster of other keys (most often every other modifier key combined). Since almost no software will make their users press all these keys at once to activate a feature (shortcuts are supposed to be fast under the fingers after all), a hyper key is almost universally ideal for system-wide shortcuts.</p>
<p>Where am I going with this? Well, most people—myself included—map their hyper key to Caps Lock, since that is a basically useless key located in one of the most ideal places on the keyboard: the home row. Karabiner Elements has a number of predefined rules that can enable this functionality, but I actually do it with Raycast, which also allows me to use the hyper key for all my different custom launcher shortcuts, like quickly opening apps, tiling windows, and moving through virtual desktops. Even Raycast&rsquo;s clipboard manager is mapped to hyper + v, so it doesn&rsquo;t cause any issue with the regular paste functionality.</p>
<p>Because of my remapping, my Caps Lock is not actually registering as Caps Lock, but as hyper ( ⌘ + ⌥ + ⌃ + ⇧ ), so I have to use a different Karabiner rule. I found one called <code>Change hyper-(jikl) to (←↑↓→) keys</code> which is close.</p>
<figure><img src="/posts/vim-everywhere-on-linux/hyper-vim.png"
    alt="Karabiner Elements rule: Change hyper-(jikl) to arrow keys">
</figure>

<p>As you can see this one uses JIKL for that standard arrow keys layout. Kind of like the way gamers use WASD. If I had never used Vim, I would probably be using this approach, and if you are happy with that configuration, you could enable that and go on your merry way.</p>
<p>For me though, I needed to edit the configuration to work the Vim way. If you do want to do that, here is my entire edited config that you can copy and paste into Karabiner&rsquo;s rule editor.</p>
<pre tabindex="0"><code>{
    &#34;description&#34;: &#34;Change hyper-(hjkl) to (←↑↓→) keys&#34;,
    &#34;manipulators&#34;: [
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;h&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;left_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        },
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;k&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;up_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        },
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;j&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;down_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        },
        {
            &#34;from&#34;: {
                &#34;key_code&#34;: &#34;l&#34;,
                &#34;modifiers&#34;: {
                    &#34;mandatory&#34;: [&#34;left_command&#34;, &#34;left_option&#34;, &#34;left_control&#34;, &#34;left_shift&#34;],
                    &#34;optional&#34;: [&#34;any&#34;]
                }
            },
            &#34;to&#34;: [{ &#34;key_code&#34;: &#34;right_arrow&#34; }],
            &#34;type&#34;: &#34;basic&#34;
        }
    ]
}</code></pre><p>Now, anywhere on my system, whenever I want to move left, right, up, or down, I&rsquo;m simply moving my left pinky over to the Caps Lock key and using my home row fingers to move with ease.</p>
<h2 id="surely-this-must-be-easy-on-linux">Surely this must be easy on Linux</h2>
<p>Spoiler alert: it wasn&rsquo;t.</p>
<p>Well&hellip; that&rsquo;s not entirely true either. But we&rsquo;ll get there. Let&rsquo;s start one month ago, around the time I released my post about installing Linux on my Thinkpad.</p>
<p>I was looking all over for a way to get the same functionality I had configured on my Mac to work on my new Linux setup. As I was on Bluefin, I decided to reach out to the project lead, Jorge Castro.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/eaa7ad3827b8d387_7793939885977693570_hu_d1fd0365232b20e2.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">Thumbs Up</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@thumbsup</span>
      </div>
    </div>
    <a href="https://mastodon.online/@thumbsup/116473806808334676" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;">Anyone know the answer to this? I’m running <span class="h-card" translate="no"><a style="text-decoration:none;" href="https://fosstodon.org/@UniversalBlue" class="u-url mention">@<span>UniversalBlue</span></a></span> <a style="text-decoration:none;" href="https://mastodon.online/tags/Bluefin" class="mention hashtag" rel="tag">#<span>Bluefin</span></a>, and I want to map Caps Lock + hjkl as directional arrows (#vim style). What’s the best way to do this on <a style="text-decoration:none;" href="https://mastodon.online/tags/Linux" class="mention hashtag" rel="tag">#<span>Linux</span></a>? </p><p style="margin:0 0 0.9em 0;">I do this on Mac with Karabiner Elements and I’ve become pretty accustomed to the home key centric workflow it enables.</p>
  </div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-04-27T00:20:49Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Apr 27, 2026 at 12:20 AM UTC</time>
    <a href="https://mastodon.online/@thumbsup/116473806808334676" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>Unfortunately, though he was nice enough to respond, he didn&rsquo;t have an answer for me.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/000d14dba920b516_18207881739220304751_hu_df61b8b23b43a320.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">Jorge Castro</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@jorge</span>
      </div>
    </div>
    <a href="https://hachyderm.io/@jorge/116476934873886166" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;"><span class="h-card" translate="no"><a style="text-decoration:none;" href="https://mastodon.online/@thumbsup" class="u-url mention">@<span>thumbsup</span></a></span> No clue on this one. I set caps to ctrl and that&#39;s as advanced as I get.</p>
  </div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-04-27T13:36:19Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Apr 27, 2026 at 1:36 PM UTC</time>
    <a href="https://hachyderm.io/@jorge/116476934873886166" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>I tried googling for an answer but everything I found was wrong. I turned to AI, and it dug up the same wrong content and fed it to me in instruction form. One thing did seem clear to me though: just like my issue with the fingerprint sensor, this would be much harder than it needed to be if I were to stay on an immutable system.</p>
<p>So I jumped ship from Bluefin over to Fedora, where I was easily able to get my fingerprint sensor working and likely would have had no issue getting my Vim hack working if I knew then what I know now.</p>
<h2 id="intermission">Intermission</h2>
<p>Around that time, I had a lot on the go so I put down my Thinkpad for a few weeks. I was too busy with other projects and I didn&rsquo;t have any time to tinker. And, using my Mac, which is carefully configured how I want it, had me even less interested in pulling out the Thinkpad, knowing that I still couldn&rsquo;t use my preferred workflow. I would come back to it when I was ready.</p>
<p>When I finally picked up the Laptop again I was in a different headspace entirely. Having watched <a href="https://www.youtube.com/watch?v=TqIQtOfwgfA" target="_blank" rel="noopener noreferrer">a video by foci</a> about installing CachyOS with Niri, I decided to try installing it again. Unfortunately I had a similar issue to <a href="https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/" target="_blank" rel="noopener noreferrer">last time</a> where once it was all set up and should have worked, it just crashed and I couldn&rsquo;t get it to boot again. Not sure why I&rsquo;m so unlucky with this particular distro.</p>
<p>As I was still in the mood to experiment with tiling window managers, I installed PikaOS again and I played with their Niri version for a bit. It&rsquo;s quite cool, but the more I use these tiling window managers, the more I missed Gnome. I know, I know, unpopular opinion or whatever.</p>
<p>It&rsquo;s just that coming from Mac, Gnome feels like an upgrade to a familiar experience, while everything else feels so different it&rsquo;s hard to relate. The workflow feels foreign, and the supposed efficiency gains feel superficial in the face of the time wasted on the immense learning curve. I imagine this is why Windows users gravitate towards KDE. It&rsquo;s a more polished version of a familiar paradigm.</p>
<p>While I&rsquo;m a Fedora stan, I&rsquo;ve really been impressed with the ethos, community, and aesthetic of PikaOS, so, rather than going back to my faithful Fedora Workstation, I decided to use Pika&rsquo;s Gnome version, and set to work getting it configured for daily use. First, I installed Bazaar to manage my flatpaks (it&rsquo;s the best), then I set up my fingerprint sensor for authentication (easy peasy), and finally, I set out to slay the dragon that is this Vim navigation issue.</p>
<p>It took a lot of trial and error, and a little help from Brave&rsquo;s Leo AI, but I finally got it figured out. Below is a little step by step for how to configure Caps Lock + hjkl to map to directional keys, so that if you want this functionality, you don&rsquo;t need to waste any energy with AI or otherwise rip out all your hair trying to figure this out.</p>
<h2 id="how-to-map-caps-lock--hjkl-to-vim-keys-on-linux">How to map Caps Lock + hjkl to Vim keys on Linux</h2>
<p>Here&rsquo;s a little step by step you can follow if you&rsquo;re using any Linux distribution with Gnome.</p>
<ol>
<li>Install the <code>xremap</code> GNOME Shell Extension. This is required. You can install it in Firefox at <table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:1.25rem 0;border-collapse:collapse;"><tr><td style="display:block;border:1px solid #363a4f;border-radius:10px;padding:0.75rem 1rem;background:#24273a;font-family:sans-serif;text-decoration:none;"><a href="https://extensions.gnome.org/extension/5428/xremap/" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:inherit;display:block;"><strong style="display:block;font-size:1rem;font-weight:700;color:#cad3f5;margin-bottom:0.2rem;">https://extensions.gnome.org/extension/5428/xremap/</strong><span style="display:block;font-size:0.75rem;color:#939ab7;font-style:italic;">https://extensions.gnome.org/extension/5428/xremap/</span></a></td></tr></table> or simply open the Gnome Extensions Manager, click Browse and search for it.</li>
</ol>
<figure><img src="/posts/vim-everywhere-on-linux/xremap.png"
    alt="xremap GNOME Shell Extension">
</figure>

<ol start="2">
<li>
<p>In order to install xremap, we need to first make sure we have rust and some other tools installed. You can try to do step 3 and if it fails come back here. If you are certain that you have everything you need already, you can proceed to step 3 anyway.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #eed49f;border-radius:0 8px 8px 0;background:#2a2518;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Warning</p>
        <p>Below I list a number of terminal commands, including some which automatically run scripts. You should never enter terminal commands you find on the internet unless you understand what they do and are sure that it is not harmful.</p>
    </blockquote><ol>
<li>
<p>Install rustup (the Rust installer):</p>
<pre tabindex="0"><code>curl --proto &#39;=https&#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh</code></pre><p>Follow the prompts. This installs rustc, cargo, and rustup.</p>
</li>
<li>
<p>Restart your shell or source the environment:</p>
<pre tabindex="0"><code>source $HOME/.cargo/env</code></pre><p>This adds <code>$HOME/.cargo/bin</code> to your PATH.</p>
</li>
<li>
<p>Verify the installation:</p>
<pre tabindex="0"><code>cargo --version</code></pre><p>If you see an output, you should be good to go.</p>
</li>
</ol>
</li>
<li>
<p>Now we&rsquo;re ready to proceed with the installation</p>
<ol>
<li>
<p>Use cargo to install xremap:</p>
<pre tabindex="0"><code>cargo install xremap --features gnome</code></pre></li>
<li>
<p>Create the configuration file:</p>
<pre tabindex="0"><code>mkdir -p ~/.config/xremap</code></pre></li>
<li>
<p>Add the configuration.</p>
<p>I use Neovim. For which we enter this command.</p>
<pre tabindex="0"><code>nvim ~/.config/xremap/config.yml</code></pre><p>But you can use Nano which comes preinstalled on every Linux distro. That would mean typing this command instead.</p>
<pre tabindex="0"><code>nano ~/.config/xremap/config.yml</code></pre><p>You can use any editor you like. These are just two options.</p>
</li>
<li>
<p>Enter this into the file and then save out.</p>
<pre tabindex="0"><code>virtual_modifiers:
  - CapsLock

keymap:
  - name: CapsLock + hjkl to Arrows
    remap:
      CapsLock-h: Left
      CapsLock-j: Down
      CapsLock-k: Up
      CapsLock-l: Right
      CapsLock-space: Super-space</code></pre>

    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Tip</p>
        <p>On Neovim, you save by pressing the colon key and then w to save, q to quit. In other words, you hit escape to stop inputting text and type <code>:wq</code></p>
    </blockquote></li>
</ol>
</li>
<li>
<p>Start xremap:</p>
<pre tabindex="0"><code>xremap ~/.config/xremap/config.yml</code></pre><p>Now you should be able to use the feature, so long as you leave the terminal open and the command active. This is fine for testing, but it&rsquo;s not the functionality we want.</p>
</li>
<li>
<p>Set up autostart</p>
<ol>
<li>
<p>I do this by simply &ldquo;opening&rdquo; the non-existent file with Neovim.</p>
<pre tabindex="0"><code>nvim ~/.config/autostart/xremap.desktop</code></pre></li>
<li>
<p>Enter the following into the new file and save.</p>
<pre tabindex="0"><code>[Desktop Entry]
Type=Application
Name=xremap
Exec=/home/user/.cargo/bin/xremap /home/user/.config/xremap/config.yml
Comment=Remap Caps+hjkl to arrow keys
X-GNOME-Autostart-enabled=true</code></pre>

    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Note</p>
        <p>Replace <em>user</em> with your username.</p>
    </blockquote></li>
</ol>
</li>
</ol>
<h2 id="what-did-we-learn">What did we learn?</h2>
<p>Nothing is impossible on Linux. But it is sometimes more complicated than you might expect. Karabiner Elements has existed for Mac for a long time, and with it, I was able to configure a rather niche workflow in minutes. On Linux, I had to understand the nature of the problem itself and how it interrelated to my specific setup. I had to rule out certain distributions which would make it harder or even impossible to do this kind of customization. And of course, I had to get comfortable with using the terminal.</p>
<p>In the end though, it wasn&rsquo;t very hard and it satisfied my compulsive need to tinker for another day. In the next post, I&rsquo;ll tell you about other system tweaks and software choices I&rsquo;ve made to make Linux feel more like home.</p>
<p>If you like this kind of content, don&rsquo;t forget to like and share it on social media and if you&rsquo;re comfortable with cryptocurrency, consider dropping a little tip with the buttons below to show that you value this kind of content. More about why I chose crypto over other tip options <a href="https://thumbsup.me/posts/why-the-heck-would-i-want-crypto-tips/" target="_blank" rel="noopener noreferrer">here</a>.</p>
<p>I do really want to replace this little 1080p Thinkpad with a Framework 13 Pro at some point. That&rsquo;s not something I can justify when I have limited funds and a perfectly working Macbook to daily drive, but it&rsquo;s one of my plans for the money I receive as tips. Just putting that out there.</p>
<p>I hope you found this entertaining, interesting, helpful, or all of the above.</p>
]]></content:encoded></item><item><title>I bought a Thinkpad and put Linux on it</title><link>https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/</link><pubDate>Sun, 26 Apr 2026 12:00:00 +0000</pubDate><guid>https://thumbsup.me/posts/i-put-linux-on-a-thinkpad/</guid><description>&lt;p&gt;Hey friends 👋&lt;/p&gt;
&lt;p&gt;So, I finally got around to picking up a Thinkpad and I&amp;rsquo;ve been trying to decide which flavour of Linux I want to use on it, long term. It&amp;rsquo;s only been a few days, and I&amp;rsquo;ll definitely write another blog post in a month or so once I&amp;rsquo;ve settled into more confident opinions, but for now I wanted to share some of my findings from my preliminary distrohopping.&lt;/p&gt;</description><content:encoded>
<![CDATA[<p>Hey friends 👋</p>
<p>So, I finally got around to picking up a Thinkpad and I&rsquo;ve been trying to decide which flavour of Linux I want to use on it, long term. It&rsquo;s only been a few days, and I&rsquo;ll definitely write another blog post in a month or so once I&rsquo;ve settled into more confident opinions, but for now I wanted to share some of my findings from my preliminary distrohopping.</p>
<p>Before we start, I should give a bit of backstory, because I&rsquo;m not exactly a novice in this domain. I have more than 15 years of experience tinkering with Linux in one form or another. I began back in the aughts where most people do, installing various flavours of Ubuntu onto old computers. I remember being so proud that I got Lubuntu installed on an iMac G3 and made it feel relatively Mac-like, though of course back then Linux could barely even play video on most websites because everything was Flash, Microsoft Silverlight, and other proprietary, DRM garbage. That made it pretty hard to seriously consider Linux as a twenty-something.</p>
<p>Nevertheless I persisted, and as many before me, I wiped my main PC, (accidentally) as I installed Ubuntu. Unity, Canonical&rsquo;s homegrown desktop environment was the default back then and was truly impressive <em>looking</em>, but it was also janky as hell and alongside Ubuntu&rsquo;s other quirks, I couldn&rsquo;t see myself putting up with such a frustrating level of bugginess for long. So I did the standard beginner progression from Ubuntu to LinuxMint. And of course that was a lot better. I think I went at least 6 months of using Mint for some of my day to day computing. But I would always go back to Mac for my university work, hobby music recording, and to load music onto my iPhone in the pre-streaming days.</p>
<p>Through the 2010s I always had at least one computer to experiment with Linux on. An old Thinkpad with 2 GB of RAM, a Macbook Air with 4 GB of RAM, a Lenovo Y40 gaming laptop (RAM was user-upgradable and I took it from 4 to 16 GB), an Alienware desktop with an Nvidia card (headaches ensued), and finally a Dell XPS 13.</p>
<p>The default recommendation, Ubuntu, no matter how many times I gave it another chance, would cause me headache after headache with random broken drivers, perpetually out of date software missing key features, and of course, user error as I tried to fix things by ignorantly copy-pasting commands from forum posts and youtube comments into my terminal as root.</p>
<h2 id="the-many-jobs-of-steve-or-how-i-learned-to-let-tim-cook">The Many Jobs of Steve, or: How I Learned to Let Tim Cook</h2>
<p>I eventually got more familiar with the terminal and found some distros that worked better for me. I settled into Manjaro for a while, and later, daily drove Fedora on both a laptop (the aforementioned Lenovo) and a desktop (the Alienware) for 3 full years. I gave away the Lenovo to a friend when I got the XPS. Then, during the pandemic I needed money and since I had a work Macbook I was able to take home, I decided to sell off my Dell XPS laptop and my Alienware Desktop and as a result, for a while I had no easy way to visit the penguin.</p>
<p>Then, after a few years of working professionally on creative work (writing, graphic design, and video editing), all of which I would do on my work Macbook, I decided to buy myself an M2 Macbook Air as a sort of backup plan in case I ever left my job and gave up my only computer.</p>
<p>Regardless of what you think of Apple, their M series laptops are marvels of engineering: extremely performant, lightweight, premium aluminum construction, excellent screens, great keyboards and trackpads, fingerprint sensors for authentication, thunderbolt ports, magsafe, and so on and so forth. This computer is so good that it&rsquo;s been very hard to justify buying a device just to tinker, because I knew I wasn&rsquo;t likely to abandon my beloved Mac anytime soon.</p>
<p>But, as those of you who&rsquo;ve gone down the Linux rabbit hole will know: the urge to tinker never goes away. So of course, I had to install the only kind of Linux that would run on Apple silicon: <a href="https://asahilinux.org/" target="_blank" rel="noopener noreferrer">Asahi Linux</a>.</p>
<figure><img src="/posts/i-put-linux-on-a-thinkpad/AsahiLinux-kawaii-logo.png"
    alt="Kawaii Asahi Linux Logo by SWARATSUKI"><figcaption>
      <p>I couldn&rsquo;t figure out how to get this awesome Kawaii Asahi Linux logo by <a href="https://twitter.com/sawaratsuki1004" target="_blank" rel="noopener noreferrer">SAWARATSUKI</a> to show on the bootloader though&hellip;</p>
    </figcaption>
</figure>

<p>I&rsquo;ve tried all of the compatible ARM-based Linux distributions. The Arch-based Asahi ALARM, Ubuntu Asahi, and the default, Fedora Asahi. As always, Fedora treated me the best. But there are still too many tradeoffs for Asahi to be my daily driver. The video output over USB-C doesn&rsquo;t work so I can&rsquo;t use an external monitor (something I do every day), the fingerprint sensor doesn&rsquo;t work (not a big deal but a shame nonetheless), and, more importantly, there&rsquo;s just so much software I use for creative work that isn&rsquo;t ported to Linux (least of all on ARM), and doesn&rsquo;t have suitable alternatives.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Note</p>
        <p>Please don&rsquo;t @ me about this. I have eagerly tested new versions of Gimp and Krita (they&rsquo;re great!), am closely watching projects like <a href="https://itsfoss.com/graphite-graphics-editor/" target="_blank" rel="noopener noreferrer">Graphite</a> (looks awesome!) and <a href="https://pixieditor.net/" target="_blank" rel="noopener noreferrer">Pixi</a>, and even tried to install <a href="https://github.com/ryzendew/Linux-Affinity-Installer" target="_blank" rel="noopener noreferrer">AffinityOnLinux</a> (it wouldn&rsquo;t work Asahi). These are not workarounds that I can adapt to for my daily, professional workflow, yet. Plus I already own the Macbook, so why force something like this pre-emptively. That said, I will switch eventually, when I&rsquo;m ready.</p>
    </blockquote><p>For a few years, I&rsquo;ve been a proud Steam Deck owner, and so technically, I am still using Linux all the time. When it comes to gaming, I&rsquo;m team Linux 100% having not dual-booted windows for close to a decade. But it&rsquo;s just running SteamOS I don&rsquo;t want to tinker too much with my Deck and risk being unable to game. So I finally did the thing&hellip;</p>
<h2 id="i-bought-a-thinkpad">I Bought a Thinkpad</h2>
<p>A few weeks ago I decided it was time to dump Asahi from my Macbook to reclaim space. As I mentioned above, I do a lot of professional work on this computer and while I try to offload as much as possible to external hard drives and my preferred cloud storage solution, Proton Drive (whose Mac Desktop integration is flawless btw), the laptop&rsquo;s tiny little 256 GB SSD—especially with 80 GB partitioned for Asahi—is constantly requiring cleanup just to continue operating.</p>
<p>So of course I headed to eBay to find a used Thinkpad to make my official tinkering device. My goal was to spend some time distrohopping through a number of newer distributions that I&rsquo;ve wanted to test drive (PikaOS, CachyOS, Bluefin), as well as revisit some that I haven&rsquo;t used much since the early 2020s (Fedora, openSUSE, Pop!OS).</p>
<p>A few days ago, my new Thinkpad arrived. An 8th Generation Intel i5, 16 GB of RAM, a good condition battery&hellip; and a 1080p screen. Yeah, the screen is not my favourite part, especially coming from my Macbook, but I told myself, this is just for testing. And besides, video output over USB-C has worked flawlessly on every distro I&rsquo;ve tried, unlike Asahi on the M2.</p>
<p>I also know that with the announcement of the <a href="https://frame.work/ca/en/laptop13pro" target="_blank" rel="noopener noreferrer">Framework Laptop 13 Pro</a>, as well as Asus&rsquo; incredible <a href="https://www.asus.com/proart/laptops-home/" target="_blank" rel="noopener noreferrer">ProArt Laptops,</a> there are much fairer comparisons I could make if I were actually looking for a replacement for my Macbook.</p>
<figure><img src="/posts/i-put-linux-on-a-thinkpad/framework-13-pro-specs.png"
    alt="Framework 13 Pro Specs"><figcaption>
      <p>I mean come on&hellip;</p>
    </figcaption>
</figure>

<p>So anyway, I fired up the laptop and everything seemed to be working perfectly except one thing: it had Windows on it. Nope! I didn&rsquo;t even go through the install once. I pulled out a thumb drive pre-loaded with the newest version of Fedora Workstation and rebooted into the Live Environment.</p>
<h2 id="the-good-the-bad-and-the-cachy">The Good, The Bad, and the Cachy</h2>
<p>Is speed-dating still a thing that people do? I remember when I was a teenager, my mom gave it a try because it was novel and she was single so why not? It sounded pretty weird to me as a kid and didn&rsquo;t seem to work for her, so maybe it&rsquo;s not a great concept.</p>
<p>And yet, for many Linux users, myself included, speed dating is a lifestyle. Only we&rsquo;re not dating people, but distributions. This past weekend, I did my rounds and it went pretty well&hellip; mostly.</p>
<p>Here&rsquo;s what I installed (or tried to) so far:</p>
<ul>
<li><a href="https://fedoraproject.org/workstation/" target="_blank" rel="noopener noreferrer">Fedora Workstation </a></li>
<li><a href="https://fedoraproject.org/spins/cosmic/" target="_blank" rel="noopener noreferrer">Fedora Cosmic Spin</a></li>
<li><a href="https://www.opensuse.org/" target="_blank" rel="noopener noreferrer">openSUSE Tumbleweed</a></li>
<li><a href="https://cachyos.org/" target="_blank" rel="noopener noreferrer">CachyOS</a></li>
<li><a href="https://github.com/tonybanters/tonarchy" target="_blank" rel="noopener noreferrer">Tonarchy</a></li>
<li><a href="https://wiki.pika-os.com/en/home" target="_blank" rel="noopener noreferrer">PikaOS</a> (Cosmic, Hyprland, Niri, Gnome)</li>
<li><a href="https://vanillaos.org/" target="_blank" rel="noopener noreferrer">VanillaOS</a></li>
<li><a href="https://projectbluefin.io/" target="_blank" rel="noopener noreferrer">Bluefin</a></li>
</ul>
<p>Below are the experiences I had. These are not reviews. They are just anecdotal first impressions on my personal (used, 6 year old) hardware. I&rsquo;ll do some future blog posts about this as I experiment more and invest more time and effort. And hey if any of you want to sponsor me to buy a Framework Laptop to test as a real Macbook replacement, you can use the tipping buttons at the bottom of this post. All that to say, anything negative you read below is not an indictment of these distros or your own experience with them. I tried them specifically because I think they&rsquo;re cool. This is what happened next.</p>
<h3 id="fedora">Fedora</h3>
<p>As I mentioned earlier, I daily drove Fedora for years. I&rsquo;ve given it to friends and recommended it to befuddled users online, and everyone has the same experience: it just works.</p>
<p>For me and my little Thinkpad this was more or less the same. I booted in, installed Workstation (which is their dumb name for the Gnome flavour) and I was off to the races. Everything worked, updates were easy. I installed my favourite Flatpak store, Bazaar, used it to install some more apps and started to do some basic testing.</p>
<p>I did run into some issues though. Gnome was laggy, especially while opening software and the laptop was getting pretty hot and spinning up the fans during light workloads. I checked for updates and everything was all good, so I&rsquo;m not sure what caused this. I tried switching to performance mode and that didn&rsquo;t help. Maybe it was a driver issue, but this is a laptop with a well known older APU from Intel, so I was left perplexed.</p>
<p>Anyway, that was enough for me to move on. Next I tried the Cosmic spin just to see what that&rsquo;s all about. Despite Pop!OS being the from the same team as Cosmic and thus the default option for it, I plan to avoid it because it&rsquo;s based on Ubuntu and I prefer my Debian derivatives with just one degree of separation. The Fedora implementation seems to be pretty stock and I can see why some people like it but I&rsquo;m not sure it&rsquo;s for me.</p>
<h3 id="opensuse-tumbleweed">openSUSE Tumbleweed</h3>
<p>I&rsquo;ve heard nothing but good things about openSUSE and on paper, it&rsquo;s pretty much designed for me:</p>
<ul>
<li>It&rsquo;s a well respected, long-running project, managed by a non-profit organization, out of Europe. Check, check, check, check.</li>
<li>It&rsquo;s rolling release like Arch, but with a methodology of testing everything before officially adding to repositories, similar to how Fedora does things. They call it &ldquo;leading edge not bleeding edge&rdquo; and I respect that.</li>
<li>Zypper is a no-nonsense package manager, similar to dnf with both obvious commands like <code>zypper install</code> and shorthands like <code>zypper in</code>. And it&rsquo;s integrated directly with&hellip;</li>
<li>Btrfs, snapshotting, and simple rollbacks enabled by default</li>
<li>YaST, an openSUSE original, gives you granular control over every aspect of the system via a simple GUI</li>
</ul>
<p>But unfortunately, the installer is confusing, and on my first attempt I failed the install completely, likely because I tried to do manual partitioning, and thus clearly made some mistake. I did end up succeeding on my second attempt using the default settings, but then every time I tried to run updates, the terminal crashed.</p>
<p>I&rsquo;ll give it another try in the future because it really does seem to be a cool project. I&rsquo;m also very intrigued by their upcoming immutable rolling release distro <a href="https://aeondesktop.github.io/" target="_blank" rel="noopener noreferrer">Aeon</a> and will for sure want to give that a try when it releases officially.</p>
<h3 id="cachyos">CachyOS</h3>
<p>From everything I&rsquo;ve watched, read, and heard, CachyOS is probably for me. It takes what I&rsquo;ve always loved about Arch-based distros like Manjaro and Endeavour (previously Antergos), and makes it even more polished, performant, and cool.</p>
<p>I know that when I can figure out how to get CachyOS to work, on this laptop or another, I&rsquo;ll daily drive it for at least a few months. But, sadly, as you may have guessed, I couldn&rsquo;t get it to work. I tried installing it with Hyprland and the installer failed at the end. I tried Niri, same result. I tried Gnome, same result. I tried KDE (which I personally dislike using, sorry to say), and it failed too.</p>
<p>So for now, I have nothing interesting to say about Cachy.</p>
<h3 id="omarch-err-tonarchy">Omarch&hellip; err, Tonarchy</h3>
<p>Listen I know that a lot of people reading this will want to tell me I should try Omarchy. I&rsquo;ve followed the project from the very beginning. I think I may have been one of the very first people to post about it on Bluesky. But after another user pointed me to some of DHH&rsquo;s reprehensible blog posts and tweets, I decided that I&rsquo;m not willing to personally promote the project, deleted my initial post, and haven&rsquo;t mentioned it, except in passing since.</p>
<p>I think what Omarchy does as a concept is cool. I think that the way that this project has brought together a lot of open source contributors, inspired some big donations to open source developers, and pushed the boundaries and pace of Arch and Hyprland development is all laudable. I don&rsquo;t fault anyone for using it, and I don&rsquo;t believe that doing so is equatable to approval of DHH&rsquo;s worldview. But it&rsquo;s not for me.</p>
<p>I did want to give an &ldquo;opinionated Hyprland distribution&rdquo; a taste though and I&rsquo;m a big fan of <a href="https://www.youtube.com/@tony-btw" target="_blank" rel="noopener noreferrer">Tony Banter&rsquo;s videos</a> on YouTube, so I decided to try out <a href="https://github.com/tonybanters/tonarchy" target="_blank" rel="noopener noreferrer">Tonarchy</a>. It&rsquo;s an extremely lightweight, user-friendly Omarchy-like installer of pre-riced Arch Linux with his own Oxidized Window Manager (<a href="https://github.com/tonybanters/oxwm" target="_blank" rel="noopener noreferrer">oxwm</a>) or, if you prefer, there&rsquo;s an XFCE spin too.</p>
<p>I installed Tonarchy and had no issues getting the system up and running and following his video tutorial was able to tweak things to look how I wanted. What&rsquo;s even crazier is that it was using the least ram I&rsquo;ve ever seen an operating system use. I&rsquo;m talking a fraction of a percent. But I had a pretty major issue that I couldn&rsquo;t seem to resolve. I couldn&rsquo;t connect to the wifi. And none of the tools I would have needed to connect from terminal seemed to be installed. And I couldn&rsquo;t install them without the internet.</p>
<p>Maybe it was just user error, and maybe I was just hungry, but I got so frustrated I decided to just move on for now. But, Tony, oxwm seems awesome. I will definitely revisit your projects in the future.</p>
<h3 id="pikaos">PikaOS</h3>
<p>This is where things start to get fun. PikaOS is a relatively new project focused on user-friendliness and gaming optimizations, and while I first thought it was a fly-by-night addition to the Linux space, I now have nothing but good things to say about this newcomer.</p>
<p>My first inclination that I should try it was seeing <a href="https://www.youtube.com/channel/UCrQTCWlRKkDPFW9eympklkQ" target="_blank" rel="noopener noreferrer">TheBlackDon&rsquo;s videos </a>on YouTube. This is a relatively experienced tiling window manager user, who moved from Cachy (if I remember correctly) to Pika and hasn&rsquo;t looked back.</p>
<p>What I&rsquo;ve seen in those videos and elsewhere online has given me a lot of confidence that Pika is worth checking out, and now that I have, I get it.</p>
<p>Installing PikaOS was dead simple. I tried all four flavours and they all worked, with installation taking just few minutes each time. I had the same issue that I had on Fedora where Gnome  a bit slow/laggy but I was still thinking this might be a hardware issue. Cosmic, I tried again, and while Pika&rsquo;s styling of this burgeoning DE was cute, I still don&rsquo;t think it&rsquo;s for me.</p>
<p>I also tried Niri which is really interesting, but I couldn&rsquo;t quite make it work for me. I think that was 100% a skill issue though and I&rsquo;m going to revisit Niri soon when I&rsquo;ve watched and read some more tutorials.</p>
<p>Hyprland was fine. I didn&rsquo;t love everything about the styling Pika added and I kept getting a brief error on login, but it didn&rsquo;t seem to stop anything from actually working.</p>
<p>I saw some good videos from both <a href="https://youtu.be/BkJNbfE7Wt0" target="_blank" rel="noopener noreferrer">TheBlackDon</a> and <a href="https://youtu.be/Q1Jgw_q0gWE" target="_blank" rel="noopener noreferrer">Tony</a> that made me think MangoWC might be exactly what I&rsquo;m looking for as a sort of middle ground between Niri and Hyprland.</p>
<p>But if you like Cosmic or Niri, want to try Hyprland, or have hardware that plays better with their version of Gnome than mine did, you should definitely check out PikaOS. It&rsquo;s awesome!</p>
<p>It&rsquo;s based on Debian Sid, which is similar to openSUSE Tumbleweed or Fedora Rawhide. It&rsquo;s got Btrfs, snapshotting, and rollbacks all set up, like openSUSE, and it uses the same performance gaming tweaks found in distros like CachyOS, Nobara, and Bazzite.</p>
<p>It&rsquo;s definitely not all hype.</p>
<h3 id="vanillaos">VanillaOS</h3>
<p>I also wanted to explore some immutable distributions and keeping with the Debian theme, I figured why not start with VanillaOS. This relatively new distribution takes the best of Fedora&rsquo;s Atomic Spins and improves upon them, in a somewhat PikaOS-like way.</p>
<p>You&rsquo;ve got the same seamless, modern installation process as Pika. Performance optimizations that benefit gaming in particular, but you also got an immutable configuration where each update is a fresh image, and you can rollback to the previous one if anything breaks.</p>
<p>Like all immutable distros, software is generally not installed from a distribution&rsquo;s repository, but rather by Flatpak or other containerized solutions. This is extremely secure, and Vanilla claims that it is not at the expense of customization.</p>
<p>My experience with VanillaOS was pretty much flawless. The install went perfectly, everything worked, the laptop was running super cool, I was able to get all my software installed via Flatpak without any issues. I tweaked Gnome to my liking, adding the Forge extension for autotiling windows, and changing the close-window shortcut to alt-Q, and area screenshots (via Gradia) to alt-shift-4 to help with my Mac muscle memory. I installed LocalSend, Krita, and Planify (a great to-do app that&rsquo;s like a cross between Things and Apple Reminders) and I spent a few hours doing everyday computer stuff, which it handled without issue.</p>
<p>The only thing that I couldn&rsquo;t get to work properly is my favourite software store: Bazaar. I wish every distro, especially those which rely exclusively on Flatpaks, would use this as the default. It&rsquo;s intuitive, clean, fast, and well organized. Bazaar is made by UniversalBlue, the team behind the SteamOS-like, immutable distro, Bazzite and is the default on all of their distros.</p>
<p>So I thought that might be as good a reason as any to do my next hop.</p>
<h3 id="bluefin">Bluefin</h3>
<p><a href="https://universal-blue.org/" target="_blank" rel="noopener noreferrer">UniversalBlue</a> makes four distributions on their namesake, in-house, immutable desktop framework: Bazzite, Aurora, Bluefin, and uCore. The first one, you&rsquo;ve surely heard of. It&rsquo;s made for handheld and home theatre style gaming setups, but would also be at home on a gaming focused desktop computer.</p>
<p>Aurora and Bluefin are more general purpose distributions, leaning towards being used by developers, but certainly suitable to everyday users as well. The main difference is that Aurora runs KDE and Bluefin runs Gnome. The other option, uCore, is for servers, so I don&rsquo;t have much else to say about it at the moment.</p>
<figure><img src="/posts/i-put-linux-on-a-thinkpad/bluefin.png"
    alt="Bluefin Linux"><figcaption>
      <p>Big fan of this approach</p>
    </figcaption>
</figure>

<p>My experience with Bluefin has been similar to my experience with VanillaOS, which is to say, it&rsquo;s effectively perfect for my needs. Install went smoothly, no hardware issues, and like VanillaOS, the subtle Gnome-lag I had experienced on Pika and Fedora was non-existent. Unlike VanillaOS, Bazaar was installed by default and worked flawlessly.</p>
<p>So the tl;dr is that for the moment, I have Bluefin installed on my Thinkpad, and intend to daily drive it for a little while. I still intend to use my Macbook for my consequential work for the foreseeable future, which gives me the freedom to tinker and distrohop on this new laptop and not worry about breaking things.</p>
<p>So, you can expect to see future blog posts with updates on this subject. Speaking of which&hellip;</p>
<h2 id="want-more-content-like-this">Want More Content Like This?</h2>
<p>This is a relatively new blog, and I don&rsquo;t know exactly what I want to write about yet. I&rsquo;m not going to force anything, but I&rsquo;d love to know what posts of mine you enjoy. You can show me that you like a certain subject by sharing my posts; by commenting (respectfully please) on Bluesky, Mastodon, or Farcaster; by subscribing via ATProtocol blogs services like <a href="https://pckt.blog/read" target="_blank" rel="noopener noreferrer">pckt</a> or <a href="https://leaflet.pub/reader/hot" target="_blank" rel="noopener noreferrer">Leaflet</a>; and, if you&rsquo;re so inclined, by supporting me with the tipping buttons at the bottom of this post. I&rsquo;ve chosen to only accept cryptocurrency (I explain why in <a href="https://thumbsup.me/posts/why-the-heck-would-i-want-crypto-tips/" target="_blank" rel="noopener noreferrer">this post</a>), so if that&rsquo;s something you avoid, I understand. Don&rsquo;t feel like you need to support me financially. You can always show support in the other ways I mentioned.</p>
<p>If people do support though, maybe I&rsquo;ll have a Framework Laptop or a gaming desktop, or something else to put Linux on and write all about.</p>
<p>That sounds like fun to me.</p>
]]></content:encoded></item><item><title>Why the heck would I want crypto tips?</title><link>https://thumbsup.me/posts/why-the-heck-would-i-want-crypto-tips/</link><pubDate>Sat, 04 Apr 2026 12:00:00 +0000</pubDate><guid>https://thumbsup.me/posts/why-the-heck-would-i-want-crypto-tips/</guid><description>&lt;p&gt;Hey friends 👋&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://thumbsup.me/posts/building-custom-social-post-embed-cards/" target="_blank" rel="noopener noreferrer"&gt;last blog post&lt;/a&gt; we looked at how and why I built custom social cards. In case you missed it, I wanted a way to &amp;ldquo;embed&amp;rdquo; social media posts in a way that is consistent with my theme&amp;rsquo;s styling, fast to load, and which didn&amp;rsquo;t make a bunch of unnecessary API calls and expose my reader&amp;rsquo;s data in the process.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a big believer that the internet is simultaneously one of the greatest boons to humanity ever created, and one of the most dangerous. This only becomes more true as time goes on and corporations, governments, black hat hacker groups, and run-of-the-mill psychopaths get better at abusing the data we put out into the world.&lt;/p&gt;</description><content:encoded>
<![CDATA[<p>Hey friends 👋</p>
<p>In my <a href="https://thumbsup.me/posts/building-custom-social-post-embed-cards/" target="_blank" rel="noopener noreferrer">last blog post</a> we looked at how and why I built custom social cards. In case you missed it, I wanted a way to &ldquo;embed&rdquo; social media posts in a way that is consistent with my theme&rsquo;s styling, fast to load, and which didn&rsquo;t make a bunch of unnecessary API calls and expose my reader&rsquo;s data in the process.</p>
<p>I&rsquo;m a big believer that the internet is simultaneously one of the greatest boons to humanity ever created, and one of the most dangerous. This only becomes more true as time goes on and corporations, governments, black hat hacker groups, and run-of-the-mill psychopaths get better at abusing the data we put out into the world.</p>
<p>Take for example patronage and support platforms like Buy Me A Coffee, Patreon, and Substack. Conceptually, these are deeply aligned with my belief in solidarity and grassroots support. They provide a way to offer sustainable income to creative professionals like writers, journalists, adult entertainers, and visual artists of all kinds.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Note</p>
        <p>I&rsquo;m hesitant to use the term content creators, but as a shorthand I may use the terms creators or creatives at times.</p>
    </blockquote><p>The issue with these platforms is that they all run on one of a limited set of very similar financial rails. The most common backend is Stripe, though some may use PayPal or other payment processors. So, what happens is that when creators who opt for pseudonymity/anonymity—often sex workers, political activists, whistleblowers and journalists—receive tips, their personal information can be leaked on the transaction receipt. On some platforms, even their billing address may be shown. On more than one instance this has been used for harassment, threats, and even acts of violence.</p>
<p>Now I&rsquo;m by no means a journalist and while I&rsquo;ve written the occasional post that might be seen as radical—usually just passing comments that could be seen as advocating for revolution against the tyrannical US government, subversion of major corporations, or protection from the unlawful spying deemed status quo in the west—I don&rsquo;t spend a lot of time worrying about vigilantes, or big brother, coming for me. But that doesn&rsquo;t mean I want to introduce unnecessary risk either.</p>
<p>With that said, I do have bills to pay and I do appreciate when people want to support with even just a dollar here and there. So I made a decision&hellip;</p>
<h2 id="remove-the-middle-man">Remove the middle man</h2>
<p>Say what you will about cryptocurrency—and you&rsquo;ll be right about most of it—but it has a number of unique and wonderful properties.</p>
<ol>
<li><strong>It&rsquo;s direct.</strong> You can send $1 worth of digital currencies straight from your wallet to mine with no intermediaries. This makes it the fastest and least complex method of settlement available today.</li>
<li><strong>It&rsquo;s borderless.</strong> Whether you&rsquo;re sending a stand-in for a sovereign currency like USDC/EURC or something intentionally separate from existing financial systems like ETH or Bitcoin, there are no hoops to jump through. Whether you&rsquo;re sending to Canada or Kenya, it&rsquo;s treated the same. There is some nuance here with respect to public blockchains and countries sanctioned by the global financial hegemony, but we&rsquo;ll get to that.</li>
<li><strong>It has no hidden fees and fewer fees overall.</strong> Payment processors often take several percentage points off each transaction. In the early days of my blogging, I used Buy Me A Coffee, and I was taking home like $3.50 on every $5 tip. If you send me $5 of USDC or any other cryptocurrency, you (the sender) will pay the fee for validation on the blockchain, and it will most likely be just a few pennies.</li>
<li><strong>Truly private options exist.</strong> Payment processors offer something that can seem like privacy: heavily regulated, centralized data handlers. In a lot of ways, at least in a perfect world where data breaches didn&rsquo;t happen all the time, this would be preferable to transacting on a public blockchain like Bitcoin or Ethereum. However, this technology lends itself extremely well to innovation around privacy. Options like Zcash and Monero offer excellent privacy guarantees while retaining all of the benefits of Bitcoin. And eventually similarly effective options will exist on Ethereum, meaning more stable currencies can be used to transact privately, solving for the usability issues caused by currency volatility.</li>
</ol>
<h2 id="but-i-thought-only-criminals-use-crypto">But I thought only criminals use crypto</h2>
<p>While a lot of folks, especially liberals, are quick to imply that crypto only exists for scammers to commit financial fraud or hide their wealth offshore, a growing number of us on the left are pushing back against this narrative.</p>
<p>Firstly, more crimes have been committed by way of and in exchange for Dollars than for cryptocurrencies. And while this may change, it&rsquo;s not the medium of exchange that creates this issue, it&rsquo;s the structure and incentives of society. Marxists know this. And intellectually consistent progressives do too.</p>
<p>Additionally, I would challenge the asker of this question to clarify who should decide what is a crime? Is it Donald Trump bombing civilian fishing boats, kidnapping and killing the leaders of sovereign countries (in violation of international law, and thus a criminal himself btw) who should say which non-profits in which countries should be allowed to receive funds? Is it Visa and Mastercard—who arbitrarily debank lawful adult entertainers and UN employees—who should decide which transactions are permitted?</p>
<p>I would argue that any interaction should be based on the consent of both parties. If I want to financially support a journalist on the ground in Palestine, an open source software developer undermining Microsoft&rsquo;s business monopoly, or a pseudonymous artist creating beautiful works, I should be able to do so without permission.</p>
<p>Here are some examples of trusted organizations who agree with what I&rsquo;ve said, at least enough that they themselves allow for support via cryptocurrencies:</p>
<ul>
<li><a href="https://wck.org/donate/" target="_blank" rel="noopener noreferrer">World Central Kitchen</a></li>
<li><a href="https://www.democracynow.org/ways_to_donate" target="_blank" rel="noopener noreferrer">Democracy Now!</a></li>
<li><a href="https://www.eff.org/pages/other-ways-give-and-donor-support#crypto" target="_blank" rel="noopener noreferrer">The Electronic Frontier Foundation (EFF)</a></li>
<li><a href="https://freedom.press/donate/cryptocurrency/" target="_blank" rel="noopener noreferrer">Freedom of the Press Foundation</a></li>
<li><a href="https://archive.org/donate" target="_blank" rel="noopener noreferrer">Internet Archive</a></li>
<li><a href="https://signal.org/donate/" target="_blank" rel="noopener noreferrer">The Signal Foundation</a></li>
<li><a href="https://grapheneos.org/donate" target="_blank" rel="noopener noreferrer">GrapheneOS</a></li>
<li><a href="https://wiki.cachyos.org/support/donation/" target="_blank" rel="noopener noreferrer">CachyOS</a></li>
<li><a href="https://linuxmint.com/donors.php" target="_blank" rel="noopener noreferrer">LinuxMint</a></li>
</ul>
<p>If these organizations believed that only criminals used cryptocurrencies, it would be quite an indictment for them to accept them.</p>
<h2 id="call-to-action">Call to Action</h2>
<p>So I&rsquo;ve given you the <em>why</em>. And you can take it or leave it. This is not going to be a blog all about cryptocurrency. In fact, I&rsquo;m not planning to write very much else about it, but I thought I should explain why at the bottom of each post you can expect to see little tip buttons that prompt you to support with cryptocurrency.</p>
<p>Writing is a labour of love for me. Putting my thoughts down to share and connect with other people is something I&rsquo;ve been doing for years and it&rsquo;s extremely fulfilling. And what&rsquo;s more, I feel like I&rsquo;m pretty good at gathering together useful information and sharing it to people.</p>
<p>I want people who come across this blog to feel like they learn something, see a different perspective, and get some value. And one of the best ways to show a creative person that you value their work, is through patronage.</p>
<p>If you are not completely crypto averse, consider using the buttons at the bottom of this post to tip with Ether, USDC, Bitcoin, Cashu, Monero, or Zcash. I&rsquo;ll most likely use it to cover my operating costs</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/eaa7ad3827b8d387_7793939885977693570_hu_d1fd0365232b20e2.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">Thumbs Up</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@thumbsup</span>
      </div>
    </div>
    <a href="https://mastodon.online/@thumbsup/116343490543209500" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;">Just renewed my domain, web hosting, and rapidSSL. As always I paid with private cryptocurrency, and the provider, Orange Website, didn&#39;t ask for a single personal detail, because of the strict privacy laws in Iceland. And because of where they host, it&#39;s all run on completely renewable geothermal energy. </p><p style="margin:0 0 0.9em 0;">No enriching big corporations, no data to mishandle and put consumers at risk, and no potential for financial censorship or unnecessary middleman fees.</p>
  </div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-04-03T23:59:40Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Apr 3, 2026 at 11:59 PM UTC</time>
    <a href="https://mastodon.online/@thumbsup/116343490543209500" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>Some of it, I&rsquo;ll donate.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/eaa7ad3827b8d387_7793939885977693570_hu_d1fd0365232b20e2.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">Thumbs Up</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@thumbsup</span>
      </div>
    </div>
    <a href="https://mastodon.online/@thumbsup/115307619094790476" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;"><span class="h-card" translate="no"><a style="text-decoration:none;" href="https://grapheneos.social/@GrapheneOS" class="u-url mention">@<span>GrapheneOS</span></a></span> thanks for accepting Monero/Zcash. </p><p style="margin:0 0 0.9em 0;">Couldn’t spare much, but happy support such a great project.</p>
  </div><div style="display: flex; gap: 8px; margin-top: 8px; margin-bottom: 12px; overflow: hidden;"><img src="/e2b4f849541c5eeb_14658377963741253882_hu_15a7e0f004747dcb.webp" alt="" onclick="window.__scLb&&window.__scLb(this.src)" style="flex: 1 1 0%; min-width: 0; border-radius: 8px; display: block; margin: 0 !important; cursor: pointer; height: auto; width: 100%;" loading="lazy"></div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2025-10-03T01:23:57Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Oct 3, 2025 at 1:23 AM UTC</time>
    <a href="https://mastodon.online/@thumbsup/115307619094790476" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>And if there&rsquo;s anything meaningful left over, I&rsquo;ll put it towards projects that I&rsquo;ll write about. Some things I could potentially fund via donations, which I would absolutely write about are:</p>
<ul>
<li>An <a href="https://www.ayntec.com/products/ayn-thor" target="_blank" rel="noopener noreferrer">AYN Thor</a> gaming handheld.</li>
<li>A dedicated Linux PC (<a href="https://frame.work/ca/en/products/desktop-diy-amd-aimax300/configuration/new" target="_blank" rel="noopener noreferrer">Framework</a>, <a href="https://system76.com/desktops" target="_blank" rel="noopener noreferrer">System76</a>, or self-built)</li>
<li>a split keyboard like the <a href="https://www.zsa.io/voyager" target="_blank" rel="noopener noreferrer">ZSA Voyager</a></li>
<li>an <a href="https://umbrel.com/umbrel-pro" target="_blank" rel="noopener noreferrer">Umbrel Pro</a> or <a href="https://www.zimaspace.com/products/single-board2-server" target="_blank" rel="noopener noreferrer">ZimaBoard2</a> to replace my current hodge-podge homelab setup</li>
</ul>
<p>And of course just keeping a roof over my head through these difficult economic times.</p>
<h2 id="closing-thoughts">Closing thoughts</h2>
<p>Whether or not you want to support, or even if I haven&rsquo;t convinced you about the role cryptocurrency can play in this kind of internet money ecosystem, I hope you enjoyed reading this post.</p>
<p>And I hope you&rsquo;ll come back in the future and read more of my posts. This blog is syndicated to AT Protocol blog readers like pckt, leaflet, and surf via the Standard.Site lexicon. If you use one of these readers, subscribe! You can also add my RSS feed to your feed reader of choice.</p>
<p>See you in the next one.</p>
]]></content:encoded></item><item><title>I built custom social cards for my blog</title><link>https://thumbsup.me/posts/building-custom-social-post-embed-cards/</link><pubDate>Fri, 06 Mar 2026 12:00:00 +0000</pubDate><guid>https://thumbsup.me/posts/building-custom-social-post-embed-cards/</guid><description>&lt;p&gt;Hey friends 👋&lt;/p&gt;
&lt;p&gt;One of the coolest things about this new blog project is that I feel like I&amp;rsquo;m in control and can make it look and act however I want. I&amp;rsquo;ve blogged, microblogged, and written newsletters on a lot of different platforms over the years, and that has meant having to accept a variety of different limitations.&lt;/p&gt;
&lt;p&gt;One thing that no platform does well, in my opinion, is social post embed cards. For years, Twitter was the only card you would find. Later, Mastodon became a bit more common, and more recently Bluesky. Most platforms support one, maybe two of these natively. But few support all of the ones I use. For example, almost no platform supports embedding posts from Farcaster, where I feel like some of my best posts can be found.&lt;/p&gt;</description><content:encoded>
<![CDATA[<p>Hey friends 👋</p>
<p>One of the coolest things about this new blog project is that I feel like I&rsquo;m in control and can make it look and act however I want. I&rsquo;ve blogged, microblogged, and written newsletters on a lot of different platforms over the years, and that has meant having to accept a variety of different limitations.</p>
<p>One thing that no platform does well, in my opinion, is social post embed cards. For years, Twitter was the only card you would find. Later, Mastodon became a bit more common, and more recently Bluesky. Most platforms support one, maybe two of these natively. But few support all of the ones I use. For example, almost no platform supports embedding posts from Farcaster, where I feel like some of my best posts can be found.</p>
<p>What&rsquo;s more, even if its possible to embed a platform&rsquo;s official embed cards, they often have their own styling that doesn&rsquo;t match my theme. It&rsquo;s a nitpick, sure, but it&rsquo;s something I care about.</p>
<p>Something you might care about are the privacy implications of embedded post cards. You see, because the post&rsquo;s data is fetched and served to readers on page load, they can leak IP addresses, geolocation data, device information, and more. They may even contain tracking pixels, cookies, and scripts that feed the surveillance capital machine.</p>
<h2 id="why-not-just-use-screenshots">Why not just use screenshots?</h2>
<p>Honestly, screenshots are a solid option. They capture a post at a specific moment in time, which means that even if the post is altered later, you still have evidence of what was once written. This is certainly preferable for journalistic endeavours.</p>
<p>I have used screenshots many times over the years, but here&rsquo;s my issue with them: they&rsquo;re inelegant. Screenshots are great for evidence, bug reports, or tutorials. They are not ideal for engaging your reader or encouraging them to visit your other content on platforms external to your blog.</p>
<p>That&rsquo;s what social cards are: an invitation for people to discover your microblogging content in its natural context and, hopefully, to follow you on that platform.</p>
<h2 id="so-i-built-my-own">So I built my own</h2>
<p>Like most of what you see on this site, these custom cards are a combination of my intermediate knowledge of HTML and CSS, my unrelenting design vision, and a long evening with Claude and a bottle of red wine.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #eed49f;border-radius:0 8px 8px 0;background:#2a2518;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Warning</p>
        <p>If you have an issue with AI-assisted coding, that&rsquo;s fine, but it won&rsquo;t change that Claude was used to make these. I clearly marked the GitHub repo and you&rsquo;re welcome to not use them, or even to make your own version. If they&rsquo;re better, I&rsquo;ll switch to yours and recommend them on the blog even!</p>
    </blockquote><p>When I build things for this site, I will make what I can open source so that anyone who wants to repurpose those things for their own needs can do so. Just keep in mind that I&rsquo;m building things to be used with <a href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> so you will probably have to make tweaks to get it to work on Astro or other static site builders.</p>
<h2 id="features">Features</h2>
<p>My custom cards feature:</p>
<ul>
<li>Subtle <strong>hover animations</strong> inspired by the official Bluesky embed cards</li>
<li>Working <strong>links in posts</strong></li>
<li><strong>Link embed cards</strong> (rendered at build)</li>
<li>Image support (with <strong>lightbox</strong> for viewing embedded images)</li>
<li><strong>Carousels</strong> for multi-image, multi-link, or mixed posts</li>
<li><strong>Timestamps</strong> for posts which can be shown in the reader&rsquo;s local timezone.</li>
</ul>
<p>Omitted, intentionally from my cards are:</p>
<ul>
<li><strong>Interactions</strong>: these would pose potential tracking risks if functional, or would be inaccurate to the point of serving no real function, if rendered at build</li>
<li><strong>Hashtag clusters</strong> can help your post be seen, but they can be quite ugly. My custom cards render hashtags only when they are in the body text. Clusters are hidden. This may cause some posts to render weirdly, if for example every other word in the post&rsquo;s text is a hashtag. The fix is simple though: don&rsquo;t write your posts that way.</li>
<li>Videos (both embeds and video files): these cards cache post images at build time. Doing this with video would be a waste of space and would slow down the site. Depending on the browser, they might not even work. Embedded YouTube, Vimeo etc, would pose the same tracking issue as interactions, so they just render standard link cards.</li>
</ul>
<h2 id="examples">Examples</h2>
<p>Without further ado, here are some posts rendered for demonstration purposes. The particular content is not intended to be relevant to this post or to sway you to follow me on these platforms—though you&rsquo;re certainly welcome to.</p>
<p>Here is an example of a Bluesky post, aka <em>skeet</em>, featuring a link card and text link.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/bafkreicxfuixp6jfteqimt5kwanw2lp24cqocrbchih7c2arosujkoomla_3067075964746239622_hu_8110fe3da8014533.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">pckt.blog</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@pckt.blog</span>
      </div>
    </div>
    <a href="https://bsky.app/profile/pckt.blog/post/3mg4kf7sskk2c" target="_blank" style="color: #0085ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 48 48" fill="currentColor" style="display: block;"><path d="M10.971 6.76c5.274 4.008 10.947 12.134 13.03 16.495 2.082-4.36 7.754-12.487 13.028-16.495C40.834 3.868 47 1.63 47 8.75c0 1.422-.805 11.946-1.278 13.654-1.642 5.94-7.625 7.455-12.947 6.538 9.303 1.603 11.67 6.912 6.559 12.221-9.707 10.083-13.952-2.53-15.04-5.761-.2-.593-.293-.87-.294-.634-.001-.236-.095.041-.294.634-1.088 3.231-5.332 15.845-15.04 5.761-5.11-5.309-2.744-10.618 6.56-12.22-5.323.916-11.307-.599-12.948-6.539C1.805 20.697 1 10.172 1 8.75c0-7.12 6.166-4.882 9.97-1.99h.001Z"/></svg>
    </a>
  </div>

  <div style="font-size: 1.05rem; line-height: 1.5; margin-bottom: 12px; color: var(--color-neso-fg1);">tell your friends about <a href="https://pckt.blog" target="_blank" rel="noopener noreferrer" style="color:#0085ff;text-decoration:none;">pckt.blog</a> 😌
  </div><a href="https://pckt.blog" target="_blank" rel="noopener noreferrer" style="display: block; margin-top: 8px; margin-bottom: 16px; border: 1px solid var(--color-neso-deco2); border-radius: 10px; overflow: hidden; text-decoration: none; color: inherit;"><img src="https://cdn.bsky.app/img/feed_thumbnail/plain/did:plc:revjuqmkvrw6fnkxppqtszpv/bafkreid5m6mgdc5xe25ov7ke474kesshz2sre5m2g6ba43mjm2wm5opguy" alt="pckt.blog" style="width: 100%; height: 180px; object-fit: cover; display: block; margin: 0 !important;"><div style="padding: 10px 14px;">
      <div style="font-weight: 600; font-size: 0.95rem; color: var(--color-neso-fg1); margin-bottom: 3px;">pckt.blog</div><div style="font-size: 0.85rem; color: var(--color-neso-fg3); margin-bottom: 4px; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;">A distraction-free space to write and share your story. Just you, and your words.</div><div style="font-size: 0.8rem; color: var(--color-neso-fg3);">pckt.blog</div>
    </div>
  </a><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-03-03T00:50:18Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Mar 3, 2026 at 12:50 AM UTC</time>
    <a href="https://bsky.app/profile/pckt.blog/post/3mg4kf7sskk2c" target="_blank" style="color: #0085ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#33a1ff'" onmouseout="this.style.color='#0085ff'">View on Bluesky</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>Here is a Mastodon post, aka <em>toot</em>,  from my web friend elle. This post features both an image and truncated text link.</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: flex-start; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 12px;">
      <img src="/54d91f4e135ca096_31224995573741215_hu_81a096866cc15bf0.webp" style="width: 44px; height: 44px; border-radius: 50%; flex-shrink: 0; object-fit: cover;" />
      <div style="display: flex; flex-direction: column; line-height: 1.2;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem;">elle</span>
        <span style="color: var(--color-neso-fg3); font-size: 0.9rem;">@e11e@mastodon.social</span>
      </div>
    </div>
    <a href="https://mastodon.online/@e11e@mastodon.social/115425817496799926" target="_blank" style="color: #6364ff; align-self: flex-start; margin-top: 2px; transition: transform 0.2s ease-in-out; display: flex; flex-shrink: 0;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 79 75" fill="currentColor" style="display: block;"><path d="M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z"/></svg>
    </a>
  </div><div style="font-size: 1.05rem; line-height: 1.6; margin-bottom: 12px; color: var(--color-neso-fg1);">
    <p style="margin:0 0 0.9em 0;">with the way things are going, my next computer is going to have to be a cyberdeck made from random parts i pick up in a huaqiangbei e-market (⌒_⌒;)</p><p style="margin:0 0 0.9em 0;">wrote a new blog about my linux adventures, building a computer, and homepage updates lately: <a style="text-decoration:none;" href="https://ellesho.me/page/website/now/#serial-experiments" rel="nofollow noopener" translate="no" target="_blank">ellesho.me/page/website/now/#s…</a></p>
  </div><div style="display: flex; gap: 8px; margin-top: 8px; margin-bottom: 12px; overflow: hidden;"><img src="/db035737165c788a_6241359627871780086_hu_139bd7ab5a3435db.webp" alt="elle&#39;s linux setup running on a pi 4 and ipad mini" onclick="window.__scLb&&window.__scLb(this.src)" style="flex: 1 1 0%; min-width: 0; border-radius: 8px; display: block; margin: 0 !important; cursor: pointer; height: auto; width: 100%;" loading="lazy"></div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2025-10-23T22:23:18Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Oct 23, 2025 at 10:23 PM UTC</time>
    <a href="https://mastodon.online/@e11e@mastodon.social/115425817496799926" target="_blank" style="color: #6364ff; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8A8BFF'" onmouseout="this.style.color='#6364ff'">View on Mastodon</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>

<p>Here is an example of a Farcaster post, aka <em>cast</em>, which features two images. Posts with two images crop them to fill two equal spaces. Posts with more than two render as a carousel of images.</p>
<p>Try clicking an image to see it in a lightbox preview!</p>
<div class="social-card-final cnt-undo" style="margin: 1.5rem auto; max-width: 550px; border: 1px solid var(--color-neso-deco2); border-radius: 12px; padding: 16px; background: var(--color-neso-bg2); color: var(--color-neso-fg2); font-family: var(--font-sans); position: relative; overflow: hidden;">
  <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 8px;">
    <div style="display: flex; align-items: center; gap: 10px; min-width: 0;">
      <img src="/original_10245280551282026412_hu_81f4ab19ec4e089a.webp" style="width: 40px; height: 40px; border-radius: 50%; flex-shrink: 0; object-fit: cover; margin: 0 !important;" />
      <div style="display: flex; align-items: center; gap: 6px; flex-wrap: wrap; min-width: 0;">
        <span style="font-weight: 700; color: var(--color-neso-fg1); font-size: 1rem; white-space: nowrap;">Thumbs Up</span><span style="color: var(--color-neso-fg3); font-size: 0.85rem;">in</span>
        <span style="display: inline-flex; align-items: center; gap: 4px; background: var(--color-neso-deco3); border-radius: 999px; padding: 2px 8px 2px 4px; font-size: 0.85rem; font-weight: 600; color: var(--color-neso-fg2); white-space: nowrap;"><img src="/pDxhPYZ_14998524118284003293_hu_8a13167fef0bc034.webp" style="width: 16px; height: 16px; border-radius: 50%; object-fit: cover; flex-shrink: 0; margin: 0 !important;" />Bluesky</span></div>
    </div>
    <a href="https://farcaster.xyz/thumbsup.eth/0x385d912a" target="_blank" style="color: #6A3CFF; align-self: flex-start; margin-top: 2px; transition: transform 0.2s; display: flex; flex-shrink: 0; width: 28px; height: 28px;" onmouseover="this.style.transform='scale(1.2)'" onmouseout="this.style.transform='scale(1)'">
      <svg width="28" height="28" viewBox="0 0 200 175" fill="currentColor" xmlns="http://www.w3.org/2000/svg" style="display: block; margin: 0 !important;"><path d="M200 0V23.6302H176.288V47.2404H183.553V47.2483H200V175H160.281L160.256 174.883L139.989 79.3143C138.057 70.2043 133 61.9616 125.751 56.0995C118.502 50.2376 109.371 47.0108 100.041 47.0108H99.9613C90.631 47.0108 81.5 50.2376 74.251 56.0995C67.0023 61.9616 61.9453 70.2073 60.013 79.3143L39.7223 175H0V47.2453H16.4475V47.2404H23.7114V23.6302H0V0H200Z"/></svg>
    </a>
  </div>

  <div style="font-size: 1.05rem; line-height: 1.5; margin-bottom: 12px; color: var(--color-neso-fg1);">My blog is officially syndicating to ATproto thanks to the standard.site lexicon. This is a blog hosted on a regular old server in Iceland, not on a PDS, and not on leaflet or pckt's own CMS. <br><br>These links just take you to my site unfortunatley, they dont create an RSS reader like experience, but it's still awesome!
  </div><div style="display: flex; gap: 8px; margin-top: 8px; margin-bottom: 16px; overflow: hidden;"><img src="/original_16303224617586663852_hu_1af686fa55947296.webp" onclick="window.__scLb&&window.__scLb(this.src)" style="flex: 1 1 0%; min-width: 0; border-radius: 8px; display: block; margin: 0 !important; cursor: pointer; height: 250px; object-fit: cover;" loading="lazy"><img src="/original_11274760543635195863_hu_439f6a89488f69e0.webp" onclick="window.__scLb&&window.__scLb(this.src)" style="flex: 1 1 0%; min-width: 0; border-radius: 8px; display: block; margin: 0 !important; cursor: pointer; height: 250px; object-fit: cover;" loading="lazy"></div><div style="border-top: 1px solid var(--color-neso-deco3); padding-top: 12px; margin-top: 16px; display: flex; justify-content: space-between; align-items: center;">
    <time class="social-card-time" datetime="2026-03-01T20:59:10Z" style="color: var(--color-neso-fg3); font-size: 0.9rem;">Mar 1, 2026 at 8:59 PM UTC</time>
    <a href="https://farcaster.xyz/thumbsup.eth/0x385d912a" target="_blank" style="color: #6A3CFF; font-weight: 600; text-decoration: none; font-size: 0.9rem; transition: color 0.2s ease-in-out;" onmouseover="this.style.color='#8C66FF'" onmouseout="this.style.color='#6A3CFF'">View on Farcaster</a>
  </div>
</div><script>
if (!window.__scLb) {
  var _lbImg = document.createElement('img');
  _lbImg.style.cssText = 'max-width:92vw;max-height:92vh;object-fit:contain;border-radius:8px;cursor:default;';
  _lbImg.addEventListener('click', function(e) { e.stopPropagation(); });
  var _lbOv = document.createElement('div');
  _lbOv.style.cssText = 'display:none;position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.88);cursor:zoom-out;align-items:center;justify-content:center;';
  _lbOv.appendChild(_lbImg);
  _lbOv.addEventListener('click', function() { _lbOv.style.display = 'none'; document.body.style.overflow = ''; });
  document.addEventListener('keydown', function(e) { if (e.key === 'Escape') { _lbOv.style.display = 'none'; document.body.style.overflow = ''; } });
  document.body.appendChild(_lbOv);
  window.__scLb = function(src) { _lbImg.src = src; _lbOv.style.display = 'flex'; document.body.style.overflow = 'hidden'; };
}
</script>
<h2 id="thoughts">Thoughts?</h2>
<p>I think they look great. And what&rsquo;s cool is that, if you hit that theme toggle at the top of the page, you&rsquo;ll see how they can be completely re-themed with just plain old CSS. That means you can make them look right at home wherever you use them.</p>
<p>Speaking of which, you can check out the code for these custom cards, review, clone, fork, etc at <a href="https://github.com/thumbsupdotme/social-cards" target="_blank" rel="noopener noreferrer">this GitHub repo</a>. This is my first time using GitHub or any of these platforms, so be kind if I&rsquo;ve made any newbie mistakes. And again, as indicated on the repo itself, this code is &ldquo;co-authored by Claude.&rdquo;</p>
<p>These cards are a perfect example what I want to do with this new website: make my own custom, privacy-preserving, modular components and then give them, and my writing, away for free to whoever wants it.</p>
<p>If that sounds like your kind of thing, subscribe to the RSS feed, follow me on socials, and come back every once in a while for a visit. And if you want to help beta-test another of my custom components, you could try out the tip buttons at the bottom of this post 💚</p>
]]></content:encoded></item><item><title>Hello (Again) World</title><link>https://thumbsup.me/posts/hello-world/</link><pubDate>Sat, 28 Feb 2026 12:00:00 +0000</pubDate><guid>https://thumbsup.me/posts/hello-world/</guid><description>&lt;hr&gt;
&lt;p&gt;Hey friends 👋&lt;/p&gt;
&lt;p&gt;Welcome to The Thumbs Up Blog. This is a new project I&amp;rsquo;m working on built from the ashes of my previous endeavours. After years of writing about cryptocurrency and other technologies that enable decentralization, as part of my newsletter Thumbs&amp;rsquo; Update, I&amp;rsquo;ve decided to branch out to new subjects, a new format, and a new home.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a big believer in ephemerality and in revising ideas over time, so I&amp;rsquo;ve archived a lot of my older posts already—and will probably archive even more over time—but if you do find yourself interested in checking out my older writing, you can find those posts over on my Paragraph.&lt;/p&gt;</description><content:encoded>
<![CDATA[<hr>
<p>Hey friends 👋</p>
<p>Welcome to The Thumbs Up Blog. This is a new project I&rsquo;m working on built from the ashes of my previous endeavours. After years of writing about cryptocurrency and other technologies that enable decentralization, as part of my newsletter Thumbs&rsquo; Update, I&rsquo;ve decided to branch out to new subjects, a new format, and a new home.</p>
<p>I&rsquo;m a big believer in ephemerality and in revising ideas over time, so I&rsquo;ve archived a lot of my older posts already—and will probably archive even more over time—but if you do find yourself interested in checking out my older writing, you can find those posts over on my Paragraph.</p>
<p><table width="100%" cellpadding="0" cellspacing="0" border="0" style="margin:1.25rem 0;border-collapse:collapse;"><tr><td style="display:block;border:1px solid #363a4f;border-radius:10px;padding:0.75rem 1rem;background:#24273a;font-family:sans-serif;text-decoration:none;"><a href="https://blog.thumbsup.me" target="_blank" rel="noopener noreferrer" style="text-decoration:none;color:inherit;display:block;"><strong style="display:block;font-size:1rem;font-weight:700;color:#cad3f5;margin-bottom:0.2rem;">blog.thumbsup.me</strong><span style="display:block;font-size:0.75rem;color:#939ab7;font-style:italic;">https://blog.thumbsup.me</span></a></td></tr></table></p>
<h2 id="whats-new">What&rsquo;s new?</h2>
<p>For years, I&rsquo;ve just redirected from my domain to other services. First to a Substack then my Mirror blog, and finally to my Paragraph newsletter. This will be my first time that I&rsquo;ve built a proper site; a place to call my own.</p>
<p>As a result of this being <em>my own thing</em>, it is very much a work in progress. So, especially if you&rsquo;re visiting this site in the <em>beta testing phase</em> (February-March of 2026), you may notice elements moving around, appearing, and disappearing, and the occasional bug. Whole posts may even come and go.</p>


    <blockquote style="margin:1.25rem 0;padding:0.85rem 1.1rem;border-left:4px solid #8aadf4;border-radius:0 8px 8px 0;background:#1e2a3a;font-family:sans-serif;">
        <p style="margin:0 0 0.4rem 0;font-weight:700;font-size:0.85rem;text-transform:uppercase;letter-spacing:0.06em;opacity:0.8;">Note</p>
        <p>Please don&rsquo;t let this impression define your opinion of the blog as a whole. Once I get it how I like it, I don&rsquo;t intend to make many more changes.</p>
    </blockquote><h2 id="some-cool-tech-behind-the-scenes">Some cool tech behind the scenes</h2>
<p>This blog post is written in my beloved <a href="https://en.wikipedia.org/wiki/Markdown" target="_blank" rel="noopener noreferrer">Markdown</a>. It never gets transferred to any blogging software&rsquo;s what-you-see-is-what-you-get (WYSIWYG) editor or laid out in a design software. Instead, I push new or updated posts to a private git repository, and they get automagically built in HTML and CSS (and a very very small amount of Javascript) into what you see before you.</p>
<p>This is handled by a piece of open-source software called <a href="https://gohugo.io/" target="_blank" rel="noopener noreferrer">Hugo</a> which is part of a category of tools known as <em>static site generators</em>. When I push my posts to git, an <em>action</em> is triggered which spins up a temporary Linux virtual machine, runs Hugo, and a few other tools I&rsquo;ve configured, to produce a fully realized post with styling, custom buttons, and more.</p>
<p>But that&rsquo;s not all. When I&rsquo;m confident that the blog is ready to be seen, I plan to toggle on <a href="https://standard.site/" target="_blank" rel="noopener noreferrer">standard.site</a> support, so that my posts synchronize to AT Protocol blog readers like <a href="leaflet.pub">leaflet</a> and <a href="https://pckt.blog" target="_blank" rel="noopener noreferrer">pckt</a>. I&rsquo;ve already configured the underlying pieces of this schema (hopefully correctly), but I&rsquo;ve had it disabled while I check for breaking errors.</p>
<p>If you&rsquo;re seeing this on leaflet&rsquo;s <a href="https://leaflet.pub/reader/new" target="_blank" rel="noopener noreferrer">reader mode</a> or <a href="https://pckt.blog/read" target="_blank" rel="noopener noreferrer">read.pckt.blog</a> then you&rsquo;ll know I&rsquo;ve succeeded. Speaking of which&hellip;</p>
<h2 id="lets-talk-about-distribution">Let&rsquo;s Talk About Distribution</h2>


    <blockquote>
        <p><em>If a tree falls in the forest and no one is around to hear it, how can they like and subscribe?</em></p></blockquote><p>When it comes to sharing blog posts with new readers and existing fans alike, I&rsquo;ve always relied on a two-pronged strategy:</p>
<ol>
<li>Sharing the link on microblogging sites (Twitter, Bluesky, Farcaster, etc); and</li>
<li>Sending out an email newsletter to active subscribers.</li>
</ol>
<p>At the height of my old blog on Mirror, which included email post announcements but stopped short of the true read-it-in-your-email-client approach to which I&rsquo;d apply the moniker <em>newsletter</em>, I had several thousand subscribers. When Paragraph bought Mirror, and it became clear they were going to kill it, I ported my mailing list to that new platform. This is the oft-touted point of using email for distributing your writing, instead of say X&rsquo;s long posts.</p>
<p>I won&rsquo;t go too deep in this post about why I&rsquo;ve decided to leave Paragraph (believe me, that post will come), but I will say that in moving to my own custom built solution, I had to make some decisions, including whether I was willing to build on top of an elaborate content management system (CMS) like Wordpress or Ghost, which easily could handle email newsletters, but at the expense of lightness, cost, and complexity.</p>
<p>I made the decision that, as much as I love being able to bring my audience with me, I&rsquo;m ready to make this our last move. So I will be sending them one final Paragraph email to inform them of my new, and hopefully permanent, home.</p>
<p>Though I&rsquo;m foregoing email handling, I will be dipping my toes in the burgeoning world of AT Protocol synchronization, and potentially ActivityPub bridging as well in the future. As always, word of mouth and social media posts will be core to my distribution and I&rsquo;d love for you to share these posts with folks you think might enjoy them. And, finally, an <a href="https://thumbsup.me/index.xml" target="_blank" rel="noopener noreferrer">RSS</a> feed is available, and I encourage you to experiment with RSS Readers as a way to step away from chaotic social media feeds once in a while.</p>
<p>Maybe I&rsquo;ll even do a post about some of my favourite feed readers. With that, you may ask&hellip;</p>
<h2 id="what-will-i-be-writing-about">What will I be writing about?</h2>
<p>The short answer is that this blog will be about whatever I want it to be about. It will combine my trademark long-form, first-person writing style with uncharacteristically shorter pieces. It will be, first and foremost, another left-politics-tinged, technology blog. That&rsquo;s what interests me and that&rsquo;s what I&rsquo;m known for.</p>
<p>What&rsquo;s different is that, where Thumbs&rsquo; Update tried to create long-form contextualized pieces about why oft-derided technology like cryptocurrency, AI, and Bittorrent matter to the left, this blog will explore more technology in a more granular way. Which specific programs are interesting to me and how do I use them?</p>
<p>At the core, will always be the underlying ideology that subverting corporate and government power is crucial to a well functioning society. I will nod toward socialist, anarchist, and broadly anti-authority use cases for many of these technologies, which you can take or leave. Everyone has a bias. This is mine.</p>
<p>I do really want this new blog to feel welcoming to both my long time readers and folks who are just discovering what I do. I think it will appeal most to eclectic, nerdy, lefty folks, but I hope to cover enough topics that there will be people with whom I disagree on many things, who find themselves nodding along, entertained at the very least.</p>
<p>Most importantly I want this blog to be fun for me. I&rsquo;m very proud of the writing I&rsquo;ve done over the years and all of the people to whom the written word has helped me connect. But I&rsquo;ve been losing steam this past year and so more than anything, creating this new blog is about the need for a change.</p>
<p>tl;dr I&rsquo;m embarking on a new adventure and I hope you&rsquo;ll come along for the ride.</p>
]]></content:encoded></item></channel></rss>