<?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/"
xmlns:media="http://search.yahoo.com/mrss/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
>
  <channel>
    <title>@home on @jelloeater👾</title>
    <link>https://jelloeater.me/</link>
    <description>Recent content in @home on @jelloeater👾</description>
    <generator>Hugo</generator>
    <language>en</language>
    
    <copyright>Jelloeater 2024</copyright>
    <image>
      <title>@home on @jelloeater👾</title>
      <url>https://jelloeater.me/favicon-32x32.png</url>
      <link>https://jelloeater.me/</link>
      <description>Recent content in @home on @jelloeater👾</description>
    </image>
    <lastBuildDate>Sat, 19 Sep 2026 20:45:10 +0000</lastBuildDate>
    
    <atom:link href="https://jelloeater.me/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>🦊&#43;⚡=🦸 Firefox Extensions to Make Browsing Smooooth</title>
      <link>
      https://jelloeater.me/blog/firefox-plugins/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/firefox-plugins/#comments
      </comments>
      <pubDate>Sat, 19 Sep 2026 20:45:10 +0000</pubDate>
      <category>extension</category>
      
      <category>firefox</category>
      
      <category>plugin</category>
      <guid>https://jelloeater.me/blog/firefox-plugins/</guid>
      
      <media:content url="https://addons.mozilla.org/user-media/previews/full/265/265554.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://addons.mozilla.org/user-media/previews/full/265/265554.png"/>
      


    
    



      
      
      <description><![CDATA[11 Firefox Extensions to Make Your Browsing Smarter, Faster, and Easier]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://addons.mozilla.org/user-media/previews/full/265/265554.png" alt="Featured Image"/></p>
        
        

  
    <blockquote>
      <p>Work it, make it, Harder, Better, Faster, Stronger</p>
    </blockquote>
  
<p>Firefox is already one of the most privacy-respecting and customizable browsers out there &hellip; sort of&hellip; another post for another day&hellip;</p>
<p>I tried throwing a bunch of neat links I found at Gemini to see what it would shit out, and it wrote some slop, so I&rsquo;m gonna go back and do this like a human because fuck yea?</p>
<p>So yeaa&hellip;. honestly this is just a link dump post with stuff that I really hope will help other people. YMMV?</p>
<h2 id="-smarter-ai-powered-superpowers">🤖 Smarter: AI-Powered Superpowers</h2>
<ul>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/open-browser-control/">Open Browser Control</a>:</strong> MCP that works w/ Firefox</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/vault-lens/">Vault Lens</a>:</strong> Obsidian in your searches!</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/summarize-translate-gemini/">Summarize &amp; Translate with Gemini</a>:</strong> Powered by Google&rsquo;s Gemini models, this extension generates quick summaries of long-form articles and translates foreign text on the fly without breaking your concentration. Also you can feed it any OpenAI endpoint FTW.</li>
</ul>
<h2 id="-faster-muscle-memory-navigation--efficiency">⚡ Faster: Muscle-Memory Navigation &amp; Efficiency</h2>
<p>Save seconds on every page until it adds up to hours saved each week.</p>
<ul>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/linkover/">LinkOver</a>:</strong> Stop opening ten background tabs just to see if a link is relevant. LinkOver gives you an instant preview overlay just by hovering over links. NEAT</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/gesturefy/">Gesturefy</a>:</strong> The gold standard of mouse gesture add-ons. Close tabs, go back, duplicate, or reload with simple, fluid mouse movements. Once you build the muscle memory, you can never go back.</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/omnisearch/">OmniSearch</a>:</strong> A launcher-style search bar that lets you jump between search engines, sites, and documentation in a couple of keystrokes.</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/reading-time/">Reading Time</a>:</strong> Displays an estimated read time for any article directly in your toolbar, so you know immediately whether to read it now or save it for later. ADHD Friendly.</li>
</ul>
<hr>
<h2 id="-easier-declutter-and-simplify">🧘 Easier: Declutter and Simplify</h2>
<p>Make your browser look cleaner, work smoother, and stay organized.</p>
<ul>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/switch-container/">Switch Container</a>:</strong> Firefox&rsquo;s Multi-Account Containers feature is its best-kept secret. This extension makes moving your active tab between personal, work, and banking containers easy.</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/bonjourr-startpage/">Bonjourr</a>:</strong> Replace the standard, ad-heavy new tab with a clean, distraction-free, Apple-inspired dashboard featuring customizable wallpapers and minimalist widgets. Link to bookmark folder FTW</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/violentmonkey/">Violentmonkey</a>:</strong> A lightweight, open-source userscript manager. Use it to block annoying web elements, bypass popups, or restyle your favorite websites to your liking. AMAZING!</li>
<li><strong><a href="https://addons.mozilla.org/en-US/firefox/addon/tab-stash/">Tab Stash</a>:</strong> Tab hoarder? Tab Stash lets you clear 50 open tabs into a clean bookmark list with a single click, freeing up both browser RAM and mental bandwidth.</li>
</ul>
<hr>
<h3 id="final-thoughts">Final Thoughts</h3>
<p>You don&rsquo;t need to install all 11 at once. Pick one from each category&hellip; <strong>Summarize with Gemini</strong> for research, <strong>Gesturefy</strong> for speed, and <strong>Tab Stash</strong> to clear the chaos and watch your daily workflow improve instantly.</p>
<p><strong>BOOM -&gt; DONEZO</strong></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/firefox-plugins/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/extension/">#extension</a>

<a href="https://jelloeater.me/tags/firefox/">#firefox</a>

<a href="https://jelloeater.me/tags/plugin/">#plugin</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Alternatives to KanDev</title>
      <link>
      https://jelloeater.me/blog/ai-kanban/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/ai-kanban/#comments
      </comments>
      <pubDate>Sun, 13 Sep 2026 18:37:14 +0000</pubDate>
      <category>ai</category>
      
      <category>kanban</category>
      <guid>https://jelloeater.me/blog/ai-kanban/</guid>
      
      <media:content url="https://raw.githubusercontent.com/NeuralNomadsAI/CodeNomad/refs/heads/dev/docs/screenshots/newSession.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://raw.githubusercontent.com/NeuralNomadsAI/CodeNomad/refs/heads/dev/docs/screenshots/newSession.png"/>
      


    
    



      
      
      <description><![CDATA[Testing Kanban alternatives]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://raw.githubusercontent.com/NeuralNomadsAI/CodeNomad/refs/heads/dev/docs/screenshots/newSession.png" alt="Featured Image"/></p>
        
        <h1 id="intro">Intro</h1>
<p>So I&rsquo;ve been lookin around for somthing to potentially replace KanDev and / or CodeNomad.</p>
<p>For OpenCode, CodeNomad has been pretty damn amazing. It&rsquo;s really hard to find anything that really quite compares to it in terms of native integration.And to be honest, the way it handles plans and everything all inside the gooey and even on mobile is absolutely sublime.</p>
<p>For KanDev, I really do love the way it integrates so well with GitHub.And also the fact that it has multi agent support and does everything in chat works great, even if the mobile experience is not quite as nice as CodeNomad.</p>
<h2 id="kandev">Kandev</h2>
<p><a href="https://github.com/kdlbs/kandev">https://github.com/kdlbs/kandev</a></p>
<p><img src="https://img.shields.io/github/stars/kdlbs/kandev?style=for-the-badge&amp;logo=github" alt=""></p>
<p><img src="https://github.com/kdlbs/kandev/blob/main/docs/screenshots/readme-intro.gif?raw=true" alt=""></p>
<h2 id="codenomad">CodeNomad</h2>
<p><a href="https://github.com/NeuralNomadsAI/CodeNomad">https://github.com/NeuralNomadsAI/CodeNomad</a></p>
<p><img src="https://img.shields.io/github/stars/chaitanyagiri/munder-difflin?style=flat&amp;logo=github" alt=""></p>
<p><img src="https://raw.githubusercontent.com/NeuralNomadsAI/CodeNomad/refs/heads/dev/docs/screenshots/newSession.png" alt=""></p>
<hr>
<h1 id="munder-difflin">munder-difflin</h1>
<p><a href="https://github.com/chaitanyagiri/munder-difflin">https://github.com/chaitanyagiri/munder-difflin</a> | <img src="https://img.shields.io/github/stars/chaitanyagiri/munder-difflin?style=flat&amp;logo=github" alt=""></p>
<ul>
<li>Need a account, gross &hellip; GUI seems cute tho, but not realistic</li>
</ul>
<h1 id="agor">agor</h1>
<p><a href="https://github.com/preset-io/agor">https://github.com/preset-io/agor</a> | <img src="https://img.shields.io/github/stars/preset-io/agor?style=flat&amp;logo=github" alt=""></p>
<ul>
<li>It works in theory, but the GUI is pretty hard to use compared to others</li>
</ul>
<h1 id="nodeterm">nodeterm</h1>
<p><a href="https://github.com/eneskirca/nodeterm">https://github.com/eneskirca/nodeterm</a> | <img src="https://img.shields.io/github/stars/eneskirca/nodeterm?style=flat&amp;logo=github" alt=""></p>
<ul>
<li>Dev is looking for $10 subs for pro&hellip; I mean, there are other way nicer options out there</li>
</ul>
<p><a href="https://star-history.dera.page/NeuralNomadsAI/CodeNomad?compare=kdlbs/kandev&amp;compare=chaitanyagiri/munder-difflin&amp;compare=preset-io/agor&amp;compare=eneskirca/nodeterm&amp;style=github"><img src="https://star-history.dera.page/svg?repos=NeuralNomadsAI/CodeNomad,kdlbs/kandev,chaitanyagiri/munder-difflin,preset-io/agor,eneskirca/nodeterm&amp;style=github" alt="Star History Chart"></a></p>
<p><img src="/blog/ai-kanban.webp" alt=""></p>
<hr>
<h1 id="outro">Outro</h1>
<p>Maybe I should have given Each of these more of a fair shot.But to be honest, if I can&rsquo;t get something like this working in five, ten minutes, it&rsquo;s not worth my time.</p>
<p>I&rsquo;ve been spoiled by things like single binariesm node Packages, docker compose files. Keep it simple, stupid.</p>
<p>TL;DR
You should really check out KanDev for their automated PR stuffs, it&rsquo;s sublime. 🙏 Pairs well with Goose 🪿 🪿 🪿.</p>
<p>If you just want pure OpenCode, CodeNomad is better, but way simpler, in a good way.</p>
<div style="text-align: center; font-size: 600%; line-height: 100%;">🤷 🧠 🫠</div>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/ai-kanban/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/kanban/">#kanban</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Tool Fatigue</title>
      <link>
      https://jelloeater.me/blog/tool-fatigue/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/tool-fatigue/#comments
      </comments>
      <pubDate>Fri, 14 Aug 2026 23:00:00 +0000</pubDate>
      <category>ai</category>
      
      <category>linux</category>
      
      <category>mental-health</category>
      
      <category>tools</category>
      <guid>https://jelloeater.me/blog/tool-fatigue/</guid>
      
      <media:content url="https://jelloeater.me/blog/tool-fatigue/garbage_banner.webp" medium="image" type="image/webp"/>
      <media:thumbnail url="https://jelloeater.me/blog/tool-fatigue/garbage_banner.webp"/>
      


    
    



      
      
      <description><![CDATA[Dont touch my garbage]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/tool-fatigue/garbage_banner.webp" alt="Featured Image"/></p>
        
        <h1 id="intro">Intro</h1>


  
    <blockquote>
      <p>A picture is worth a thousand words.</p>
    </blockquote>
  
<p><strong>Then this is complete crap.</strong></p>
<h2 id="tools">Tools</h2>
<pre class="mermaid">flowchart LR

subgraph access
Chat
Jetbrains
Local
Remote_Server
Phone
VSCode
Cherry_Studio
end

Agent_Mgmt_AgentDeck --> Opencode & Crush & Goose
Jetbrains --> AgentBridge_ACP --> Opencode
Chat --> Telegram_Gateway --> Hermes
Local --> Agent_Mgmt_AgentDeck
Local -->  Obsidian_AgentConsole_ACP  ---> Hermes
VSCode --> ACP_Client --> Opencode & Goose
Phone --> Termux --> Crush

Remote_Server --> Agent_Mgmt_AgentDeck
Remote_Server --> KanDev --> OpenCode
Remote_Server --> CodeNomad --> OpenCode
Remote_Server --> Minions --> Hermes

subgraph agent
Goose
Opencode
Crush
Hermes
end
  </pre>
  
<h2 id="providers">Providers</h2>
<pre class="mermaid">flowchart LR
Github_Copilot --> work
OpenRouter --> home

subgraph work
github-copilot/gpt-5.6-luna
github-copilot/claude-haiku-4.5
end
subgraph home
openrouter/deepseek/deepseek-v4-flash-0731
opencode/big-pickle
end
  </pre>
  
<table>
  <thead>
      <tr>
          <th style="text-align: left">Repository</th>
          <th style="text-align: center">Stars</th>
          <th style="text-align: center">License</th>
          <th style="text-align: center">Activity</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: left"><a href="https://github.com/kdlbs/kandev">kandev</a></td>
          <td style="text-align: center"><a href="https://github.com/kdlbs/kandev"><img src="https://img.shields.io/github/stars/kdlbs/kandev?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/kdlbs/kandev"><img src="https://img.shields.io/github/license/kdlbs/kandev?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/kdlbs/kandev"><img src="https://img.shields.io/github/last-commit/kdlbs/kandev?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/catatafishen/agentbridge">agentbridge</a></td>
          <td style="text-align: center"><a href="https://github.com/catatafishen/agentbridge"><img src="https://img.shields.io/github/stars/catatafishen/agentbridge?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/catatafishen/agentbridge"><img src="https://img.shields.io/github/license/catatafishen/agentbridge?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/catatafishen/agentbridge"><img src="https://img.shields.io/github/last-commit/catatafishen/agentbridge?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/asheshgoplani/agent-deck">agent-deck</a></td>
          <td style="text-align: center"><a href="https://github.com/asheshgoplani/agent-deck"><img src="https://img.shields.io/github/stars/asheshgoplani/agent-deck?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/asheshgoplani/agent-deck"><img src="https://img.shields.io/github/license/asheshgoplani/agent-deck?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/asheshgoplani/agent-deck"><img src="https://img.shields.io/github/last-commit/asheshgoplani/agent-deck?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/donivatamazondotcom/obsidian-agent-console">obsidian-agent-console</a></td>
          <td style="text-align: center"><a href="https://github.com/donivatamazondotcom/obsidian-agent-console"><img src="https://img.shields.io/github/stars/donivatamazondotcom/obsidian-agent-console?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/donivatamazondotcom/obsidian-agent-console"><img src="https://img.shields.io/github/license/donivatamazondotcom/obsidian-agent-console?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/donivatamazondotcom/obsidian-agent-console"><img src="https://img.shields.io/github/last-commit/donivatamazondotcom/obsidian-agent-console?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/agent37-platform/minions">minions</a></td>
          <td style="text-align: center"><a href="https://github.com/agent37-platform/minions"><img src="https://img.shields.io/github/stars/agent37-platform/minions?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/agent37-platform/minions"><img src="https://img.shields.io/github/license/agent37-platform/minions?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/agent37-platform/minions"><img src="https://img.shields.io/github/last-commit/agent37-platform/minions?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/aaif-goose/goose">goose</a></td>
          <td style="text-align: center"><a href="https://github.com/aaif-goose/goose"><img src="https://img.shields.io/github/stars/aaif-goose/goose?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/aaif-goose/goose"><img src="https://img.shields.io/github/license/aaif-goose/goose?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/aaif-goose/goose"><img src="https://img.shields.io/github/last-commit/aaif-goose/goose?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/charmbracelet/crush">crush</a></td>
          <td style="text-align: center"><a href="https://github.com/charmbracelet/crush"><img src="https://img.shields.io/github/stars/charmbracelet/crush?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/charmbracelet/crush"><img src="https://img.shields.io/github/license/charmbracelet/crush?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/charmbracelet/crush"><img src="https://img.shields.io/github/last-commit/charmbracelet/crush?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/anomalyco/opencode">opencode</a></td>
          <td style="text-align: center"><a href="https://github.com/anomalyco/opencode"><img src="https://img.shields.io/github/stars/anomalyco/opencode?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/anomalyco/opencode"><img src="https://img.shields.io/github/license/anomalyco/opencode?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/anomalyco/opencode"><img src="https://img.shields.io/github/last-commit/anomalyco/opencode?style=flat-square" alt="Last Commit"></a></td>
      </tr>
      <tr>
          <td style="text-align: left"><a href="https://github.com/nousresearch/hermes-agent">hermes-agent</a></td>
          <td style="text-align: center"><a href="https://github.com/nousresearch/hermes-agent"><img src="https://img.shields.io/github/stars/nousresearch/hermes-agent?style=flat-square" alt="Stars"></a></td>
          <td style="text-align: center"><a href="https://github.com/nousresearch/hermes-agent"><img src="https://img.shields.io/github/license/nousresearch/hermes-agent?style=flat-square" alt="License"></a></td>
          <td style="text-align: center"><a href="https://github.com/nousresearch/hermes-agent"><img src="https://img.shields.io/github/last-commit/nousresearch/hermes-agent?style=flat-square" alt="Last Commit"></a></td>
      </tr>
  </tbody>
</table>
<h1 id="overthinking">Overthinking</h1>
<p><img src="overthinking.webp" alt="overthinking"></p>


  
    <blockquote>
      <p><a href="https://www.instagram.com/thecrazyopossumlady/">https://www.instagram.com/thecrazyopossumlady/</a></p>
    </blockquote>
  
<p>So I&rsquo;ve been dealing with a bit of a problem lately: AI tool bloat. I have so many different solutions and so many different ways of interacting with the same software, and it&rsquo;s starting to become a real drag. At least for me specifically, I have a really nasty case of autism and ADHD, and I just struggle to focus sometimes. But also sometimes I get stuck, go down a rabbit hole with a billion things. It tends to be a bit of a hole. I just need something to be simple, and my tools to just work.</p>
<hr>


  
    <blockquote>
      <p>Clearly, all you have to do is look at <a href="https://jelloeater.me/apps">https://jelloeater.me/apps</a> <br> or <a href="https://jelloeater.me/ai">https://jelloeater.me/ai</a> to see I have a problem &hellip;</p>
    </blockquote>
  
<h1 id="day_job">$DAY_JOB</h1>
<p>For example, for work, I use a combination of tools. I use JetBrains IDE, I use VS Code, but I also have Codium - the second alternative, to have it feel a bit snappier, which is kind of silly, that I would have to have a second text editor because my first text editor is so bloated that I can&rsquo;t even use it&hellip; because it doesn&rsquo;t start fast enough for my taste.</p>
<p>And that&rsquo;s what a lot of this boils down to: friction. In terms of software, friction is how much work does it take just to do the thing you want to do to begin with. That&rsquo;s the problem, I guess, is all this friction.</p>
<p>With all the addition of LLMs and AI, nerds now just got the biggest new chew toy to play with&hellip; but here&rsquo;s the rub, you just added WHOLE nothing headache to the daily mix.</p>


  
    <blockquote>
      <p>Forget the whole AI is a help to productivity, get back to me when you lost 3 hours on a Saturday, cause you didn&rsquo;t know how ACP worked. (Pro tip: one ACP session per harness, or ouch time)</p>
    </blockquote>
  
<p>&hellip;</p>
<p>Like we as humans, now have so many layers to go through to do work&hellip;</p>
<ul>
<li>(Not including shelter, power, internet) &hellip; sad to say, they ARE a privilage.</li>
<li>Computer turn on?</li>
<li>OS not busted</li>
<li>Slack busted?</li>
<li>Auth need to update?</li>
<li>Email full?</li>
<li>Ok&hellip; let&rsquo;s open up Jetbrains &hellip;</li>
<li>Plugin update&hellip; nope</li>
<li>Agent update&hellip;yes &hellip; reload</li>
<li>LSP server good?</li>
<li>Oh, wrong dir</li>
<li>Oh Git branch drifted</li>
<li>&hellip; and it&rsquo;s bad&hellip;</li>
</ul>
<p>&hellip; well fuck, there goes my day&hellip;</p>
<p>So I need to have all those things working just to be able to edit a text file. Kind of crazy. A simple harness like - I&rsquo;d say Crush or Goose - hooked into OpenRouter, but nothing else, and no multiplexer. Just Fresh and Crush, two windows, one if your fancy. That&rsquo;s easy, I guess?</p>
<h1 id="personal-tech">Personal tech</h1>
<p>Now for my personal stuff, yeah, that can work. But for work, when I&rsquo;m doing a giant codebase and Terraform and all the better things, I need something more robust. Something that uses plugins like GitNexus for git indexing, memory system, remember everything that I ever wrote, also an integration with Obsidian, which adds all my notes.</p>
<p>I have this gigantic system built up just to be able to do my job. Kind of crazy. But we all can&rsquo;t be relaxed Russian Blue cats.</p>
<p>And it gets to the point where you get so overloaded that you need to spend 15-20 minutes a day just sitting outside remembering how to breathe, because you&rsquo;re so overloaded by all these tools and all this complexity on any given day. That kind of makes me wonder, was life always this hard? I don&rsquo;t think so.</p>
<p>And that kind of makes me want to go back to simpler tools and things. But you can&rsquo;t go back, that&rsquo;s the problem. You can&rsquo;t get rid of all of this, but you can slim it down.</p>
<h1 id="tldr">TL;DR</h1>
<p>So I&rsquo;m going to be working on trying to standardize: one harness, one editor, one computer, one operating system. And I found decreasing friction that way tends to help. I had the same dotfiles-and-home-can-of-worms between my Linux boxes and my Windows, my Mac.</p>
<p>You don&rsquo;t differentiate anymore, for that reason. The editors work the same across both. They&rsquo;re all unified spaces, same environment, same shells, and everything. And that lack of differentiation, that sameness between platforms, makes my life a lot easier, so I don&rsquo;t have to think as much. And it&rsquo;s the same setups everywhere. Which is why on servers, for example, I use Fish as a shell, not Zsh. On desktops it just works. So I use Crush, and I use Micro. Very simple. Because the servers, we&rsquo;re working on day to day, I just need them to work, to be able to edit a few simple config files.</p>
<p>And that&rsquo;s the real goal: trying to keep it simple, trying as hard as you can to make it simple.</p>
<p>So I&rsquo;m going to work on standardizing even my agent. So one harness. You can also have multiple providers for routing, for saving money, because tokens cost money. So right now I&rsquo;m demoing 9Router, but I used to use Bifrost. But there&rsquo;s also Headroom. So now you see you have all these different options and all these different ways you can save money, and it adds complexity to save money.</p>
<p>&hellip;</p>
<p>If I didn&rsquo;t want to save money, I could just run straight into an LLM provider, no gateway, just pay. And sometimes it&rsquo;s worth it. You pay and run DeepSeek Flash, you know, still pretty cheap, pay the money, don&rsquo;t have to deal with anything. But tell that to me spending 15, 20, 30 days of my life managing it. You know?</p>
<p>So, we&rsquo;ll see. This is a rough draft; of life&hellip; next chapter please.</p>


  
    <blockquote>
      <p>TL;DR &hellip;
<img src="garbage.webp" alt="garbage"></p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/tool-fatigue/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/linux/">#linux</a>

<a href="https://jelloeater.me/tags/mental-health/">#mental-health</a>

<a href="https://jelloeater.me/tags/tools/">#tools</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Obsidian’s Agent Era</title>
      <link>
      https://jelloeater.me/blog/obsidian-acp/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/obsidian-acp/#comments
      </comments>
      <pubDate>Thu, 13 Aug 2026 23:00:00 +0000</pubDate>
      <category>agent</category>
      
      <category>ai</category>
      
      <category>obsidian</category>
      
      <category>tools</category>
      <guid>https://jelloeater.me/blog/obsidian-acp/</guid>
      
      <media:content url="https://raw.githubusercontent.com/donivatamazondotcom/obsidian-agent-console/HEAD/docs/public/images/multi-session.webp" medium="image" type="image/webp"/>
      <media:thumbnail url="https://raw.githubusercontent.com/donivatamazondotcom/obsidian-agent-console/HEAD/docs/public/images/multi-session.webp"/>
      


    
    



      
      
      <description><![CDATA[A quick breakdown of ACP plugins for Obsidian]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://raw.githubusercontent.com/donivatamazondotcom/obsidian-agent-console/HEAD/docs/public/images/multi-session.webp" alt="Featured Image"/></p>
        
        <p>So quick hot take on some Obsidian plugins relating to AI:</p>
<p>For the longest time, I leaned hard on the <a href="https://github.com/logancyang/obsidian-copilot">Copilot</a> extension for when I needed to do things like quick note summaries for time tracking and Slack, but as of late, I&rsquo;ve started using a few different agents inside my vault via ACP (Agent Control Protocol).</p>
<p>Also&hellip; it seems the new v4.0 release is pretty bugged&hellip; lame&hellip;</p>
<p>So y&rsquo;all might want to check these out:</p>
<p>Side note: I&rsquo;m working on a related blog post on tool fatigue / tech exhaustion. Stay tuned.</p>
<p><a href="https://github.com/whiskeyjack96/obsidian-acp">whiskeyjack96/obsidian-acp</a></p>
<ul>
<li>Old, minimal functionality.</li>
</ul>
<p><a href="https://github.com/luis85/specorator">luis85/specorator</a></p>
<ul>
<li>Feels like a meh version of KanDev.</li>
</ul>
<p><a href="https://github.com/yiiwang118/obsidian-glossa">yiiwang118/obsidian-glossa</a></p>
<ul>
<li>Half-baked setup, no ACP.</li>
</ul>
<p><a href="https://github.com/antigmalabs/ante-obsidian">antigmalabs/ante-obsidian</a></p>
<ul>
<li>Nice, but you need to commit to Ante&hellip; which I do love though as a side project.</li>
</ul>
<p><a href="https://github.com/donivatamazondotcom/obsidian-agent-console">donivatamazondotcom/obsidian-agent-console</a></p>
<ul>
<li>New kid in town, good ideas, running it for a while, multi-tab, better features.</li>
</ul>
<p><a href="https://github.com/rait-09/obsidian-agent-client">rait-09/obsidian-agent-client</a></p>
<ul>
<li>OG ACP with Obsidian, still great, has floating chat button.</li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/obsidian-acp/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/agent/">#agent</a>

<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/obsidian/">#obsidian</a>

<a href="https://jelloeater.me/tags/tools/">#tools</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>AI Agent Orchestration</title>
      <link>
      https://jelloeater.me/blog/ai-orch/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/ai-orch/#comments
      </comments>
      <pubDate>Sat, 25 Jul 2026 21:00:00 +0000</pubDate>
      <category>ai</category>
      
      <category>kanban</category>
      <guid>https://jelloeater.me/blog/ai-orch/</guid>
      
      <media:content url="https://jelloeater.me/blog/ai-orch.webp" medium="image" type="image/webp"/>
      <media:thumbnail url="https://jelloeater.me/blog/ai-orch.webp"/>
      


    
    



      
      
      <description><![CDATA[Kanban&#43;&#43;]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/ai-orch.webp" alt="Featured Image"/></p>
        
        <h1 id="intro">Intro</h1>
<p>Been comparing differnt agent Kanban solutions, some I dig into will do orchistration, others will just give you a board and a API.</p>
<p>After digging through Github for 2-3 hours late night, I found these, all at least seem worth taking a look at.</p>
<p>Had Gemini toss a breakdown and it tracks 👍</p>
<p>I&rsquo;ve tested Fusion so far, most of these are kinda overkill if your just looking to track a few open issues.</p>
<p>Hope this breakdown helps some folks out, the space is pretty noisy and hard to skim through TBH.</p>
<p>A big issue I&rsquo;ve been seeing is projects die after 3-6 months. All of these at least don&rsquo;t feel like vibe code slop at least.</p>
<p>&hellip; and MAN, is there ALOT of slop on Github!</p>
<h1 id="contenders">Contenders</h1>
<table>
  <thead>
      <tr>
          <th>Repo</th>
          <th>OpenCode</th>
          <th>Hermes</th>
          <th>Core Identity / Vibe</th>
          <th>GitHub Stats</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>DanWahlin/ai-agent-board</td>
          <td>✅</td>
          <td>✅</td>
          <td>A lightweight, pure drag-and-drop Kanban board with terminal streaming.</td>
          <td><img src="https://img.shields.io/github/stars/DanWahlin/ai-agent-board?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/DanWahlin/ai-agent-board?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>kdlbs/kandev</td>
          <td>✅</td>
          <td>❌</td>
          <td>A heavy, IDE-like integrated workspace (editor, terminal, git, kanban).</td>
          <td><img src="https://img.shields.io/github/stars/kdlbs/kandev?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/kdlbs/kandev?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>Kangentic</td>
          <td>✅</td>
          <td>❌</td>
          <td>A dedicated desktop command center focused on visual drag-to-spawn sessions.</td>
          <td><img src="https://img.shields.io/github/stars/Kangentic/kangentic?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/Kangentic/kangentic?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>777genius/agent-teams-ai</td>
          <td>✅</td>
          <td>❌</td>
          <td>Focuses heavily on multi-agent communication, peer reviews, and budgets.</td>
          <td><img src="https://img.shields.io/github/stars/777genius/agent-teams-ai?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/777genius/agent-teams-ai?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>the-open-engine/zeroshot</td>
          <td>✅</td>
          <td>❌</td>
          <td>An execution loop prioritizing independent AI verifiers (CLI/Headless, no TUI).</td>
          <td><img src="https://img.shields.io/github/stars/the-open-engine/zeroshot?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/the-open-engine/zeroshot?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>dagucloud/dagu</td>
          <td>✅</td>
          <td>❌</td>
          <td>A robust, local-first DAG workflow engine for broader ops automation.</td>
          <td><img src="https://img.shields.io/github/stars/dagucloud/dagu?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/dagucloud/dagu?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>BradGroux/veritas-kanban</td>
          <td>❌</td>
          <td>✅</td>
          <td>A git-native, highly governed Kanban board with deep audit trails.</td>
          <td><img src="https://img.shields.io/github/stars/BradGroux/veritas-kanban?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/BradGroux/veritas-kanban?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>Runfusion/Fusion</td>
          <td>❌</td>
          <td>✅</td>
          <td>A full &ldquo;software factory&rdquo; orchestrator with complex visual routing.</td>
          <td><img src="https://img.shields.io/github/stars/Runfusion/Fusion?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/Runfusion/Fusion?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
      <tr>
          <td>ruvnet/ruflo</td>
          <td>❌</td>
          <td>✅</td>
          <td>An agent meta-harness and swarm coordinator rather than a pure visual board.</td>
          <td><img src="https://img.shields.io/github/stars/ruvnet/ruflo?style=flat&amp;logo=github" alt="stars"> <img src="https://img.shields.io/github/commit-activity/m/ruvnet/ruflo?style=flat&amp;logo=github" alt="activity"></td>
      </tr>
  </tbody>
</table>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/ai-orch/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/kanban/">#kanban</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Launchers ... neat?</title>
      <link>
      https://jelloeater.me/blog/launchers/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/launchers/#comments
      </comments>
      <pubDate>Fri, 24 Jul 2026 23:40:28 +0000</pubDate>
      <category>linux</category>
      
      <category>productivity</category>
      <guid>https://jelloeater.me/blog/launchers/</guid>
      
      <media:content url="https://extensions.gnome.org/extension-data/screenshots/screenshot_8594_lf7HM8o.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://extensions.gnome.org/extension-data/screenshots/screenshot_8594_lf7HM8o.png"/>
      


    
    



      
      
      <description><![CDATA[Everyone knows Raycast ... but?]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://extensions.gnome.org/extension-data/screenshots/screenshot_8594_lf7HM8o.png" alt="Featured Image"/></p>
        
        <p>So I don&rsquo;t normally write blog posts, but this is a quick one.
I know a lot of people like to use Raycast and other launchers, and way back in the day I used to use ULauncher, which was a Python based one. it was kinda cool.
But I found a bunch of these and I think they might be worth checking out.
I know I tend to add a lot of stuff to my apps page, but you know what sometimes you just want to do a quick one off blog post.</p>
<p>&hellip;</p>
<p>Still rocking Raycast on mac, but Vicinae on Linux is Amazing!</p>
<h2 id="launchers">Launchers</h2>
<table>
  <thead>
      <tr>
          <th>Link</th>
          <th>Stats</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><a href="https://github.com/Xoshbin/asyar">https://github.com/Xoshbin/asyar</a></td>
          <td><a href="https://github.com/Xoshbin/asyar"><img src="https://img.shields.io/github/stars/Xoshbin/asyar?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/SuperCmdLabs/SuperCmd">https://github.com/SuperCmdLabs/SuperCmd</a></td>
          <td><a href="https://github.com/SuperCmdLabs/SuperCmd"><img src="https://img.shields.io/github/stars/SuperCmdLabs/SuperCmd?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/backslash-app/backslash">https://github.com/backslash-app/backslash</a></td>
          <td><a href="https://github.com/backslash-app/backslash"><img src="https://img.shields.io/github/stars/backslash-app/backslash?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/vicinaehq/vicinae">https://github.com/vicinaehq/vicinae</a></td>
          <td><a href="https://github.com/vicinaehq/vicinae"><img src="https://img.shields.io/github/stars/vicinaehq/vicinae?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/ospfranco/sol">https://github.com/ospfranco/sol</a></td>
          <td><a href="https://github.com/ospfranco/sol"><img src="https://img.shields.io/github/stars/ospfranco/sol?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/MystikoLab/rustcast">https://github.com/MystikoLab/rustcast</a></td>
          <td><a href="https://github.com/MystikoLab/rustcast"><img src="https://img.shields.io/github/stars/MystikoLab/rustcast?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/kunkka19xx/look">https://github.com/kunkka19xx/look</a></td>
          <td><a href="https://github.com/kunkka19xx/look"><img src="https://img.shields.io/github/stars/kunkka19xx/look?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/quicksilver/Quicksilver">https://github.com/quicksilver/Quicksilver</a></td>
          <td><a href="https://github.com/quicksilver/Quicksilver"><img src="https://img.shields.io/github/stars/quicksilver/Quicksilver?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
      <tr>
          <td><a href="https://github.com/cerebroapp/cerebro">https://github.com/cerebroapp/cerebro</a></td>
          <td><a href="https://github.com/cerebroapp/cerebro"><img src="https://img.shields.io/github/stars/cerebroapp/cerebro?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></td>
      </tr>
  </tbody>
</table>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/launchers/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/linux/">#linux</a>

<a href="https://jelloeater.me/tags/productivity/">#productivity</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Agent-Bridge &#43; OpenCode</title>
      <link>
      https://jelloeater.me/blog/opencode-agentbridge/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/opencode-agentbridge/#comments
      </comments>
      <pubDate>Sun, 12 Jul 2026 13:29:20 -0400</pubDate>
      <category>dev</category>
      
      <category>opencode</category>
      <guid>https://jelloeater.me/blog/opencode-agentbridge/</guid>
      
      <media:content url="https://jelloeater.me/blog/opencode-agentbridge.webp" medium="image" type="image/webp"/>
      <media:thumbnail url="https://jelloeater.me/blog/opencode-agentbridge.webp"/>
      


    
    



      
      
      <description><![CDATA[What&#39;s a job, but a pile of pay checks?]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/opencode-agentbridge.webp" alt="Featured Image"/></p>
        
        <h1 id="the-just-in-time-agent-integrating-opencode-with-agentbridge-via-zsh">The Just-in-Time Agent: Integrating OpenCode with AgentBridge via ZSH</h1>
<p>Some people manage their AI agent environments by maintaining multiple configuration files and manually switching between them&hellip; and some folks don&rsquo;t even bother at all&hellip; I think I fall somwhere in the middle lol&hellip; I wanted something eode.json`, I have the AgentBridge MCP server defined like this:</p>
<pre tabindex="0"><code class="language-jsonven" data-lang="jsonven">
## The Problem: The &#34;Missing Variable&#34; Trap

I use **OpenCode** as my primary agentic CLI, and **AgentBridge** to give it deep access to my JetBrains IDE. In my global `openc
&#34;AgentBridge&#34;: {
  &#34;type&#34;: &#34;remote&#34;,
  &#34;url&#34;: &#34;http://localhost:{env:AGENTBRIDGE_MCP_PORT}/api/mcp&#34;
}
</code></pre><p>Notice the <code>{env:AGENTBRIDGE_MCP_PORT}</code>. This is the key. This port is only known and active when the AgentBridge plugin is running inside a JetBrains IDE.
If I simply set <code>&quot;enabled&quot;: true</code> in my global config, every time I run an agent in a standard terminal, it tries to resolve that environment variable, fails, the agent tries to use IDE tools that aren&rsquo;t there, leading to errors and noise.
This is a compound problem, if I let the whole config load (with a static port) I&rsquo;ll end up with my CLI app trying to fill in everything. This is a quick way to make a hot mess of your config&hellip;</p>
<h2 id="the-solution-environment-variable-injection">The Solution: Environment Variable Injection</h2>
<p>OpenCode allows you to override its configuration via the <code>OPENCODE_CONFIG_CONTENT</code> environment variable. I use this to &ldquo;flip the switch&rdquo; only when I launch my IDE.</p>
<p>I keep AgentBridge disabled by default in my global environment. Then, I wrap my IDE launch commands in ZSH functions that inject the &ldquo;enabled&rdquo; state only for that specific process.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span><span style="color:#75715e"># 1. Disable AgentBridge by default in the global environment</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># This prevents crosstalk in the standard terminal</span>
</span></span><span style="display:flex;"><span>export OPENCODE_CONFIG_CONTENT<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;{&#34;mcp&#34;: {&#34;AgentBridge&#34;: {&#34;enabled&#34;: false}}}&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># 2. The &#34;Injection&#34; functions</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># When called, these functions export a NEW config content</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># that enables the bridge for the IDE process only.</span>
</span></span><span style="display:flex;"><span>idea<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    export OPENCODE_CONFIG_CONTENT<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;{&#34;mcp&#34;: {&#34;AgentBridge&#34;: {&#34;enabled&#34;: true}}}&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;</span>$HOME<span style="color:#e6db74">/.local/bin/idea&#34;</span> <span style="color:#e6db74">&#34;</span>$@<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>pycharm<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    export OPENCODE_CONFIG_CONTENT<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;{&#34;mcp&#34;: {&#34;AgentBridge&#34;: {&#34;enabled&#34;: true}}}&#39;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;</span>$HOME<span style="color:#e6db74">/.local/bin/pycharm&#34;</span> <span style="color:#e6db74">&#34;</span>$@<span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><h2 id="end-result">End result</h2>
<p>This guy cares&hellip;</p>
<p><a href="https://github.com/catatafishen/agentbridge/pull/1018">https://github.com/catatafishen/agentbridge/pull/1018</a></p>
<h1 id="links">Links</h1>
<ul>
<li><a href="https://github.com/catatafishen/agentbridge">AgentBridge</a></li>
<li><a href="https://github.com/opencode-ai/opencode">OpenCode</a></li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:opencode-agentbridge">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/opencode-agentbridge/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/dev/">#dev</a>

<a href="https://jelloeater.me/tags/opencode/">#opencode</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Less is More: How an AI Agent Taught Me to Write Better systemd Services</title>
      <link>
      https://jelloeater.me/blog/less-is-more-systemd/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/less-is-more-systemd/#comments
      </comments>
      <pubDate>Sat, 04 Jul 2026 00:00:00 +0000</pubDate>
      <category>ai</category>
      
      <category>devops</category>
      
      <category>linux</category>
      
      <category>systemd</category>
      <guid>https://jelloeater.me/blog/less-is-more-systemd/</guid>
      
      <media:content url="https://eod-image.s3.amazonaws.com/2022/02/Max_Pixels.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://eod-image.s3.amazonaws.com/2022/02/Max_Pixels.png"/>
      


    
    



      
      
      <description><![CDATA[A session of iteratively simplifying until it hurts]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://eod-image.s3.amazonaws.com/2022/02/Max_Pixels.png" alt="Featured Image"/></p>
        
        

  
    <blockquote>
      <p><strong><a href="https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it">YAGNI</a> — You Ain&rsquo;t Gonna Need It.</strong></p>
    </blockquote>
  
<h2 id="-rambling">💬 Rambling</h2>
<p>Welp, if you haven&rsquo;t been living under a rock, AI now cost money yo&hellip;
WTF is a token&hellip; well it&rsquo;s a magical thing that makes Sam Altman ALOT of money&hellip; in theory?</p>
<p>That being said&hellip; There are a lot of things I&rsquo;d rather do with my Saturday than sit and fuck around with Linux services.</p>
<p>I dunno, I think I have a pretty weird idea with what I consider fun.
I should probably be cleaning or doing some chores, but I digress&hellip;
AND&hellip; to be honest, I&rsquo;m pretty far behind with working on my German. I really need to catch up. Das ist nicht gut.</p>
<p>I also spent a good chunk of yesterday trying to fix my Hermes install. That poor thing really got messed up. I mean it doesn&rsquo;t know how to UN-fuck itself sometimes and you gotta go in and then use a different agent to go fix it, which is really annoying. Like literally I&rsquo;ve used Crush and Goose to fix OpenCode before&hellip; and half the time Crush won&rsquo;t make system level changes, becuase it&rsquo;s too careful&hellip; normally good. Then I just break out Goose, which is HONKING MAD&hellip; 🪿🔪💻 That &hellip; thing&hellip; will do whatever bat shit instructions you tell it, more or less. IIRC only Ante or Pi might be more pants on head&hellip;?</p>
<p>I&rsquo;m also using <a href="https://handy.computer/">handy</a> to write some of this because I think it&rsquo;s easier for me to try to say what I&rsquo;m thinking and ramble on versus trying to type it out.</p>
<p>&hellip; ANYWAY&hellip;</p>
<h2 id="-what-you-came-here-for">📏 What you came here for</h2>
<p>I needed to run an LLM proxy stack on my home server: <a href="https://www.getbifrost.ai">Bifrost</a> (AI gateway), <a href="https://headroom-ai.com">Headroom</a> (caching proxy), and optionally <a href="https://github.com/features/copilot">copilot-api</a>. I wanted proper systemd services — restart on failure, logging, the works.</p>
<p>So threw OpenCode at it. What followed was a masterclass in over-engineering, followed by a <a href="https://github.com/DietrichGebert/ponytail">Ponytail</a> beatdown.</p>
<h2 id="-round-1-the-enterprise-edition-545-lines">🏅 Round 1: The &ldquo;Enterprise&rdquo; Edition (545 lines)</h2>
<p>The AI&rsquo;s first pass was <em>impressive</em>. Three services, dependency chains, readiness checks with curl loops, PATH detection, wrapper scripts, environment file generation, pre-install dependency caching&hellip; it looked like something a cloud provider would ship.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># (545 lines of... this)</span>
</span></span><span style="display:flex;"><span>wait_for_port<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    local host<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span>$1<span style="color:#e6db74">&#34;</span> port<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span>$2<span style="color:#e6db74">&#34;</span> timeout<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>3<span style="color:#66d9ef">:-</span>30<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> i in <span style="color:#66d9ef">$(</span>seq <span style="color:#ae81ff">1</span> <span style="color:#e6db74">&#34;</span>$timeout<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span>; <span style="color:#66d9ef">do</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> curl -sf <span style="color:#e6db74">&#34;http://</span><span style="color:#e6db74">${</span>host<span style="color:#e6db74">}</span><span style="color:#e6db74">:</span><span style="color:#e6db74">${</span>port<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> &gt; /dev/null 2&gt;&amp;1; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span>        sleep <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">done</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> <span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span></code></pre></div><p>It was <em>correct</em>. It was <em>thorough</em>. It was also fucking overkill for three services on a laptop. Not even on my home server&hellip;</p>
<h2 id="-round-2-the-middle-ground">🫠 Round 2: The Middle Ground</h2>
<p>I pushed back. The AI collapsed it to a single service running <code>llm_proxy.sh</code> with <code>trap</code> + <code>wait</code> so bash stayed alive. Cleaner, but still had a wrapper script.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e">#!/bin/bash
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>trap <span style="color:#e6db74">&#39;exit 0&#39;</span> SIGINT SIGTERM
</span></span><span style="display:flex;"><span>...
</span></span><span style="display:flex;"><span>wait
</span></span></code></pre></div><p>Better, but I asked myself: wait, why do I need a wrapper at all?</p>
<h2 id="-round-3-three-lines-of-execstart">💯 Round 3: Three Lines of ExecStart</h2>
<p>The final version (189 lines for the <em>installer</em>, and the service definitions themselves are practically nothing):</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[Service]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Type</span><span style="color:#f92672">=</span><span style="color:#e6db74">simple</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ExecStart</span><span style="color:#f92672">=</span><span style="color:#e6db74">bunx @maximhq/bifrost -port 11434 -host 0.0.0.0</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Restart</span><span style="color:#f92672">=</span><span style="color:#e6db74">on-failure</span>
</span></span></code></pre></div><p>That&rsquo;s it. No wrapper. No PATH detection. No readiness checks. No env file for the first pass. Each service is just:</p>
<table>
  <thead>
      <tr>
          <th>Service</th>
          <th>Command</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>llm-proxy-bifrost</code></td>
          <td><code>bunx @maximhq/bifrost -port 11434 -host 0.0.0.0</code></td>
      </tr>
      <tr>
          <td><code>llm-proxy-headroom</code></td>
          <td><code>uvx --from &quot;headroom-ai[all]&quot; headroom proxy ...</code></td>
      </tr>
      <tr>
          <td><code>llm-proxy-copilot</code></td>
          <td><code>npx copilot-api@latest start</code> (disabled by default)</td>
      </tr>
  </tbody>
</table>
<p>Type=simple. Raw ExecStart. <code>Restart=on-failure</code>. DONE.</p>
<h2 id="-the-headroom-standalone-the-real-lesson">📖 The Headroom Standalone (the real lesson)</h2>
<p>After all that, I realized I wanted Headroom minus Bifrost. So we made a standalone Headroom service with a swappable upstream via <code>.env</code>:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[Service]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Environment</span><span style="color:#f92672">=</span><span style="color:#e6db74">HEADROOM_UPSTREAM_URL=http://127.0.0.1:11434</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">EnvironmentFile</span><span style="color:#f92672">=</span><span style="color:#e6db74">-/opt/llm-proxy/.env</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ExecStart</span><span style="color:#f92672">=</span><span style="color:#e6db74">/bin/sh -c &#39;exec uvx --from &#34;headroom-ai[all]&#34; headroom proxy --no-telemetry --code-aware --openai-api-url &#34;$HEADROOM_UPSTREAM_URL&#34;&#39;</span>
</span></span></code></pre></div><p>The <strong>one</strong> shell wrapper I have, and it&rsquo;s just to expand <code>$HEADROOM_UPSTREAM_URL</code> from the env file. Switching between local and OpenRouter:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>echo <span style="color:#e6db74">&#39;HEADROOM_UPSTREAM_URL=https://openrouter.ai/api/v1&#39;</span> | sudo tee /opt/llm-proxy/.env
</span></span><span style="display:flex;"><span>sudo systemctl restart llm-proxy-headroom
</span></span></code></pre></div><h2 id="-what-i-learned">🧠 What I learned</h2>
<p>Everything I cut had a reason:</p>
<ul>
<li><strong>Readiness checks?</strong> <code>Restart=on-failure</code> handles that. If the port isn&rsquo;t up, the service errors and retries. systemd already has a loop.</li>
<li><strong>Wrapper scripts?</strong> If your command fits in <code>ExecStart</code>, put it there. One fewer file to maintain.</li>
<li><strong>PATH detection?</strong> Systemd has <code>Environment=PATH=...</code>. Explicit beats magic.</li>
<li><strong>Hard dependencies?</strong> <code>Wants=</code> (soft) over <code>Requires=</code> (hard). If Headroom starts before Bifrost, it&rsquo;ll fail once and restart fine.</li>
<li><strong>Env file for the first version?</strong> Nope. Default baked into <code>Environment=</code>. Only add the file when you need to override.</li>
</ul>
<p>The AI kept adding things &ldquo;just in case.&rdquo; I kept deleting them. What remained was what I <em>actually</em> needed.</p>
<h2 id="-verdict">⚖️ Verdict</h2>
<p>Less code is better code. The best systemd service is the one you can read in one screen.</p>
<p><strong>4/5 deletions 🪓</strong></p>
<p>&hellip; 5/5 w/ rice 🥡</p>
<h2 id="-tldr">💾 TL;DR</h2>
<p><code>/etc/systemd/system/headroom.service</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#f92672">[</span>Unit<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Description<span style="color:#f92672">=</span>Headroom Caching Proxy
</span></span><span style="display:flex;"><span>After<span style="color:#f92672">=</span>network-online.target
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Service<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>Type<span style="color:#f92672">=</span>simple
</span></span><span style="display:flex;"><span>User<span style="color:#f92672">=</span>USENAME_HERE
</span></span><span style="display:flex;"><span>Environment<span style="color:#f92672">=</span>PATH<span style="color:#f92672">=</span>/home/USENAME_HERE/.bun/bin:/home/USENAME_HERE/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
</span></span><span style="display:flex;"><span>Environment<span style="color:#f92672">=</span>HOME<span style="color:#f92672">=</span>/home/USENAME_HERE
</span></span><span style="display:flex;"><span>Environment<span style="color:#f92672">=</span>HEADROOM_OUTPUT_SHAPER<span style="color:#f92672">=</span><span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>Environment<span style="color:#f92672">=</span>HEADROOM_UPSTREAM_URL<span style="color:#f92672">=</span>https://openrouter.ai/api/v1
</span></span><span style="display:flex;"><span>EnvironmentFile<span style="color:#f92672">=</span>-/etc/headroom.env
</span></span><span style="display:flex;"><span>ExecStart<span style="color:#f92672">=</span>/bin/sh -c <span style="color:#e6db74">&#39;exec uvx --from &#34;headroom-ai[all]&#34; headroom proxy --no-telemetry --no-code-aware --openai-api-url &#34;$HEADROOM_UPSTREAM_URL&#34;&#39;</span>
</span></span><span style="display:flex;"><span>Restart<span style="color:#f92672">=</span>on-failure
</span></span><span style="display:flex;"><span>RestartSec<span style="color:#f92672">=</span><span style="color:#ae81ff">5</span>
</span></span><span style="display:flex;"><span>StandardOutput<span style="color:#f92672">=</span>append:/var/log/headroom/headroom.log
</span></span><span style="display:flex;"><span>StandardError<span style="color:#f92672">=</span>append:/var/log/headroom/headroom.log
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">[</span>Install<span style="color:#f92672">]</span>
</span></span><span style="display:flex;"><span>WantedBy<span style="color:#f92672">=</span>multi-user.target
</span></span></code></pre></div><h2 id="other-posts-like-this">Other posts like this</h2>
<ul>
<li><a href="/review/zmx">Review - ZMX</a></li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/less-is-more-systemd/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/devops/">#devops</a>

<a href="https://jelloeater.me/tags/linux/">#linux</a>

<a href="https://jelloeater.me/tags/systemd/">#systemd</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>How to setup ZSH LLM Autocomplete</title>
      <link>
      https://jelloeater.me/blog/ai-shell/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/ai-shell/#comments
      </comments>
      <pubDate>Sat, 09 May 2026 22:58:12 +0000</pubDate>
      <category>ai</category>
      
      <category>cli</category>
      
      <category>utils</category>
      <guid>https://jelloeater.me/blog/ai-shell/</guid>
      
      <media:content url="https://jelloeater.me/blog/ai-shell/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/ai-shell/cover.png"/>
      


    
    



      
      
      <description><![CDATA[Term-LLM vs AiChat vs Forge ... Oh MY!]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/ai-shell/cover.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>So I&rsquo;ve been using AI Chat for a VERY long time for autocomplete, but I&rsquo;ve taken a real liking to 💻 <strong><code>term-llm</code></strong> as of late, due to the amount of terminal-specific options, vs 🤖 <strong><code>aichat</code></strong> which always had felt like a &ldquo;do anything, and do it, okay&rdquo; tool (I started with <em>aichat</em> for reference).</p>
<p>The biggest issue is that I&rsquo;ve always wanted just a little more flexibility and options out of it. So over the last week or two, I&rsquo;ve started comparing them, along with 🛠️ <strong><code>forge</code></strong> (at the recommendation of a friend). I&rsquo;m including it (forge) here as well, even though it ALSO functions as a full-on ZSH-homed AI agent. Really, you should check it out, outside of the need for terminal autocomplete.</p>
<p>The big driving force behind this post and related research is that I have a strong distaste for closed-source options and baked-in shell AI&hellip; I&rsquo;m looking at you, <strong>Warp</strong>.</p>


  
    <blockquote>
      <p><strong>HA!</strong> &hellip; I stand corrected. &hellip; <a href="https://www.warp.dev/blog/warp-is-now-open-source">https://www.warp.dev/blog/warp-is-now-open-source</a></p>
    </blockquote>
  
<h3 id="edit">Edit</h3>
<p>&hellip; Oh wow, I forgot about Fabric&hellip; that thing is REAL MVP G.L.U.E. 🖌️</p>
<h2 id="smaller-agents">Smaller agents?</h2>
<p>Yes, I know you can also use agents like OpenCode and Crush, but both tend to load way too much overhead to be usable in this context. Maybe something like 🐦‍⬛ <strong><code>crow-cli</code></strong> or 🥧 <strong><code>pi</code></strong> might fit better, but I&rsquo;ve relegated those two to just toying around with on my phone (still very neato tho!). You could also override OpenCode and Crush with minimal configs, but with minimal agents like <strong>Pi</strong> and <strong>Crow</strong>, why bother? Just keep separate tools for separate jobs. And don&rsquo;t get me started where 🪿 <strong><code>goose</code></strong> would even fit in&hellip; that <em>thing</em> is so strange&hellip; it HONKS for Christ&rsquo;s sake, and its TUI reads like a SimCity 2000 loading screen 🤣. TBH the whole &ldquo;batteries included&rdquo; approach it has is refreshing, in stark contrast to Pi&rsquo;s absolute minimalism.</p>


  
    <blockquote>
      <p><strong>Caveat</strong>
<em>While I know the provider you pick will have one of the biggest influences on the results you get out, if you do have decent system prompts, you should get the results you would expect.</em></p>
    </blockquote>
  
<h2 id="links">Links</h2>
<p><strong>CLI Native</strong></p>
<ul>
<li><a href="https://github.com/samsaffron/term-llm"><img src="https://img.shields.io/github/stars/samsaffron/term-llm?style=flat-square&amp;logo=github&amp;label=samsaffron/term-llm" alt=""></a></li>
<li><a href="https://github.com/danielmiessler/Fabric"><img src="https://img.shields.io/github/stars/danielmiessler/Fabric?style=flat-square&amp;logo=github&amp;label=danielmiessler/Fabric" alt=""></a></li>
<li><a href="https://github.com/sigoden/aichat"><img src="https://img.shields.io/github/stars/sigoden/aichat?style=flat-square&amp;logo=github&amp;label=sigoden/aichat" alt=""></a></li>
<li><a href="https://forgecode.dev/">https://forgecode.dev/</a></li>
</ul>
<p><strong>Smaller agents</strong></p>
<ul>
<li><a href="https://github.com/earendil-works/pi"><img src="https://img.shields.io/github/stars/earendil-works/pi?style=flat-square&amp;logo=github&amp;label=earendil-works/pi" alt=""></a></li>
<li><a href="https://github.com/block/goose"><img src="https://img.shields.io/github/stars/block/goose?style=flat-square&amp;logo=github&amp;label=block/goose" alt=""></a></li>
<li><a href="https://github.com/crow-cli/crow-cli"><img src="https://img.shields.io/github/stars/crow-cli/crow-cli?style=flat-square&amp;logo=github&amp;label=crow-cli/crow-cli" alt=""></a></li>
</ul>
<h2 id="config-examples">Config Examples</h2>
<p>Anyway 🙄, I still prefer to be able to use whatever app I like when it comes to something like shell autocomplete.</p>
<p>Without further ado, here are some working snippets you should feel free to test out; YMMV. Check what it spits out before you hit <strong>ENTER</strong> a second time 🫠.</p>
<h3 id="termllm">TermLLM</h3>
<p><strong>New hotness, testing going well!</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>_term_llm_zsh<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[[</span> -n <span style="color:#e6db74">&#34;</span>$BUFFER<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        local msg<span style="color:#f92672">=</span>$BUFFER
</span></span><span style="display:flex;"><span>        zle -I <span style="color:#f92672">&amp;&amp;</span> zle redisplay
</span></span><span style="display:flex;"><span>        PROMPT<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Be concise. Output only the text needed for a POSIX compatible shell, must work with Bash / ZSH. Only output the command, PLAIN TEXT ONLY.&#34;</span>
</span></span><span style="display:flex;"><span>        BUFFER<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>term-llm ask <span style="color:#e6db74">&#34;</span>$msg<span style="color:#e6db74">&#34;</span> --fast --porcelain --native-search --system-message <span style="color:#e6db74">&#34;</span>$PROMPT<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>        zle end-of-line
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>zle -N _term_llm_zsh
</span></span><span style="display:flex;"><span>bindkey <span style="color:#e6db74">&#34;^ &#34;</span> _term_llm_zsh <span style="color:#75715e"># Ctrl+SPACE</span>
</span></span></code></pre></div><h3 id="ai-chat">AI Chat</h3>
<p><strong>Just works&hellip;</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>_aichat_zsh<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[[</span> -n <span style="color:#e6db74">&#34;</span>$BUFFER<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        local _old<span style="color:#f92672">=</span>$BUFFER
</span></span><span style="display:flex;"><span>        BUFFER<span style="color:#f92672">+=</span><span style="color:#e6db74">&#34;⌛&#34;</span>
</span></span><span style="display:flex;"><span>        zle -I <span style="color:#f92672">&amp;&amp;</span> zle redisplay
</span></span><span style="display:flex;"><span>        BUFFER<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>aichat -e <span style="color:#e6db74">&#34;</span>$_old<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>        zle end-of-line
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>zle -N _aichat_zsh
</span></span><span style="display:flex;"><span>bindkey <span style="color:#e6db74">&#34;^x&#34;</span> _aichat_zsh <span style="color:#75715e"># Ctrl+x</span>
</span></span></code></pre></div><h3 id="forgecode">ForgeCode</h3>
<p><strong>You may want to just use their native <code>: QUERY_HERE</code>, based shell injection?</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>_forge_zsh<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[[</span> -n <span style="color:#e6db74">&#34;</span>$BUFFER<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        local _old<span style="color:#f92672">=</span>$BUFFER
</span></span><span style="display:flex;"><span>        zle -I <span style="color:#f92672">&amp;&amp;</span> zle redisplay
</span></span><span style="display:flex;"><span>        local result<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>forge suggest <span style="color:#e6db74">&#34;</span>$_old<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>        BUFFER<span style="color:#f92672">=</span>$result
</span></span><span style="display:flex;"><span>        zle reset-prompt
</span></span><span style="display:flex;"><span>        zle end-of-line
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>zle -N _forge_zsh
</span></span><span style="display:flex;"><span>bindkey <span style="color:#e6db74">&#34;^f&#34;</span> _forge_zsh <span style="color:#75715e"># Ctrl+f</span>
</span></span></code></pre></div><h3 id="crush">Crush</h3>
<p><em>Kinda working?</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>_crush_zsh<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[[</span> -n <span style="color:#e6db74">&#34;</span>$BUFFER<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        local msg<span style="color:#f92672">=</span>$BUFFER
</span></span><span style="display:flex;"><span>        zle -I <span style="color:#f92672">&amp;&amp;</span> zle redisplay
</span></span><span style="display:flex;"><span>        PROMPT<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Be concise. Output only the text needed for a POSIX compatible shell, must work with Bash / ZSH. Only output the command, PLAIN TEXT ONLY.&#34;</span>
</span></span><span style="display:flex;"><span>        BUFFER<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>crush run --quiet <span style="color:#e6db74">&#34;</span>$PROMPT<span style="color:#e6db74"> </span>$msg<span style="color:#e6db74">&#34;</span> --small-model <span style="color:#e6db74">&#39;copilot-proxy/gpt-4o&#39;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>        zle end-of-line
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>zle -N _crush_zsh
</span></span><span style="display:flex;"><span>bindkey <span style="color:#e6db74">&#34;^q&#34;</span> _crush_zsh
</span></span></code></pre></div><h3 id="bonus-fabric">BONUS: Fabric</h3>
<p><a href="https://github.com/danielmiessler/Fabric">https://github.com/danielmiessler/Fabric</a></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>_fabric_zsh<span style="color:#f92672">()</span> <span style="color:#f92672">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">[[</span> -n <span style="color:#e6db74">&#34;</span>$BUFFER<span style="color:#e6db74">&#34;</span> <span style="color:#f92672">]]</span>; <span style="color:#66d9ef">then</span>
</span></span><span style="display:flex;"><span>        local msg<span style="color:#f92672">=</span>$BUFFER
</span></span><span style="display:flex;"><span>        zle -I <span style="color:#f92672">&amp;&amp;</span> zle redisplay
</span></span><span style="display:flex;"><span>        PROMPT<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;Be concise. Output ONLY the PLAIN TEXT command needed for a ZSH shell.&#34;</span>
</span></span><span style="display:flex;"><span>        BUFFER<span style="color:#f92672">=</span><span style="color:#66d9ef">$(</span>fabric --pattern create_command <span style="color:#e6db74">&#34;</span>$PROMPT<span style="color:#e6db74"> - </span>$msg<span style="color:#e6db74">&#34;</span><span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>        zle end-of-line
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">fi</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">}</span>
</span></span><span style="display:flex;"><span>zle -N _fabric_zsh
</span></span><span style="display:flex;"><span>bindkey <span style="color:#e6db74">&#34;^ &#34;</span> _fabric_zsh
</span></span></code></pre></div><h2 id="tool-breakdown-thanks-gemini">Tool breakdown (thanks Gemini&hellip;?)</h2>
<p>These three tools are all terminal-based AI interfaces, but they target different workflows: ForgeCode is an <strong>autonomous coding agent</strong>, AIChat is a <strong>multi-model shell utility</strong>, and term-llm is a <strong>terminal-first runtime</strong> for agents and tools.</p>
<h3 id="high-level-comparison">High-Level Comparison</h3>
<table>
  <thead>
      <tr>
          <th>Feature</th>
          <th>ForgeCode</th>
          <th>AIChat</th>
          <th>term-llm</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>Primary Focus</strong></td>
          <td>Autonomous coding / RAG</td>
          <td>General chat / Shell assistant</td>
          <td>Tool-centric runtime / MCP</td>
      </tr>
      <tr>
          <td><strong>Language</strong></td>
          <td>Rust</td>
          <td>Rust</td>
          <td>Go</td>
      </tr>
      <tr>
          <td><strong>Agentic Power</strong></td>
          <td>High (Multi-agent roles)</td>
          <td>Moderate (Roles/Tools)</td>
          <td>High (MCP/Skills/Jobs)</td>
      </tr>
      <tr>
          <td><strong>Model Support</strong></td>
          <td>Hosted (Claude/GPT/Gemini)</td>
          <td>Hosted + Local (Ollama/Groq)</td>
          <td>Hosted + Local (Zen/MCP)</td>
      </tr>
      <tr>
          <td><strong>Best For</strong></td>
          <td>Large codebase refactoring</td>
          <td>Daily shell tasks &amp; quick chat</td>
          <td>Building custom AI workflows</td>
      </tr>
  </tbody>
</table>
<hr>
<h3 id="forgecode-forgecodedev">ForgeCode (<code>forgecode.dev</code>)</h3>
<p>ForgeCode is designed as a high-performance alternative to tools like Aider or Claude Code. It focuses on deep codebase integration and autonomous execution.</p>
<ul>
<li>
<p><strong>Workflow:</strong> Uses specialized agents:</p>
</li>
<li>
<p><code>muse</code>: Planning and impact analysis.</p>
</li>
<li>
<p><code>forge</code>: Implementation (modifies files, runs tests).</p>
</li>
<li>
<p><code>sage</code>: Internal research agent for codebase navigation.</p>
</li>
<li>
<p><strong>Strengths:</strong></p>
</li>
<li>
<p>Native Zsh plugin for seamless shell integration.</p>
</li>
<li>
<p>High accuracy on terminal-based benchmarks.</p>
</li>
<li>
<p>Maintains conversation context when switching between LLMs (e.g., GPT-4 to Claude).</p>
</li>
<li>
<p><strong>Infrastructure:</strong> Distributed as a Rust binary; very low latency in terminal interactions.</p>
</li>
</ul>
<h3 id="aichat-sigodenaichat">AIChat (<code>sigoden/aichat</code>)</h3>
<p>AIChat is an all-in-one utility meant to be the &ldquo;Swiss Army knife&rdquo; for LLM interactions in the terminal. It is less about &ldquo;agents&rdquo; and more about &ldquo;versatility.&rdquo;</p>
<ul>
<li>
<p><strong>Workflow:</strong> Centered around a robust Chat-REPL and shell expansion (<code>-e</code> to explain/run commands).</p>
</li>
<li>
<p><strong>Strengths:</strong></p>
</li>
<li>
<p>Extensive provider support (OpenAI, Claude, Gemini, Ollama, Groq, Mistral, etc.).</p>
</li>
<li>
<p>Role-based prompting: Define custom system prompts for specific tasks (e.g., code reviewer, translator).</p>
</li>
<li>
<p>Lightweight RAG: Can index local documents for context-aware chatting.</p>
</li>
<li>
<p><strong>Infrastructure:</strong> Single Rust binary; highly portable with a simple <code>config.yaml</code>.</p>
</li>
</ul>
<h3 id="term-llm-samsaffronterm-llm">term-llm (<code>samSaffron/term-llm</code>)</h3>
<p><code>term-llm</code> functions as a runtime for AI workflows rather than just a chat interface. It emphasizes the Model Context Protocol (MCP) and persistent sessions.</p>
<ul>
<li>
<p><strong>Workflow:</strong> Executing &ldquo;Jobs&rdquo; and &ldquo;Skills&rdquo; via natural language. It can manage background tasks and complex tool-use sequences.</p>
</li>
<li>
<p><strong>Strengths:</strong></p>
</li>
<li>
<p><strong>MCP First:</strong> Deep integration with MCP servers to fetch data or control local systems.</p>
</li>
<li>
<p><strong>Widgets:</strong> Support for local web-based widgets that can be served directly from the terminal UI.</p>
</li>
<li>
<p><strong>Zen Provider:</strong> Offers a &ldquo;no-key&rdquo; quickstart option for immediate use.</p>
</li>
<li>
<p><strong>Infrastructure:</strong> Built in Go; supports Unix domain sockets for widget communication and local automation.</p>
</li>
</ul>
<hr>
<h3 id="key-differentiators">Key Differentiators</h3>
<ul>
<li><strong>Codebase Management:</strong> Use <strong>ForgeCode</strong> if the goal is to have an agent read a thousand files and implement a complex feature across multiple directories.</li>
<li><strong>Shell Integration:</strong> Use <strong>AIChat</strong> for day-to-day command-line assistance, such as &ldquo;How do I grep for this pattern?&rdquo; or &ldquo;Summarize this log file.&rdquo;</li>
<li><strong>Extensibility &amp; MCP:</strong> Use <strong>term-llm</strong> if you want to build a customized environment where the AI can interact with your local databases, APIs, or custom MCP servers.</li>
</ul>
<p>All three tools are compatible with Linux environments (Ubuntu/Debian) and work well within multiplexers like Zellij or screen/tmux sessions due to their CLI-first architectures.</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/ai-shell/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/cli/">#cli</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>MCP Tool Bloat, Permission Purgatory, and the $400 Loop</title>
      <link>
      https://jelloeater.me/blog/mcp-fun/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/mcp-fun/#comments
      </comments>
      <pubDate>Sat, 21 Mar 2026 19:55:48 +0000</pubDate>
      <category>ai</category>
      
      <category>mcp</category>
      
      <category>opencode</category>
      <guid>https://jelloeater.me/blog/mcp-fun/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/blog/mcp-fun/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/blog/mcp-fun/gen-cover.png"/>
    



      
      
      <description><![CDATA[How I learned words matter... ALOT]]></description>
      
      <content:encoded>
        <![CDATA[
        
        <p>I’ve spent most of the last week living inside <strong>OpenCode</strong>, and if there’s one thing I’ve learned, it’s that the &ldquo;Model Context Protocol&rdquo; (MCP) is both a godsend and a token-eating monster. We&rsquo;re moving fast into agentic workflows, but we’re hitting a wall: <strong>Tool Bloat</strong>.</p>
<h3 id="the-mcp-handshake-tax"><strong>The MCP Handshake Tax</strong></h3>
<p>When you connect an MCP server, it doesn&rsquo;t just &ldquo;exist.&rdquo; The host app has to inject the entire JSON-RPC schema into the model&rsquo;s context. I’ve seen handshakes for complex database tools eat 50k tokens before I even finish my first prompt. This &ldquo;token tax&rdquo; is real—it kills reasoning depth and makes models prone to &ldquo;choice paralysis.&rdquo;</p>
<h3 id="skills-vs-tools"><strong>Skills vs. Tools</strong></h3>
<p>In OpenCode, I’ve been leaning harder on <strong>Skills</strong> (those .md guidance layers) rather than raw execution tools.</p>
<ul>
<li><strong>Tools:</strong> Preloaded, verbose, and static.</li>
<li><strong>Skills:</strong> Lazy-loaded. The agent only pulls the procedural recipe when it actually needs it.<br>
If you&rsquo;re seeing your context window evaporate, move your logic to SKILL.md files.</li>
</ul>
<h3 id="the-permission-surface-area"><strong>The Permission Surface Area</strong></h3>
<p>The permissions you set (allow, ask, deny) do more than just gatekeep—they prune the context.</p>
<ul>
<li><strong>Allow:</strong> The model sees the tool and plans around it.</li>
<li><strong>Ask:</strong> The model sees it but knows it needs a &ldquo;Mother May I&rdquo; step.</li>
<li><strong>Deny:</strong> The tool is surgically removed from the context.<br>
<strong>Pro-tip:</strong> If a tool is marked deny, the agent stops trying to use it in its planning phase, saving you from &ldquo;I can&rsquo;t do that&rdquo; loops.</li>
</ul>
<h3 id="model-limits-gpt-5-mini-is-not-a-power-user"><strong>Model Limits: GPT-5-mini is Not a Power User</strong></h3>
<p>I&rsquo;ve been testing <strong>GPT-5-mini</strong>, and you have to be careful. While the flagship models can juggle hundreds of tools, the &ldquo;mini&rdquo; variants often hit a hard limit (around 128 tools) and just crash with a Tool limit exceeded error. If you’re using mini models, you <em>must</em> prune your MCP servers or it simply won&rsquo;t load.</p>
<h3 id="crush-vs-opencode"><strong>Crush vs. OpenCode</strong></h3>
<p>Apps like <strong>Crush</strong> handle this differently. While OpenCode is a collaborative powerhouse with its subagent system (Oracle, Sage, etc.), Crush is built in Go and uses LSP (Language Server Protocol) for structural awareness. It feels faster and more stable for single-threaded precision, whereas OpenCode is where I go when I need a whole team of agents to refactor a codebase.</p>
<h3 id="the-400-doom-loop"><strong>The $400 Doom Loop</strong></h3>
<p>Learn from my mistakes: I accidentally triggered a &ldquo;doom loop&rdquo; with <strong>Claude Opus 4.5</strong>. A misunderstood error message caused the agent to recursively query its own history and re-run bash commands. With a 200k+ context being re-injected every turn, I managed to run up a <strong>$400 bill</strong> before I caught it. <strong>Always use &ldquo;ask&rdquo; permissions for bash and edit.</strong></p>
<h3 id="mobile-autonomy-pi-in-termux"><strong>Mobile Autonomy: Pi in Termux</strong></h3>
<p>The craziest thing I got working this week? The <strong>Pi agent</strong> (shittycodingagent) running on my phone via <strong>Termux</strong>.</p>
<ul>
<li>pkg install nodejs</li>
<li>npm install -g @mariozechner/pi-coding-agent<br>
It’s insane to have a full coding agent with clipboard access and filesystem control running in a mobile terminal. I can literally refactor code while I&rsquo;m out and about.</li>
</ul>
<h3 id="updates-to-the-site"><strong>Updates to the Site</strong></h3>
<p>I’ve updated a few things on the main site:</p>
<ul>
<li><strong>AI Hot Picks:</strong> Check out <a href="https://jelloeater.me/apps/#-ai-hot-picks">jelloeater.me/apps/#-ai-hot-picks</a> for tools like Cherry Studio and OpenWork.</li>
<li><strong>Automation Scripts:</strong> I’ve added new install scripts at <a href="https://jelloeater.me/scripts/">jelloeater.me/scripts/</a> to help you set up the Pi agent and other CLI tools quickly using stew or eget.</li>
</ul>
<p>Stay agentic, but watch your tokens.<br>
— jelloeater</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:mcp-fun">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/mcp-fun/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/mcp/">#mcp</a>

<a href="https://jelloeater.me/tags/opencode/">#opencode</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Yazi CLI Rant</title>
      <link>
      https://jelloeater.me/blog/2026-02-08-yazi/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/2026-02-08-yazi/#comments
      </comments>
      <pubDate>Sun, 08 Feb 2026 15:34:48 +0000</pubDate>
      <category>cli</category>
      
      <category>linux</category>
      
      <category>yazi</category>
      <guid>https://jelloeater.me/blog/2026-02-08-yazi/</guid>
      
      <media:content url="https://jelloeater.me/blog/2026-02-08_yazi_rant.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/2026-02-08_yazi_rant.png"/>
      


    
    



      
      
      <description><![CDATA[Issues with Yazi and Keybindings]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/2026-02-08_yazi_rant.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>Hey all,
Well I spent way too much of my Sunday trying to figure out why Yazi wouldn&rsquo;t display the editor menu properly&hellip; turns out it&rsquo;s due to how my terminal relays key combinations.</p>
<p><strong>READ THIS FIRST 👍 <a href="https://sw.kovidgoyal.net/kitty/keyboard-protocol">https://sw.kovidgoyal.net/kitty/keyboard-protocol</a></strong></p>
<h2 id="orig-yazi-keymap">Orig Yazi Keymap</h2>
<p>So this config was NOT working  for my keymap, BUT it does work!
The interesting issue is that on my work Mac, I didn&rsquo;t need to add any tweaks to get the <code>shfit + enter</code> editor option.</p>
<p>For reference <code>shift+o</code> does work regardless of the terminal emulator used.</p>
<p><img src="2026-02-08_yazi_editor.png" alt="editor menu"></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-toml" data-lang="toml"><span style="display:flex;"><span>[<span style="color:#a6e22e">mgr</span>]
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">prepend_keymap</span> = [
</span></span><span style="display:flex;"><span>  { <span style="color:#a6e22e">on</span> = <span style="color:#e6db74">&#34;&lt;enter&gt;&#34;</span>, <span style="color:#a6e22e">run</span>  = <span style="color:#e6db74">&#34;plugin fast-enter&#34;</span>, <span style="color:#a6e22e">desc</span> = <span style="color:#e6db74">&#34;Enter the subfolder faster, or open the file directly&#34;</span>},
</span></span><span style="display:flex;"><span>  { <span style="color:#a6e22e">on</span> = <span style="color:#e6db74">&#34;&lt;S&gt;&lt;enter&gt;&#34;</span>, <span style="color:#a6e22e">run</span> = <span style="color:#e6db74">&#34;open --interactive&#34;</span>, <span style="color:#a6e22e">desc</span> = <span style="color:#e6db74">&#34;Interactive open&#34;</span> },
</span></span><span style="display:flex;"><span>]
</span></span></code></pre></div><p>Docs -&gt; <a href="https://yazi-rs.github.io/docs/configuration/keymap">https://yazi-rs.github.io/docs/configuration/keymap</a></p>


  
    <blockquote>
      <p>The legacy terminal keyboard protocol treats <code>&lt;Tab&gt;</code> and <code>&lt;C-i&gt;</code>, <code>&lt;Enter&gt;</code> and <code>&lt;C-m&gt;</code>, etc. as the same key. If you want to distinguish between them, make sure your terminal supports and has CSI u enabled.</p>
    </blockquote>
  
<p><strong><code>CSI u</code></strong> -&gt; <a href="https://sw.kovidgoyal.net/kitty/keyboard-protocol/">https://sw.kovidgoyal.net/kitty/keyboard-protocol/</a></p>
<h2 id="to-fix-wezterm">To fix Wezterm</h2>
<p>The fix for Wezterm was easy enough, I just had it respect the settings for CSI_u and Kitty and everything was working again.</p>
<p><a href="https://wezterm.org/config/lua/config/enable_csi_u_key_encoding.html">https://wezterm.org/config/lua/config/enable_csi_u_key_encoding.html</a></p>
<p><strong><code>.config/wezterm/wezterm.lua</code></strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-lua" data-lang="lua"><span style="display:flex;"><span>config.enable_kitty_keyboard <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>config.enable_csi_u_key_encoding <span style="color:#f92672">=</span> <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><h2 id="to-fix-guake">To fix Guake?</h2>
<p>I also REALLY love <a href="https://guake.github.io/">Guake</a> but I was not able to figure out a simple fix for it</p>
<p>On my Mac I just use iTerm2 for my dropdown term, so I never noticed the issue&hellip; go figure? 🤷</p>
<p>Seems to be a limitation of VTE?</p>


  
    <blockquote class="alert alert-important">
      <p class="alert-heading">
        ℹ️
        
          Also works fine with <a href="https://ghostty.org/">Ghostty</a> out of the box 👻
        
      </p>
      
    </blockquote>
  
<p>If anyone can give me any pointers with this, feel free to drop me a email or a DM. Thanks!</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:2026-02-08-yazi">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/2026-02-08-yazi/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/cli/">#cli</a>

<a href="https://jelloeater.me/tags/linux/">#linux</a>

<a href="https://jelloeater.me/tags/yazi/">#yazi</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Review - Heynote (Created by Jonatan Heyman)</title>
      <link>
      https://jelloeater.me/review/heynote/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/review/heynote/#comments
      </comments>
      <pubDate>Sat, 27 Dec 2025 18:50:11 +0000</pubDate>
      <category>gui</category>
      
      <category>javascript</category>
      
      <category>utils</category>
      
      <category>vue</category>
      <guid>https://jelloeater.me/review/heynote/</guid>
      
      <media:content url="https://heynote.com/img/dark/screenshot2.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://heynote.com/img/dark/screenshot2.png"/>
      


    
    



      
      
      <description><![CDATA[Desktop Scratchpad]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://heynote.com/img/dark/screenshot2.png" alt="Featured Image"/></p>
        
        <h2 id="stats">Stats</h2>
<p><img src="https://img.shields.io/github/stars/heyman/heynote?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars">
<img src="https://img.shields.io/github/downloads/heyman/heynote/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/heyman/heynote?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/heyman/heynote?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
<h2 id="review">Review</h2>
<p>So my desktop is usually a mess of terminal windows, IDEs, and random snippets of JSON. I’ve tried everything from sticking things in a temporary <code>scratch.txt</code> to using heavy-duty note apps. While I am a huge fan of both Obsidian and Google Keep, I wanted something similar to Boop.</p>
<p>Enter <strong>Heynote</strong>.</p>
<p>The core concept is solid: it’s one giant, persistent text buffer, but it’s divided into <strong>blocks</strong>. You hit <code>Ctrl+Enter</code>, and you have a new block. You can set each block to a different language (Python, JSON, Markdown, etc.), and you get full syntax highlighting and auto-formatting. No more pasting JSON into a random browser &ldquo;formatter&rdquo; tool. It stays local, stays fast, and stays organized without me having to manage fifty different files.</p>
<p>One of the killer features for me is the <strong>Math blocks</strong>. They use Math.js, so I can do quick &ldquo;napkin math&rdquo; for resource allocations or budget estimates right inside my notes. It even handles currency conversions.</p>
<p>Yeah, it&rsquo;s an Electron app. I know, I know—some people get twitchy about the memory footprint. But honestly? It’s snappy, the UI is minimalist and clean, and it supports a global hotkey to show/hide the app, which fits perfectly into my workflow. Plus, it stores everything in a local directory, so I can sync them via SyncThing, which is dope.</p>
<h3 id="ℹ-important">ℹ️ Important</h3>
<p>If you&rsquo;re on Linux (like me), the <strong>AppImage</strong> and <strong>Snap</strong> are the primary ways to grab this. If you use the AppImage, make sure you use an app image launcher to integrate it properly with your desktop menu so the global hotkey works reliably.</p>
<h2 id="pros--cons">Pros / Cons</h2>
<table>
  <thead>
      <tr>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>👍</td>
          <td>Block-based - keeps snippets separate without creating new files</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Integrated calculator mode for quick execution</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Syntax Highlighting including Terraform, Python, and Shell</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Local-first; ensures privacy and data ownership</td>
      </tr>
      <tr>
          <td>🤷</td>
          <td>Electron-based, but well-optimized</td>
      </tr>
      <tr>
          <td>👎</td>
          <td>No mobile app strictly for desktop</td>
      </tr>
  </tbody>
</table>
<h2 id="verdict">Verdict</h2>
<p><strong>4/5</strong></p>
<h2 id="download">Download</h2>
<p><strong>💾 <a href="https://github.com/heyman/heynote/releases">https://github.com/heyman/heynote/releases</a> 💾</strong></p>
<h2 id="interface">Interface</h2>
<p><img src="https://heynote.com/img/dark/blocks.png" alt="Interface"></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/review/heynote/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/gui/">#gui</a>

<a href="https://jelloeater.me/tags/javascript/">#javascript</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

<a href="https://jelloeater.me/tags/vue/">#vue</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Review - ZMX (Created by Jonatan Heyman)</title>
      <link>
      https://jelloeater.me/review/zmx/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/review/zmx/#comments
      </comments>
      <pubDate>Sat, 27 Dec 2025 18:50:11 +0000</pubDate>
      <category>ai</category>
      
      <category>golang</category>
      
      <category>tui</category>
      
      <category>utils</category>
      <guid>https://jelloeater.me/review/zmx/</guid>
      
      <media:content url="https://heynote.com/img/dark/screenshot2.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://heynote.com/img/dark/screenshot2.png"/>
      


    
    



      
      
      <description><![CDATA[Session persistence for terminal processes]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://heynote.com/img/dark/screenshot2.png" alt="Featured Image"/></p>
        
        

  
    <blockquote>
      <p><strong>&hellip; <a href="https://bower.sh/you-might-not-need-tmux">You might not need tmux</a>!</strong></p>
    </blockquote>
  
<h2 id="stats">Stats</h2>
<p><img src="https://img.shields.io/github/stars/neurosnap/zmx?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars">
<img src="https://img.shields.io/github/downloads/neurosnap/zmx/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/neurosnap/zmx?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/neurosnap/zmx?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
<h2 id="background">Background</h2>
<p>Well for a long time, I have been using tmux <a href="https://github.com/tmux/tmux">!</a> for session persistence and window management in the terminal. I a new terminal multiplexer that promises to be more user-friendly and feature-rich than tmux . I decided to give it a try and see how it compares to Byobu.</p>
<h2 id="byobu">Byobu</h2>
<p><a href="https://github.com/dustinkirkland/byobu">!</a>.</p>
<p>!</p>
<p>For those of you who haven&rsquo;t played with Byobu, it&rsquo;s based off of tmux and provides a more user-friendly interface with additional features. The keybindings make a lot more sense to me. Ctrl+A -&gt; D to detach, F2 for new Window. My fingers can actually hit the damn buttons</p>
<p>One of the big reasons for even going down this rabbit hole was needing to keep ssh sessions open in the background. Yeah I know Ctrl+Z and fg/bg DO work, but I wanted somthing BETTER&hellip;</p>
<h2 id="zellij">Zellij</h2>
<p>So I DID end up finding Zellij <a href="https://github.com/zellij-org/zellij">!</a> after asking a SlackWare work friend&hellip; OH MAN, I could write a whole review on this one as well&hellip; man, if TMUX was even EASIER, like Byobu, but even NICER!</p>
<p>!</p>
<h2 id="zmx">ZMX</h2>
<p>ZMX hits the sweet spot between the simplicity of <em>byobu</em> and the power of <em>tmux</em>.
If you&rsquo;re looking for a modern, privacy‐first way to keep terminal work alive across reboots, ZMX is the tool to try today.</p>
<p>I did find two nice options for just running commands in the background. Both are nice, but not quite robust enough for running apps in the background, interactivly.</p>
<ul>
<li>
<p><a href="https://github.com/dunstorm/pm2-go">https://github.com/dunstorm/pm2-go</a> !</p>
</li>
<li>
<p><a href="https://github.com/Nukesor/pueue">https://github.com/Nukesor/pueue</a> !</p>
<p>!</p>
</li>
</ul>
<p>The issue with these two is that I wanted to be able to pop back into the shell and see what was running, not quite systemD, but not the PITA of Docker Exec&hellip;</p>
<h2 id="verdict">Verdict</h2>
<p>TLDR, this app hits a great sweet spot between all the above for long running scripts / CLI apps.</p>
<p><strong>5/5</strong></p>
<h2 id="download">Download</h2>
<p><strong>💾 <a href="https://github.com/neurosnap/zmx/releases">https://github.com/neurosnap/zmx/releases</a> 💾</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># Install (macOS / Linux via Homebrew)</span>
</span></span><span style="display:flex;"><span>brew install neurosnap/tap/zmx
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Or grab a pre‐built binary</span>
</span></span><span style="display:flex;"><span>curl https://zyedidia.github.io/eget.sh | sh
</span></span><span style="display:flex;"><span>eget https://zmx.sh/a/zmx-0.6.0-linux-x86_64.tar.gz
</span></span></code></pre></div><h2 id="other-reviews">Other reviews</h2>
<p><a href="https://bower.sh/zmx-ai-porta">Zmx Ai Portal</a></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/review/zmx/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/golang/">#golang</a>

<a href="https://jelloeater.me/tags/tui/">#tui</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>RSS and replies to posts</title>
      <link>
      https://jelloeater.me/blog/rss_replys/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/rss_replys/#comments
      </comments>
      <pubDate>Sat, 15 Nov 2025 15:02:08 +0000</pubDate>
      <category>comments</category>
      
      <category>engagement</category>
      
      <category>personal</category>
      
      <category>rss</category>
      <guid>https://jelloeater.me/blog/rss_replys/</guid>
      
      <media:content url="https://jelloeater.me/blog/rss_replys/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/rss_replys/cover.png"/>
      


    
    



      
      
      <description><![CDATA[Avoiding screaming into the void by enabling replies via RSS feeds]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/rss_replys/cover.png" alt="Featured Image"/></p>
        
        <h1 id="too-quiet">Too quiet?</h1>
<p>So I&rsquo;ve been blogging for a while now, and also follow a number of other blogs via RSS. One thing I&rsquo;ve noticed is that a good portion of the blogs I follow don&rsquo;t have a straightforward way for readers to reply to posts directly.</p>
<p>Yeah, there will occasionally be a link to someone&rsquo;s social media or a contact page, but often there is no easy way to engage in a conversation about the content itself. I know some folks just want to be able to post and have limited interaction, but I think having a way for readers to reply really <strong>gives</strong> me a sense of connection and, to be honest, a reason to keep writing. It gets lonely out here, ya know? I know blogs are not posts (a la Bluesky or Mastodon) but having no way to reply at all feels a bit isolating.</p>
<h2 id="too-noisy">Too noisy?</h2>
<p>On the flip side, I&rsquo;ve seen some bloggers that do micro-post blog entries to their RSS feeds. To be blunt, I find that a bit spammy and <strong>off-putting</strong>. If I check my Inoreader and see 20 micro-posts from the same blog, I&rsquo;m likely to just unsubscribe entirely. We&rsquo;re aiming for connection, not congestion.</p>
<p><img src="/blog/rss_replys/noisy.png" alt="kaboom"></p>
<h2 id="the-will-i-even-read-it-problem">The &ldquo;Will I even read it?&rdquo; problem</h2>
<p>That being said, if you write a blog post that will take me 20 or more minutes to read, my ADHD brain is likely to just skip it entirely. Walls of text without any sectioning are not cool, and I&rsquo;m sure a pain for anyone to read, so I really don&rsquo;t understand how folks can even write that way?</p>
<p>There is a middle ground, which I think is like 5-10 minute reads with some images and section breaks. <strong>Crucially, if a post is an unreadable wall of text, readers will often give up before they even see your reply links.</strong></p>
<h2 id="finding-a-practical-way-to-reply">Finding a practical way to reply</h2>
<p>So what are some options for allowing readers to reply to blog posts without overwhelming them? I&rsquo;ve looked at the common solutions:</p>
<ul>
<li><strong>Webmentions:</strong> These are a thing, but they seem a bit complex to set up and use. Plus, not all blogging platforms support them natively. For many bloggers, the barrier to entry is too high.</li>
<li><strong>POSSE:</strong> There is also <a href="https://indieweb.org/POSSE">POSSE</a>—Post On your own Site, Syndicate Everywhere. This means you post on your own site and then syndicate it out to other platforms like Mastodon, Bluesky, etc. This is fine for publishing, but those replies stay siloed on the third-party platform; they don&rsquo;t automatically come back to the original blog post, which is what I&rsquo;m truly missing.</li>
</ul>
<h3 id="simple-reply-links-the-practical-middle-ground">Simple Reply Links: The practical middle ground</h3>
<p>The simplest and most robust solution I&rsquo;ve found is to include direct reply links at the end of each blog post. This includes links to my email, Mastodon, Bluesky, and a GitHub Discussions page.</p>
<p>This way, readers can choose their preferred method of engagement without feeling pressured to respond in a specific way. The GitHub Discussions page is particularly useful for more in-depth conversations, while social media links cater to quick comments. I also have a little kudos button for folks who just want to show appreciation without leaving a full reply.</p>
<p><strong>Reply via RSS</strong></p>
<p><img src="/blog/rss_replys/rss_replys_2.png" alt="RSS"></p>
<p><strong>Reply via web</strong></p>
<p><img src="/blog/rss_replys/rss_replys_1.png" alt="Web"></p>
<p><strong>Kudos</strong></p>
<p><img src="/blog/rss_replys/kudos.png" alt="Kudos"></p>
<h2 id="conclusions">Conclusions</h2>
<p>While not every blog needs to have a robust commenting system, I think providing some way for folks to reach out to me really keeps me motivated to keep writing. Whether it&rsquo;s through RSS replies, social media, or email, having that connection makes the blogging experience much more rewarding. If you&rsquo;re a blogger, I&rsquo;d love to hear how you handle replies and engagement on your posts. Feel free to reach out via any of the methods mentioned above!</p>
<h2 id="side-note">Side note</h2>
<p>Also the how to set up GitHub Discussions for your blog is <a href="/about/#-site">here</a>.</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/rss_replys/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/comments/">#comments</a>

<a href="https://jelloeater.me/tags/engagement/">#engagement</a>

<a href="https://jelloeater.me/tags/personal/">#personal</a>

<a href="https://jelloeater.me/tags/rss/">#rss</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Ten Pointless Facts about Me</title>
      <link>
      https://jelloeater.me/blog/10_pointless_facts/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/10_pointless_facts/#comments
      </comments>
      <pubDate>Sun, 02 Nov 2025 22:22:07 +0000</pubDate>
      <category>fun</category>
      
      <category>personal</category>
      
      <category>quirky</category>
      <guid>https://jelloeater.me/blog/10_pointless_facts/</guid>
      
      <media:content url="https://jelloeater.me/blog/10_pointless_facts.webp" medium="image" type="image/webp"/>
      <media:thumbnail url="https://jelloeater.me/blog/10_pointless_facts.webp"/>
      


    
    



      
      
      <description><![CDATA[A light-hearted look at some of my quirks and preferences]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/10_pointless_facts.webp" alt="Featured Image"/></p>
        
        <p>So it looks like this one is making the rounds again, and I thought it would be fun to share some pointless facts about myself. Here we go!</p>
<ul>
<li>Do you floss your teeth?
<ul>
<li>Yes, every few days. Who doesn&rsquo;t floss?</li>
</ul>
</li>
<li>Tea, coffee, or water?
<ul>
<li>Coffee, black, way too much stevia.</li>
</ul>
</li>
<li>Footwear preference?
<ul>
<li>New Balance sneakers.</li>
</ul>
</li>
<li>Favourite dessert?
<ul>
<li>Halo Top ice cream.</li>
</ul>
</li>
<li>The first thing you do when you wake up?
<ul>
<li>Drink water from my bedside bottle. Maybe eat some pretzels.</li>
</ul>
</li>
<li>Age you&rsquo;d like to stick at?
<ul>
<li>30, because I had more energy then. But honestly 40 isn&rsquo;t bad, just nap more.</li>
</ul>
</li>
<li>How many hats do you own?
<ul>
<li>Two, a super soft beanie and a driver cap I live in.</li>
</ul>
</li>
<li>Describe the last photo you took?
<ul>
<li>A really nice sunset over the bay.</li>
</ul>
</li>
<li>Worst TV show?
<ul>
<li>Big Bang Theory. Just awful.</li>
</ul>
</li>
<li>As a child, what was your aspiration for adulthood?
<ul>
<li>I wanted to be a pilot&hellip; that didn&rsquo;t pan out. Long story but involved a very dark time in my life&hellip;</li>
</ul>
</li>
</ul>
<hr>
<p>Inspired by:</p>
<ul>
<li><a href="https://mihobu.lol/ten-pointless-facts-about-me">https://mihobu.lol/ten-pointless-facts-about-me</a></li>
<li><a href="https://forkingmad.blog/ten-pointless-facts-about-me/">https://forkingmad.blog/ten-pointless-facts-about-me/</a></li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/10_pointless_facts/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/fun/">#fun</a>

<a href="https://jelloeater.me/tags/personal/">#personal</a>

<a href="https://jelloeater.me/tags/quirky/">#quirky</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Updating SM-T820 Samsung Galexy Tab S3 tablet to Android 14</title>
      <link>
      https://jelloeater.me/blog/smamsung-refresh/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/smamsung-refresh/#comments
      </comments>
      <pubDate>Sat, 11 Oct 2025 20:38:58 -0400</pubDate>
      <category>android</category>
      
      <category>lineageos</category>
      
      <category>linux</category>
      
      <category>samsung</category>
      <guid>https://jelloeater.me/blog/smamsung-refresh/</guid>
      
      <media:content url="https://jelloeater.me/blog/samsung_refresh.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/samsung_refresh.png"/>
      


    
    



      
      
      <description><![CDATA[Android 14 on Samsung Galaxy Tab S3 SM-T820]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/samsung_refresh.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>Wow, what a hot mess that was&hellip; fun way to spend a Saturday afternoon, right? I originally wanted to do this project back in Aug&hellip;</p>


  
    <blockquote>
      <p><strong>TL;DR, the goal was to get Android 14 (LineageOS 21) running on my Samsung Galaxy Tab S3 (SM-T820), which was officially abandoned on Android 9. The entire process was done from an Ubuntu desktop.</strong>
My original inspo from from this post: <a href="https://fullfreesoftware.net/how-to-upgrade-samsung-tab-s3-to-android-14">https://fullfreesoftware.net/how-to-upgrade-samsung-tab-s3-to-android-14</a>
Below is a summery of my notes, mixed into with a giant pile of XDA links I fed the bot for context / background. I&rsquo;m including them in the bottom if another human wants to dig through, but everything below tracks with what I had to go through.</p>
    </blockquote>
  
<h2 id="how-to">How to</h2>
<h3 id="required-files--tools"><strong>Required Files &amp; Tools</strong></h3>
<ul>
<li><strong>ROM:</strong> <code>lineage-21.0-20240309-UNOFFICIAL-gts3lwifi.zip</code></li>
<li><strong>Recovery:</strong> <code>twrp-3.5.2_9-0-gts3lwifi.img.tar</code> (Version 3.7.0 had issues accessing the SD card).</li>
<li><strong>GApps:</strong> <code>NikGapps-core-arm64-14-20250716-signed.zip</code></li>
<li><strong>Tools:</strong> Heimdall, Android Debug Bridge (adb).</li>
</ul>
<h3 id="procedure"><strong>Procedure</strong></h3>
<p><strong>1. Flash Custom Recovery (TWRP)</strong></p>
<ol>
<li>
<p>On the tablet, enable Developer Options and turn on <strong>OEM Unlocking</strong>.</p>
</li>
<li>
<p>Reboot into Download Mode (<code>Power</code> + <code>Volume Down</code> + <code>Home</code>).</p>
</li>
<li>
<p>Extract <code>recovery.img</code> from the TWRP <code>.tar</code> archive. ==<strong>(Make sure it is named exactly that)</strong>==</p>
</li>
<li>
<p>From my Ubuntu terminal, flash the recovery image using Heimdall:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>heimdall flash --RECOVERY recovery.img
</span></span></code></pre></div></li>
<li>
<p>As soon as the flash completed, I rebooted directly into Recovery (<code>Power</code> + <code>Volume Up</code> + <code>Home</code>) to prevent the stock OS from overwriting it.</p>
</li>
</ol>
<p><strong>2. Wipe Partitions</strong></p>
<ol>
<li>In TWRP, navigated to <code>Wipe</code> -&gt; <code>Advanced Wipe</code>.</li>
<li>Selected and wiped <code>Dalvik / ART Cache</code>, <code>Cache</code>, <code>Data</code>, and <code>System</code>.</li>
</ol>
<p><strong>3. Transfer Files to Tablet</strong></p>
<ol>
<li>
<p>MTP was unstable after transferring the first file. Used <code>adb</code> for reliability.</p>
</li>
<li>
<p>With the tablet in TWRP, I pushed the files from my PC:</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>adb push lineage-21.0-20240309-UNOFFICIAL-gts3lwifi.zip /sdcard/
</span></span><span style="display:flex;"><span>adb push NikGapps-core-arm64-14-20250716-signed<span style="color:#ae81ff">\(</span>1<span style="color:#ae81ff">\)</span>.zip /sdcard/
</span></span></code></pre></div></li>
</ol>
<p><strong>4. Install ROM and GApps</strong></p>
<ol>
<li>In TWRP, selected <code>Install</code>.</li>
<li>Flashed <code>lineage-21.0...zip</code> first.</li>
<li>Without rebooting, went back and flashed <code>NikGapps-core...zip</code>.</li>
<li>Wiped cache, then rebooted the system.
The first boot took several minutes, but it eventually loaded into the LineageOS 21 setup screen. The result is a usable Galaxy Tab S3 running a current version of Android.</li>
</ol>
<hr>
<h2 id="root">Root</h2>
<p>I would recomend you install the Magisk app and flash the Magisk.zip in TWRP.
This one worked fine for me <a href="https://magiskzip.com/">Magiskzip</a></p>
<h2 id="reference-links">Reference Links</h2>
<ul>
<li><a href="https://forum.zorin.com/t/galaxy-tab-s3/28707/4">Galaxy tab S3 - Installing Zorin OS - Zorin Forum</a></li>
<li><a href="https://xdaforums.com/t/galaxy-tab-s3-gets-lineageos-18-1.4283433/">Galaxy Tab S3 gets LineageOS 18.1 | XDA Forums</a></li>
<li><a href="https://stackoverflow.com/questions/19508310/how-to-push-folders-from-computer-into-sdcard-using-adb-shell">android - how to push folders from computer into sdcard using adb shell - Stack Overflow</a></li>
<li><a href="https://xdaforums.com/t/eol-rom-unofficial-11-eas-signature-spoofing-ota-sm-t820-sm-t825-2024-10-10-lineageos-18-1-for-galaxy-tab-s3.4293069/">[EOL][ROM][UNOFFICIAL][11][EAS][Signature Spoofing][OTA][SM-T820][SM-T825][2024-10-10] LineageOS 18.1 for Galaxy Tab S3 | XDA Forums</a></li>
<li><a href="https://github.com/awesometic/android-ota-provider/releases/tag/gts3lwifi_lineage-18.1_1728573708">Release gts3lwifi_lineage-18.1_1728573708 · awesometic/android-ota-provider</a></li>
<li><a href="https://drive.google.com/drive/folders/1012WN6BGG4UAcL-htgONjP0v9jRPg0zy">gts3lwifi - Google Drive</a></li>
<li><a href="https://xdaforums.com/t/recovery-root-twrp-3-2-1-1-samsung-galaxy-tab-s3-sm-t820-t825.3581359/">[RECOVERY][ROOT]TWRP 3.2.1-1 Samsung Galaxy Tab S3 SM-T820/T825 | XDA Forums</a></li>
<li><a href="https://drive.google.com/file/d/1M2c74b84IMEz0zSxBDJBBHRWKUlPARR_/view">twrp-3.5.2_9-0-gts3llte.img.tar - Google Drive</a></li>
<li><a href="https://en.wikipedia.org/wiki/Samsung_Galaxy_Tab_S3">Samsung Galaxy Tab S3 - Wikipedia</a></li>
<li><a href="https://androidfilehost.com/?fid=745425885120721426">twrp_3.1.0-1_sm-t820_3417.tar | by ashyt16 for Galaxy Tab S2 9.7</a></li>
<li><a href="https://xdaforums.com/t/how-to-flash-recovery-using-linux-and-heimdall-solved.4238595/">How to flash recovery using Linux and Heimdall? (SOLVED) | XDA Forums</a></li>
</ul>
<h2 id="issues-when-charging-powered-off">Issues when charging powered off</h2>
<p>When a Samsung Galaxy Tab S3 running LineageOS is stuck or behaves abnormally while charging in the powered-off state, it&rsquo;s a known issue that can be linked both to hardware quirks and to how custom ROMs like LineageOS handle &ldquo;offline charging&rdquo; mode. The tablet may vibrate or display the charging animation briefly, then shut off or repeat the cycle, instead of charging normally in the powered-off state.</p>
<h3 id="common-causes">Common Causes</h3>
<ul>
<li>LineageOS versions (especially recent or unofficial builds) sometimes introduce bugs in low-level charging logic, leading to problems in the powered-off charging state, or even bootloops if the battery is fully drained.</li>
<li>Some users find the issue came after flashing or updating to newer builds (e.g., LOS 18 or 21), while older versions (such as LOS 17.1) do not have this problem.</li>
<li>The symptoms are also reported on stock firmware in some cases, especially with deeply discharged batteries or damaged charging hardware, but ROM-level bugs can make the issue worse.</li>
</ul>
<h3 id="workarounds-and-suggestions">Workarounds and Suggestions</h3>
<ul>
<li><strong>Charge in Recovery Mode:</strong> Boot into TWRP recovery and then connect the charger. Some users report that charging works as intended in this mode when it fails in normal powered-off state.SS</li>
<li><strong>Stick with a Stable Build:</strong> If the issue appeared after a LineageOS upgrade (e.g., from LOS 17.1 to 18 or later), reverting to a previous, stable version may resolve it.</li>
<li><strong>Deep Discharge Reset:</strong> Let the battery fully drain, then leave the device off and charging for several hours (sometimes overnight). Once charged enough (even if no animation is shown), attempt to power on again.</li>
<li><strong>Button Combo Reset:</strong> If the tablet becomes unresponsive, hold Power + Volume Down for 10-20 seconds to force a reboot or reset; this sometimes helps recover from stuck charging or soft-bricked states.</li>
<li><strong>Hardware Troubleshooting:</strong> If none of the software fixes help, try different cables/chargers, clean the USB-C port, or inspect for physical damage, as faulty charging circuitry can cause similar symptoms.</li>
</ul>
<h3 id="additional-notes">Additional Notes</h3>
<ul>
<li>There is currently no universal fix within LineageOS for this problem, but sticking with official, stable builds and monitoring LineageOS forum threads for updates or bugfixes is recommended.</li>
<li>If the device repeatedly enters a bootloop when connecting to charge while off, it&rsquo;s best to charge only while the tablet is powered on or in TWRP recovery until a ROM update or workaround resolves the underlying issue.
For many users, reverting to a prior LineageOS version or charging in TWRP are the most effective practical solutions until upstream patches appear.</li>
</ul>
<h2 id="edit-2026-01-25-152523">Edit 2026-01-25 15:25:23</h2>
<p>Update: Got a great tip from my <a href="https://github.com/Jelloeater/giscus/discussions/6#discussioncomment-15580549">comments section</a>!</p>


  
    <blockquote>
      <p>Before doing the Advanced Wipe, I had to to format the Data partion in Standard Wipe mode and return to TWRP for the Advanced Wipe&quot;
<br> — <em><a href="https://github.com/Vitus-TL">Vitus-TL</a></em></p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:smamsung-refresh">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/smamsung-refresh/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/android/">#android</a>

<a href="https://jelloeater.me/tags/lineageos/">#lineageos</a>

<a href="https://jelloeater.me/tags/linux/">#linux</a>

<a href="https://jelloeater.me/tags/samsung/">#samsung</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Phonebook Cleanup</title>
      <link>
      https://jelloeater.me/blog/phonebook-cleanup/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/phonebook-cleanup/#comments
      </comments>
      <pubDate>Sat, 04 Oct 2025 15:50:58 -0400</pubDate>
      <category>android</category>
      
      <category>cleanup</category>
      
      <category>phonebook</category>
      
      <category>privacy</category>
      <guid>https://jelloeater.me/blog/phonebook-cleanup/</guid>
      
      <media:content url="https://jelloeater.me/blog/phonebook-cleanup/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/phonebook-cleanup/cover.png"/>
      


    
    



      
      
      <description><![CDATA[🎶 Baby don&#39;t loose my number 🎶]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/phonebook-cleanup/cover.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>So honestly I feel like I&rsquo;m that guy that never deletes a single contact.
I get notifications on my phone for birthdays for people I don&rsquo;t like.
And more importantly applications like WhatsApp and even my beloved Telegram will sync my local contacts with people who I don&rsquo;t really want to talk to anymore.</p>
<p>I&rsquo;ve had a nickel for every time I got a person you hate has just joined WhatsApp or random burger place has joined Telegram I have like five bucks but that&rsquo;s about $5 more than I&rsquo;d really like to have considering some of these people I never wanted to talk to again.</p>
<p>So I went on the journey of trying to both clean out my address book while still being able to get notifications if people I really don&rsquo;t like call me or text me.</p>
<p>The way Android deals with contacts is it loves to just lump everything into one big giant global address book your quote contacts this is less than ideal from a privacy perspective and honestly I really can&rsquo;t complain too much consider I&rsquo;m using a product made by a search company Linux Roots be damned.</p>
<p>Fortunately some really nice folks on GitHub and f-Droid cooked up some apps that ended up solving my problem after ironically enough digging through perplexity and Gemini for about a good hour.</p>
<h2 id="decsync">DecSync</h2>
<a href="./decsync.png">
<img src="./decsync.png"
style="width:33%; display:block; margin:auto;"/></a>
<p>Export all of your contacts from people you don&rsquo;t want to talk to anymore into one giant VCF.</p>
<p>Now you may want to be able to edit that contact book from time to time while still having it not tied with every single person on your phone.</p>
<p>This is where DecSync comes in. You can import that VCF file of those people you don&rsquo;t like into their and toggle it on and off so as you need to move contacts in and out of it you can from any standard Android contact app.</p>
<p><a href="https://f-droid.org/packages/org.decsync.cc">https://f-droid.org/packages/org.decsync.cc</a></p>
<h2 id="alternate">Alternate</h2>
<p>So for all the folks reading this if you want to still get that caller ID notification for somebody who you don&rsquo;t like but you don&rsquo;t want them to end up in your WhatsApp or your telegram or even your signal try this little app I found on fdroid called Alternate.</p>
<p><a href="https://apt.izzysoft.de/packages/com.lulu786.Alternate">https://apt.izzysoft.de/packages/com.lulu786.Alternate</a></p>
<p>You can then feed in that VCF file that you exported from DecSync, and voila you now have caller ID for all the people you don&rsquo;t like while still having them not show up in your signal chats by accident.</p>
<a href="./Alternate.png">
<img src="./Alternate.png"
style="width:33%; display:block; margin:auto;"/></a>
<h2 id="conclusion">Conclusion</h2>
<p>If this blog post helps you out please let me know because God knows I&rsquo;m always trying to figure out a better solution for privacy on my mobile devices.</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:phonebook-cleanup">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/phonebook-cleanup/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/android/">#android</a>

<a href="https://jelloeater.me/tags/cleanup/">#cleanup</a>

<a href="https://jelloeater.me/tags/phonebook/">#phonebook</a>

<a href="https://jelloeater.me/tags/privacy/">#privacy</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>What Ive read in Sept 2025</title>
      <link>
      https://jelloeater.me/blog/rss-dump-2025-09/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/rss-dump-2025-09/#comments
      </comments>
      <pubDate>Sat, 27 Sep 2025 23:55:17 -0400</pubDate>
      <category>link_dump</category>
      <guid>https://jelloeater.me/blog/rss-dump-2025-09/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/blog/rss-dump-2025-09/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/blog/rss-dump-2025-09/gen-cover.png"/>
    



      
      
      <description><![CDATA[Open web, gaming, and security highlights]]></description>
      
      <content:encoded>
        <![CDATA[
        
        <p>Here is a condensed, markdown-formatted link dump blog post covering the most interesting, novel, or representative entries from your September 2025 collection.</p>
<h3 id="software--tech">Software &amp; Tech</h3>
<ul>
<li><a href="https://jamesg.blog/2025/09/15/a-255-byte-web-page/">A 255 byte web page</a> &ndash; Minimalist web coding at its peak.</li>
<li><a href="https://www.docker.com/blog/announcing-docker-model-runner-ga/">Docker: Model Runner General Availability</a> &ndash; Docker’s latest tool for ML workloads.</li>
<li><a href="https://github.blog/ai-and-ml/github-copilot/5-ways-to-integrate-github-copilot-coding-agent-into-your-workflow/">GitHub Copilot in Workflows</a> &ndash; Practical uses for Copilot agents right now.</li>
<li><a href="https://blog.cloudflare.com/eliminating-cold-starts-2-shard-and-conquer/">Eliminating Cold Starts: Cloudflare</a> &ndash; Performance lessons from edge computing.</li>
<li><a href="https://itsfoss.com/hyprland-distros/">Hyprland Made Easy: Beautiful Distros</a> &ndash; Eye-candy Linux for the modern desktop.</li>
</ul>
<h3 id="open-web--blogging">Open Web &amp; Blogging</h3>
<ul>
<li><a href="https://bapsi.micro.blog/2025/08/20/long-live-rss.html">LONG LIVE RSS!! 📚</a> &ndash; RSS endures in the IndieWeb.</li>
<li><a href="https://blog.jim-nielsen.com/2025/why-make-a-website-in-2025/">Why Make a Website in 2025?</a> &ndash; The ongoing relevance of personal sites.</li>
<li><a href="https://manuelmoreale.com/blogs-don-t-need-to-be-so-lonely">Blogs Don’t Need to Be So Lonely</a> &ndash; The joys of blogging community.</li>
</ul>
<h3 id="culture--society">Culture &amp; Society</h3>
<ul>
<li><a href="https://insidemordecai.com/joy-of-libraries/">The Joy of Libraries</a> &ndash; A love letter to public libraries.</li>
<li><a href="https://joelchrono.xyz/blog/keeping-old-stuff-or-not/?ref=feedle.world">Keeping Old Stuff, or Not</a> &ndash; Rethinking possessions in a digital age.</li>
<li><a href="https://onefoottsunami.com/2025/09/22/weaponizing-narcan/">Weaponizing Narcan</a> &ndash; Unexpected uses and abuses of opioid reversal drugs.</li>
<li><a href="https://bigthink.com/series/the-big-think-interview/upwards-immobility/?ref=feedle.world">Why the American Dream No Longer Moves Upward</a> &ndash; A timely Big Think essay.</li>
</ul>
<h3 id="developer--productivity">Developer &amp; Productivity</h3>
<ul>
<li><a href="https://www.chriseldon.com/blog/2025/09/do-it-for-fun.html">Do It for Fun</a> &ndash; Rediscovering joy in making things.</li>
<li><a href="https://www.chriseldon.com/blog/2025/09/learning-vim.html">Learning Vim</a> &ndash; One dev’s migration tale.</li>
<li><a href="https://sethmlarson.dev/extracting-nes-and-n64-from-zelda-collectors-edition?utm_campaign=rss">Extracting NES &amp; N64 ROMs from Zelda Collector&rsquo;s Edition</a> &ndash; Deep retro hacking.</li>
</ul>
<h3 id="science--future">Science &amp; Future</h3>
<ul>
<li><a href="https://www.economist.com/science-and-technology/2025/09/15/pink-pineapples-and-lab-grown-meat-tasting-the-foods-of-the-future">Pink Pineapples and Lab-Grown Meat</a> &ndash; The new era of engineered food.</li>
<li><a href="https://www.economist.com/united-states/2025/09/21/rail-travel-is-booming-in-america">Rail Travel is Booming in America</a> &ndash; Infrastructure and cultural shift news.</li>
<li><a href="https://bigthink.com/mini-philosophy/the-cold-plunge-fallacy-why-some-fads-may-never-work-for-you/">The Cold-Plunge Fallacy</a> &ndash; Debunking wellness trends.</li>
</ul>
<h3 id="security--privacy">Security &amp; Privacy</h3>
<ul>
<li><a href="http://android-developers.googleblog.com/2025/09/best-practices-migrating-users-passkeys-credential-manager.html">Best Practices for Migrating Users to Passkeys</a> &ndash; Android Dev on passkey transitions.</li>
<li><a href="https://www.darkreading.com/endpoint-security/hacked-routers-linger-on-the-internet-for-years-data-shows">Hacked Routers Linger on the Internet for Years</a> &ndash; Dark Reading on persistent vulnerabilities.</li>
<li><a href="https://www.backblaze.com/blog/why-cloud-native-developers-need-a-specialized-storage-layer/">Why Cloud-Native Developers Need Specialized Storage</a> &ndash; Rethinking infrastructure.</li>
</ul>
<h3 id="media--entertainment">Media &amp; Entertainment</h3>
<ul>
<li><a href="https://stephvee.ca/blog/entertainment/alien-earth-was-ultimately-a-letdown/">Alien: Earth Was Ultimately a Letdown</a> &ndash; A genre-movie postmortem.</li>
<li><a href="https://embedded.substack.com/p/the-tiktok-ification-of-saturday">The TikTok-ification of ‘Saturday Night Live’</a> &ndash; Streaming culture’s new normal.</li>
</ul>
<h3 id="bonus-classic-web-nostalgia">Bonus: Classic Web Nostalgia</h3>
<ul>
<li><a href="https://indieweb.social/@classicweb/115221622533497620">bored.com, December 02, 2010 (Internet Archive)</a> &ndash; Remember internet before enshittification?</li>
<li><a href="https://indieweb.social/@classicweb/115095560660576364">memepool.com, December 10, 2001 (Internet Archive)</a> &ndash; The roots of social linking.</li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:rss-dump-2025-09">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/rss-dump-2025-09/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/link_dump/">#link_dump</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Sunday Funday - Sept 2025</title>
      <link>
      https://jelloeater.me/blog/sunday-funday-2025-09/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/sunday-funday-2025-09/#comments
      </comments>
      <pubDate>Sat, 27 Sep 2025 23:51:12 -0400</pubDate>
      <category>link_dump</category>
      
      <category>sunday_funday</category>
      <guid>https://jelloeater.me/blog/sunday-funday-2025-09/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/blog/sunday-funday-2025-09/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/blog/sunday-funday-2025-09/gen-cover.png"/>
    



      
      
      <description><![CDATA[Some politics, a little AI, and a lot of culture]]></description>
      
      <content:encoded>
        <![CDATA[
        
        <p>Some of the best reads I&rsquo;ve come across recently, organized by theme. Enjoy!</p>
<h3 id="coping-culture--community">Coping, Culture &amp; Community</h3>
<ul>
<li><a href="https://kottke.org/25/01/how-to-weather-the-storm">How to Weather the Storm</a> &ndash; Jason Kottke collects practical wisdom on surviving authoritarian times, mutual aid, critical ignoring, and building community.</li>
<li><a href="https://flaminghydra.com/cooking-to-survive/">Cooking to Survive</a> &ndash; A personal take on food, resilience, and how eating connects us during turbulent times.</li>
<li><a href="https://kottke.org/25/07/the-kindly-brontosaurus-1">The Kindly Brontosaurus</a> &ndash; On quiet persistence, awkward waiting, and making your presence felt in the gentlest way.</li>
<li><a href="https://tracydurnell.com/2025/06/01/midlife-rage/">Midlife Rage</a> &ndash; Reflections on hitting a boiling point in middle age, and channeling it toward something purposeful.</li>
<li><a href="https://yordi.me/the-world-is-improvised/">The World Is Improvised</a> &ndash; A hopeful essay about navigating uncertainty by embracing improvisation.</li>
<li><a href="https://www.theparisreview.org/blog/2025/07/17/the-same-damned-thing-over-and-over/">The Same Damned Thing Over and Over</a> &ndash; Parisians, rituals, patterns, and the strange comfort of repetition.</li>
</ul>
<hr>
<h3 id="ai-tech--digital-life">AI, Tech &amp; Digital Life</h3>
<ul>
<li><a href="https://stratechery.com/2025/checking-in-on-ai-and-the-big-five/">Checking In on AI and the Big Five</a> &ndash; Ben Thompson’s deep dive on where Apple, Google, Meta, Microsoft, and Amazon stand in the AI arms race.</li>
<li><a href="https://stratechery.com/2025/snapshots-of-an-evolving-ai-landscape/">Snapshots of an Evolving AI Landscape</a> &ndash; Follow-up thoughts on AI trends and strategic shifts.</li>
<li><a href="https://www.404media.co/inside-ai-addiction-support-groups-where-people-try-to-stop-talking-to-chatbots/">Inside AI Addiction Support Groups</a> &ndash; Support circles for those who can’t stop chatting with bots.</li>
<li><a href="https://futurism.com/ai-turbocharging-global-inequality">AI Turbocharging Global Inequality</a> &ndash; How this new wave of automation could widen divides.</li>
<li><a href="https://mjtsai.com/blog/2025/06/26/software-is-changing-again/">Software Is Changing Again</a> &ndash; Michael Tsai on another turning point for software dev.</li>
<li><a href="https://bigthink.com/business/ai-vs-humans-a-question-of-humanity/">AI vs Humans: A Question of Humanity</a> &ndash; A philosophical examination of what remains uniquely human.</li>
<li><a href="https://www.theatlantic.com/culture/archive/2025/06/artificial-intelligence-illiteracy/683021/">Artificial Intelligence Illiteracy</a> &ndash; Why daily life increasingly demands AI literacy.</li>
</ul>
<hr>
<h3 id="tools-code--open-source">Tools, Code &amp; Open Source</h3>
<ul>
<li><a href="https://www.docker.com/blog/docker-desktop-4-43/">Docker Desktop 4.43</a> &ndash; New updates for container developers.</li>
<li><a href="https://www.docker.com/blog/docker-mcp-catalog-secure-way-to-discover-and-run-mcp-servers/">Docker MCP Catalog</a> &ndash; A secure way to explore MCP servers.</li>
<li><a href="https://www.ducktyped.org/p/aws-in-terraform">AWS in Terraform</a> &ndash; Practical breakdowns for infrastructure coders.</li>
<li><a href="https://github.blog/ai-and-ml/github-copilot/5-ways-to-transform-your-workflow-using-github-copilot-and-mcp/">GitHub Copilot + MCP</a> &ndash; New AI-assisted dev workflows.</li>
<li><a href="https://github.com/aws/pgactive">pgactive</a> &ndash; Active-active database setup for Postgres from AWS.</li>
<li><a href="https://github.com/fastapi/typer">FastAPI Typer</a> &ndash; Build intuitive Python CLIs.</li>
<li><a href="https://github.com/AdguardTeam/AdGuardHome?tab=readme-ov-file#comparison">AdGuard Home comparisons</a> &ndash; Block ads, trackers, and take back your network.</li>
<li><a href="https://github.com/chubin/wttr.in">wttr.in</a> &ndash; Minimalist weather forecasts in your terminal.</li>
</ul>
<hr>
<h3 id="indie-web--digital-minimalism">Indie Web &amp; Digital Minimalism</h3>
<ul>
<li><a href="https://www.joanwestenberg.com/p/i-deleted-my-second-brain">I Deleted My Second Brain</a> &ndash; On letting go of obsessive notetaking systems.</li>
<li><a href="https://winther.sysctl.dk/curate-your-own-website/">Curate Your Own Website</a> &ndash; A call for more personal web gardens.</li>
<li><a href="https://flaminghydra.com/the-internet-you-make/">The Internet You Make</a> &ndash; Why the web we have is the one we cultivate.</li>
<li><a href="https://www.optoutproject.net/stop-the-scroll/">Stop the Scroll</a> &ndash; Strategies to avoid infinite feeds.</li>
<li><a href="https://www.hottakes.space/p/you-dont-always-have-to-publish">You Don’t Always Have to Publish</a> &ndash; On rest, restraint, and resisting output pressure.</li>
</ul>
<hr>
<h3 id="politics-labor--media">Politics, Labor &amp; Media</h3>
<ul>
<li><a href="https://www.bloodinthemachine.com/p/the-budget-bill-opens-the-floodgates">The Budget Bill Opens the Floodgates</a> &ndash; Worker struggles in the wake of new policy.</li>
<li><a href="https://www.bloodinthemachine.com/p/hundreds-of-workers-mobilize-to-stop">Hundreds of Workers Mobilize to Stop</a> &ndash; Collective resistance comes into focus.</li>
<li><a href="https://www.bloodinthemachine.com/p/the-luddite-renaissance-is-in-full">The Luddite Renaissance</a> &ndash; On modern echoes of machine-breaking resistance.</li>
<li><a href="https://www.nytimes.com/2025/06/26/opinion/peter-thiel-antichrist-ross-douthat.html">Peter Thiel, Antichrist?</a> Provocative op-ed exploring ideology.</li>
<li><a href="https://jtwoodhouse.com/let-democracy-go/">Let Democracy Go</a> &ndash; Hard questions about system fragility.</li>
<li><a href="https://lucio.boxofcox.org/2025/07/12/itching-for-just-violence/">Itching for Just Violence</a> &ndash; A grim reflection on reactionary force.</li>
</ul>
<hr>
<h3 id="odds--ends">Odds &amp; Ends</h3>
<ul>
<li><a href="https://www.osnews.com/story/142677/servers-and-thin-clients-in-every-home-is-the-future-they-stole-from-us/">Servers and Thin Clients in Every Home</a> &ndash; A retro-futurist computing dream that never arrived.</li>
<li><a href="https://www.dpreview.com/articles/8692510157/what-gear-does-dpreview-staff-use-for-travel">What Gear Does DPReview Staff Use for Travel?</a> &ndash; Behind-the-scenes kit picks.</li>
<li><a href="https://disassociated.com/emulate-wes-anderson-with-shoot-like-wes-book-adam-woodward-liz-seabrook/">Emulate Wes Anderson</a> &ndash; A photo book on capturing symmetry and color.</li>
<li><a href="https://www.historicaltechtree.com/">Historical Tech Tree</a> &ndash; A playful chart mapping humanity’s inventions like a strategy game.</li>
<li><a href="https://weatherstar.netbymatt.com/">WeatherStar Emulator</a> &ndash; Bring back retro Weather Channel vibes.</li>
<li><a href="https://www.bee-link.com/products/beelink-me-mini-n150?variant=47599172780274">BeeLink Mini N150</a> &ndash; A budget tiny PC with surprising power.</li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:sunday-funday-2025-09">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/sunday-funday-2025-09/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/link_dump/">#link_dump</a>

<a href="https://jelloeater.me/tags/sunday_funday/">#sunday_funday</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>August 2025 Blog Dump</title>
      <link>
      https://jelloeater.me/blog/blog-dump-2025-aug/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/blog-dump-2025-aug/#comments
      </comments>
      <pubDate>Sun, 31 Aug 2025 17:47:52 +0000</pubDate>
      <category>blogdump</category>
      
      <category>link_dump</category>
      <guid>https://jelloeater.me/blog/blog-dump-2025-aug/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/blog/blog-dump-2025-aug/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/blog/blog-dump-2025-aug/gen-cover.png"/>
    



      
      
      <description><![CDATA[Blogs about Technology, design, niche hobbies, cultural commentary, and daily life]]></description>
      
      <content:encoded>
        <![CDATA[
        
        <h2 id="another-month-more-links--neat">Another month, more links &hellip; neat!</h2>
<p>I&rsquo;m still struggling to find time to get through my RSS feeds, so <em>hopefully</em> this will be the last blog dump for a month or so, but either way, I just want to make sure these don&rsquo;t get lost into the ether. 💝</p>
<h2 id="blog-list">Blog List</h2>
<h3 id="tech-development--web-design">Tech, Development, &amp; Web Design</h3>
<p><em>This category includes blogs focused on software development, web design, cloud infrastructure, and general technology commentary.</em></p>
<ul>
<li><a href="https://aaronparecki.com/">Aaron Parecki</a></li>
<li><a href="https://allenpike.com/">Allen Pike, pixel crafter</a></li>
<li><a href="https://www.anildash.com/">Anil Dash</a></li>
<li><a href="https://artemis.sh/">Artemis Everfree</a></li>
<li><a href="https://www.benkuhn.net/">benkuhn.net</a></li>
<li><a href="https://benovermyer.com/">Ben Overmyer, the Coder</a></li>
<li><a href="https://bradfrost.com/blog/">Blog | Brad Frost</a></li>
<li><a href="https://david.shanske.com/">David Shanske – The Definitive Location</a></li>
<li><a href="https://davideaversa.it/">Davide Aversa</a></li>
<li><a href="https://writing.kemitchell.com/">/dev/lawyer</a></li>
<li><a href="https://matuzo.at/">Home - Manuel Matuzovic</a></li>
<li><a href="https://sarahspiekermann.com/">Home - Sarah Spiekermann</a></li>
<li><a href="https://chrismcleod.dev/">I Build Things — Chris McLeod</a></li>
<li><a href="https://zeldman.com/">Jeffrey Zeldman Presents - Since 1995.</a></li>
<li><a href="https://jzhao.xyz/">jzhao.xyz</a></li>
<li><a href="https://maggieappleton.com/">Maggie Appleton</a></li>
<li><a href="https://mikebell.io/">Mike Bell - Blog &amp; Stuff</a></li>
<li><a href="https://hamatti.org/blog/">My writings : Juha-Matti Santala</a></li>
<li><a href="https://nelson.cloud/">Nelson Figueroa</a></li>
<li><a href="https://takuti.me/note/">Notes | Takuya Kitazawa</a></li>
<li><a href="https://pcarrier.com/">Pierre Carrier</a></li>
<li><a href="https://rishikeshs.com/">Rishikesh Sreehari</a></li>
<li><a href="https://squeaki.sh/">squeaki.sh</a></li>
<li><a href="https://stackdiver.com/">Stack Diver</a></li>
<li><a href="https://stephango.com/">Steph Ango</a></li>
<li><a href="https://waxy.org/">Waxy.org - Andy Baio lives here</a></li>
</ul>
<h3 id="design-art--creativity">Design, Art, &amp; Creativity</h3>
<p><em>Blogs focusing on graphic design, illustration, photography, art, and the creative process.</em></p>
<ul>
<li><a href="https://tyfromtheinternet.com/posts/">Blog | Ty Finck, Graphic Design in Ithaca, New York</a></li>
<li><a href="https://www.sholis.com/">Brian Sholis</a></li>
<li><a href="https://blog.reimenayee.com/">Home | Blog – Reimena Yee</a></li>
<li><a href="https://maique.eu/">{maique}</a></li>
<li><a href="https://www.rotational.co.uk/">rotational by Alex Wiltshire</a></li>
<li><a href="https://scottboms.com/">Scott Boms | Creative direction, Design, and Printmaking</a></li>
<li><a href="https://www.lazaruscorporation.co.uk/blogs/artists-notebook">The Artist’s Notebook</a></li>
</ul>
<h3 id="culture-media--history">Culture, Media, &amp; History</h3>
<p><em>These blogs cover topics like history, media analysis, music, theatre, and cultural commentary.</em></p>
<ul>
<li><a href="https://www.fluxblog.org/">Fluxblog</a></li>
<li><a href="https://going-medieval.com/">Going Medieval – Medieval History, Pop Culture, Swearing</a></li>
<li><a href="https://glycerinequeenmedia.com/">Glycerine Queen Media - News, opinion and everything in between</a></li>
<li><a href="https://warnercrocker.com/">Life on the Wicked Stage: Act 3 – Musings on life, the theatre, technology, culture&hellip;</a></li>
<li><a href="https://thisvictorianlife.com/">Secure Site Not Available</a></li>
</ul>
<h3 id="niche--special-interest">Niche &amp; Special Interest</h3>
<p><em>Blogs dedicated to a very specific topic, from coffee to science to travel.</em></p>
<ul>
<li><a href="https://hasbrouck.org/">Edward Hasbrouck, &ldquo;The Practical Nomad&rdquo;</a> (Travel)</li>
<li><a href="https://www.futilitycloset.com/">Futility Closet - An idler&rsquo;s miscellany of compendious amusements</a> (Curiosities &amp; Puzzles)</li>
<li><a href="https://jamesg.blog/">James&rsquo; Coffee Blog</a> (Coffee)</li>
<li><a href="https://mythcreants.com/">Mythcreants – Fantasy &amp; Science Fiction for Storytellers</a> (Writing &amp; Genre Fiction)</li>
<li><a href="https://rootprivileges.net/">Root Privileges – A blog about science and scepticism with an Indian outlook</a> (Science &amp; Skepticism)</li>
<li><a href="https://spectralcodex.com/">Spectral Codex</a> (Curiosities)</li>
</ul>
<h3 id="link-blogs--curated-content">Link Blogs &amp; Curated Content</h3>
<p><em>Blogs whose primary format is sharing and commenting on links from around the web.</em></p>
<ul>
<li><a href="https://www.timemachinego.com/linkmachinego/">LinkMachineGo | &lsquo;This is Lima Mike Golf. Shall we blog?&rsquo;</a></li>
<li><a href="https://www.marginalia.nu/log/">Weblog @ marginalia.nu</a></li>
</ul>
<h3 id="digital-gardens--wikis">Digital Gardens &amp; Wikis</h3>
<p><em>A non-linear format for sharing knowledge and notes.</em></p>
<ul>
<li><a href="https://chotrin.org/">chötrin&rsquo;s wiki.</a></li>
</ul>
<h3 id="personal--general-musings">Personal &amp; General Musings</h3>
<p><em>A broad category for personal journals, life updates, and general commentary that defines much of the indie blogosphere.</em></p>
<ul>
<li><a href="https://aegir.org/words/lush">Aegir.org | Lush</a></li>
<li><a href="https://blakewatson.com/">blakewatson.com - Homepage</a></li>
<li><a href="https://www.eddiedale.com/blog">Blog | Eddie Dale</a></li>
<li><a href="https://julianpaul.me/blog">Blog - Julian Paul</a></li>
<li><a href="https://rosano.ca/blog">Blog</a></li>
<li><a href="https://www.flingelli.com/blog">Blog — Jakob Flingelli</a></li>
<li><a href="https://bobbyhiltz.com/">Bobby&rsquo;s Blog | BobbyHiltz.com</a></li>
<li><a href="https://cadence.moe/">cadence&rsquo;s website</a></li>
<li><a href="https://calv.info/">calv.info/</a></li>
<li><a href="https://www.cboxes.icu/">cboxes.icu/</a></li>
<li><a href="https://chrisglass.com/">Chris Glass</a></li>
<li><a href="https://www.cozypper.net/">Cozy Zypper</a></li>
<li><a href="https://freyavie.blog/">Freya Vie</a></li>
<li><a href="https://www.joshbeckman.org/">From the Desk of Josh Beckman</a></li>
<li><a href="https://grubz.net/">gru:Bz</a></li>
<li><a href="https://heyloura.com/">Hey Loura!</a></li>
<li><a href="https://hosentaschenblog.org/">hosentaschenblog.org</a> (<em>&ldquo;Pocket blog&rdquo; in German - might be fun for your language practice!</em>)</li>
<li><a href="https://jesperreiche.com/">Jesper</a></li>
<li><a href="https://joelchrono.xyz/">Joel&rsquo;s Homepage</a></li>
<li><a href="https://jshox.com/jay/">jshox.com/jay</a></li>
<li><a href="https://www.cassandrapages.com/">Just a moment&hellip;</a></li>
<li><a href="https://ludic.mataroa.blog/">Ludicity</a></li>
<li><a href="https://nice-marmot.net/">Main Page</a></li>
<li><a href="https://mandarismoore.com/">Mandaris</a></li>
<li><a href="https://noahie.xyz/blog/">Noahie&rsquo;s Blog</a></li>
<li><a href="https://www.henryleach.com/">Notes</a></li>
<li><a href="https://ptrbrynt.com/">Peter Bryant</a></li>
<li><a href="https://peterspath.net/">Peter&rsquo;s Path</a></li>
<li><a href="https://rebeccatoh.co/">rebeccatoh.co</a></li>
<li><a href="https://www.patrickrhone.net/">Rhoneisms – by Patrick Rhone, Master Generalist</a></li>
<li><a href="https://sals.place/">Sal&rsquo;s</a></li>
<li><a href="https://stfn.pl/">STFN</a></li>
<li><a href="https://stephen.nyc/">Stephen Petrey - hypertext, words and more</a></li>
<li><a href="https://stillness.digital/">Stillness.Digital | A Place To Rest</a></li>
<li><a href="https://aj.bourg.family/">The Anti Social – just something I was thinking</a></li>
<li><a href="https://notaprick.blog/">trying not to be a prick</a></li>
<li><a href="https://usamainsights.com/">Usama Insights</a></li>
<li><a href="https://vale.rocks/">Vale.Rocks</a></li>
<li><a href="https://victorwynne.com/">Victor Wynne</a></li>
<li><a href="https://www.jayeless.net/">Welcome! - Jayeless.net</a></li>
<li><a href="https://fredrocha.net/words/">Words - fredrocha.net</a></li>
<li><a href="https://blog.x-way.org/">x-log</a></li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:blog-dump-2025-aug">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/blog-dump-2025-aug/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/blogdump/">#blogdump</a>

<a href="https://jelloeater.me/tags/link_dump/">#link_dump</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Sunday Funday - Aug 2025</title>
      <link>
      https://jelloeater.me/blog/sunday-funday-2025-08/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/sunday-funday-2025-08/#comments
      </comments>
      <pubDate>Sat, 09 Aug 2025 21:41:49 +0000</pubDate>
      <category>ai</category>
      
      <category>design</category>
      
      <category>devops</category>
      
      <category>hardware</category>
      
      <category>link_dump</category>
      
      <category>python</category>
      
      <category>slow_living</category>
      
      <category>sunday_funday</category>
      
      <category>web_culture</category>
      <guid>https://jelloeater.me/blog/sunday-funday-2025-08/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/blog/sunday-funday-2025-08/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/blog/sunday-funday-2025-08/gen-cover.png"/>
    



      
      
      <description><![CDATA[Now with moar Linux]]></description>
      
      <content:encoded>
        <![CDATA[
        
        <h2 id="-tech--programming">🖥️ Tech &amp; Programming</h2>
<ul>
<li><a href="https://blog.frankel.ch/opentelemetry-tracing-jvm/">OpenTelemetry Tracing on the JVM</a></li>
<li><a href="https://golangweekly.com/issues/565">An explorer and visualizer for Go concurrency patterns</a></li>
<li><a href="https://github.blog/ai-and-ml/generative-ai/a-practical-guide-on-how-to-use-the-github-mcp-server/">A practical guide on how to use the GitHub MCP server</a></li>
<li><a href="https://aws.amazon.com/blogs/devops/gitops-continuous-delivery-with-argocd-and-eks-using-natural-language/">GitOps continuous delivery with ArgoCD and EKS using natural language</a></li>
<li><a href="https://packagemain.tech/p/terminal-ui-bubble-tea">Developing a terminal UI in Go with Bubble Tea</a></li>
<li><a href="https://simonwillison.net/2025/Aug/3/virtual-threads/#atom-everything">From Async/Await to Virtual Threads</a></li>
<li><a href="https://simonwillison.net/2025/Jul/14/application-development-without-programmers/#atom-everything">Application development without programmers</a></li>
<li><a href="https://www.reddit.com/r/zsh/comments/1lv6u2f/modern_linux_a_containerized_batteriesincluded/">Modern linux: a containerized, batteries-included collection of tools</a></li>
<li><a href="https://simonwillison.net/2025/Jul/8/uv-cache-prune/#atom-everything">uv cache prune</a></li>
</ul>
<h2 id="-ai--machine-learning">🤖 AI &amp; Machine Learning</h2>
<ul>
<li><a href="https://github.blog/ai-and-ml/generative-ai/junior-developers-arent-obsolete-heres-how-to-thrive-in-the-age-of-ai/">Junior developers aren’t obsolete: Here’s how to thrive in the age of AI</a></li>
<li><a href="https://packagemain.tech/p/evolution-of-code-review-practices-code-rabbit">The evolution of code review practices in the world of AI</a></li>
<li><a href="https://pxlnv.com/linklog/google-ai-search-response/">Google Says A.I. Search Is Just Great</a></li>
<li><a href="https://simonwillison.net/2025/Aug/4/chatgpt-agents-agent/#atom-everything">ChatGPT agent triggers crawls from Bingbot and Yandex</a></li>
<li><a href="https://thoughts.uncountable.uk/working-with-ai/">Working with AI</a></li>
<li><a href="https://www.bloodinthemachine.com/p/inside-the-escalating-struggle-over">Inside the escalating struggle over AI in journalism</a></li>
<li><a href="https://www.bloodinthemachine.com/p/trumps-ai-action-plan-is-a-blueprint">Trump&rsquo;s AI Action Plan is a blueprint for dystopia</a></li>
<li><a href="https://futurism.com/expert-people-losing-themselves-ai">Experts Warn that People Are Losing Themselves to AI</a></li>
<li><a href="https://futurism.com/pyschiatric-researchers-risk-ai">Psychiatric Researchers Warn of Grim Psychological Risks for AI Users</a></li>
<li><a href="https://pxlnv.com/blog/personal-superintelligence/">The Vagueness and Vagaries of ‘Personal Superintelligence’</a></li>
</ul>
<h2 id="-web--internet-culture">🌐 Web &amp; Internet Culture</h2>
<ul>
<li><a href="https://buttondown.com/justinpot/archive/youtube-and-the-end-of-internet-culture/">YouTube and the end of &ldquo;internet culture&rdquo;</a></li>
<li><a href="https://iam.skoo.bz/from-small-web-july-to-blaugust/">From Small Web July to Blaugust</a></li>
<li><a href="https://disassociated.com/classic-web-mastodon-page-explores-early-web/">Classic Web, a Mastodon page that explores the web of old</a></li>
<li><a href="https://disassociated.com/personal-websites-comments-not-social-media-channels/">Personal websites are the place for comments, not social media channels</a></li>
<li><a href="https://jtwoodhouse.com/the-rowboat-theres-a-life-after-social-media/">Rowboats: There&rsquo;s a life after social media</a></li>
<li><a href="https://ldstephens.net/blog/link-post-own-whats-yours/">Link Post: Own what’s yours</a></li>
<li><a href="https://mirroredworld.bearblog.dev/rediscovering-joy-in-blogging/">Rediscovering Joy in Blogging</a></li>
<li><a href="https://mirroredworld.bearblog.dev/minimalism-is-a-cult/">Minimalism is a Cult</a></li>
<li><a href="https://mirroredworld.bearblog.dev/if-it-works-it-works/">If It Works, It Works</a></li>
<li><a href="https://mirroredworld.bearblog.dev/popcap-games-are-still-fun-actually/">Popcap Games are Still Fun, Actually</a></li>
<li><a href="https://mirroredworld.bearblog.dev/getting-things-done-without-keeling-over/">Getting Things Done (Without Keeling Over)</a></li>
<li><a href="https://sentfrom.me/week-notes-2025-07-06/">Week Notes, 2025-07-06</a></li>
</ul>
<h2 id="-security--privacy">🛡️ Security &amp; Privacy</h2>
<ul>
<li><a href="https://www.docker.com/blog/mcp-horror-stories-the-supply-chain-attack/">MCP Horror Stories: The Supply Chain Attack</a></li>
<li><a href="https://www.darkreading.com/vulnerabilities-threats/old-ways-still-best-most-cybercriminals">Why the Old Ways Are Still the Best for Most Cybercriminals</a></li>
<li><a href="https://www.backblaze.com/blog/the-essential-guide-to-disaster-recovery-building-resilience-for-your-enterprise/">The Essential Guide to Disaster Recovery: Building Resilience for Your Enterprise</a></li>
<li><a href="https://aws.amazon.com/blogs/security/secure-file-sharing-solutions-in-aws-a-security-and-cost-analysis-guide-part-2/">Secure file sharing solutions in AWS: A security and cost analysis guide: Part 2</a></li>
<li><a href="https://www.darkreading.com/application-security/malicious-open-source-packages-spike">Malicious Open Source Packages Spike 188% YoY</a></li>
<li><a href="https://www.darkreading.com/vulnerabilities-threats/coinbase-breach-insider-risk">What the Coinbase Breach Says About Insider Risk</a></li>
<li><a href="https://www.darkreading.com/cybersecurity-operations/can-security-culture-be-taught-aws-says-yes">Can Security Culture Be Taught? AWS Says Yes</a></li>
<li><a href="https://www.darkreading.com/vulnerabilities-threats/fire-ant-cyber-spies-siloed-vmware-systems">‘Fire Ant&rsquo; Cyber Spies Compromise Siloed VMware Systems</a></li>
</ul>
<h2 id="-linux--open-source">🐧 Linux &amp; Open Source</h2>
<ul>
<li><a href="https://www.reddit.com/r/linux/comments/1miggm8/should_i_switch_over_to_a_linuxbased_software_for/">Should I switch over to a Linux-Based software for College?</a></li>
<li><a href="https://www.reddit.com/r/linux/comments/1m3lyvy/why_do_most_linux_users_prefer_thinkpad_laptops/">Why do most Linux users prefer ThinkPad laptops? share your opinion.</a></li>
<li><a href="https://www.reddit.com/r/linux/comments/1m4o5pt/linux_is_healing_me_mentally/">Linux is healing me mentally.</a></li>
<li><a href="https://itsfoss.com/file-transfer-apps-linux-android/">5 Open Source Apps You Can use for Seamless File Transfer Between Linux and Android</a></li>
<li><a href="https://itsfoss.com/linux-android-file-transfer/">Packet is the Linux App You Didn’t Know You Needed for Fast Android File Transfers</a></li>
<li><a href="https://www.reddit.com/r/linux/comments/1lwt4tt/flatsync_sync_flatpaks_between_devices/">FlatSync: Sync flatpaks between devices.</a></li>
<li><a href="https://www.reddit.com/r/linux/comments/1lxd0hl/systemctl_vs_busctl_as_dbus_clients_visual_guide/">‘systemctl’ vs ‘busctl’ as D-Bus clients (Visual Guide)</a></li>
<li><a href="https://www.omgubuntu.co.uk/2025/08/flameshot-13">Flameshot Screenshot App Gets First Major Update in 3 Years</a></li>
<li><a href="https://www.omgubuntu.co.uk/2025/07/mozilla-addons-listing-page-redesign">Firefox Add-Ons Website Revamps Listing Pages</a></li>
</ul>
<h2 id="-hardware--devices">🛠️ Hardware &amp; Devices</h2>
<ul>
<li><a href="https://www.backblaze.com/blog/backblaze-drive-stats-for-q2-2025/">Backblaze Drive Stats for Q2 2025</a></li>
<li><a href="https://distrowatch.com/12517">Distribution Release: Proxmox 9.0 &ldquo;Virtual Environment&rdquo;</a></li>
<li><a href="https://liliputing.com/magink-is-a-power-bank-with-a-color-e-ink-display-crowdfunding/">MagInk is a power bank with a color E Ink display (crowdfunding)</a></li>
<li><a href="https://liliputing.com/keyphone-is-a-feature-phone-with-swappable-keyboard-and-camera-modules-crowdfunding/">Keyphone is a feature phone with swappable keyboard and camera modules (crowdfunding)</a></li>
<li><a href="https://m.dpreview.com/opinion/8980731893/opinion-fixed-lens-cameras-are-no-substitute-for-mirrorless">Un-interchangeable: Fixed-lens cameras are no substitute for mirrorless</a></li>
<li><a href="https://www.commodore.net/">Reborn Commodore Is Taking Pre-Orders for New Commodore 64 Models</a></li>
<li><a href="https://ubuntu.com//blog/state-of-silicon-devices-q2">The State of Silicon and Devices – Q2 2025 roundup</a></li>
</ul>
<h2 id="-design--creativity">🎨 Design &amp; Creativity</h2>
<ul>
<li><a href="https://kottke.org/25/08/classical-statues-dressed-up-as-hipsters-1">Classical Statues Dressed Up As Hipsters</a></li>
<li><a href="https://thecreativeindependent.com/people/artist-hebru-brantley-on-reframing-past-stories-with-a-fresh-perspective/">Artist Hebru Brantley on reframing past stories with a fresh perspective</a></li>
<li><a href="https://thecreativeindependent.com/people/writer-publisher-and-podcaster-elly-blue-on-following-a-nontraditional-path/">Writer, publisher, and podcaster Elly Blue on following a nontraditional path</a></li>
<li><a href="https://www.thisiscolossal.com/2025/07/circe-irasema/">Cosmetics and Cosmos Blend in Circe Irasema’s Wooden Sculptures</a></li>
<li><a href="https://www.thisiscolossal.com/2025/07/slow-light-animated-film/">In ‘Slow Light,’ Past and Present Merge in the Uncanny, Animated Life of a Unique Protagonist</a></li>
</ul>
<h2 id="-personal-slow-living--miscellaneous">🧘 Personal, Slow Living &amp; Miscellaneous</h2>
<ul>
<li><a href="https://bigthink.com/series/the-big-think-interview/jefferson-fisher/">The true cost of always needing to win an argument</a></li>
<li><a href="https://bigthink.com/perception-box/brain-briefs-somatic-awareness/">Trauma, healing, and your nervous system explained</a></li>
<li><a href="https://lazybea.rs/hitn-2025/">How I take notes in 2025</a></li>
<li><a href="https://spacetimetech.wordpress.com/2025/07/05/projects-joy-etc/">Projects, joy, etc</a></li>
<li><a href="https://www.henrikkarlsson.xyz/p/agency">On agency</a></li>
<li><a href="https://maurice-renck.de/en/notes/2025/silence">Silence</a></li>
<li><a href="https://anildash.com/2025/06/11/time_for_something_new/">It&rsquo;s Time for Something New</a></li>
<li><a href="https://www.web-goddess.org/archive/80639">Cornish pasty</a></li>
<li><a href="https://www.ghastlymirror.xyz/blog/birdwatching-from-home/">Birdwatching From Home</a></li>
<li><a href="https://www.ghastlymirror.xyz/blog/blog-hosting-recomendations/">Blog Hosting Recomendations</a></li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:sunday-funday-2025-08">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/sunday-funday-2025-08/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/design/">#design</a>

<a href="https://jelloeater.me/tags/devops/">#devops</a>

<a href="https://jelloeater.me/tags/hardware/">#hardware</a>

<a href="https://jelloeater.me/tags/link_dump/">#link_dump</a>

<a href="https://jelloeater.me/tags/python/">#python</a>

<a href="https://jelloeater.me/tags/slow_living/">#slow_living</a>

<a href="https://jelloeater.me/tags/sunday_funday/">#sunday_funday</a>

<a href="https://jelloeater.me/tags/web_culture/">#web_culture</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>July Blog Dump</title>
      <link>
      https://jelloeater.me/blog/blog-dump-2025-july/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/blog-dump-2025-july/#comments
      </comments>
      <pubDate>Sat, 19 Jul 2025 20:53:23 +0000</pubDate>
      <category>blogdump</category>
      
      <category>link_dump</category>
      <guid>https://jelloeater.me/blog/blog-dump-2025-july/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/blog/blog-dump-2025-july/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/blog/blog-dump-2025-july/gen-cover.png"/>
    



      
      
      <description><![CDATA[Blogs ranging from tech and design to personal reflections and creative works]]></description>
      
      <content:encoded>
        <![CDATA[
        
        <h2 id="more-links-more-problems">More links, more problems</h2>
<p>While I really need to find more time to read through, I know I&rsquo;m not going to have the time to read through all of them. Maybe eventually I&rsquo;ll get through the whole list, but for now, I just want to at least leave this here incase anyone else finds it interesting. Pardon the LLM for the descriptions, but I don&rsquo;t have the time to write them all out myself.</p>
<h3 id="a-curated-collection-of-blogs-to-check-out"><strong>A Curated Collection of Blogs to Check Out:</strong></h3>
<ul>
<li><strong><a href="https://wildwild.directory/blog">The Wild Wild Web - Blog</a></strong>: A blog by the &ldquo;Wild Wild Web&rdquo; directory, focusing on curated content and discussions about the independent web and smaller online communities.</li>
<li><strong><a href="https://marmar22.tilde.team/">Marmar @ tilde.team</a></strong>: A personal blog likely part of the tildeverse, featuring various musings and thoughts from Marmar.</li>
<li><strong><a href="https://rdldn.co.uk/">Roast Dinners In London</a></strong>: A highly specific blog dedicated to reviewing and celebrating roast dinners found in London, complete with photos and detailed critiques.</li>
<li><strong><a href="https://www.laurahilliger.com/blog/">Posts - Laura Hilliger</a></strong>: Laura Hilliger&rsquo;s personal blog, featuring posts on open culture, technology, education, and social impact, often from a progressive viewpoint.</li>
<li><strong><a href="https://bohemiansultriness.nekoweb.org/">Bohemian Sultriness</a></strong>: A personal blog with an eclectic mix of thoughts, art, and possibly reflections on a bohemian lifestyle.</li>
<li><strong><a href="https://mjulius.com/">Michael Julius</a></strong>: Michael Julius&rsquo;s personal site, likely featuring a mix of professional work (design/development) and personal projects or writings.</li>
<li><strong><a href="https://insidemordecai.com/">Mordecai Kipng&rsquo;etich</a></strong>: Mordecai Kipng&rsquo;etich&rsquo;s personal blog, offering insights and thoughts on various topics, potentially tech or personal development.</li>
<li><strong><a href="https://gurupanguji.com/">@gurupanguji - Ramblings of an Eccentric Soul</a></strong>: A blog offering philosophical, personal, and sometimes humorous &ldquo;ramblings&rdquo; from a unique perspective.</li>
<li><strong><a href="https://notes.jeddacp.com/">Notes by JCProbably</a></strong>: A collection of notes and short-form writings from JCProbably, covering a range of interests.</li>
<li><strong><a href="https://perrotta.dev/">¬ just serendipity 🍀</a></strong>: The personal blog of a developer (Perrotta), likely sharing thoughts on code, personal projects, and other serendipitous discoveries.</li>
<li><strong><a href="https://uncorrected.net/">Uncorrected - By Alex Nonnemacher</a></strong>: Alex Nonnemacher&rsquo;s blog, presenting &ldquo;uncorrected&rdquo; thoughts, essays, and observations, often on culture and technology.</li>
<li><strong><a href="https://jagibson.org/">jagibson.org</a></strong>: A personal website for Jagibson, likely containing updates, projects, or personal reflections.</li>
<li><strong><a href="https://folkmoss.bearblog.dev/">The Folkmoss Logs</a></strong>: A personal journal or log of thoughts and experiences, hosted on the minimal Bear Blog platform, often evoking a cozy, reflective tone.</li>
<li><strong><a href="https://thewallflowerdigest.co.uk/">The Wallflower Digest - Blogging book reviews, embroidery &amp; whatever else may on my mind.</a></strong>: A charming UK-based blog covering book reviews, embroidery projects, and a variety of personal thoughts and interests.</li>
<li><strong><a href="https://jvns.ca/">Julia Evans</a></strong>: Julia Evans&rsquo;s highly popular blog known for its clear, insightful, and often illustrated explanations of technical concepts, particularly for programmers.</li>
<li><strong><a href="https://www.jemjabella.co.uk/">Jem - UK blogger - Developer - Entrepeneur</a></strong>: Jem&rsquo;s blog, showcasing insights from a UK-based developer and entrepreneur, likely covering technology, business, and personal experiences.</li>
<li><strong><a href="https://img25.com/">my photos</a></strong>: A minimalist photo blog, dedicated to sharing personal photography.</li>
<li><strong><a href="https://www.benji.dog/">benji</a></strong>: A simple, personal blog that might include updates on life, projects, or musings, perhaps with a charming, laid-back vibe.</li>
<li><strong><a href="https://memory.elliott.computer/">memory site</a></strong>: A personal &ldquo;memory site&rdquo; by Elliott, possibly a digital garden or collection of thoughts and personal archives.</li>
<li><strong><a href="https://www.mollywhite.net/">Molly White</a></strong>: Molly White&rsquo;s critical blog, often focusing on web3, cryptocurrency, and financial technology, known for its in-depth analysis and skepticism.</li>
<li><strong><a href="https://www.eliseomartelli.it/">Eliseo Martelli</a></strong>: Eliseo Martelli&rsquo;s personal and professional website, likely featuring work related to web development, design, or personal interests.</li>
<li><strong><a href="https://coyotetracks.org/">Coyote Tracks</a></strong>: A blog that might explore nature, travel, personal journeys, or reflections on the wild.</li>
<li><strong><a href="https://marksuth.dev/">Home - Mark Sutherland</a></strong>: Mark Sutherland&rsquo;s developer blog, where he shares insights, projects, and thoughts on software development.</li>
<li><strong><a href="https://v6.robweychert.com/blog/">Blog Archive | Rob Weychert</a></strong>: The blog archive of Rob Weychert, likely containing reflections on design, technology, and culture, with a focus on past writings.</li>
<li><strong><a href="https://tedium.co/">Tedium | An Offbeat Digital Newsletter</a></strong>: A unique newsletter and blog that delves into obscure, fascinating, and often overlooked corners of history, technology, and culture.</li>
<li><strong><a href="https://shkspr.mobi/blog/">Terence Eden’s Blog - Regular nonsense about tech and its effects 🙃</a></strong>: Terence Eden&rsquo;s blog, offering often humorous and insightful commentary on technology, its societal effects, and digital policy.</li>
<li><strong><a href="https://bookmaniac.org/">Composite - Internet - information - criticism - poetry - connection - feminism - open source - open spaces - translation - digression - recursion - boats - wheelchairs - disability rights - ranting - the future - by Liz Henry</a></strong>: Liz Henry&rsquo;s incredibly diverse blog, covering a vast range of topics including internet culture, open source, feminism, and disability rights with critical insight.</li>
<li><strong><a href="https://birchtree.me/">Birchtree</a></strong>: A personal blog, likely featuring thoughts on technology, productivity, and everyday life.</li>
<li><strong><a href="https://www.aleesteele.com/">/home (aleesteele.com)</a></strong>: A personal online space by Alee Steele, potentially sharing reflections, creative work, or personal updates.</li>
<li><strong><a href="https://www.scottishstoater.com/">Scottish Stoater - A collection of photographs and notes by Chris Collins</a></strong>: Chris Collins&rsquo;s blog, featuring stunning photography and personal notes from Scotland, capturing its landscapes and spirit.</li>
<li><strong><a href="https://www.chrisvogt.me/">Chris Vogt - Software Engineer in San Francisco | Digital Garden of Photography, Piano, and Travel</a></strong>: Chris Vogt&rsquo;s personal digital garden, blending his software engineering insights with his passions for photography, piano, and travel.</li>
<li><strong><a href="https://www.rousette.org.uk/">but she&rsquo;s a girl&hellip;</a></strong>: A personal blog by a woman, sharing her thoughts and experiences, possibly with a focus on feminism or personal identity.</li>
<li><strong><a href="https://write.as/matt/">Matt - Write.as</a></strong>: A minimalist blog by Matt, hosted on Write.as, likely featuring personal reflections or short-form essays.</li>
<li><strong><a href="https://sethw.xyz/">HELLO, I&rsquo;M SETH WERKHEISER - Founder of the Social Media Escape Club</a></strong>: Seth Werkheiser&rsquo;s blog, promoting a break from traditional social media and offering insights on independent online presence.</li>
<li><strong><a href="https://www.nicksimson.com/">Nick Simson, Internet Nobody.</a></strong>: Nick Simson&rsquo;s self-deprecatingly named blog, offering personal thoughts and observations on technology, internet culture, and daily life.</li>
<li><strong><a href="https://xandra.cc/">the museum of alexandra</a></strong>: Alexandra&rsquo;s unique personal site, presented as a &ldquo;museum&rdquo; of her thoughts, projects, and digital artifacts.</li>
<li><strong><a href="https://frills.dev/">Home - Frills</a></strong>: A developer&rsquo;s blog, potentially focusing on the &ldquo;frills&rdquo; of web development-design, user experience, and aesthetic details.</li>
<li><strong><a href="https://blog.gerbenjacobs.nl/">Gerben Jacobs</a></strong>: Gerben Jacobs&rsquo;s personal blog, likely covering topics related to technology, personal development, or professional insights.</li>
<li><strong><a href="https://karshwrites.com/">Karsh Writes</a></strong>: A blog primarily dedicated to Karsh&rsquo;s writing, which could include fiction, essays, or personal reflections.</li>
<li><strong><a href="https://paulrjohnson.net/">Paul Johnson</a></strong>: Paul Johnson&rsquo;s personal website, likely featuring a mix of professional work, personal interests, or reflective essays.</li>
<li><strong><a href="https://glycerinequeenmedia.com/">Glycerine Queen Media - News, opinion and everything in between</a></strong>: A media blog offering news, opinions, and general commentary on a wide range of topics.</li>
<li><strong><a href="https://veronique.ink/">véronique</a></strong>: Véronique&rsquo;s personal site, potentially a portfolio, digital garden, or blog covering her creative and intellectual pursuits.</li>
<li><strong><a href="https://tracydurnell.com/">Tracy Durnell&rsquo;s Mind Garden - Thinking and Learning In Public</a></strong>: Tracy Durnell&rsquo;s &ldquo;mind garden,&rdquo; a concept for a personal blog where thoughts, ideas, and learning processes are documented publicly.</li>
<li><strong><a href="https://aaronparecki.com/">Aaron Parecki</a></strong>: Aaron Parecki&rsquo;s personal website, a prominent figure in the IndieWeb movement, often documenting his tools, projects, and thoughts on personal data and online identity.</li>
<li><strong><a href="https://anderegg.ca/">anderegg.ca | Something (slightly) less boring than nothing.</a></strong>: A personal blog from anderegg.ca promising content &ldquo;slightly less boring than nothing,&rdquo; implying a casual and engaging style.</li>
<li><strong><a href="https://artlung.com/blog/">ArtLung: Joe Crawford</a></strong>: Joe Crawford&rsquo;s blog, often exploring the intersection of art, technology, and personal expression.</li>
<li><strong><a href="https://www.cboxes.icu/">CBOXES PHOTOGRAPHY</a></strong>: A dedicated photography blog, showcasing images and possibly accompanying narratives.</li>
<li><strong><a href="https://rknight.me/blog/">Blog • Robb Knight</a></strong>: Robb Knight&rsquo;s personal blog, typically featuring thoughts on technology, web development, and personal projects.</li>
<li><strong><a href="https://sergiswriting.com/">Sergi&rsquo;s writing</a></strong>: Sergi&rsquo;s dedicated space for his writing, which could encompass various forms and topics.</li>
<li><strong><a href="https://alexwlchan.net/">alexwlchan</a></strong>: Alex Chan&rsquo;s technical blog, offering insights on software engineering, Python, and personal projects.</li>
<li><strong><a href="https://dominikhofer.me/">Curious. Creative. Coder. | Dominik Hofer</a></strong>: Dominik Hofer&rsquo;s personal site, embodying his interests as a curious, creative coder, likely sharing projects and thoughts.</li>
<li><strong><a href="https://alabut.com/writing/">Writing Archives | Essays, articles &amp; notes</a></strong>: Alabut&rsquo;s collection of essays, articles, and notes, serving as a public archive of their written works.</li>
<li><strong><a href="https://george-lakoff.com/">George Lakoff</a></strong>: The official website and blog of George Lakoff, a cognitive linguist known for his work on metaphor and its role in politics and thought.</li>
<li><strong><a href="https://omeratagun.net/">Omers playground</a></strong>: Omer Atagun&rsquo;s personal &ldquo;playground,&rdquo; likely a space for experimenting with code, sharing personal projects, or exploring ideas.</li>
<li><strong><a href="https://rubenerd.com/">Rubenerd</a></strong>: Rubenerd&rsquo;s blog, featuring tech news, Linux-related content (which you&rsquo;d appreciate!), personal updates, and general internet culture.</li>
<li><strong><a href="https://ialja.com/">Meet iAlja</a></strong>: A personal blog introducing iAlja and their thoughts, projects, or professional endeavors.</li>
<li><strong><a href="https://refugionorte.com/">Refugio Norte - Reflexiones sobre la experiencia humana y los espacios arquitectónicos</a></strong>: A blog offering reflections on the human experience and architectural spaces, likely from a Spanish-speaking perspective.</li>
<li><strong><a href="https://pgadey.ca/">Parker Glynn-Adey</a></strong>: Parker Glynn-Adey&rsquo;s personal website, possibly featuring academic work, personal projects, or general musings.</li>
<li><strong><a href="https://erikjohannes.no/">Erik Johannes Husom</a></strong>: Erik Johannes Husom&rsquo;s personal blog, sharing thoughts, projects, or professional updates.</li>
<li><strong><a href="https://beradadisini.com/">Home - Beradadisini</a></strong>: A personal blog or online presence, likely based in Indonesia given the name.</li>
<li><strong><a href="https://www.ottorask.com/">Home - ottorask.com</a></strong>: Otto Rask&rsquo;s personal website, potentially a portfolio, blog, or digital garden.</li>
<li><strong><a href="https://ggirelli.info/">ggirelli | Filopoetica</a></strong>: A blog by ggirelli combining philosophy and poetry (&ldquo;Filopoetica&rdquo;).</li>
<li><strong><a href="https://cybrkyd.com/">cybrkyd - just another cyber kid</a></strong>: A personal blog by &ldquo;cybrkyd,&rdquo; reflecting a youthful or digital-native perspective on technology and life.</li>
<li><strong><a href="https://bneil.me/">bneil.me | Home</a></strong>: B Neil&rsquo;s personal website, likely featuring a mix of professional information, personal projects, or blog posts.</li>
<li><strong><a href="https://renecoignard.com/">renecoignard.com/</a></strong>: René Coignard&rsquo;s personal website, probably a portfolio or blog.</li>
<li><strong><a href="https://www.dazeland.com/index-en.html">Dazeland - We won’t nag you with cookies!</a></strong>: A blog that proudly declares no cookie nags, focusing on art, design, and creative content.</li>
<li><strong><a href="https://creativwork.org/">creativwork.org</a></strong>: A website dedicated to showcasing and discussing creative work.</li>
<li><strong><a href="https://frederickvanbrabant.com/">Frederick&rsquo;s delirious rantings</a></strong>: Frederick&rsquo;s personal blog for his &ldquo;delirious rantings,&rdquo; suggesting unedited thoughts on various topics.</li>
<li><strong><a href="https://wordsdeferred.com/">Words Deferred - Free fiction, ruminations on craft, and a radically open writing process</a></strong>: A blog by a writer sharing free fiction, thoughts on the writing craft, and a transparent look into their writing process.</li>
<li><strong><a href="https://olly.pagecord.com/">Posts from @olly</a></strong>: A personal blog or collection of posts from Olly, likely on a variety of personal interests.</li>
<li><strong><a href="https://kyscg.github.io/">New Ideas</a></strong>: A blog or repository for &ldquo;new ideas,&rdquo; possibly related to coding projects, innovative concepts, or personal insights.</li>
<li><strong><a href="https://essentialthinker.com/">Essential Thinker</a></strong>: A blog dedicated to thoughtful analysis and reflection on essential topics.</li>
<li><strong><a href="https://arbourtrary.com/">ɑrbərtrɛri</a></strong>: A personal blog with a unique name, likely featuring arbitrary but interesting thoughts and observations.</li>
<li><strong><a href="https://ivndbt.com/">Home (ivndbt.com)</a></strong>: A personal website with no overt theme, potentially a digital garden or collection of thoughts.</li>
<li><strong><a href="https://hq.getmatter.com/">Matter</a></strong>: A reading app and platform that also features curated articles and a blog with insights on reading, writing, and current events.</li>
<li><strong><a href="https://ninox.com/en">Ninox | The low-code platform for all business processes</a></strong>: While primarily a low-code platform, their blog likely covers business processes, database solutions, and tech productivity.</li>
<li><strong><a href="https://stfn.pl/">STFN</a></strong>: A personal or project blog from Poland, likely focusing on tech, development, or personal interests.</li>
<li><strong><a href="https://morgan.zoemp.be/">Morgan - Peanuts 🥜 - Quality is always right</a></strong>: Morgan&rsquo;s blog, possibly with short, concise, and high-quality &ldquo;peanut&rdquo; sized thoughts.</li>
<li><strong><a href="https://davehenry.blog/">Dave Henry Blog</a></strong>: Dave Henry&rsquo;s personal blog, featuring his thoughts and experiences.</li>
<li><strong><a href="https://nullrouted.space/">Nullrouted Space - The void is my friend.</a></strong>: A technical or philosophical blog with a focus on networks, privacy, or the &ldquo;void&rdquo; of the internet.</li>
<li><strong><a href="https://netbros.com/">Notes (netbros.com)</a></strong>: A collection of notes or short posts by Netbros, possibly on tech or personal reflections.</li>
<li><strong><a href="https://bucketz.wtf/">A Drop From The Bucket</a></strong>: A blog offering small, insightful &ldquo;drops from the bucket&rdquo; of knowledge or personal experience.</li>
<li><strong><a href="https://www.martinhaagen.se/">MartinHaagen.se</a></strong>: Martin Haagen&rsquo;s personal website, likely featuring professional work, personal projects, or blog posts.</li>
<li><strong><a href="https://laze.net/">laze.net</a></strong>: A personal blog or website that might have a relaxed, casual approach to its content.</li>
<li><strong><a href="https://alexcarpenter.me/notes">Notes // Alex Carpenter</a></strong>: Alex Carpenter&rsquo;s collection of notes, serving as a digital garden of thoughts and learnings.</li>
</ul>
<h3 id="recent-discoveries-saved-6292025-32806-pm"><strong>Recent Discoveries (Saved 6/29/2025, 3:28:06 PM):</strong></h3>
<ul>
<li><strong><a href="https://hypercritical.co/">Hypercritical</a></strong>: John Siracusa&rsquo;s renowned blog, known for its extremely detailed, thoughtful, and often lengthy commentary on Apple products and technology in general (though you&rsquo;re not an Apple fan, his depth of analysis is noteworthy).</li>
<li><strong><a href="https://blog.jpnearl.com/">Life Is Such A Sweet Insanity.</a></strong>: JP Nearl&rsquo;s personal blog, offering reflections on life&rsquo;s eccentricities and personal experiences.</li>
<li><strong><a href="https://joshcollinsworth.com/">Josh Collinsworth</a></strong>: Josh Collinsworth&rsquo;s blog, often covering web development, front-end technologies, and related industry thoughts.</li>
<li><strong><a href="https://meyerweb.com/">meyerweb.com</a></strong>: Eric Meyer&rsquo;s influential blog, a foundational resource for web standards, CSS, and web design, often featuring technical insights and personal reflections.</li>
<li><strong><a href="https://alicebartlett.co.uk/">The website of Alice Bartlett</a></strong>: Alice Bartlett&rsquo;s personal website, likely featuring her work in data, technology, or personal insights.</li>
<li><strong><a href="https://tantek.com/">Tantek Çelik</a></strong>: Tantek Çelik&rsquo;s personal website and blog, a key figure in microformats and the IndieWeb movement, focused on personal data and web standards.</li>
<li><strong><a href="https://www.jwz.org/blog/">jwz</a></strong>: Jamie Zawinski&rsquo;s classic, often irreverent, and highly opinionated blog on software, technology, and personal anecdotes.</li>
<li><strong><a href="https://librarian.aedileworks.com/">Librarian of Things - Mita Williams. Her blog.</a></strong>: Mita Williams&rsquo;s blog, sharing insights from a librarian&rsquo;s perspective on information, technology, and public life.</li>
<li><strong><a href="https://alis.me/">» alis.me</a></strong>: Alis&rsquo;s personal blog, potentially a digital garden or collection of thoughts and projects.</li>
<li><strong><a href="https://emilygorcenski.com/">Emily F. Gorcenski</a></strong>: Emily Gorcenski&rsquo;s blog, often covering data science, social justice, technology&rsquo;s societal impact, and political commentary from a progressive stance.</li>
</ul>
<h3 id="more-great-reads-saved-6272025-20017-pm"><strong>More Great Reads (Saved 6/27/2025, 2:00:17 PM):</strong></h3>
<ul>
<li><strong><a href="https://www.sparklytrainers.com/">The travels of Mary Loosemore</a></strong>: Mary Loosemore&rsquo;s blog, documenting her travels and experiences, often with a lighthearted and engaging tone.</li>
<li><strong><a href="https://www.birdsoutsidemywindow.org/">Outside My Window | A Blog of Birds &amp; Nature with Kate St. John</a></strong>: Kate St. John&rsquo;s nature blog, focusing on birdwatching, wildlife, and observations from her window.</li>
<li><strong><a href="https://gwern.net/">Essays · Gwern.net</a></strong>: Gwern Branwen&rsquo;s extensive collection of long-form essays, covering a wide range of topics from psychology and technology to statistics and personal experiments.</li>
<li><strong><a href="https://xlthlx.com/en/">Third Level | Don&rsquo;t waste your time, or time will waste you.</a></strong>: A blog that offers reflections and philosophical insights on productivity, personal growth, and making the most of one&rsquo;s time.</li>
<li><strong><a href="https://jasdev.me/">Distillations (jasdev.me)</a></strong>: Jasdev&rsquo;s blog, where he &ldquo;distills&rdquo; complex ideas into clear, concise posts, often on technology or personal development.</li>
<li><strong><a href="https://www.robinsloan.com/">Robin Sloan</a></strong>: Robin Sloan&rsquo;s personal website and blog, from a writer and media inventor, featuring his unique projects, thoughts on technology, and storytelling.</li>
<li><strong><a href="https://maggieappleton.com/">Maggie Appleton</a></strong>: Maggie Appleton&rsquo;s visual blog, known for her hand-drawn illustrations and insightful explanations of complex concepts, often related to knowledge work and digital gardens.</li>
<li><strong><a href="https://zioibi.com/">Adam Wood</a></strong>: Adam Wood&rsquo;s personal website, likely a portfolio or blog showcasing his work and thoughts.</li>
</ul>
<h3 id="latest-finds-saved-6292025-115324-pm"><strong>Latest Finds (Saved 6/29/2025, 11:53:24 PM):</strong></h3>
<ul>
<li><strong><a href="https://coxy.co/">coxy - designer and internet addict</a></strong>: Coxy&rsquo;s blog, blending insights from a designer&rsquo;s perspective with reflections on internet culture and digital life.</li>
<li><strong><a href="https://fromemily.com/">&hellip;from Emily Moran Barwick</a></strong>: Emily Moran Barwick&rsquo;s personal blog, likely featuring updates, personal thoughts, or creative projects.</li>
<li><strong><a href="https://www.elmikewalsh.com/">Front-End Web Designer, Developer &amp; Translator in Villarrica</a></strong>: El Mike Walsh&rsquo;s blog, detailing insights from his work as a front-end web designer, developer, and translator.</li>
<li><strong><a href="https://davidallengreen.com/">The Law and Policy Blog - Independent commentary on law and policy from a liberal constitutionalist and critical perspective</a></strong>: David Allen Green&rsquo;s blog, providing independent and critical commentary on law and policy from a liberal constitutionalist viewpoint, which aligns with your progressive political leanings.</li>
<li><strong><a href="https://timharek.no/">Tim Hårek</a></strong>: Tim Hårek&rsquo;s personal blog, likely featuring thoughts, projects, or professional insights.</li>
<li><strong><a href="https://netwars.pelicancrossing.net/">net.wars - computers, freedom, and privacy</a></strong>: Wendy Grossman&rsquo;s long-running blog focusing on the critical intersection of computers, digital freedom, and privacy issues.</li>
<li><strong><a href="https://bryanmanio.com/">Bryan Maniotakis - Design Director</a></strong>: Bryan Maniotakis&rsquo;s blog, offering insights into design, creative direction, and professional experiences.</li>
<li><strong><a href="https://rys.io/en/index.html">Songs on the Security of Networks</a></strong>: A blog by RYS.io, likely delving into cybersecurity topics, network security, and related technical discussions.</li>
<li><strong><a href="https://photothunk.blogspot.com/">Secure Site Not Available</a></strong>: A blog primarily focused on photography, sharing images and possibly thoughts on the photographic process.</li>
<li><strong><a href="https://www.bruh.ltd/">Ruby Klover</a></strong>: A personal blog by Ruby Klover, with a unique domain, likely featuring personal reflections or creative content.</li>
<li><strong><a href="https://impossiblesongs.blogspot.com/">impossible songs</a></strong>: A blog dedicated to &ldquo;impossible songs,&rdquo; suggesting a focus on music, creative audio projects, or musings on the art of songwriting.</li>
<li><strong><a href="https://wiby.me/">Wiby - Search Engine for the Classic Web</a></strong>: While a search engine, their blog or &ldquo;about&rdquo; section often provides commentary on the classic web, privacy, and independent web discovery.</li>
</ul>
<h3 id="more-interesting-blogs"><strong>More Interesting Blogs:</strong></h3>
<ul>
<li><strong><a href="https://hacdias.com/">Home - Henrique Dias</a></strong>: Henrique Dias&rsquo;s personal website, showcasing his projects, thoughts, and professional work, likely in development or open source.</li>
<li><strong><a href="https://www.jasonhalf.com/">JASON HALF : writer - Home</a></strong>: Jason Half&rsquo;s dedicated writing website, where he publishes his works, essays, or personal blog posts.</li>
<li><strong><a href="https://www.kryobot.io/">kryobot - Home of Emanuel Schwarz</a></strong>: Emanuel Schwarz&rsquo;s personal website, possibly focusing on robotics, AI, or other tech-related projects.</li>
<li><strong><a href="https://lindsma.com/">Linda Ma</a></strong>: Linda Ma&rsquo;s personal website, potentially a portfolio, digital garden, or blog covering her interests.</li>
<li><strong><a href="https://www.karlkoch.me/">Karl Koch | Home</a></strong>: Karl Koch&rsquo;s personal website, likely featuring his work, thoughts, or projects.</li>
<li><strong><a href="https://christopherharper.media/">Christopher Harper | Documenting life and exploration on Guam</a></strong>: Christopher Harper&rsquo;s blog, visually documenting life and explorations on the island of Guam through photos and stories.</li>
<li><strong><a href="https://calebhailey.com/">Caleb Hailey</a></strong>: Caleb Hailey&rsquo;s personal website, probably a professional portfolio or blog.</li>
<li><strong><a href="https://oliverobscure.xyz/">obscure blog</a></strong>: Oliver Obscure&rsquo;s personal blog, likely offering unique, perhaps unconventional, thoughts and observations.</li>
<li><strong><a href="https://blog.ucant.org/">Martin Keegan: All posts</a></strong>: Martin Keegan&rsquo;s blog, featuring a wide array of posts on technology, programming, and personal musings, often with a distinct perspective.</li>
<li><strong><a href="https://captainawkward.com/">CaptainAwkward.com - Don&rsquo;t need to be cool to be kind.</a></strong>: A popular advice blog focused on navigating awkward social situations, boundaries, and interpersonal relationships with kindness and directness.</li>
<li><strong><a href="https://tomcritchlow.com/">Tom Critchlow. Move. Think. Create.</a></strong>: Tom Critchlow&rsquo;s blog, where he writes about strategy, digital products, independent consulting, and the future of work.</li>
<li><strong><a href="https://fredrocha.net/words/">Words - fredrocha.net</a></strong>: Fred Rocha&rsquo;s space for his written works, which could include essays, articles, or personal reflections.</li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:blog-dump-2025-july">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/blog-dump-2025-july/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/blogdump/">#blogdump</a>

<a href="https://jelloeater.me/tags/link_dump/">#link_dump</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Moving my diary to Obsidian</title>
      <link>
      https://jelloeater.me/blog/diary-migrate/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/diary-migrate/#comments
      </comments>
      <pubDate>Mon, 07 Jul 2025 01:32:00 -0500</pubDate>
      <category>diary</category>
      
      <category>obsidian</category>
      
      <category>personal</category>
      
      <category>private</category>
      
      <category>update</category>
      <guid>https://jelloeater.me/blog/diary-migrate/</guid>
      
      <media:content url="https://jelloeater.me/blog/diary-migrate.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/diary-migrate.png"/>
      


    
    



      
      
      <description><![CDATA[Keeping private thoughts; private]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/diary-migrate.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>So, I recently decided to migrate from <a href="https://diaroapp.com">Diaro</a> to Two Obsidian for my diary. Not that I have a problem with their website. For the low price of $20, I believe it was, I think it&rsquo;s a good deal. They gave me a lifetime subscription to their site, which utilizes Dropbox to sync its data backend. They&rsquo;ve never lost a single entry, and they&rsquo;ve helped me chronicle my life over the last three or four years. One of the great features they had was that you could upload a photo, and it would tag the location and set the time and date based on the photo. This was a great feature, and something I hope I can find similar to in Obsidian.</p>
<h2 id="getting-the-data-out">Getting the data out</h2>
<p>Getting the data out of the service wasn&rsquo;t exactly the easiest process, though they offered a few different export options, one that did CSV and one that did Text. When the PDF, A few different things, depending on which platform you tried to export from, the options were different depending on whether you did it on mobile or on the website. This was a little bit difficult because all the formats that they offered didn&rsquo;t include photos, at least in an easy-to-access format. Y, You could try and export the photos by ripping them out of the PDFs, but that was a nightmare. Luckily, I was able to do some digging through the Dropbox account that it happened to be using as a backend sync. In there. I found some XML files and my photos all as JPEGs. The XML file wasn&rsquo;t the easiest to parse, but thankfully, the structure was relatively sane. Attachments were in one table, Locations in another, and then the direct entries themselves in another table, all on one giant XML document.</p>
<h2 id="custom-scripting">Custom scripting</h2>
<p>I was able to cook up a little bit of Python magic to get all this converted into a standardized markdown format with some YAML front matter and the images embedded at the bottom of the posts. All in all. This took two to three days Of Work over a weekend. Nothing too crazy, but I do wish that they offered a better export option. Maybe something with JSON or at least CSVs with attachments easily linked? Maybe like a photo dump option as well, just some food for thought. Either way, I can&rsquo;t complain too much. For a whopping $20, I spent on a lifetime license, and the fact that they never lost a single post, but arguably, I would have to probably thank Dropbox for that. As they were debating the back end. Thankfully, the app always worked on every single device, and the website was reliable, so no digs against them. I&rsquo;m gonna include a link to the Python script or maybe just embed it in this post. At the bottom, we&rsquo;ll see. Just in case, it can help somebody else out down the road by moving their notes over from this service to either Obsidian or another markdown-based Diary application. Thanks!</p>
<p>🖖 Jelloeater</p>
<h2 id="migration-script">Migration script</h2>


  
    <blockquote>
      <p>This script is used to migrate data from Diaro to Obsidian, parsing XML files and creating markdown files with metadata. It&rsquo;s kind of crap, but it DOES work. Feel free to email me if you need help&hellip; ❤️</p>
    </blockquote>
  
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env -S uv run --quiet</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># /// script</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># requires-python = &#34;&gt;=3.12&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># dependencies = [</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#     &#34;pymarkdownlnt&#34;,</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ]</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># ///</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> xml.etree.ElementTree <span style="color:#66d9ef">as</span> ET
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> datetime <span style="color:#f92672">import</span> datetime
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> zipfile
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> os
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> re
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> pymarkdown
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> xml.etree.ElementTree <span style="color:#66d9ef">as</span> ET
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Location</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __init__(self, uid, title, address, lat, lng, zoom):
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>uid <span style="color:#f92672">=</span> uid
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>title <span style="color:#f92672">=</span> title
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>address <span style="color:#f92672">=</span> address
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>lat <span style="color:#f92672">=</span> lat
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>lng <span style="color:#f92672">=</span> lng
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>zoom <span style="color:#f92672">=</span> zoom
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __repr__(self):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> (
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Location(uid=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>uid<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, title=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>title<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, &#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;address=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>address<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, lat=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>lat<span style="color:#e6db74">}</span><span style="color:#e6db74">, lng=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>lng<span style="color:#e6db74">}</span><span style="color:#e6db74">, zoom=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>zoom<span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Attachment</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __init__(self, uid, entry_uid, type, filename, position):
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>uid <span style="color:#f92672">=</span> uid
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>entry_uid <span style="color:#f92672">=</span> entry_uid
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>type <span style="color:#f92672">=</span> type
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>filename <span style="color:#f92672">=</span> filename
</span></span><span style="display:flex;"><span>        self<span style="color:#f92672">.</span>position <span style="color:#f92672">=</span> position
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">def</span> __repr__(self):
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> (
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;Attachment(uid=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>uid<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, entry_uid=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>entry_uid<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, &#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;type=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>type<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, filename=&#39;</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">&#39;, position=</span><span style="color:#e6db74">{</span>self<span style="color:#f92672">.</span>position<span style="color:#e6db74">}</span><span style="color:#e6db74">)&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">parse_locations_xml</span>(xml_file_path):
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Parses an XML file containing location data into a list of Location objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Args:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        xml_file_path (str): The path to the XML file.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Returns:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        list: A list of Location objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    tree <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>parse(xml_file_path)
</span></span><span style="display:flex;"><span>    root <span style="color:#f92672">=</span> tree<span style="color:#f92672">.</span>getroot()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    locations <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> r_element <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;r&#34;</span>):
</span></span><span style="display:flex;"><span>        uid <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        title <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;title&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;title&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>        address <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;address&#34;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;address&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        lat_text <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lat&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lat&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0.0&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>        lng_text <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lng&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;lng&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0.0&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>        zoom_text <span style="color:#f92672">=</span> (
</span></span><span style="display:flex;"><span>            r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;zoom&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;zoom&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0&#34;</span>
</span></span><span style="display:flex;"><span>        )
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            lat <span style="color:#f92672">=</span> float(lat_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            lat <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            lng <span style="color:#f92672">=</span> float(lng_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            lng <span style="color:#f92672">=</span> <span style="color:#ae81ff">0.0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            zoom <span style="color:#f92672">=</span> int(zoom_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            zoom <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        location <span style="color:#f92672">=</span> Location(uid, title, address, lat, lng, zoom)
</span></span><span style="display:flex;"><span>        locations<span style="color:#f92672">.</span>append(location)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> locations
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">parse_attachments_xml</span>(xml_file_path):
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Parses an XML file containing attachment data into a list of Attachment objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Args:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        xml_file_path (str): The path to the XML file.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Returns:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        list: A list of Attachment objects.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    tree <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>parse(xml_file_path)
</span></span><span style="display:flex;"><span>    root <span style="color:#f92672">=</span> tree<span style="color:#f92672">.</span>getroot()
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    attachments <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> r_element <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;r&#34;</span>):
</span></span><span style="display:flex;"><span>        uid <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;uid&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        entry_uid <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;entry_uid&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;entry_uid&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        type <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;type&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;type&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        filename <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;filename&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;filename&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        position_text <span style="color:#f92672">=</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;position&#34;</span>)<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> r_element<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#34;position&#34;</span>) <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;0&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">try</span>:
</span></span><span style="display:flex;"><span>            position <span style="color:#f92672">=</span> int(position_text)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">except</span> <span style="color:#a6e22e">ValueError</span>:
</span></span><span style="display:flex;"><span>            position <span style="color:#f92672">=</span> <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        attachment <span style="color:#f92672">=</span> Attachment(uid, entry_uid, type, filename, position)
</span></span><span style="display:flex;"><span>        attachments<span style="color:#f92672">.</span>append(attachment)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> attachments
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">write_files</span>():
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    Parses the Diaro XML data from a string, creates markdown files,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    and zips them up.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    data <span style="color:#f92672">=</span> open(<span style="color:#e6db74">&#39;DiaroBackup.xml&#39;</span>)<span style="color:#f92672">.</span>read()
</span></span><span style="display:flex;"><span>    root <span style="color:#f92672">=</span> ET<span style="color:#f92672">.</span>fromstring(data)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    folders <span style="color:#f92672">=</span> {
</span></span><span style="display:flex;"><span>        folder<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;uid&#39;</span>)<span style="color:#f92672">.</span>text: folder<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;title&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> folder <span style="color:#f92672">in</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;.//table[@name=&#39;diaro_folders&#39;]/r&#34;</span>)
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># locations = {</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     location.find(&#39;uid&#39;).text: location.find(&#39;name&#39;).text</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     for location in root.findall(&#34;.//table[@name=&#39;diaro_locations&#39;]/r&#34;)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># }</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># moods = {</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     mood.find(&#39;uid&#39;).text: mood.find(&#39;name&#39;).text</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">#     for mood in root.findall(&#34;.//table[@name=&#39;diaro_moods&#39;]/r&#34;)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># }</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    entries <span style="color:#f92672">=</span> root<span style="color:#f92672">.</span>findall(<span style="color:#e6db74">&#34;.//table[@name=&#39;diaro_entries&#39;]/r&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    output_dir <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;diaro_markdown_entries&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">if</span> <span style="color:#f92672">not</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>exists(output_dir):
</span></span><span style="display:flex;"><span>        os<span style="color:#f92672">.</span>makedirs(output_dir)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    markdown_files <span style="color:#f92672">=</span> []
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    xml_path <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;./locations.xml&#34;</span>
</span></span><span style="display:flex;"><span>    parsed_locations <span style="color:#f92672">=</span> parse_locations_xml(xml_path)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    xml_path_attach <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;./attachments.xml&#34;</span>
</span></span><span style="display:flex;"><span>    parsed_attach <span style="color:#f92672">=</span> parse_attachments_xml(xml_path_attach)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">for</span> entry <span style="color:#f92672">in</span> entries:
</span></span><span style="display:flex;"><span>        date_ms <span style="color:#f92672">=</span> int(entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;date&#39;</span>)<span style="color:#f92672">.</span>text)
</span></span><span style="display:flex;"><span>        dt_object <span style="color:#f92672">=</span> datetime<span style="color:#f92672">.</span>fromtimestamp(date_ms <span style="color:#f92672">/</span> <span style="color:#ae81ff">1000</span>)
</span></span><span style="display:flex;"><span>        date_str <span style="color:#f92672">=</span> dt_object<span style="color:#f92672">.</span>strftime(<span style="color:#e6db74">&#34;%Y-%m-</span><span style="color:#e6db74">%d</span><span style="color:#e6db74"> %H:%M:%S %z&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        text_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;text&#39;</span>)
</span></span><span style="display:flex;"><span>        text <span style="color:#f92672">=</span> text_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> text_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> text_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;No content&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        title_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;title&#39;</span>)
</span></span><span style="display:flex;"><span>        title <span style="color:#f92672">=</span> title_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> title_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> title_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;Untitled&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> title <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;Untitled&#34;</span>:
</span></span><span style="display:flex;"><span>            title <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>sub(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#34;[^\w]&#34;</span>, <span style="color:#e6db74">&#34; &#34;</span>, text<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#39;.&#39;</span>)[<span style="color:#ae81ff">0</span>][:<span style="color:#ae81ff">30</span>])
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Use the first X characters of text if title is &#34;Untitled&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        mood_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;mood&#39;</span>)
</span></span><span style="display:flex;"><span>        mood <span style="color:#f92672">=</span> title_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> mood_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> mood_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;3&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;1&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;5-🥰&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;2&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;4-🙂&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;3&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;3-😑&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;4&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;2-🙁&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;5&#34;</span>:
</span></span><span style="display:flex;"><span>            mood <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;1-😢&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        media_path <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;../media/&#34;</span>
</span></span><span style="display:flex;"><span>        attachments <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> i <span style="color:#f92672">in</span> parsed_attach:
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> i<span style="color:#f92672">.</span>entry_uid <span style="color:#f92672">==</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;uid&#39;</span>)<span style="color:#f92672">.</span>text:
</span></span><span style="display:flex;"><span>                attachments <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">---------------------------------------------------------------&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> i<span style="color:#f92672">.</span>type <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;image&#34;</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">![</span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">elif</span> i<span style="color:#f92672">.</span>type <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;video&#34;</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">[Video: </span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">elif</span> i<span style="color:#f92672">.</span>type <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;audio&#34;</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">[Audio: </span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>                    attachments <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">![</span><span style="color:#e6db74">{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">](</span><span style="color:#e6db74">{</span>media_path<span style="color:#e6db74">}{</span>i<span style="color:#f92672">.</span>filename<span style="color:#e6db74">}</span><span style="color:#e6db74">)</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Create a safe filename</span>
</span></span><span style="display:flex;"><span>        safe_title <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>sub(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#39;[^\w\s-]&#39;</span>, <span style="color:#e6db74">&#39;&#39;</span>, title)<span style="color:#f92672">.</span>strip()<span style="color:#f92672">.</span>lower()
</span></span><span style="display:flex;"><span>        safe_title <span style="color:#f92672">=</span> re<span style="color:#f92672">.</span>sub(<span style="color:#e6db74">r</span><span style="color:#e6db74">&#39;[-\s]+&#39;</span>, <span style="color:#e6db74">&#39;-&#39;</span>, safe_title) <span style="color:#66d9ef">if</span> safe_title <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;entry&#34;</span>
</span></span><span style="display:flex;"><span>        filename <span style="color:#f92672">=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;</span><span style="color:#e6db74">{</span>dt_object<span style="color:#f92672">.</span>strftime(<span style="color:#e6db74">&#39;%Y-%m-</span><span style="color:#e6db74">%d</span><span style="color:#e6db74">&#39;</span>)<span style="color:#e6db74">}</span><span style="color:#e6db74">-</span><span style="color:#e6db74">{</span>safe_title<span style="color:#e6db74">}</span><span style="color:#e6db74">.md&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Front Matter</span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;---</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> title:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;title: </span><span style="color:#e6db74">{</span>title<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;title: Entry on </span><span style="color:#e6db74">{</span>dt_object<span style="color:#f92672">.</span>strftime(<span style="color:#e6db74">&#39;%Y-%m-</span><span style="color:#e6db74">%d</span><span style="color:#e6db74">&#39;</span>)<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;date: </span><span style="color:#e6db74">{</span>date_str<span style="color:#f92672">.</span>rstrip()<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        folder_uid <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;folder_uid&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> folder_uid <span style="color:#f92672">and</span> folder_uid <span style="color:#f92672">in</span> folders:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;folder: </span><span style="color:#e6db74">{</span>folders[folder_uid]<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># location_uid = entry.find(&#39;location_uid&#39;).text</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># if location_uid and location_uid in locations:</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">#     front_matter += f&#34;location: {locations[location_uid]}\n&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        location_element <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;location_uid&#39;</span>)
</span></span><span style="display:flex;"><span>        location <span style="color:#f92672">=</span> location_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">if</span> location_element <span style="color:#f92672">is</span> <span style="color:#f92672">not</span> <span style="color:#66d9ef">None</span> <span style="color:#f92672">and</span> location_element<span style="color:#f92672">.</span>text <span style="color:#66d9ef">else</span> <span style="color:#e6db74">&#34;N/A&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> location <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#34;N/A&#34;</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#75715e"># Find the location in the parsed locations</span>
</span></span><span style="display:flex;"><span>            location_obj <span style="color:#f92672">=</span> next((loc <span style="color:#66d9ef">for</span> loc <span style="color:#f92672">in</span> parsed_locations <span style="color:#66d9ef">if</span> loc<span style="color:#f92672">.</span>uid <span style="color:#f92672">==</span> location), <span style="color:#66d9ef">None</span>)
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> location_obj:
</span></span><span style="display:flex;"><span>                location_obj <span style="color:#f92672">=</span> location_obj
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>                location_obj <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Unknown Location&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> location <span style="color:#f92672">!=</span> <span style="color:#e6db74">&#34;N/A&#34;</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;location: </span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>lat<span style="color:#e6db74">}</span><span style="color:#e6db74">,</span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>lng<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;location_title: </span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>title<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;location_address: </span><span style="color:#e6db74">{</span>location_obj<span style="color:#f92672">.</span>address<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;location: Unknown</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> mood:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;mood: </span><span style="color:#e6db74">{</span>mood<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        tags_text <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;tags&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> tags_text <span style="color:#f92672">and</span> tags_text<span style="color:#f92672">.</span>strip(<span style="color:#e6db74">&#39;,&#39;</span>) :
</span></span><span style="display:flex;"><span>            tags <span style="color:#f92672">=</span> [tag<span style="color:#f92672">.</span>strip() <span style="color:#66d9ef">for</span> tag <span style="color:#f92672">in</span> tags_text<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#39;,&#39;</span>) <span style="color:#66d9ef">if</span> tag<span style="color:#f92672">.</span>strip()]
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;tags: </span><span style="color:#e6db74">{</span>tags<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># mood_uid = entry.find(&#39;mood&#39;).text</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># if mood_uid and mood_uid in moods:</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">#     front_matter += f&#34;mood: {moods[mood_uid]}\n&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        weather_temp <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;weather_temperature&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        weather_icon <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;weather_icon&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>        weather_desc <span style="color:#f92672">=</span> entry<span style="color:#f92672">.</span>find(<span style="color:#e6db74">&#39;weather_description&#39;</span>)<span style="color:#f92672">.</span>text
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> weather_temp:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;temp_c: </span><span style="color:#e6db74">{</span>weather_temp<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> weather_icon:
</span></span><span style="display:flex;"><span>            weather_data <span style="color:#f92672">=</span> weather_icon<span style="color:#f92672">.</span>split(<span style="color:#e6db74">&#34;-&#34;</span>)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            time_of_day <span style="color:#f92672">=</span> weather_data[<span style="color:#ae81ff">0</span>]
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> time_of_day <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;day&#34;</span>:
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;time_of_day: day</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">elif</span> time_of_day <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;night&#34;</span>:
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;time_of_day: night</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;time_of_day: unknown</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>            weather_icon <span style="color:#f92672">=</span> weather_data[<span style="color:#ae81ff">1</span>:]
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span> weather_icon:
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#39;alt&#39;</span> <span style="color:#f92672">in</span> weather_icon:
</span></span><span style="display:flex;"><span>                    weather_icon<span style="color:#f92672">.</span>remove(<span style="color:#e6db74">&#39;alt&#39;</span>)
</span></span><span style="display:flex;"><span>                front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;weather: [</span><span style="color:#e6db74">{</span><span style="color:#e6db74">&#39;, &#39;</span><span style="color:#f92672">.</span>join(weather_icon)<span style="color:#e6db74">}</span><span style="color:#e6db74">]</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> weather_desc:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;forcast: </span><span style="color:#e6db74">{</span>weather_desc<span style="color:#e6db74">}</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> <span style="color:#e6db74">&#34;-----BEGIN PGP MESSAGE-----&#34;</span> <span style="color:#f92672">in</span> text:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;encrypted: true</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">else</span>:
</span></span><span style="display:flex;"><span>            front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;encrypted: false</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        front_matter <span style="color:#f92672">+=</span> <span style="color:#e6db74">&#34;---</span><span style="color:#ae81ff">\n\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        converted_entry <span style="color:#f92672">=</span> front_matter <span style="color:#f92672">+</span> text <span style="color:#f92672">+</span> attachments <span style="color:#f92672">+</span> <span style="color:#e6db74">&#34;</span><span style="color:#ae81ff">\n</span><span style="color:#e6db74">&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e"># Write markdown file</span>
</span></span><span style="display:flex;"><span>        filepath <span style="color:#f92672">=</span> os<span style="color:#f92672">.</span>path<span style="color:#f92672">.</span>join(output_dir, filename)
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">with</span> open(filepath, <span style="color:#e6db74">&#39;w&#39;</span>, encoding<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;utf-8&#39;</span>) <span style="color:#66d9ef">as</span> f:
</span></span><span style="display:flex;"><span>            f<span style="color:#f92672">.</span>write(converted_entry)
</span></span><span style="display:flex;"><span>        markdown_files<span style="color:#f92672">.</span>append(filepath)
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">if</span> __name__ <span style="color:#f92672">==</span> <span style="color:#e6db74">&#34;__main__&#34;</span>:
</span></span><span style="display:flex;"><span>    write_files()
</span></span></code></pre></div><h2 id="ai-version">AI version</h2>
<p>I ran this through Gemini to see if it would emulate my style&hellip; eh&hellip;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>I recently made the switch from [<span style="color:#f92672">Diaro</span>](<span style="color:#a6e22e">https://diaroapp.com</span>) to [<span style="color:#f92672">Obsidian</span>](<span style="color:#a6e22e">https://obsidian.md/</span>) for my personal diary. While I had a great experience with Diaro - their lifetime subscription was a steal at around $20, and their Dropbox sync never lost a single entry over three or four years. Diaro&#39;s feature to automatically tag location, time, and date from uploaded photos was incredibly convenient, and I&#39;m hoping to find a similar workflow in Obsidian.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Extracting the Data
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>Getting my data out of Diaro proved to be the trickiest part. Diaro offered various export options (CSV, text, PDF), but these varied by platform (mobile vs. web) and none provided an easy way to export photos alongside the entries. Ripping images from PDFs was an absolute nightmare.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Fortunately, I dug into the Dropbox backend Diaro used for syncing. There, I discovered XML files containing all my entries and, more importantly, all my photos as JPEGs. The XML structure was relatively sane, with attachments, locations, and the diary entries themselves all contained within one large document, which made parsing manageable.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">## Custom Scripting for Conversion
</span></span></span><span style="display:flex;"><span><span style="color:#75715e"></span>
</span></span><span style="display:flex;"><span>To get everything into a standardized Markdown format with YAML front matter and embedded images, I cooked up some Python magic. This conversion process took me a solid two to three days over a weekend. While not &#34;crazy&#34; in terms of effort, I do wish Diaro offered more robust export options – perhaps JSON or CSVs with easily linked attachments, or even a dedicated photo dump.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>That said, for a $20 lifetime license and the peace of mind that came with never losing a single post (kudos to Dropbox for the reliable backend!), I can&#39;t really complain too much. The Diaro app itself was consistently reliable across all my devices, and the website was solid.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>I&#39;ll include a link to the Python script, or perhaps embed it directly in this post, just in case it can help someone else migrate their notes from Diaro to Obsidian or another Markdown-based diary application down the road.
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Thanks for reading!
</span></span><span style="display:flex;"><span>--- over From this service to either obsidian Or another Mark down based Diary application. Thanks!
</span></span></code></pre></div>
        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:diary-migrate">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/diary-migrate/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/diary/">#diary</a>

<a href="https://jelloeater.me/tags/obsidian/">#obsidian</a>

<a href="https://jelloeater.me/tags/personal/">#personal</a>

<a href="https://jelloeater.me/tags/private/">#private</a>

<a href="https://jelloeater.me/tags/update/">#update</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Sunday Funday - June 2025</title>
      <link>
      https://jelloeater.me/blog/sunday-funday-2025-06/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/sunday-funday-2025-06/#comments
      </comments>
      <pubDate>Mon, 30 Jun 2025 05:43:24 +0000</pubDate>
      <category>ai</category>
      
      <category>design</category>
      
      <category>devops</category>
      
      <category>hardware</category>
      
      <category>link_dump</category>
      
      <category>python</category>
      
      <category>slow_living</category>
      
      <category>sunday_funday</category>
      
      <category>web_culture</category>
      <guid>https://jelloeater.me/blog/sunday-funday-2025-06/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/blog/sunday-funday-2025-06/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/blog/sunday-funday-2025-06/gen-cover.png"/>
    



      
      
      <description><![CDATA[Small Web, Big Ideas]]></description>
      
      <content:encoded>
        <![CDATA[
        
        <p>Here’s a curated link dump of standout articles, tools, and odd corners of the web that caught my attention this month. Expect a mix of tech, design, culture, and a dash of whimsy. Enjoy exploring!</p>
<h2 id="web--tech-culture">Web &amp; Tech Culture</h2>
<ul>
<li>
<p><a href="https://alexwlchan.net/2025/my-favourite-websites/">My Favourite Websites from My Bookmark Collection</a>
Alex Chan wraps up a series on web archiving by sharing a handful of creative, quirky sites that celebrate the web’s diversity. From ever-changing designs to hand-drawn aesthetics, it&rsquo;s a reminder that the internet can still surprise and delight.</p>
</li>
<li>
<p><a href="https://thehistoryoftheweb.com/can-directories-rise-again/">Can Directories Rise Again?</a>
A thoughtful look at whether old-school web directories could make a comeback in today’s algorithm-dominated internet.</p>
</li>
<li>
<p><a href="https://www.theringer.com/2021/07/21/tech/google-reader-ode-end-of-the-good-internet">The End of the Good Internet: An Ode to Google Reader</a>
A nostalgic reflection on the loss of Google Reader and what it meant for the open web.</p>
</li>
<li>
<p><a href="https://fredrocha.net/2025/05/21/small-web-is-beautiful/">Small Web is Beautiful</a>
A celebration of independent, small-scale websites and why they matter more than ever.</p>
</li>
</ul>
<h2 id="devops-linux--command-line">DevOps, Linux &amp; Command Line</h2>
<ul>
<li>
<p><a href="https://blog.kalvad.com/our-journey-through-linux-unix-landscapes/">Our Journey Through Linux/Unix Landscapes</a>
A personal narrative through the evolving world of Linux and Unix, with insights for both newcomers and seasoned sysadmins.</p>
</li>
<li>
<p><a href="https://magnus919.com/2025/05/zsh-hidden-gems-advanced-tricks-that-will-transform-your-command-line-experience/">Zsh Hidden Gems: Advanced Tricks That Will Transform Your Command Line Experience</a>
Discover lesser-known Zsh features and plugins to supercharge your shell workflow.</p>
</li>
<li>
<p><a href="https://terminaltrove.com/gitid/">GitID: A Minimalist Git Identity Manager</a>
A handy tool for managing multiple Git identities—perfect for open source contributors and contractors.</p>
</li>
</ul>
<h2 id="python--programming">Python &amp; Programming</h2>
<ul>
<li>
<p><a href="https://realpython.com/python-script-structure/">How to Structure a Python Script</a>
Real Python delivers a practical guide on organizing Python scripts for clarity and maintainability.</p>
</li>
<li>
<p><a href="https://community.emergingthreats.net/t/come-sail-the-cves-part-1-data-acquisition/2750">Come Sail the CVEs: Data Acquisition</a>
A deep dive into collecting and analyzing CVE data, valuable for anyone interested in infosec or vulnerability management.</p>
</li>
</ul>
<h2 id="design-accessibility--ux">Design, Accessibility &amp; UX</h2>
<ul>
<li>
<p><a href="https://goodinternetmagazine.com/can-accessibility-be-whimsical/">Can Accessibility Be Whimsical?</a>
An exploration of how accessible design doesn’t have to be boring—whimsy and usability can coexist.</p>
</li>
<li>
<p><a href="https://www.smashingmagazine.com/2025/06/designing-for-neurodiversity/">Designing for Neurodiversity</a>
Smashing Magazine offers actionable advice for creating digital experiences that are inclusive of neurodivergent users.</p>
</li>
<li>
<p><a href="https://stephaniewalter.design/blog/neurodiversity-and-ux-essential-resources-for-cognitive-accessibility/">Neurodiversity and UX: Essential Resources for Cognitive Accessibility</a>
A resource-rich post for designers looking to improve cognitive accessibility in their products.</p>
</li>
</ul>
<h2 id="ai-society--the-future">AI, Society &amp; the Future</h2>
<ul>
<li>
<p><a href="https://www.bloodinthemachine.com/p/openais-desperate-quest-to-become">OpenAI’s Desperate Quest to Become</a>
A critical look at the current trajectory of OpenAI and the broader AI industry.</p>
</li>
<li>
<p><a href="https://www.bloodinthemachine.com/p/the-ai-jobs-crisis-is-here-now">The AI Jobs Crisis Is Here Now</a>
A sobering analysis of how AI is already impacting the labor market.</p>
</li>
<li>
<p><a href="https://arstechnica.com/science/2025/05/why-incels-take-the-blackpill-and-why-we-should-care/">Why Incels Take the Blackpill—and Why We Should Care</a>
Ars Technica examines the social and psychological forces behind the “blackpill” ideology and its real-world consequences.</p>
</li>
</ul>
<h2 id="digital-life--slow-living">Digital Life &amp; Slow Living</h2>
<ul>
<li>
<p><a href="https://buttondown.com/justinpot/archive/we-buy-too-much-crap-anyway/">We Buy Too Much Crap Anyway</a>
A personal essay on consumerism, minimalism, and finding satisfaction with less.</p>
</li>
<li>
<p><a href="https://tracydurnell.com/2025/03/23/slow-craft-writing-noncapitalist-mentality/">Slow Craft: Writing with a Noncapitalist Mentality</a>
Tracy Durnell explores the value of slow, intentional creative work in a fast-paced world.</p>
</li>
<li>
<p><a href="https://www.fromjason.xyz/p/notebook/the-bliss-of-good-enough-an-ode-to-my-moka-pot/">The Bliss of Good Enough: An Ode to My Moka Pot</a>
A love letter to the humble moka pot and the joys of embracing “good enough” in daily life.</p>
</li>
</ul>
<h2 id="hardware--gadgets">Hardware &amp; Gadgets</h2>
<ul>
<li>
<p><a href="https://liliputing.com/banana-pi-bpi-r4-pro-is-a-versatile-router-board-with-wifi-7-10-gb-and-2-5-gb-lan-and-multiple-m-2-connectors/">Banana Pi BPI-R4 Pro: A Versatile Router Board</a>
An overview of a new router board supporting WiFi 7, 10Gbps LAN, and multiple M.2 connectors—catnip for home lab enthusiasts.</p>
</li>
<li>
<p><a href="https://www.campsnapphoto.com/collections/camp-snap-screen-free-digital-cameras">Camp Snap: Screen-Free Digital Cameras</a>
A collection of digital cameras designed to be screen-free, encouraging mindful photography.</p>
</li>
</ul>
<h2 id="odds--ends">Odds &amp; Ends</h2>
<ul>
<li>
<p><a href="https://pxlnv.com/linklog/ai-calvin-and-hobbes-strip/">AI Calvin and Hobbes Strip</a>
What happens when AI meets classic comics? This link explores the intersection in a playful way.</p>
</li>
<li>
<p><a href="https://www.joanwestenberg.com/a-world-without-touch-is-a-world-without-trust/">A World Without Touch Is a World Without Trust</a>
Joan Westenberg reflects on the importance of physical connection in a digital age.</p>
</li>
<li>
<p><a href="https://old.reddit.com/r/Volumeeating/comments/1l1xd56/thanks_for_showing_me_the_ways_of_jellogurt/">Volume Eating &amp; Jellogurt</a>
A quirky Reddit thread on creative, low-calorie eating hacks.</p>
</li>
<li>
<p><a href="https://scifiinterfaces.com/">Scifi Interfaces</a>
A treasure trove of design inspiration from sci-fi movies and TV.</p>
</li>
</ul>
<h2 id="tools--platforms">Tools &amp; Platforms</h2>
<ul>
<li>
<p><a href="https://techcrunch.com/2025/06/05/introducing-bounce-a-tool-to-move-your-follwing-between-bluesky-and-mastodon/">Introducing Bounce: Move Your Following Between Bluesky and Mastodon</a>
TechCrunch covers a new tool for migrating your social graph across decentralized platforms.</p>
</li>
<li>
<p><a href="https://zorin.com/">Zorin OS</a>
A user-friendly Linux distro worth checking out, especially if you’re looking for a polished desktop experience.</p>
</li>
</ul>
<h2 id="meta--web-discovery">Meta &amp; Web Discovery</h2>
<ul>
<li>
<p><a href="https://winther.sysctl.dk/blog-discovery-requires-effort/">Blog Discovery Requires Effort</a>
A meditation on the changing landscape of blog discovery and why finding good writing is harder—but more rewarding—than ever.</p>
</li>
<li>
<p><a href="https://shellsharks.com/scrolls/scroll/2025-06-24">Shellsharks Scrolls</a>
A regularly updated scroll of interesting links and commentary from the Shellsharks community.</p>
</li>
</ul>
<hr>
<p><em>Happy browsing! If you have a favorite link or hidden gem, let me know—there’s always room for more in the next dump.</em></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:sunday-funday-2025-06">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/sunday-funday-2025-06/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/design/">#design</a>

<a href="https://jelloeater.me/tags/devops/">#devops</a>

<a href="https://jelloeater.me/tags/hardware/">#hardware</a>

<a href="https://jelloeater.me/tags/link_dump/">#link_dump</a>

<a href="https://jelloeater.me/tags/python/">#python</a>

<a href="https://jelloeater.me/tags/slow_living/">#slow_living</a>

<a href="https://jelloeater.me/tags/sunday_funday/">#sunday_funday</a>

<a href="https://jelloeater.me/tags/web_culture/">#web_culture</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>How to Identify and Heal Burnout from Work</title>
      <link>
      https://jelloeater.me/blog/identify-heal-burnout/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/identify-heal-burnout/#comments
      </comments>
      <pubDate>Mon, 30 Jun 2025 04:58:20 +0000</pubDate>
      <category>mental-health</category>
      
      <category>self-care</category>
      <guid>https://jelloeater.me/blog/identify-heal-burnout/</guid>
      
      <media:content url="https://jelloeater.me/blog/identify-heal-burnout/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/identify-heal-burnout/cover.png"/>
      


    
    



      
      
      <description><![CDATA[How to avoid burnout by building healthy habits]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/identify-heal-burnout/cover.png" alt="Featured Image"/></p>
        
        <h2 id="how-it-started-">How it started 🔰</h2>
<p>This one hits close to home for me. I started working from home about five years ago, and at first, it was great!
I could work in my pajamas and eat lunch with friends and family. I could make myself a nice home-cooked meal; no more bagged sandwiches or takeout!</p>
<p>I’ve always been a big fan of not having to drive into work and being able to shower after work. I used to think morning showers were great, but just wait until you try a before-bedtime shower; now <em>that’s</em> relaxing!</p>
<p>Back in 2019, I decided to move back home. I had been working in an office for most of my life, but both my family and I wanted to be closer to our parents, about two hours away. I was fortunate that my job let me continue to work remotely. This worked well for several years while I was a lead engineer. However, nothing lasts forever, and in 2022, I decided to change careers. I’d always been interested in a more programming-centric role, and I was lucky enough to find a cloud consulting company that took me on.</p>
<p>So, I took the plunge into the world of DevOps and traded my SIP desk phone for a MacBook M1. The desk looks nicer that way, anyway. 😅</p>
<div
style=
"
float: right;
min-width: 250px;
max-width: 33%;
padding-left: 2%;
">
<p><a href="healing.png"><img src="healing.png" alt="Bird"></a></p>
</div>
<p>Another big change: the company I joined is fully remote; no office, period (at least for the dev team). This is great for me because I never have to worry about “return to office” policies, also known as “we don’t know how to measure productivity” or “if I can’t see you, I can’t control you, and then what do I do all day?” I’m a little spicy about this, as my social media will attest. Anyway…</p>
<p>A nice benefit of working at a cloud consulting company is making my own hours. For someone like me, who’s not only a night owl but also suffers from <strong>really</strong> bad insomnia, this works out well for both my mental and physical health; but we’ll come back to this later. I make all my meetings and our daily standup, and if we have anything early, I’ll wake up for those if needed. This can be a blessing <em>and</em> a curse.</p>
<p>Fast forward five years, and here I am, writing this article after learning a thing or two; not just about working from home, but about how to better take care of myself.</p>
<hr>
<h2 id="how-its-going-">How it’s going ⏩</h2>
<div
style=
"
float: right;
max-width: 250px;
padding-left: 2%;
">
<p><a href="ikigai.png"><img src="ikigai.png" alt="ikigai"></a></p>
</div>
<p>If you’ve read other articles on my blog, you’ll know I’m a big fan of tooling and software. With my undergrad in psychology and sociology, I’ve tried to combine these interests to help my mental health <em>and</em> manage a serious case of ADHD. The apps I list here are just half the picture; they help reinforce good habits and self-reflection. The other, <strong>bigger</strong> half is what you do in the <em>real world</em> to handle stress and turmoil. Finding the right balance is always tough for neurodivergent folks, and finding <a href="https://www.dictionary.com/browse/ikigai">ikigai</a> is even harder!</p>
<p><strong>So, real talk time&hellip;</strong></p>
<p>Depression can and will take the joy from your life if you let it. That doesn’t make you weak; it makes you human. They say stress is a killer, but if you <a href="https://scholar.google.com/scholar?hl=en&amp;as_sdt=0%2C33&amp;q=burnt+out+employees&amp;btnG=&amp;oq=burntout">look at a few studies</a>, you’ll find that burnout has a very real impact on health too. It almost took the life of someone in my family at age 50! Even with all this evidence, it’s easy to get lost in the day-to-day.</p>
<h3 id="mental-health-tools-">Mental Health Tools 🧠</h3>
<p>Here are a few soft skills and mental health patterns to look out for. You can’t fix a problem until you recognize you have one. ❤</p>
<h4 id="stages-of-burnout">Stages of Burnout</h4>
<div
style=
"
float: right;
max-width: 250px;
padding-left: 2%;
">
<p><a href="stages_burntout.webp"><img src="stages_burntout.webp" alt="Burnout"></a></p>
</div>
<ol>
<li><strong>Compulsion to Prove Oneself:</strong> Constantly feeling the need to validate your worth and overextending yourself.</li>
<li><strong>Working Harder:</strong> Unable to disconnect, often working during off-hours and taking on too many tasks.</li>
<li><strong>Neglecting Needs:</strong> Forgetting basic needs like eating or socializing, prioritizing work over well-being.</li>
<li><strong>Displacement of Conflicts:</strong> Avoiding issues, attributing problems to “just stress,” and becoming defensive.</li>
<li><strong>Revision of Values:</strong> Work dominates your personal life, overshadowing relationships and interests.</li>
<li><strong>Denial of Problems:</strong> Blaming others and overlooking your own increasing stress and irritability.</li>
<li><strong>Withdrawal:</strong> Preferring solitude, avoiding social events, possibly turning to substances for comfort.</li>
<li><strong>Odd Behavioral Changes:</strong> Acting out of character, with noticeable mood swings or impulsive decisions.</li>
<li><strong>Depersonalization:</strong> Feeling detached, viewing achievements as just tasks.</li>
<li><strong>Inner Emptiness:</strong> Feeling a void, resorting to various means to fill it—this is a sign you need help.</li>
<li><strong>Depression:</strong> Constantly drained, hopeless about the future, struggling with motivation.</li>
<li><strong>Burnout Syndrome:</strong> At a critical point, feeling overwhelmed and possibly experiencing severe anxiety.</li>
</ol>
<hr>
<h4 id="signs-youve-hit-burnout">Signs You’ve Hit Burnout</h4>
<p><a href="burnout.webp"><img src="burnout.webp" alt="Burnout"></a></p>
<ol>
<li>You’re easily irritated.</li>
<li>You feel completely unmotivated, even for things you normally enjoy.</li>
<li>You’re experiencing anxiety or panic attacks.</li>
<li>You’re having trouble sleeping; either it takes hours to fall asleep, or your sleep is broken throughout the night.</li>
<li>You have almost no patience and find yourself being short with colleagues and family.</li>
<li>You’re experiencing indigestion; low-grade stomach aches or constant “butterflies.”</li>
<li>You start crying unexpectedly.</li>
<li>You feel detached from reality, going through your days without emotional connection.</li>
<li>You feel empty.</li>
</ol>
<hr>
<h3 id="digital-tools-">Digital Tools 📱</h3>
<p>Here are three applications that have helped me build healthy habits and communication skills. They may or may not work for you, but I also recommend keeping a physical notebook for decompressing. <a href="https://www.amazon.com/gp/product/B0BYV2DJ1K">These ones from Amazon</a> are great for short breaks!</p>
<h4 id="howwefeel-mood-tracker">HowWeFeel (Mood Tracker)</h4>
<p><a href="https://howwefeel.org/">https://howwefeel.org/</a></p>
<p>A great app for daily check-ins. I’ve been using it for a few months; while it hasn’t directly changed my life, it has a nice feature for sharing your mood with close friends. You can also write mini diary entries (stored locally) to record how you’re feeling in the moment.</p>
<h4 id="diaro-diary">Diaro (Diary)</h4>
<p><a href="https://play.google.com/store/apps/details?id=com.pixelcrater.Diaro">https://play.google.com/store/apps/details?id=com.pixelcrater.Diaro</a></p>
<p>I struggled for years to find the right diary app. I tried Google Keep, Word documents, markdown files; none quite fit. For me, it had to be private, easy to use, and able to record a decent amount of metadata. Diaro is cross-platform (iOS, Android, web), uses Dropbox for sync (so your notes don’t touch random servers), and lets you add photos with automatic date/location updates. Great for documenting after the fact.</p>
<h4 id="gymrun-exercise">GymRun (Exercise)</h4>
<p><a href="https://play.google.com/store/apps/details?id=com.imperon.android.gymapp">https://play.google.com/store/apps/details?id=com.imperon.android.gymapp</a></p>
<p>When COVID hit, I decided to get back in shape. Over two years, I put on muscle and lost weight. Cardio and running were key at first, but long-term, weightlifting was my focus. I tried a dozen workout apps, but most were clunky or filled with ads. GymRun is perfect for nerds; it tracks every stat you could want and syncs with Google Fit/HealthConnect to track calories.</p>
<h2 id="additional-info">Additional Info</h2>
<p>While writing this article, I started compiling a list of “Good Reads” that might benefit readers. The list kept growing, so I moved it to <a href="/blogroll/#mental-health-i-classfa-solid-fa-braini-i-classfa-solid-fa-heart-pulsei">my “must reads” section</a> on my blog.</p>
<h2 id="wrapping-it-up-">Wrapping it up 🎁</h2>
<div
style=
"
float: right;
max-width: 250px;
padding-left: 2%;
">
<p><a href="kind.webp"><img src="kind.webp" alt="Its okay"></a></p>
</div>
<p>I know this is a lot to take in, especially for those struggling right now. I hope what I’ve shared helps even one person feel less alone, or gives you a nudge to check in with yourself (or someone you care about). Burnout is sneaky; it creeps up on you, and sometimes you don’t realize how deep in it you are until you’re running on empty. If any of this resonated, remember: you’re not broken, you’re not lazy, and you absolutely deserve rest and support.</p>
<p>Take it from someone who’s been there: it’s okay to step back, ask for help, and put yourself first sometimes. The world will keep spinning, and you’ll be better for it. If you need a sign to take a break, this is it. Be kind to yourself, reach out if you need to, and remember: healing isn’t linear, but every small step counts.</p>
<p>Thanks for reading, and take care of yourself. 💛</p>
<h2 id="additional-resources-">Additional Resources 📚</h2>
<h3 id="mental-health-resources">Mental Health Resources</h3>
<ul>
<li>Worldwide Directory: <a href="https://findahelpline.com/i/iasp">https://findahelpline.com/i/iasp</a></li>
<li>International Directory: <a href="https://www.opencounseling.com/suicide-hotlines">https://www.opencounseling.com/suicide-hotlines</a></li>
</ul>
<h3 id="places-to-find-a-therapist">Places to Find a Therapist</h3>
<ul>
<li><a href="https://therapists.psychologytoday.com/rms/?tr=Hdr_SubBrand">Psychology Today</a></li>
<li><a href="https://www.goodtherapy.org/find-therapist.html">Good Therapy</a></li>
<li><a href="https://openpathcollective.org/">Open Path Collective</a></li>
<li><a href="https://www.inclusivetherapists.com/">Inclusive Therapists</a></li>
<li><a href="https://www.unmute.today/">Unmute</a></li>
</ul>


  
    <blockquote>
      <p><em>Cover by Irhan Prabasukma</em></p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:identify-heal-burnout">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/identify-heal-burnout/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/mental-health/">#mental-health</a>

<a href="https://jelloeater.me/tags/self-care/">#self-care</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Bookmarking &amp; Blogging</title>
      <link>
      https://jelloeater.me/blog/info-overload/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/info-overload/#comments
      </comments>
      <pubDate>Wed, 04 Jun 2025 02:59:29 +0000</pubDate>
      <category>blogging</category>
      
      <category>bookmarking</category>
      
      <category>instapaper</category>
      
      <category>link_dump</category>
      
      <category>mozilla_sync</category>
      
      <category>raindrop.io</category>
      
      <category>rss</category>
      
      <category>update</category>
      <guid>https://jelloeater.me/blog/info-overload/</guid>
      
      <media:content url="https://jelloeater.me/blog/info-overload.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/info-overload.png"/>
      


    
    



      
      
      <description><![CDATA[Blog posts (in theory) last forever...ish]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/info-overload.png" alt="Featured Image"/></p>
        
        <h2 id="-information-overload">🤯 Information Overload</h2>
<p>I&rsquo;ve been rethinking my bookmarking and sharing habits. I consume a massive amount of content via RSS using <a href="https://www.inoreader.com">Inoreader</a>, often skimming 100-250 posts daily. This leads to an overwhelming reading list.</p>
<p>I&rsquo;ve been using <a href="https://openvibe.social/">OpenVibe</a> for quick shares and <a href="https://buffer.com/">Buffer</a> for automated posting, which works, but feels impersonal. Longer articles get starred for later review, resulting in a backlog of around 100 articles weekly. <a href="https://www.instapaper.com/">Instapaper</a> is my go-to for long-form content, but even then, I struggle to keep up.</p>
<p>I&rsquo;m trying to be more selective with what I send to Instapaper, reserving it for thought-provoking pieces. My free Buffer plan limits me to 10 queued articles, forcing me to be more discerning. I post around 20-30 articles weekly, which makes me question if I&rsquo;m a person or just a link aggregator.</p>
<p>While I&rsquo;m more selective than some, I want to avoid overwhelming my own followers. Feeds that post excessively feel like a chore, and I don&rsquo;t want to create that experience for others.</p>
<h2 id="-blogging">📝 Blogging</h2>
<p>To that end, I&rsquo;m going to TRY and start writing up a blog entry of the things I find interesting each week, and then posting that to my social media accounts. This way I can be more deliberate about what I share, and hopefully make it easier for folks reading my stuff things that interest <strong>them</strong>.</p>
<ul>
<li>Worst case, it becomes a highlight reel of the things I find interesting, and I can look back on it in a few months and see what I was into at the time.</li>
<li>Best case, it becomes a way for me to share my thoughts on the things I find interesting.</li>
</ul>
<p>Yeah, I&rsquo;ll still post timely stuff that&rsquo;s neat like now now, but I really want to focus more on the slow insightful stuff, as I&rsquo;m hoping it makes the whole info digestion process a bit easier for me, and hopefully for you too.</p>
<h2 id="-reading-and-bookmarking">📚 Reading and Bookmarking</h2>
<p>I use <a href="https://sync.mozilla.org/">Mozilla Sync</a> to manage my bookmarks, but it doesn&rsquo;t really help with the reading aspect. I do like how it integrates and lets me do bulk actions.</p>
<p>I&rsquo;ve also been testing out <a href="http://raindrop.io/">Raindrop.io</a>, which is also pretty neat. But the integration just feels second rate compared to FF Sync.</p>
<p>If you&rsquo;re not looking to use Mozilla Sync, then you might want to try [<a href="https://floccus.org/">Floccus</a>](<a href="https://floccus.org/">https://floccus.org/</a>) for doing cross browser bookmark syncing. It does work fairly well, but it does require a desktop to have all the bookmarks sync up, vs FF Sync, which is totally cloud based.</p>
<p>For reading long form, I prefer Instapaper due to its text reformating and features like reading progress tracking and highlighting. It also has Kindle sync, which I should utilize more.</p>
<p>However, I need a streamlined way to bulk bookmark, read, and share articles without service hassles. Currently, Mozilla Sync suits me for managing links to share later, while Buffer/OpenVibe handle immediate sharing.</p>
<pre class="mermaid">graph TD
Start --> Neat_Link --Skim_Headline-->

Interesting? --YES--> Read_Moar
Interesting? --NO--> Start

Read_Moar --> Lots_of_text
Lots_of_text --yeah--> InstaPaper
Still_Relevent --Nope--> Archive_It
InstaPaper --> Still_Relevent --Yeah--> Buffer/OpenVibe

Lots_of_text --nope--> Time_Sensitive
Time_Sensitive --Yes--> Buffer
Time_Sensitive --Nope--> Bookmark_It


Bookmark_It --> Blog_Post
  </pre>
  
<h2 id="-tldr">🤔 TL;DR</h2>
<p>I have a lot of bookmarks, and I want to be more deliberate about what I read and share. I&rsquo;m going to TRY to start writing up blog posts of the things I find interesting, and then posting that to my social media accounts.</p>
<ul>
<li>Worst case, you get a highlight reel / link dump of the things I find interesting</li>
<li>Best case, it becomes a new way for me to share my thoughts on the things I find interesting.</li>
</ul>
<p>🖖 Jelloeater</p>


  
    <blockquote>
      <p>Social media comes and goes, but blog posts (in theory) last forever&hellip;ish &lt;3</p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:info-overload">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/info-overload/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/blogging/">#blogging</a>

<a href="https://jelloeater.me/tags/bookmarking/">#bookmarking</a>

<a href="https://jelloeater.me/tags/instapaper/">#instapaper</a>

<a href="https://jelloeater.me/tags/link_dump/">#link_dump</a>

<a href="https://jelloeater.me/tags/mozilla_sync/">#mozilla_sync</a>

<a href="https://jelloeater.me/tags/raindrop.io/">#raindrop.io</a>

<a href="https://jelloeater.me/tags/rss/">#rss</a>

<a href="https://jelloeater.me/tags/update/">#update</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Review - AI Tooling</title>
      <link>
      https://jelloeater.me/blog/ai-tools/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/ai-tools/#comments
      </comments>
      <pubDate>Fri, 25 Apr 2025 17:22:38 +0000</pubDate>
      <category>ai</category>
      
      <category>cli</category>
      
      <category>utils</category>
      <guid>https://jelloeater.me/blog/ai-tools/</guid>
      
      <media:content url="https://jelloeater.me/blog/ai-tools/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/ai-tools/cover.png"/>
      


    
    



      
      
      <description><![CDATA[Worth the hype... YES!]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/ai-tools/cover.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>The AI tooling landscape has exploded recently, and it can be overwhelming to sift through the noise.  This review covers some  tools I&rsquo;ve found genuinely handy. There&rsquo;s also a really nice PDF report I&rsquo;ve attached below, worth a read if you have the time.</p>


  
    <blockquote>
      <p><a href="report">AI Tooling Review and Analysis - Markdown</a></p>
<p><a href="AI_Tooling_Review_and_Analysis.pdf">AI Tooling Review and Analysis - PDF</a></p>
    </blockquote>
  
<h2 id="search-engines">Search Engines</h2>
<h3 id="perplexityai">perplexity.ai</h3>
<p>Perplexity.ai excels at delivering concise answers with source citations, making it ideal for research and fact-checking. It blew my mind when I first started using it a few month back. It&rsquo;s magic yo.</p>
<h3 id="gemini">Gemini</h3>
<p>Google&rsquo;s Gemini offers a more integrated search experience, blending traditional search results with AI-powered summaries.  Its deep integration with other Google services is a significant advantage (if you&rsquo;re ok with that&hellip;). I&rsquo;d stick with the Pro model, as Flash tends to be good for simpler tasks. The live mode is downright creepy with how real it sounds and responds.</p>
<h3 id="phindcom">phind.com</h3>
<p>Phind works as a great alternative and second source to engines like Gemini and Perplexity. I do wish I used it more, but it&rsquo;s usually worth a shot if the other two aren&rsquo;t cutting it.</p>
<h2 id="ai-tools">AI Tools</h2>
<p>I&rsquo;ve also dug through a fair bit a tooling as I often do. I&rsquo;ve had, of all things, Gemini fill in the gaps below, as I&rsquo;ve been pretty busy with work. <strong>Aichat</strong> in particular, I&rsquo;d say check out out. It&rsquo;s better then Goose, but the LTM stuff with Pieces is nuts with how it sort of follows you around, taking notes on your work.</p>
<h3 id="ltm-long-term-memory---pieces">LTM (Long-Term Memory) - Pieces</h3>
<p>Pieces is a powerful CLI and GUI tool for saving and managing code snippets. Its AI capabilities allow for semantic search and intelligent tagging, making it easy to find and reuse code.</p>


  
    <blockquote>
      <p><strong>Links &amp; Stats</strong></p>
<p>👉 <a href="https://github.com/pieces-app/cli-agent">https://github.com/pieces-app/cli-agent</a></p>
<p><img src="https://img.shields.io/github/stars/pieces-app/cli-agent?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/pieces-app/cli-agent/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/pieces-app/cli-agent?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/pieces-app/cli-agent?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
    </blockquote>
  
<h3 id="ai-agent---goose">AI Agent - Goose</h3>
<p>Goose is a versatile AI agent designed for automation and task execution.  While still under development, its potential for streamlining workflows and automating repetitive tasks is significant.</p>


  
    <blockquote>
      <p><strong>Links &amp; Stats</strong></p>
<p>👉 <a href="https://github.com/block/goose">https://github.com/block/goose</a></p>
<p><img src="https://img.shields.io/github/stars/block/goose?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/block/goose/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/block/goose?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/block/goose?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
    </blockquote>
  
<h3 id="ai-agent---aider">AI Agent - Aider</h3>
<p><code>aider</code> lets you pair program with LLMs to start a new project or build on your existing codebase. It supports various programming languages and integrates with popular code editors, making it a powerful tool for developers.</p>


  
    <blockquote>
      <p><strong>Links &amp; Stats</strong></p>
<p>👉 <a href="https://github.com/Aider-AI/aider">https://github.com/Aider-AI/aider</a></p>
<p><img src="https://img.shields.io/github/stars/Aider-AI/aider?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/Aider-AI/aider/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/Aider-AI/aider?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/Aider-AI/aider?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
    </blockquote>
  
<h3 id="ai-chat---aichat">AI Chat - aichat</h3>
<p><code>aichat</code> provides a convenient CLI for interacting with various large language models. Its simple interface makes it easy to experiment with different models and access their capabilities from the terminal.</p>


  
    <blockquote>
      <p><strong>Links &amp; Stats</strong></p>
<p>👉 <a href="https://github.com/sigoden/aichat">https://github.com/sigoden/aichat</a></p>
<p><img src="https://img.shields.io/github/stars/sigoden/aichat?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/sigoden/aichat/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/sigoden/aichat?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/sigoden/aichat?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
    </blockquote>
  
<h3 id="gui---jan">GUI - Jan</h3>
<p>Jan offers a clean and intuitive GUI for interacting with LLMs.  Its cross-platform compatibility and user-friendly design make it accessible to a wide range of users.</p>


  
    <blockquote>
      <p><strong>Links &amp; Stats</strong></p>
<p>👉 <a href="https://github.com/menloresearch/jan">https://github.com/menloresearch/jan</a></p>
<p><img src="https://img.shields.io/github/stars/menloresearch/jan?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/menloresearch/jan/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/menloresearch/jan?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/menloresearch/jan?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
    </blockquote>
  
<h3 id="ide-plugin---proxyai">IDE Plugin - ProxyAI</h3>
<p>ProxyAI integrates AI assistance directly into your IDE, providing code completion, generation, and refactoring suggestions.  This tight integration can significantly speed up development workflows.</p>


  
    <blockquote>
      <p><strong>Links &amp; Stats</strong></p>
<p>👉 <a href="https://github.com/carlrobertoh/ProxyAI">https://github.com/carlrobertoh/ProxyAI</a></p>
<p><img src="https://img.shields.io/github/stars/carlrobertoh/ProxyAI?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/carlrobertoh/ProxyAI/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/carlrobertoh/ProxyAI?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/carlrobertoh/ProxyAI?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
    </blockquote>
  
<h3 id="model---qwen25-coder">Model - Qwen2.5-Coder</h3>
<p>Qwen2.5-Coder is a specialized language model designed for code generation and understanding.  Its performance on coding tasks makes it a valuable tool for developers.</p>


  
    <blockquote>
      <p><strong>Links &amp; Stats</strong></p>
<p>👉 <a href="https://github.com/QwenLM/Qwen2.5-Coder">https://github.com/QwenLM/Qwen2.5-Coder</a></p>
<p><img src="https://img.shields.io/github/stars/QwenLM/Qwen2.5-Coder?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/QwenLM/Qwen2.5-Coder/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/QwenLM/Qwen2.5-Coder?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/QwenLM/Qwen2.5-Coder?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
    </blockquote>
  
<h2 id="honorable-mentions-local-based">Honorable Mentions (Local Based)</h2>
<p>Running AI tools locally offers benefits in terms of privacy, security, and customization.  These options are worth exploring:</p>
<table>
  <thead>
      <tr>
          <th>Platform</th>
          <th>App</th>
          <th>Link</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>IDE (JetBrains + VSCode)</td>
          <td>Tabby</td>
          <td><a href="https://www.tabbyml.com">https://www.tabbyml.com</a></td>
      </tr>
      <tr>
          <td>IDE (VSCode)</td>
          <td>Privy</td>
          <td><a href="https://marketplace.visualstudio.com/items?itemName=Privy.privy-vscode">https://marketplace.visualstudio.com/items?itemName=Privy.privy-vscode</a></td>
      </tr>
      <tr>
          <td>IDE (VSCode)</td>
          <td>Ollama Autocoder</td>
          <td><a href="https://marketplace.visualstudio.com/items?itemName=10nates.ollama-autocoder">https://marketplace.visualstudio.com/items?itemName=10nates.ollama-autocoder</a></td>
      </tr>
      <tr>
          <td>Server</td>
          <td>Ollama</td>
          <td><a href="https://ollama.com/">https://ollama.com/</a></td>
      </tr>
      <tr>
          <td>Server</td>
          <td>llama.cpp</td>
          <td><a href="https://github.com/ggerganov/llama.cpp">https://github.com/ggerganov/llama.cpp</a></td>
      </tr>
  </tbody>
</table>
<h2 id="conclusion">Conclusion</h2>
<p>The AI tools discussed here represent a powerful and rapidly evolving landscape.  By integrating these tools into your workflow, you can significantly enhance your productivity and unlock new possibilities.  This is just the beginning, and I&rsquo;m excited to see what the future holds for AI-powered tooling.</p>
<h1 id="edit-2026-06-14-0132-pm">Edit 2026-06-14 01:32 PM</h1>
<p>Found this in my drafts, worth adding as a foot note at least</p>
<p><a href="https://www.linkedin.com/pulse/ai-agents-human-anatomy-creative-framework-systems-monisha-sadhukhan-mekke">https://www.linkedin.com/pulse/ai-agents-human-anatomy-creative-framework-systems-monisha-sadhukhan-mekke</a></p>
<p>AI Tooling blog post</p>
<pre class="mermaid">flowchart TD

subgraph agent [Agent Orchestrator]
    direction TB
    opencode <--> mcp

    subgraph context_window [Working Memory]
        agent_prompt
        loaded_skills
    end

    opencode <--> context_window
end

agent <--> provider

subgraph provider [Inference Gateway]
    openrouter --> model
    model --> gemma-4-31b-it
end
  </pre>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/ai-tools/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/ai/">#ai</a>

<a href="https://jelloeater.me/tags/cli/">#cli</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Smashed Pumpkins</title>
      <link>
      https://jelloeater.me/blog/poem_pumpkins/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/poem_pumpkins/#comments
      </comments>
      <pubDate>Fri, 17 Jan 2025 22:53:45 +0000</pubDate>
      <category>fall</category>
      
      <category>poem</category>
      <guid>https://jelloeater.me/blog/poem_pumpkins/</guid>
      
      <media:content url="https://jelloeater.me/blog/poem_pumpkins/cover.webp" medium="image" type="image/webp"/>
      <media:thumbnail url="https://jelloeater.me/blog/poem_pumpkins/cover.webp"/>
      


    
    



      
      
      <description><![CDATA[Short poem about November]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/poem_pumpkins/cover.webp" alt="Featured Image"/></p>
        
        <p><strong>Play in background</strong></p>
<p><a href="https://youtu.be/ATA4JAwZ15I?si=5bWVhwVarOuFgvE3">https://youtu.be/ATA4JAwZ15I?si=5bWVhwVarOuFgvE3</a></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>It&#39;s Sunday.
</span></span><span style="display:flex;"><span>Hazy blue sky, cold, but sweaters make due.
</span></span><span style="display:flex;"><span>A stiff breeze blows through me.
</span></span><span style="display:flex;"><span>A blue jay hops along the gutter.
</span></span><span style="display:flex;"><span>Snowball bushes, now long dead.
</span></span><span style="display:flex;"><span>Winter is knocking on fall&#39;s door.
</span></span><span style="display:flex;"><span>Cranberry sauce &amp; Stuffing.
</span></span><span style="display:flex;"><span>Coffee &amp; Cake.
</span></span><span style="display:flex;"><span>Maybe it will snow this year?
</span></span><span style="display:flex;"><span>I look forward to warm sheets &amp; cats.
</span></span><span style="display:flex;"><span>Hurry home, there is still much to do.
</span></span><span style="display:flex;"><span>27 days to go...
</span></span></code></pre></div><p><a href="/blog/poem_pumpkins/cover.webp"><img src="/blog/poem_pumpkins/cover.webp"
style="
border-radius: 2.5rem;
position: relative;
width: 75%;
margin-left: 10%;
"/></a></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/poem_pumpkins/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/fall/">#fall</a>

<a href="https://jelloeater.me/tags/poem/">#poem</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Recipe - Diet Pancakes</title>
      <link>
      https://jelloeater.me/blog/recipie_dietpancakes/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/recipie_dietpancakes/#comments
      </comments>
      <pubDate>Fri, 17 Jan 2025 22:42:09 +0000</pubDate>
      <category>breakfast</category>
      
      <category>cooking</category>
      <guid>https://jelloeater.me/blog/recipie_dietpancakes/</guid>
      
      <media:content url="https://jelloeater.me/blog/recipie_dietpancakes/cover.webp" medium="image" type="image/webp"/>
      <media:thumbnail url="https://jelloeater.me/blog/recipie_dietpancakes/cover.webp"/>
      


    
    



      
      
      <description><![CDATA[No fat high fiber high protein pancakes!]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/recipie_dietpancakes/cover.webp" alt="Featured Image"/></p>
        
        <p>No fat high fiber high protein pancakes!
Delicious for anytime!</p>
<h2 id="ingredients">Ingredients</h2>
<ul>
<li>120 g Egg white</li>
<li>20 g Oat fiber by anthony&rsquo;s</li>
<li>20 g stevia sugar</li>
<li>5 g of cinnamon</li>
<li>6 g Baking powder</li>
<li>6g Stevia</li>
<li>2g Salt</li>
<li>20 g Fiber one cereal with whole grain by general mills</li>
<li>56 ml Original unsweetened almond milk by almo</li>
</ul>
<h2 id="directions">Directions</h2>
<p>Grind fiber One cereal to course powder
Combined dry ingredients in a small bowl</p>
<p>Mix in egg whites and stir vigorously until fully combined
Add almond milk and continue to stir
(Be sure there&rsquo;s no clumps)</p>
<p>Peter frying pan to medium heat
Spray pan with oil of your choice</p>
<p>Pour half of mixture and cook</p>
<p>Flip each side after 2 to 3 minutes
Cook until golden brown</p>
<p><strong>Prep Time:</strong> 6 min
<strong>Cook Time:</strong> 5 min
<strong>Total Time:</strong> 15 min
<strong>Servings:</strong> 1 serving</p>
<p><strong>Notes:</strong> Feel free to add powdered chocolate into the dry mix if you want</p>
<p><strong>Nutritional Info:</strong></p>
<ul>
<li>125 Calories</li>
<li>40g Carbs</li>
<li>16g Protein</li>
<li>2g Fat</li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/recipie_dietpancakes/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/breakfast/">#breakfast</a>

<a href="https://jelloeater.me/tags/cooking/">#cooking</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Review - Doggo (Created by mr-karan)</title>
      <link>
      https://jelloeater.me/review/doggo/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/review/doggo/#comments
      </comments>
      <pubDate>Tue, 14 Jan 2025 20:59:34 +0000</pubDate>
      <category>cli</category>
      
      <category>golang</category>
      
      <category>utils</category>
      <guid>https://jelloeater.me/review/doggo/</guid>
      
      <media:content url="https://cdn.terminaltrove.com/m/1f891f27-8e2e-46bb-80a4-ce4146242cc8.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://cdn.terminaltrove.com/m/1f891f27-8e2e-46bb-80a4-ce4146242cc8.png"/>
      


    
    



      
      
      <description><![CDATA[Dig Replacment]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://cdn.terminaltrove.com/m/1f891f27-8e2e-46bb-80a4-ce4146242cc8.png" alt="Featured Image"/></p>
        
        <h2 id="stats">Stats</h2>
<p><img src="https://img.shields.io/github/stars/mr-karan/doggo?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"> <img src="https://img.shields.io/github/downloads/mr-karan/doggo/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/mr-karan/doggo?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/mr-karan/doggo?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
<h2 id="review">Review</h2>
<p>I do my fair share of poking around network infrastructure from time to time. While I do appreciate bind-utils and their wide reach, sometimes, I just want something a little&hellip; nicer. I love to swap out basic CLI utils with Golang and Rust versions, nice and easy to install. So here we are, replacing <code>dig</code> with <code>doggo</code>&hellip; and this util is a good boy for sure &lt;3</p>
<p>The author took the time to improve on <a href="https://github.com/ogham/dog">the original Dog client</a>, and it shows. The feature list really shines on the thoughtfulness of it!</p>
<h2 id="feature-list-from-the-readmemd">Feature List (from the <code>README.md</code>)</h2>
<ul>
<li>Human-readable output with color-coded and tabular format</li>
<li>JSON output support for easy scripting and parsing</li>
<li>Multiple transport protocols: DoH, DoT, DoQ, TCP, UDP, DNSCrypt</li>
<li>Support for <code>ndots</code> and <code>search</code> configurations</li>
<li>Multiple resolver support with customizable query strategies</li>
<li>IPv4 and IPv6 support</li>
<li>Web interface available</li>
<li>Shell completions for <code>zsh</code> and <code>fish</code></li>
<li>Reverse DNS lookups</li>
<li>Flexible query options including various DNS flags</li>
<li>Debug mode for troubleshooting</li>
<li>Response time measurement</li>
<li>Cross-platform support</li>
</ul>
<p>TL;DR
It&rsquo;s a alias and soo nice 😉</p>
<h2 id="pros--cons">Pros / Cons</h2>
<table>
  <thead>
      <tr>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>👍</td>
          <td>JSON Output</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Easy to learn</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Easy Install</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Multi Proto support</td>
      </tr>
  </tbody>
</table>
<h2 id="verdict">Verdict</h2>
<p><strong>5/5</strong></p>
<h2 id="download">Download</h2>
<p><strong>💾 <a href="https://github.com/mr-karan/doggo/releases">https://github.com/mr-karan/doggo/releases</a> 💾</strong></p>
<h2 id="demo">Demo</h2>
<p><img src="https://cdn.terminaltrove.com/m/1f891f27-8e2e-46bb-80a4-ce4146242cc8.png" alt="Demo"></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/review/doggo/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/cli/">#cli</a>

<a href="https://jelloeater.me/tags/golang/">#golang</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Forced Samsung Galaxy Watch Update [SOLVED]</title>
      <link>
      https://jelloeater.me/blog/galaxy-watch-update/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/galaxy-watch-update/#comments
      </comments>
      <pubDate>Sun, 29 Dec 2024 19:23:07 +0000</pubDate>
      <category>foss</category>
      
      <category>samsung</category>
      
      <category>watch</category>
      <guid>https://jelloeater.me/blog/galaxy-watch-update/</guid>
      
      <media:content url="https://jelloeater.me/blog/galaxy-watch-update.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/galaxy-watch-update.png"/>
      


    
    



      
      
      <description><![CDATA[My watch, my problem?]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/galaxy-watch-update.png" alt="Featured Image"/></p>
        
        <h2 id="ug">Ug</h2>
<p>So Samsung just dropped this update for my watch&hellip;</p>
<p><a href="https://doc.samsungmobile.com/SM-R860/XAA/doc.html">https://doc.samsungmobile.com/SM-R860/XAA/doc.html</a></p>
<p>Normally, I&rsquo;d be happy to get new shit for my older watch, but I&rsquo;ve been following post for my FAVORITE watch face <a href="https://sectograph.com/">Sectograph</a> and the latest WearOS 5 update breaks complex custom watch faces.</p>
<p>I know there are alternatives out there, and I&rsquo;ll prob give them a try, just incase.</p>
<p>Anyway, if you are handy with <a href="https://developer.android.com/training/wearables/get-started/debugging">ADB wireless debugging</a>, you can disable the system update on the watch, while still keeping play services and Google Pay working.</p>
<h2 id="the-fix">The fix</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>pm disable-user --user <span style="color:#ae81ff">0</span> com.sec.android.soagent
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Package com.sec.android.soagent new state: disabled-user</span>
</span></span><span style="display:flex;"><span>pm disable-user --user <span style="color:#ae81ff">0</span> com.wssyncmldm
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Package com.wssyncmldm new state: disabled-user</span>
</span></span></code></pre></div><p>I hope this helps some folks out there have a little more control over their own hardware ❤</p>


  
    <blockquote>
      <p>Peace!</p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:galaxy-watch-update">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/galaxy-watch-update/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/foss/">#foss</a>

<a href="https://jelloeater.me/tags/samsung/">#samsung</a>

<a href="https://jelloeater.me/tags/watch/">#watch</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Review - GDU (Created by dundee)</title>
      <link>
      https://jelloeater.me/review/gdu/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/review/gdu/#comments
      </comments>
      <pubDate>Sat, 23 Nov 2024 23:54:25 +0000</pubDate>
      <category>cli</category>
      
      <category>golang</category>
      
      <category>utils</category>
      <guid>https://jelloeater.me/review/gdu/</guid>
      
      <media:content url="https://cdn.terminaltrove.com/m/e8aca807-824e-4797-9644-fb147ea6f1e6.gif" medium="image" type="image/gif"/>
      <media:thumbnail url="https://cdn.terminaltrove.com/m/e8aca807-824e-4797-9644-fb147ea6f1e6.gif"/>
      


    
    



      
      
      <description><![CDATA[NCDU Replacement]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://cdn.terminaltrove.com/m/e8aca807-824e-4797-9644-fb147ea6f1e6.gif" alt="Featured Image"/></p>
        
        <h2 id="stats">Stats</h2>
<p><img src="https://img.shields.io/github/stars/dundee/gdu?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars">
<img src="https://img.shields.io/github/downloads/dundee/gdu/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/dundee/gdu?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/dundee/gdu?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
<h2 id="review">Review</h2>
<p>Anyone who&rsquo;s run into disk space issues I&rsquo;m sure knows about <a href="https://dev.yorhel.nl/ncdu">NCDU</a>. It&rsquo;s a super handy util to see what and where is eating the most disk space on any Linux or Mac. However one big issue I&rsquo;ve run into is that it&rsquo;s fairly slow, even on a SSD.</p>
<p>Yes there have been some great improvements&hellip;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>Notable updates
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>Parallel scanning
</span></span><span style="display:flex;"><span>    Ncdu 2.5 adds support for parallel scanning, but it’s not enabled by default. To give it a try, run with -t8 to scan with 8 threads. If you’re running an unusual setup, such as networked storage, odd filesystems, complex RAID configurations, etc, I’d love to hear about the performance impact of this new feature.1 Feedback is welcome on the issue tracker or to projects@yorhel.nl.
</span></span><span style="display:flex;"><span>Binary export
</span></span><span style="display:flex;"><span>    Ncdu 2.6 adds a new binary export format that better works with parallel scanning, offers built-in compression and supports browsing directory trees that are too large to fit in memory. To give it a try, use the -O flag instead of -o.
</span></span><span style="display:flex;"><span>Colors
</span></span><span style="display:flex;"><span>    Ncdu has had color support since version 1.13. Colors were enabled by default in 1.17 and 2.0, and then later disabled again in 1.20 and 2.4 because the text was not legible in all terminal configurations. If you do prefer the colors, add --color=dark to your config file. Maybe at some point in the future we’ll have colors that are readable in every setup.
</span></span></code></pre></div><p>&hellip; but none of these are enabled by default and I&rsquo;m always going to take a GoLang version of a app over one written in <a href="https://en.wikipedia.org/wiki/Zig_(programming_language)">Zig</a>, which seems to be scratching a certain <a href="https://xkcd.com/927/">XKCD</a> itch&hellip;</p>
<p>TL;DR
So good, it&rsquo;s a alias on all my boxes 😉</p>
<h2 id="pros--cons">Pros / Cons</h2>
<table>
  <thead>
      <tr>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>👍</td>
          <td>Great interface</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Easy to learn</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Easy Install</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Apt-get package</td>
      </tr>
  </tbody>
</table>
<h2 id="verdict">Verdict</h2>
<p><strong>5/5</strong></p>
<h2 id="download">Download</h2>
<p><strong>💾 <a href="https://github.com/dundee/gdu/releases">https://github.com/dundee/gdu/releases</a> 💾</strong></p>
<h2 id="demo">Demo</h2>
<p><img src="https://cdn.terminaltrove.com/m/e8aca807-824e-4797-9644-fb147ea6f1e6.gif" alt="Demo Gif"></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/review/gdu/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/cli/">#cli</a>

<a href="https://jelloeater.me/tags/golang/">#golang</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Joan Westenberg Blog</title>
      <link>
      https://jelloeater.me/blog/posts-by-westenberg/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/posts-by-westenberg/#comments
      </comments>
      <pubDate>Sat, 23 Nov 2024 23:45:00 +0000</pubDate>
      <category>small-web</category>
      <guid>https://jelloeater.me/blog/posts-by-westenberg/</guid>
      
      <media:content url="https://www.joanwestenberg.com/content/images/size/w1000/2024/09/Cropped-1-1.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://www.joanwestenberg.com/content/images/size/w1000/2024/09/Cropped-1-1.png"/>
      


    
    



      
      
      <description><![CDATA[A great voice in the blog-o-sphere]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://www.joanwestenberg.com/content/images/size/w1000/2024/09/Cropped-1-1.png" alt="Featured Image"/></p>
        
        <p>I&rsquo;ve been following <a href="https://www.joanwestenberg.com/about/">Joan Westenberg</a> for a while. I forget exactly where I found this blog, but it really resonates with me, and I wanted to make it a point to share a few recent articles that I think are really good reads for anyone coming across my blog.</p>
<ul>
<li><a href="https://www.joanwestenberg.com/the-death-of-critical-thinking-will-kill-us-long-before-ai/">The Death of Critical Thinking Will Kill Us Long Before AI</a></li>
<li><a href="https://www.joanwestenberg.com/i-miss-the-internet/">I Miss the Internet</a></li>
<li><a href="https://www.joanwestenberg.com/fuck-the-cult-of-productivity/">Fuck the Cult of Productivity</a></li>
<li><a href="https://www.joanwestenberg.com/the-art-of-not-sharing/">The Art of Not Sharing</a></li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:posts-by-westenberg">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/posts-by-westenberg/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/small-web/">#small-web</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Load Bal Comic (from turnoff.us)</title>
      <link>
      https://jelloeater.me/blog/load-bal-comic/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/load-bal-comic/#comments
      </comments>
      <pubDate>Fri, 22 Nov 2024 19:16:23 +0000</pubDate>
      <category>cloud</category>
      
      <category>comic</category>
      <guid>https://jelloeater.me/blog/load-bal-comic/</guid>
      
      <media:content url="https://jelloeater.me/blog/load-bal-comic/image.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/load-bal-comic/image.png"/>
      


    
    



      
      
      <description><![CDATA[You work with what??]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/load-bal-comic/image.png" alt="Featured Image"/></p>
        
        <p>I know this is a repost, but it brings me so much joy&hellip;</p>
<p><img src="image.png" alt=""></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:load-bal-comic">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/load-bal-comic/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/cloud/">#cloud</a>

<a href="https://jelloeater.me/tags/comic/">#comic</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>BTRFS Slowness</title>
      <link>
      https://jelloeater.me/blog/btrfs-slowness/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/btrfs-slowness/#comments
      </comments>
      <pubDate>Fri, 01 Nov 2024 16:27:26 +0000</pubDate>
      <category>btrfs</category>
      
      <category>linux</category>
      
      <category>troubleshooting</category>
      <guid>https://jelloeater.me/blog/btrfs-slowness/</guid>
      
      <media:content url="https://jelloeater.me/blog/btrfs-slowness/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/btrfs-slowness/cover.png"/>
      


    
    



      
      
      <description><![CDATA[Why is my i7 laptop freezing all the time?]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/btrfs-slowness/cover.png" alt="Featured Image"/></p>
        
        <p>So this is going to be a quick post.</p>
<p>For anyone who is <a href="https://surajsinghbisht054.medium.com/understand-btrfs-file-system-copy-on-write-sub-volumes-snapshots-quota-group-part-1-c6305f87df9b">running BTRFS</a> on their computer, they MAY be getting occasional stalls at regular intervals.</p>
<p>You&rsquo;ll go looking in HTOP and such for what&rsquo;s killing it, but you&rsquo;ll notice that the CPU will only eat about one whole core at most and your disk IO will be getting slammed hard.</p>
<p>It&rsquo;s the fault of this guy&hellip;</p>
<p><img src="assistant.png" alt="assistant"></p>
<p><a href="https://forum.garudalinux.org/t/btrfs-cleaner-gobbling-up-cpu-but-quota-is-disabled/16437">https://forum.garudalinux.org/t/btrfs-cleaner-gobbling-up-cpu-but-quota-is-disabled/16437</a></p>
<p>If you disable quotas, the issue goes away. The more snapshots you have, the slower your system will run.</p>
<p>You&rsquo;ll want to also grab <a href="https://gitlab.com/btrfs-assistant/btrfs-assistant">btrfs-assistant</a>, this thing is magic.</p>
<p>That being said, if your not running BTRFS and <a href="https://github.com/linuxmint/timeshift">Timeshift</a>, you&rsquo;re really setting yourself up for failure if you like to tinker. Just make sure you don&rsquo;t fill your disk with snapshots, or you&rsquo;ll be in for a very bad time.</p>


  
    <blockquote class="alert alert-tip">
      <p class="alert-heading">
        💡
        
          Tip
        
      </p>
      <p>Just make sure you don&rsquo;t forget to <a href="https://askubuntu.com/questions/644623/is-it-safe-to-delete-apt-snapshot">clean your apt snapshots</a> as well.</p>
    </blockquote>
  


  
    <blockquote class="alert alert-tip">
      <p class="alert-heading">
        💡
        
          Tip
        
      </p>
      <p><a href="https://unix.stackexchange.com/questions/582222/btrfs-file-system-is-full-but-deleting-files-frees-no-space">Docker can cause issues as well</a>, so be sure to check that too!</p>
    </blockquote>
  
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>sudo apt-btrfs-snapshot delete-older-than 0d
</span></span></code></pre></div><p>You also may want to check out <a href="https://github.com/CyberShadow/btdu">this NCDU-like tool</a> as well!</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:btrfs-slowness">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/btrfs-slowness/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/btrfs/">#btrfs</a>

<a href="https://jelloeater.me/tags/linux/">#linux</a>

<a href="https://jelloeater.me/tags/troubleshooting/">#troubleshooting</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Does work bring joy?</title>
      <link>
      https://jelloeater.me/blog/fall-and-tennis/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/fall-and-tennis/#comments
      </comments>
      <pubDate>Sun, 20 Oct 2024 20:31:40 +0000</pubDate>
      <category>digital-detox</category>
      
      <category>life</category>
      <guid>https://jelloeater.me/blog/fall-and-tennis/</guid>
      
      <media:content url="https://jelloeater.me/blog/fall-and-tennis/cover.jpg" medium="image" type="image/jpg"/>
      <media:thumbnail url="https://jelloeater.me/blog/fall-and-tennis/cover.jpg"/>
      


    
    



      
      
      <description><![CDATA[What&#39;s a job, but a pile of pay checks?]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/fall-and-tennis/cover.jpg" alt="Featured Image"/></p>
        
        <p>Crickets are chirping.</p>
<p>The sun is starting to set.<br>
Cars are slowly driving by, and I can hear the sounds of the birds far away.</p>
<p>I drink my coffee in flip-flops, writing on an old Dell netbook that barely runs.<br>
It doesn&rsquo;t matter to the squirrel with half a tail&hellip; he&rsquo;s got bigger problems with the weather getting colder.</p>
<p>Trying not to go on Slack on my phone, just enjoy the sunset.<br>
ADHD is a pain.<br>
I take a deep breath&hellip; and let it out.<br>
&ndash; A sip of coffee, it&rsquo;s warm, sweet, with a hint of cinnamon.</p>
<hr>
<p>Is anyone going to ever read this? Maybe? If they do, I hope they stop, even for just a minute; to close their eyes - and breathe.</p>
<p>There&rsquo;s a man who lives next to me; he owns a small motorcycle. He just got home from an evening ride, I hope he was able to find peace on the road.</p>
<p>I miss hearing the leaves rustle and crunch most days. It&rsquo;s cool, but my flannel is still keeping up with the wind.<br>
Maybe shorts weren&rsquo;t the best idea, but who cares? I&rsquo;ll be back inside when I&rsquo;m done with my coffee.<br>
&ndash; Another sip.</p>
<hr>
<p>I&rsquo;ve done this before; take a coffee break just long enough to finish it.<br>
Stress is a killer, and I know I don&rsquo;t manage mine well. Too many things to fix and people to help.<br>
What makes me happy? My wife, my cat, my silly little blog.</p>
<p>Work&hellip; nah. When I was 30, it made me fulfilled, but never quite happy. There was always that itch in the back of my brain, &ldquo;Is that it? Is that all you can build?&rdquo; Self doubt pushes a person in strange ways.</p>
<p>There&rsquo;s two types of engineers, those with something to prove to themselves, and those with something to prove to someone else.</p>
<p>Well, that&rsquo;s a half-lie, for some lucky folks, it really is &ldquo;just a job&rdquo;.<br>
&ndash; Almost out.</p>
<hr>
<p>To you, my dear reader,  find what really makes you happy, because there will always be more work, always another problem to solve, and another chance to build it better; next time.</p>
<p>Young folks think their job will bring them purpose and meaning. Don&rsquo;t, don&rsquo;t, DON&rsquo;T let your job define your life.</p>
<p>Listen to your heart, it will tell you what makes it sing. 🎶<br>
To the person reading this, I hope you find what REALLY makes you feel joy, even if it <em>IS</em> what you do, to pay your bills.<br>
&ndash; Last sip.</p>
<hr>
<p>I&rsquo;m out of coffee; my feet are cold, but the sun still has a few more hours of life today. Maybe another cup?<br>
Nah, got code to fix, still so much to do, in that digital world. Black mirror, mirror, on my lap, what do you see&hellip;</p>
<p>Always so&hellip;</p>
<p><a href="busy.jpg"><img src="busy.jpg"
style="
border-radius: 2.5rem;
position: relative;
width: 75%;
margin-left: 10%;
"/></a></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:fall-and-tennis">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/fall-and-tennis/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/digital-detox/">#digital-detox</a>

<a href="https://jelloeater.me/tags/life/">#life</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Review - LazyGit (created by jesseduffield)</title>
      <link>
      https://jelloeater.me/review/lazygit/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/review/lazygit/#comments
      </comments>
      <pubDate>Sat, 19 Oct 2024 06:10:09 +0000</pubDate>
      <category>cli</category>
      
      <category>git</category>
      
      <category>golang</category>
      
      <category>utils</category>
      <guid>https://jelloeater.me/review/lazygit/</guid>
      
      <media:content url="https://jelloeater.me/review/lazygit/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/review/lazygit/cover.png"/>
      


    
    



      
      
      <description><![CDATA[Best Git TUI (ever?)]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/review/lazygit/cover.png" alt="Featured Image"/></p>
        
        <h2 id="stats">Stats</h2>
<p><img src="https://img.shields.io/github/stars/jesseduffield/lazygit?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars">
<img src="https://img.shields.io/github/downloads/jesseduffield/lazygit/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/jesseduffield/lazygit?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/jesseduffield/lazygit?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
<h2 id="review">Review</h2>
<p>I&rsquo;ve used a lot of TUIs over the years, and have dealt with many different Git GUIs as well. TBH most are either big desktop affairs a-la <a href="https://www.syntevo.com/smartgit/">SmartGit</a> or are <a href="https://github.com/extrawurst/gitui">underwhelming TUIs</a> that lack a user interface designed for <strong>Normal People™</strong>. I&rsquo;ve been looking for years for something to fill the gap between CLI speed and GUI simplicity, so enter LazyGit.</p>
<p>This app covers all the basic Git operations, including some more obscure ones, like dealing with submodules, editing remotes, and building custom patches. The diffs can use whatever pager you are comfortable with and customizing the configs is fairly easy. You will want to adjust some of the keybindings, as they are not the easiest to get used to. I will say the mouse support is great, and it works well even in small IDE console windows. As a bonus, anytime I see a CLI written in GoLang, I smile. Yeah yeah, I know, Rust FAST, Python SLOW, blah blah.</p>
<p>It <a href="https://plugins.jetbrains.com/plugin/24917-lazygit-in-editor-terminal">even has a plugin</a> to quickly open it in JetBrains IDEs in it&rsquo;s own full window panel. VScode <a href="https://marketplace.visualstudio.com/items?itemName=TomPollak.lazygit-vscode">has it&rsquo;s own version</a> as well. It&rsquo;s even replaced me using the IDE native VSC tooling, which is sorely lacking on VSCode; JetBrains, as bad.</p>
<p>Overall, you should definitely check it out, it&rsquo;s one of the few tools I use every day! Very very cool.
Questions, comments, (constructive) complaints, feel free to drop me a reply here or on my social. 😎</p>


  
    <blockquote class="alert alert-important">
      <p class="alert-heading">
        ℹ️
        
          Important
        
      </p>
      <p>You will want to make sure you disable ligatures in your IDE console. This is a known issue with JetBrains IDEs  causing a BIG slowdown when scrolling, even on small repos. The issue is NOT present in most terminal emulators, like Guake and WezTerm.</p>
    </blockquote>
  
<h2 id="pros--cons">Pros / Cons</h2>
<table>
  <thead>
      <tr>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>👍👍</td>
          <td>Amazing patch builder</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Mouse support 🖱</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Great interface</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Good help menu</td>
      </tr>
      <tr>
          <td>🤷</td>
          <td>No apt-get package, but single binary</td>
      </tr>
      <tr>
          <td>👎</td>
          <td>Keybindings are not too intuitive</td>
      </tr>
  </tbody>
</table>
<h2 id="verdict">Verdict</h2>
<p><strong>5/5 🥳</strong></p>
<h2 id="download">Download</h2>
<p><strong>💾 <a href="https://github.com/jesseduffield/lazygit/releases">https://github.com/jesseduffield/lazygit/releases</a> 💾</strong></p>
<h2 id="demo">Demo</h2>
<p><img src="https://github.com/jesseduffield/lazygit/raw/assets/demo/commit_and_push-compressed.gif" alt="Demo Gif"></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/review/lazygit/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/cli/">#cli</a>

<a href="https://jelloeater.me/tags/git/">#git</a>

<a href="https://jelloeater.me/tags/golang/">#golang</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>OpenGraph, CSS &amp; Misc Tweaks</title>
      <link>
      https://jelloeater.me/blog/css-is-not-fun/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/css-is-not-fun/#comments
      </comments>
      <pubDate>Mon, 14 Oct 2024 01:53:43 +0000</pubDate>
      <category>site</category>
      
      <category>small-web</category>
      
      <category>update</category>
      <guid>https://jelloeater.me/blog/css-is-not-fun/</guid>
      
      <media:content url="https://jelloeater.me/blog/css-is-not-fun/css.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/css-is-not-fun/css.png"/>
      


    
    



      
      
      <description><![CDATA[I STILL need a new hobby!]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/css-is-not-fun/css.png" alt="Featured Image"/></p>
        
        <h2 id="-again">👋 again</h2>
<p>Well, it&rsquo;s been a hot minute and I&rsquo;ve gotten deep into Hugo and front end dev. Man, <a href="https://csshell.dev/">CSS sucks</a>&hellip;</p>
<p>That being said, I&rsquo;ve made a ton of usability improvements to the site 😉</p>
<ul>
<li>Added PWA install manifest</li>
<li>Tweaked RSS feed web footer for comments</li>
<li>Updated RSS to include tags</li>
<li>Setup OpenGraph, for pasting pretty links</li>
<li>Cleaned up CSS for nav bar</li>
<li>Updated FavIcon to include new logo, rawr!</li>
</ul>
<p>ALSO, I&rsquo;ve updated my <a href="https://link.jelloeater.me/">LinkTree style site</a> with MOAR links, and some better CSS / flow 🤙</p>


  
    <blockquote>
      <p>Peace!</p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:css-is-not-fun">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/css-is-not-fun/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/site/">#site</a>

<a href="https://jelloeater.me/tags/small-web/">#small-web</a>

<a href="https://jelloeater.me/tags/update/">#update</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>RSS💗</title>
      <link>
      https://jelloeater.me/blog/rss-love/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/rss-love/#comments
      </comments>
      <pubDate>Fri, 04 Oct 2024 18:20:58 +0000</pubDate>
      <category>atom</category>
      
      <category>rant</category>
      
      <category>rss</category>
      <guid>https://jelloeater.me/blog/rss-love/</guid>
      
      <media:content url="https://jelloeater.me/blog/2024-10-04-rsslove.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/2024-10-04-rsslove.png"/>
      


    
    



      
      
      <description><![CDATA[Ranting about feeds]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/2024-10-04-rsslove.png" alt="Featured Image"/></p>
        
        <p>I know I rant and rave about RSS alot and am a big fan of <a href="https://www.inoreader.com/">Inoreader</a> but I know some folks like other options, so I figure I&rsquo;d post some recommendations here&hellip;</p>
<ul>
<li>If your on Android, give <a href="https://play.google.com/store/apps/details?id=com.seazon.feedme">FeedMe</a> a try.</li>
<li>Firefox users should try <a href="https://addons.mozilla.org/en-US/firefox/addon/feedbroreader/">FeeedBro</a>,</li>
<li>Chrome users are gonna have a hard time with browser specific ones it seems.</li>
<li>For desktop <a href="https://github.com/martinrotter/rssguard">RSSGuard</a> is nice, I&rsquo;ve used it a little.</li>
<li>For terminal usage <a href="https://newsboat.org/">NewsBoat</a> is nice, I use it for a few high profile feeds to avoid distraction.</li>
</ul>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:rss-love">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/rss-love/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/atom/">#atom</a>

<a href="https://jelloeater.me/tags/rant/">#rant</a>

<a href="https://jelloeater.me/tags/rss/">#rss</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Inspiration ... sort of</title>
      <link>
      https://jelloeater.me/blog/inspiration/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/inspiration/#comments
      </comments>
      <pubDate>Fri, 04 Oct 2024 18:18:57 +0000</pubDate>
      <category>comic</category>
      
      <category>mermaid</category>
      <guid>https://jelloeater.me/blog/inspiration/</guid>
      
      <media:content url="https://jelloeater.me/blog/2024-10-04-Inspiration-sortof.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/2024-10-04-Inspiration-sortof.png"/>
      


    
    



      
      
      <description><![CDATA[Ranting about feeds]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/2024-10-04-Inspiration-sortof.png" alt="Featured Image"/></p>
        
        <p>And they say state diagrams cannot be funny&hellip;</p>
<pre class="mermaid">stateDiagram-v2
    [*] --> New_Idea
    New_Idea --> Working_On_Project:Write down idea
    Working_On_Project --> Bored:Life
    Bored --> New_Idea:Inspiration
    Project_Done --> [*] :Feeling of accomplishment
  </pre>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:inspiration">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/inspiration/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/comic/">#comic</a>

<a href="https://jelloeater.me/tags/mermaid/">#mermaid</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Publishing CLI Apps (with Apt &amp; YUM)</title>
      <link>
      https://jelloeater.me/blog/publishing-cli-apps/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/publishing-cli-apps/#comments
      </comments>
      <pubDate>Wed, 02 Oct 2024 17:35:04 +0000</pubDate>
      <category>apt</category>
      
      <category>dev</category>
      
      <category>golang</category>
      <guid>https://jelloeater.me/blog/publishing-cli-apps/</guid>
      
      <media:content url="https://jelloeater.me/blog/publishing-cli-apps/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/publishing-cli-apps/cover.png"/>
      


    
    



      
      
      <description><![CDATA[How to publish your first CLI app!]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/publishing-cli-apps/cover.png" alt="Featured Image"/></p>
        
        <h2 id="intro">Intro</h2>
<p>I&rsquo;ve gotten to become quite the fan of CLI apps as of late. Maybe it&rsquo;s the allure of the terminal of my childhood (starting with DOS on a 486/33 and my dad&rsquo;s old <a href="https://en.wikipedia.org/wiki/Apple_IIe">Apple IIe</a>). I was born a little too late for the Gen X <a href="https://en.wikipedia.org/wiki/Commodore_64">Commodore64</a> era, but just in time to know more then just Windows 95. It was interesting era, back when dial up and 56k modems were king. I know most blog posts these days have intro fluff, to pad out word count for SEO, but this really is even why I still love the CLI when so many the younger folks these days only know GUI apps. Nothing makes me happier then to see Gen Z kids fire up the terminal, even for simple tasks. Man, wait till Gen Alpha finds out <a href="https://en.wikipedia.org/wiki/Bulletin_board_system">what a BBS is</a>. &ldquo;Grandpa computers&rdquo; they&rsquo;ll probably say 🤣. <em>&ldquo;GET OFF MY LAWN&rdquo; ✊✊</em></p>
<p>Projects like <a href="https://www.omgubuntu.co.uk/2016/11/make-cool-retro-terminal-ubuntu">CoolRetroTerm</a> definitely have a warm place in my heart, for brining back the CLI love. I still prefer to do some of my blogging in <a href="https://micro-editor.github.io/">Micro</a> on my old Netbook, really let&rsquo;s you concentrate on just writing. VSCode <a href="https://code.visualstudio.com/docs/getstarted/userinterface#_zen-mode">ZenMode</a> and <a href="https://www.marktext.cc/">MarkText</a> come close I guess?</p>
<pre class="mermaid">flowchart LR
Build_App --> GH_Actions --> ??? --> Profit!!!
  </pre>
  
<h2 id="packaging">Packaging</h2>
<p>Anyway, I digress&hellip;</p>
<p>So after writing my little CLI app <a href="/blog/stampy">Stampy</a> I ran into a small problem, how to distribute it? I was at least smart enough to think a head an write it in GoLang (as much as I wanted to just build it in Python) to avoid the dreaded <a href="/blog/poetry-in-motion">wrath of Python Packaging</a>.
One thing that has always stumped me was, how folks publish their nice CLI apps to fancy package management systems such as APT and YUM.</p>
<p>Normally to get your app built you would just do a simple <code>go build .</code> and boom, instant binary. As great as this is for local dev, it doesn&rsquo;t do much good for cross platform compiles. There are some nice guides to <a href="https://opensource.com/article/21/1/go-cross-compiling">show you how to do it</a>, but&hellip; tl;dr for my 🐟🧠. So I did some more digging, there had to be a nice tool&hellip; and sure as heck, there is <a href="https://goreleaser.com/">GoReleaser</a>!</p>
<p>After reading through some very well written documentation, I was able to do a quick local cross platform build, easy-peasy.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>goreleaser --snapshot --clean
</span></span></code></pre></div><p>Getting builds to happen with GitHub releases was easy as well, as they have nice pre-written <a href="https://goreleaser.com/ci/actions/">GH Actions</a>!</p>
<p>Users can now just install my app with tools like <a href="https://github.com/zyedidia/eget">eget (good)</a> and <a href="https://github.com/marwanhawari/stew">stew (way better)</a>!</p>
<p>While you can also <code>go install github.com/xxx</code> all this would be doing is clone the repo, build it locally, and put the bin in your $GOBIN folder. Not really the same as proper package management tooling, but does work in a pinch for folks <strong>who already have Go installed</strong>. Not really a option for the average user IMHO. 😅</p>
<p>And not only that, GoReleaser offers packaging as well! So now you can easily craft DEBs and RPMs. I was one step closer to the scared <code>apt-get install stampy</code>. The only thing missing was how to create a APT repo. This last key part is not easy for sure. I spent a hour or so looking into how to self host this with GitHub Pages, and while it is doable, it was far easier to just use a free service like <a href="https://packagecloud.io/">Packagecloud</a> to handle the signing and repo hosting for the low low cost of $0 per month😉.</p>
<p><img src="/blog/publishing-cli-apps/Packagecloud.png" alt="pricing"></p>
<p>You can see a example of the whole workflow <a href="https://github.com/Jelloeater/stampy/blob/main/.github/workflows/release.yml">HERE</a></p>
<p>I&rsquo;ll also include a stripped down version of it here in a code block, for anybody stumbling across the blog post itself.</p>
<p>For a high level overview the GHA does the following:</p>
<ul>
<li>Writes out he GoReleaser config</li>
<li>Runs the Releaser itself</li>
<li>Uploads the .debs for the next job</li>
<li>In chained job, we pull the .deb and upload it to PackageCloud</li>
<li>Done!</li>
</ul>
<h2 id="github-actions-example">GitHub Actions Example</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">Release</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">pull_request</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">push</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#75715e"># run only against tags</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">tags</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">permissions</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">contents</span>: <span style="color:#ae81ff">write</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">packages</span>: <span style="color:#ae81ff">write</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">issues</span>: <span style="color:#ae81ff">write</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">goreleaser</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Checkout</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v4</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">fetch-depth</span>: <span style="color:#ae81ff">0</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Set up Go</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/setup-go@v5</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">go-version</span>: <span style="color:#ae81ff">stable</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Release config</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          cat &lt;&lt; EOF &gt; /tmp/goreleaser-github.yaml
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          project_name: EXAMPLE
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          version: 2
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          builds:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            - env: [CGO_ENABLED=0]
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              goos:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                - linux
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              goarch:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                - amd64
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          nfpms:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            -
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              maintainer: YOU &lt;your@email.com&gt;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              bindir: /usr/local/bin
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              description: Copy formatted timestamp to system clipboard
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              homepage: https://github.com/USERNAME/REPO
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              license: MIT
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">              formats:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">                - deb
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          release:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            draft: false # If set to true, will not auto-publish the release.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            replace_existing_draft: true
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            replace_existing_artifacts: true
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            target_commitish: &#34;{{ .Commit }}&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            prerelease: auto
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            make_latest: true
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            mode: replace
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">            include_meta: true
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          EOF</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Run GoReleaser</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">goreleaser/goreleaser-action@v6</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">distribution</span>: <span style="color:#ae81ff">goreleaser</span>
</span></span><span style="display:flex;"><span>          <span style="color:#75715e"># &#39;latest&#39;, &#39;nightly&#39;, or a semver</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">version</span>: <span style="color:#e6db74">&#34;~&gt; v2&#34;</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">args</span>: <span style="color:#ae81ff">release --clean --verbose --config /tmp/goreleaser-github.yaml</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">GITHUB_TOKEN</span>: <span style="color:#ae81ff">${{ secrets.GITHUB_TOKEN }}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Upload .deb artifact x86</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/upload-artifact@v3</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">name</span>: <span style="color:#ae81ff">deb-package</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">path</span>: <span style="color:#ae81ff">dist/*amd64.deb</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">pkgcld_amd64-deb</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">needs</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">goreleaser</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">strategy</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">max-parallel</span>: <span style="color:#ae81ff">3</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">matrix</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">distro</span>:
</span></span><span style="display:flex;"><span>        - <span style="color:#ae81ff">debian/bookworm</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#ae81ff">ubuntu/noble</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#ae81ff">ubuntu/jammy</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Download .deb artifact</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/download-artifact@v3</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">name</span>: <span style="color:#ae81ff">deb-package</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Push package to packagecloud.io</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">computology/packagecloud-github-action@v0.6</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">package-name</span>: <span style="color:#ae81ff">./*.deb</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">packagecloud-username</span>: <span style="color:#ae81ff">USERNAME</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">packagecloud-reponame</span>: <span style="color:#ae81ff">APP_NAME</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">packagecloud-distro</span>: <span style="color:#ae81ff">${{ matrix.distro }}</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">packagecloud-token</span>: <span style="color:#ae81ff">${{ secrets.PACKAGECLOUD_TOKEN }}</span>
</span></span></code></pre></div><hr>


  
    <blockquote class="alert alert-important">
      <p class="alert-heading">
        ℹ️
        
          Important
        
      </p>
      <p>You&rsquo;ll want to make sure things like program structure and your <code>go.mod</code> file <a href="https://go.dev/doc/modules/layout">are properly setup</a>, or you&rsquo;re going to run into issues with publishing your app properly.</p>
    </blockquote>
  
<p>Side note: You can also <a href="https://goreleaser.com/customization/homebrew">distribute your app with Homebrew</a>, but I didn&rsquo;t bother due to the extra GH Actions complexity involving PAT secrets and the fact that I&rsquo;m pretty well covered with <em>Apt</em>, <em>Yum</em>, and <em>Stew</em>&hellip; tasty! 🥘</p>
<p>This leads me to the big second thing when releasing a app. <strong>👏DOCUMENTATION👏</strong> and the much neglected <code>Readme.md</code>😭!</p>
<h2 id="readme-formatting">Readme Formatting</h2>
<p>There are a few elements that I feel like any decent readme should have, as they will help your app stand out from all the apps with little to no documentation, or worse yet, bad documentation.</p>
<p>I highly recommend you follow this format for crafting your own readme!
I&rsquo;m a big fan of badges for flair, but I feel like having a little <strong>GIF</strong> demo really shows folks what it&rsquo;s about, just like listing <strong>screenshots</strong> of your GUI apps. Using ASCIINEMA was easy enough, and they have a nice <strong>GIF</strong> converter as well to get everything looking just right.</p>


  
    <blockquote class="alert alert-tip">
      <p class="alert-heading">
        💡
        
          Tip
        
      </p>
      <p>As a side note <a href="https://github.com/carlrobertoh/CodeGPT">I did have CodeGPT write me some GoLang unit tests</a>, which I know are normally painful to write.  It&rsquo;s a fantastic plugin if you&rsquo;re on the JetBrains suite.</p>
    </blockquote>
  
<h3 id="readme-example">Readme Example</h3>
<ul>
<li><a href="https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-go">Test badges</a></li>
<li><a href="https://asciinema.org/">GIF Demo</a></li>
<li><a href="https://github.com/vladopajic/go-test-coverage">Coverage badges</a></li>
<li><a href="https://goreportcard.com">Go Report card</a></li>
<li>Install
<ul>
<li>Package manager (ex apt)</li>
<li>Binary install (ex eget)</li>
<li>Go Install snip</li>
</ul>
</li>
<li>Usage
<ul>
<li><a href="https://idea-instructions.com/quick-sort.png">CLEAR INSTRUCTIONS and example code snips</a></li>
</ul>
</li>
<li>Settings
<ul>
<li>Where settings get saved</li>
<li>Do you use INI files, JSON, Env Vars?</li>
</ul>
</li>
<li>How to access built-in help</li>
<li><strong>How to build the app from source</strong></li>
<li>Prior art (aka previous work/inspiration)</li>
</ul>
<h2 id="wrap-up">Wrap up</h2>
<p>Similar to when I set out to learn how to publish Python apps, I&rsquo;m glad to be able to say I feel like I can properly distribute any app I write in GoLang going forward. It&rsquo;s a neat skill that I picked up, and with this blog post, I hope it can help others do the same! Cheers!</p>
<p>-Jelloeater</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:publishing-cli-apps">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/publishing-cli-apps/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/apt/">#apt</a>

<a href="https://jelloeater.me/tags/dev/">#dev</a>

<a href="https://jelloeater.me/tags/golang/">#golang</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Comment Section and other neat things</title>
      <link>
      https://jelloeater.me/blog/new-site-features/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/new-site-features/#comments
      </comments>
      <pubDate>Sun, 29 Sep 2024 02:23:12 +0000</pubDate>
      <category>apps</category>
      
      <category>meta</category>
      
      <category>update</category>
      <guid>https://jelloeater.me/blog/new-site-features/</guid>
      
      <media:content url="https://jelloeater.me/blog/2024-09-28_22-29.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/2024-09-28_22-29.png"/>
      


    
    



      
      
      <description><![CDATA[I need a new hobby, but hey, this is neat at least]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/2024-09-28_22-29.png" alt="Featured Image"/></p>
        
        <h2 id="heading">👋</h2>
<p>So I&rsquo;ve added a few new neat features to the site:</p>
<ul>
<li>Comment section powered by Github Discussions</li>
<li>App list change list, this is still a local pre-commit hook, but I&rsquo;ll eventually add it as a GH Action</li>
<li>CSS cleanup, man was the article list hard to read</li>
<li>Added clickable tags in the article view, still need to figure out how to add it in other views</li>
</ul>
<p>Should make the site more usable and user friendly. Also should save me from having to spam folks with posts when I add new apps to my ever growing list.</p>
<p><a href="/apps_changelog"><strong>🪵Changelog HERE🪵</strong></a></p>


  
    <blockquote>
      <p>Peace!</p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:new-site-features">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/new-site-features/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/apps/">#apps</a>

<a href="https://jelloeater.me/tags/meta/">#meta</a>

<a href="https://jelloeater.me/tags/update/">#update</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Site design and new some new apps</title>
      <link>
      https://jelloeater.me/blog/2024-09-23-apps-and-tweaks/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/2024-09-23-apps-and-tweaks/#comments
      </comments>
      <pubDate>Mon, 23 Sep 2024 00:39:01 +0000</pubDate>
      <category>apps</category>
      
      <category>meta</category>
      
      <category>update</category>
      <guid>https://jelloeater.me/blog/2024-09-23-apps-and-tweaks/</guid>
      
      <media:content url="https://jelloeater.me/blog/2024-09-23.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/2024-09-23.png"/>
      


    
    



      
      
      <description><![CDATA[Find, Trace, and blog tweaks]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/2024-09-23.png" alt="Featured Image"/></p>
        
        <h2 id="hey">Hey</h2>
<p>So I&rsquo;ve added some quality of life stuff to my blog. Just minor things like reading time and some visual tweaks, should make the site itself easier to read. I&rsquo;ve also added a few neat app to my list ASN and fd-find. Both are handy for getting network info and making the common &lsquo;find&rsquo; command easier to navigate. I&rsquo;m a big fan of aliases for common commands, often swapping them for easier to use version written in GoLang (yay) or Rust (&hellip;yay?).</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-zsh" data-lang="zsh"><span style="display:flex;"><span>alias ls<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;exa --git --icons&#39;</span>
</span></span><span style="display:flex;"><span>alias la<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;exa --long --extended --links --header --git --icons --classify -a -a&#39;</span>
</span></span><span style="display:flex;"><span>alias dir<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;exa --oneline --icons -a -a&#39;</span>
</span></span><span style="display:flex;"><span>alias tree<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;exa --git --tree --recurse --level=2 --icons -all --no-permissions --no-user&#39;</span>
</span></span><span style="display:flex;"><span>alias tree-deep<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;exa --git --tree --recurse --level=5 --icons -all --no-permissions --no-user&#39;</span>
</span></span><span style="display:flex;"><span>alias grep<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;rga -C 3 -S -L -M 140&#39;</span>
</span></span><span style="display:flex;"><span>alias cat<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;batcat&#39;</span>
</span></span><span style="display:flex;"><span>alias nano<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;micro&#39;</span>
</span></span><span style="display:flex;"><span>alias traceroute<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;asn&#39;</span>
</span></span><span style="display:flex;"><span>alias finder<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;xdg-open&#39;</span>
</span></span><span style="display:flex;"><span>alias find_fzf<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;rga-fzf&#39;</span>
</span></span><span style="display:flex;"><span>alias lg<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;lazygit&#39;</span>
</span></span><span style="display:flex;"><span>alias wez<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;(&amp;&gt;/dev/null nohup wezterm start --cwd . &amp;)&#39;</span>
</span></span><span style="display:flex;"><span>alias curl<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;curlie&#39;</span>
</span></span><span style="display:flex;"><span>alias top<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;htop&#39;</span>
</span></span><span style="display:flex;"><span>alias ncdu<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;gdu&#39;</span>
</span></span><span style="display:flex;"><span>alias dig<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;doggo&#39;</span>
</span></span><span style="display:flex;"><span>alias neofetch<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;fastfetch&#39;</span>
</span></span><span style="display:flex;"><span>alias age<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;sudo nala&#39;</span>
</span></span><span style="display:flex;"><span>alias find<span style="color:#f92672">=</span><span style="color:#e6db74">&#39;fdfind&#39;</span>
</span></span></code></pre></div><p>Also comparing a few util to make removing files a little safer 🤲.</p>
<ul>
<li><a href="https://github.com/nateshmbhat/rm-trash">https://github.com/nateshmbhat/rm-trash</a></li>
<li><a href="https://github.com/sindresorhus/trash-cli">https://github.com/sindresorhus/trash-cli</a></li>
<li><a href="https://github.com/umlx5h/gtrash">https://github.com/umlx5h/gtrash</a></li>
</ul>
<p><strong>PS if you can, you should really be using <a href="https://en.wikipedia.org/wiki/Btrfs">BTRFS</a> and <a href="https://github.com/linuxmint/timeshift">Timeshift</a>, you&rsquo;ll thank me later 😉</strong></p>


  
    <blockquote>
      <p>EDIT 2024-09-23T21:42:04Z</p>
<p>For OSX maybe try <a href="https://github.com/andreafrancia/trash-cli">https://github.com/andreafrancia/trash-cli</a>? For Linux <a href="https://github.com/umlx5h/gtrash">https://github.com/umlx5h/gtrash</a> is working great!</p>
    </blockquote>
  

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:2024-09-23-apps-and-tweaks">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/2024-09-23-apps-and-tweaks/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/apps/">#apps</a>

<a href="https://jelloeater.me/tags/meta/">#meta</a>

<a href="https://jelloeater.me/tags/update/">#update</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Review - Superfile (Created by yorukot)</title>
      <link>
      https://jelloeater.me/review/superfile/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/review/superfile/#comments
      </comments>
      <pubDate>Thu, 12 Sep 2024 04:50:59 +0000</pubDate>
      <category>cli</category>
      
      <category>golang</category>
      
      <category>utils</category>
      <guid>https://jelloeater.me/review/superfile/</guid>
      
      <media:content url="https://github.com/yorukot/superfile/raw/main/asset/demo.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://github.com/yorukot/superfile/raw/main/asset/demo.png"/>
      


    
    



      
      
      <description><![CDATA[CLI File Managers are neat]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://github.com/yorukot/superfile/raw/main/asset/demo.png" alt="Featured Image"/></p>
        
        <h2 id="stats">Stats</h2>
<p><img src="https://img.shields.io/github/stars/yorukot/superfile?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars">
<img src="https://img.shields.io/github/downloads/yorukot/superfile/total?style=for-the-badge&amp;logo=github" alt="GitHub Downloads (all assets, all releases)"> <img src="https://img.shields.io/github/last-commit/yorukot/superfile?style=for-the-badge&amp;logo=github" alt="GitHub last commit"> <img src="https://img.shields.io/github/commit-activity/m/yorukot/superfile?style=for-the-badge&amp;logo=github" alt="GitHub commit activity"></p>
<h2 id="review">Review</h2>
<p>I&rsquo;ve tried quite a few file managers over the years, from Midnight Commander to GUI ones such as Caja and Thunar. I always seem to be coming back to good ol&rsquo; MC. That being said, I&rsquo;ve seen to recommended by the nice folks over at TerminalTrove, so I took a look, especially due to the fact that it was written in GoLang, a big fav of mine.</p>
<p>Well all I can say is wow, for a keyboard only file manager, it&rsquo;s fantastic, and very easy to pick up. Colorful, icons all over the interface. It may be too much visually for some more spartan users, but for me, I love a VISUAL TUI. The BubbleTea framework really shines here for sure. It&rsquo;s even got a basic image render, even if it&rsquo;s a bit pixel-y.🖌</p>
<p>I do wish it had proper mouse support, but it is what it is. Also would be nice if it full image previews, but I get that can be hard to support.</p>
<h2 id="pros--cons">Pros / Cons</h2>
<table>
  <thead>
      <tr>
          <th></th>
          <th></th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>👍</td>
          <td>Great interface</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Easy to learn</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Nice Previews</td>
      </tr>
      <tr>
          <td>👍</td>
          <td>Easy Install</td>
      </tr>
      <tr>
          <td>👎</td>
          <td>No mouse support</td>
      </tr>
      <tr>
          <td>👎</td>
          <td>No apt-get package</td>
      </tr>
  </tbody>
</table>
<h2 id="verdict">Verdict</h2>
<p><strong>4/5</strong></p>
<h2 id="download">Download</h2>
<p><strong>💾 <a href="https://github.com/yorukot/superfile/releases">https://github.com/yorukot/superfile/releases</a> 💾</strong></p>
<h2 id="demo">Demo</h2>
<p><img src="https://github.com/yorukot/superfile/raw/main/asset/demo.gif" alt="Demo Gif"></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/review/superfile/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/cli/">#cli</a>

<a href="https://jelloeater.me/tags/golang/">#golang</a>

<a href="https://jelloeater.me/tags/utils/">#utils</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Stampy</title>
      <link>
      https://jelloeater.me/blog/stampy/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/stampy/#comments
      </comments>
      <pubDate>Sun, 08 Sep 2024 21:17:36 -0500</pubDate>
      <category>dev</category>
      
      <category>golang</category>
      <guid>https://jelloeater.me/blog/stampy/</guid>
      
      <media:content url="https://jelloeater.me/blog/stampy/cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/stampy/cover.png"/>
      


    
    



      
      
      <description><![CDATA[Tinkering w/ GoLang]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/stampy/cover.png" alt="Featured Image"/></p>
        
        <p>Over the last couple of weeks I&rsquo;ve been needing to do something very simple, in theory, type out a timestamp.</p>
<p>Yeah, I could just use one of the 1000&rsquo;s of bash scripts, or write it out in Python in my sleep, but I wanted to use this as a excuse to get back into writing GoLang. I first fell in love with it over a Thanksgiving break. Took me a little over a week (40 hours) to get the hang of it well enough to write a nice little <a href="https://github.com/Jelloeater/UptimeParserGo">custom SNMP parser</a> for the monitoring app <a href="https://www.paessler.com/prtg">PRTG</a>.</p>
<p>The issue I originally ran into was that the Python single threaded app didn&rsquo;t spit out the data needed fast enough. Sad to say it was easier for me to learn a while programming language, then, at the time, to learn how to do multi threading in Python🤣.</p>
<p>Fast forward to 2024, and I was a bit envious of all the neat CLI apps being written in Rust. I have nothing against it personally, I just don&rsquo;t have the time or the patience to tackle something with that STEEP of a learning curve in my free time. IMHO GoLang is &ldquo;fast enough&rdquo; for most practical purposes. I tell everyone I know, if you can only learn one programming language, learn Python. If you can learn two, learn Python AND GoLang. They complement each other well, while being both easy to learn and very capable in the devops space.</p>
<p>Anyway, <a href="https://github.com/Jelloeater/stampy">I hope you like Stampy 💝</a>, drop me a comment or a email if you like it?</p>
<p><a href="https://github.com/Jelloeater/stampy/stargazers"><img src="https://img.shields.io/github/stars/jelloeater/stampy?style=for-the-badge&amp;logo=github" alt="GitHub Repo stars"></a></p>
<p><img src="https://github.com/Jelloeater/stampy/blob/main/stampy.gif?raw=true" alt=""></p>
<p>Thanks!</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:stampy">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/stampy/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/dev/">#dev</a>

<a href="https://jelloeater.me/tags/golang/">#golang</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Small Web</title>
      <link>
      https://jelloeater.me/blog/small-web/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/small-web/#comments
      </comments>
      <pubDate>Thu, 05 Sep 2024 20:00:00 -0500</pubDate>
      <category>small-web</category>
      <guid>https://jelloeater.me/blog/small-web/</guid>
      
      <media:content url="https://jelloeater.me/blog/2024-09-07.jpg" medium="image" type="image/jpg"/>
      <media:thumbnail url="https://jelloeater.me/blog/2024-09-07.jpg"/>
      


    
    



      
      
      <description><![CDATA[It&#39;s the 90&#39;s all over again!]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/2024-09-07.jpg" alt="Featured Image"/></p>
        
        <p>So I updated the main page to better reflect that I&rsquo;ll be keeping a goofy little blog here as well. Should be nice. To be honest, keeping a formal dev blog is pretty hard for me, long form, lot of research, A LOT of pressure to make it good and stand out. I&rsquo;ll still try and write stuff for it, but the only big thing I have &ldquo;in the pipe&rdquo; is a neat article on the rise of the #smallweb so that&rsquo;ll be neat when I finally finish it. Been super busy with FHF stuff and works been busy as heck as well w/ doing CICD stuffs.</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:small-web">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/small-web/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/small-web/">#small-web</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>First Post, don&#39;t ignore</title>
      <link>
      https://jelloeater.me/blog/first-post-dont-ignore/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/first-post-dont-ignore/#comments
      </comments>
      <pubDate>Sun, 18 Aug 2024 20:00:00 -0500</pubDate>
      <category>intro</category>
      <guid>https://jelloeater.me/blog/first-post-dont-ignore/</guid>
      
      <media:content url="https://jelloeater.me/blog/2024-08-18.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/2024-08-18.png"/>
      


    
    



      
      
      <description><![CDATA[FIRST! ... at least on the new site 🙄]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/2024-08-18.png" alt="Featured Image"/></p>
        
        <p>So&hellip; I created this site because I felt that having folks just visit my link site wasn&rsquo;t quite up to what folks expect when they thing of a &ldquo;home page&rdquo; from back in the days of old. So far this page is just a collection of apps that I&rsquo;ve found are neat. You may like them, maybe you don&rsquo;t, but hey hopefully someone does 😅.</p>
<p>Anyway, I&rsquo;m going to be putting updates here when I add new stuff that I find interesting, so it&rsquo;s:</p>
<ul>
<li>Separate from my more <a href="https://jelloeater.dev">formal dev blog</a> and&hellip;</li>
<li>A blog site somewhere greater then my <a href="https://mastodon.social/@jelloeater">&ldquo;neat shit&rdquo; Mastodon</a></li>
</ul>
<p>Basically for medium sized internet-y updates 💖.</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:first-post-dont-ignore">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/first-post-dont-ignore/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/intro/">#intro</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>ADHD, Productivity and Time Management</title>
      <link>
      https://jelloeater.me/blog/adhd-productivity/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/adhd-productivity/#comments
      </comments>
      <pubDate>Tue, 16 Apr 2024 00:02:10 -0500</pubDate>
      <category>adhd</category>
      
      <category>automation</category>
      
      <category>beginners</category>
      
      <category>productivity</category>
      <guid>https://jelloeater.me/blog/adhd-productivity/</guid>
      
      <media:content url="https://jelloeater.me/blog/adhd-productivity/adhd-cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/adhd-productivity/adhd-cover.png"/>
      


    
    



      
      
      <description><![CDATA[Learning to think slow, to move fast]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/adhd-productivity/adhd-cover.png" alt="Featured Image"/></p>
        
        <p><em>(Image credit to bphope.com)</em></p>
<h2 id="intro">Intro</h2>
<p>So it&rsquo;s no secret among my friends and family that I&rsquo;m a bit of a scatterbrain. I also love to offload anything difficult into different applications, either on my phone or on my desktop/laptop. While I&rsquo;ve <a href="/blog/tools-dont-matter">covered some great tooling before</a>, this time, I&rsquo;d like to review a few neat things I&rsquo;ve found that more normal users can benefit from.</p>
<p>I make no effort to hide the fact that I have a really bad case of ADHD. No, not the &ldquo;I cannot concentrate when I have a TV on in the background bad&rdquo;, more like, I&rsquo;ve sat staring at my monitor for 45 minutes and cannot make my brain engage in something I know I <strong>NEED</strong> to get done. This can be very frustrating and downright upsetting. Anyone with ADHD knows that stress and anxiety love to tag along RIGHT when you need to get things done. This can create a depressing cycle that can be hard to break out of, depending on the day.</p>
<p>While medication can work for some folks, for me I would just hyper-focus on one thing and then struggle to switch to the next task. A good strong cup of coffee and two <a href="tps://www.amazon.com/gp/product/B09G5TFVYK">L-Theanine gummies</a> every morning do help. Also be sure to drink water, <strong>like a lot of it.</strong></p>
<p><strong>UPDATE 4/18</strong></p>
<p>For some really great inspiration, you should check out <a href="https://www.youtube.com/watch?v=JiwZQNYlGQI">Jessica McCabe</a> and <a href="https://www.youtube.com/@HowtoADHD">How to ADHD - YouTube</a></p>
<h2 id="staying-focused">Staying Focused</h2>
<h3 id="focusmeter"><a href="https://focusmeter.app/">Focusmeter</a></h3>
<p><a href="https://play.google.com/store/apps/details?id=co.zeitic.focusmeter">https://play.google.com/store/apps/details?id=co.zeitic.focusmeter</a></p>
<p><img src="https://play-lh.googleusercontent.com/OfW0vfTGFaKIe9f1CZ7REsSEigMK2B7xIH6etF11IbiuCwwC4NVgySErWJ7iDg4R8aM" alt=""></p>
<p>This app sits at the core of my workflow, bite-sized 25-minute sprints of work. One of the best parts is that it not only generates great analytics but also can set your phone to Do Not Disturb mode, which helps keep those dopamine hits at bay.</p>
<h3 id="block">Block</h3>
<p><a href="https://play.google.com/store/apps/details?id=com.wverlaek.block">https://play.google.com/store/apps/details?id=com.wverlaek.block</a></p>
<p><img src="https://play-lh.googleusercontent.com/yrmXbi7NFsMkOT1DQeb6mNqi-fcwOIkzfZgF5_qRA8YRPJB5z1icBRVChxxzKFGpsYSI" alt=""></p>
<p>While having a *<em>Pomodoro</em> timer on my phone lets me know how much time I have left, it does not, however, keep me from <a href="https://en.wikipedia.org/wiki/Doomscrolling">doom-scrolling</a> between breaks. This is where Block comes in. While there are dozens of app blockers, all the ones I&rsquo;ve tried had tons of features tacked on, bloated GUIs and junk I just didn&rsquo;t need. This app does what it says on the tin, and does it WELL.</p>
<p>If you&rsquo;re looking for a more physical approach, <a href="https://www.amazon.com/dp/B0CRB4BTRQ">I&rsquo;ve also gotten this timer as well</a> for a few folks, and it works quite well.</p>
<h3 id="business-calendar-2"><a href="https://www.appgenix-software.com/">Business Calendar 2</a></h3>
<p><a href="https://play.google.com/store/apps/details?id=com.appgenix.bizcal">https://play.google.com/store/apps/details?id=com.appgenix.bizcal</a></p>
<p><img src="https://play-lh.googleusercontent.com/9v6_bQCaSO0-UUGEhp-eTkKlUZDeYAQgv5rR9tM_FogEcF3f0XnlTvDCCJ3rz_5jO5k" alt=""></p>
<p>I&rsquo;ve been using this calendar app for YEARS, back when I first switched to Android from a BlackBerry Curve 😉</p>
<p>The best part of it is that it syncs with Google Tasks AND has a WearOS app, so I can view and edit tasks right from my Galaxy Watch. This ties in nicely to &hellip;</p>
<h3 id="sectograph-day--time-planner"><a href="https://sectograph.com/">Sectograph Day &amp; Time planner</a></h3>
<p><a href="https://play.google.com/store/apps/details?id=prox.lab.calclock">https://play.google.com/store/apps/details?id=prox.lab.calclock</a></p>
<p><img src="https://play-lh.googleusercontent.com/PIQOdExIHKKMRIgv2tS3ADD9Nhc77ToawtKbquQnwIm_FP_O5_ZN6IwZXF2U5Da5Jyw" alt=""></p>
<p>This is my default watch face for my smartwatch. I&rsquo;ve been using it for years, as I&rsquo;ve changed to different WearOS brand watches. Being able to see how much time I have to get to the next event or what my day will look like in terms of density helps me avoid being late to meetings and appointments.</p>
<h3 id="tockler"><a href="https://maygo.github.io/tockler/">Tockler</a></h3>
<p><img src="https://github.com/MayGo/tockler/raw/master/screenshots/light/tockler-timeline.png" alt=""></p>
<p>If you ever wonder where your time went while working on a personal or professional project, you should give Tockler a try. Many time tracking apps are invasive and creepy. Some log your data god knows where, and if you&rsquo;re like me, you value your privacy. All the data logged by this app is stored LOCALLY ONLY. You can generate reports from inside the GUI and if you feel fancy, pull data directly out of the SQLite database and do your own reporting. Big shout out to <a href="https://activitywatch.net/">Activity Watch which I initially discovered</a>. Nothing wrong with this app, and I&rsquo;d encourage you to try both and see which one works best for you. <a href="https://github.com/nomeata/arbtt">Arbtt</a> seems nice if you&rsquo;re really into CLI apps.</p>
<h2 id="offloading">Offloading</h2>
<h3 id="calendly"><a href="https://calendly.com/">Calendly</a></h3>
<p><a href="https://play.google.com/store/apps/details?id=com.calendly.app">https://play.google.com/store/apps/details?id=com.calendly.app</a></p>
<p><img src="https://help.calendly.com/hc/article_attachments/4403029413655" alt=""></p>
<p>No more &ldquo;So what time works for you?&rdquo;, or endless email back and forth to find shared meeting times. This web app links with Google calendar or Office 365 to automatically make sure appointments that get scheduled show up on your calendar AND appointments you already have booked, populate your free/busy time slots.</p>
<p>It also has a great &ldquo;meeting poll&rdquo; feature to figure out when your group/team is ALL free.</p>
<h3 id="inoreader"><a href="https://www.inoreader.com/">Inoreader</a></h3>
<p><a href="https://play.google.com/store/apps/details?id=com.innologica.inoreader">https://play.google.com/store/apps/details?id=com.innologica.inoreader</a></p>
<p><img src="https://play-lh.googleusercontent.com/Tfcyw9cNgHFiY8uzF9_AVBSwoyssMQ58YOg3VKE6ECUeEnL7zd9P0y_PGfN-iCD3Zw" alt=""></p>
<p>I&rsquo;m sure many of you were bummed when <a href="https://news.ycombinator.com/item?id=26581434">Google Reader finally</a> shut down. I had used them for years to follow <a href="https://techcrunch.com/2018/04/07/rss-is-undead/">RSS feeds</a>. Incase you aren&rsquo;t in the know, RSS was the way to follow all your favorite websites, before sites such as Digg and Reddit took over, back when the internet wasn&rsquo;t made up of just 5-10 big sites. This is one of the few great FREE RSS readers online, and you can import all your existing feeds easily. I use this with <a href="https://github.com/noinnion/greader">gReader, which rocks</a> to view all my feeds. This app also does 2-way sync of your feeds and read status, so you can easily pick back up from where you left off.</p>
<h3 id="instapaper"><a href="https://instapaper.com">Instapaper</a></h3>
<p><img src="https://cdn.macstories.net/002/1410832717-2014-09-16-at-03-24-29-.jpeg" alt=""></p>
<p><a href="https://play.google.com/store/apps/details?id=com.instapaper.android">https://play.google.com/store/apps/details?id=com.instapaper.android</a></p>
<p>Another big issue I&rsquo;ve run into is finding neat articles on social media and RSS feeds, but not having the time to read them NOW. Instapaper is a &lsquo;read it later&rsquo; type of service. You simply add links to posts, blogs and news articles, and it turns them into a nice uniform easy-to-read format. Every article looks the same, minus photos. No ad, no banners, no color even. Just you and the content you want to consume. It even includes a speed read function and a read-a-loud function on mobile, both great time savers. Honorable mention to <a href="https://www.mozilla.org/en-US/firefox/pocket/">Pocket</a> as well. I did give it a short try, but I&rsquo;ve found Instapaper much easier to use and consume. It&rsquo;s JUST for reading and comprehending articles, nothing more, nothing less.</p>
<h3 id="keepassxc--keepassdx"><a href="https://keepassxc.org/">KeepassXC</a> &amp; <a href="https://www.keepassdx.com/">KeepassDX</a></h3>
<p><img src="https://keepassxc.org/assets/img/screenshots/database_view.png" alt=""></p>
<p><a href="https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free">https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free</a></p>
<p>I&rsquo;m sure most folks in tech circles use a password manager. 1Password has been a household name for years. I&rsquo;m all for generating single-site passwords because nothing will cause me to groan faster than seeing yet ANOTHER website gets breached and passwords leaked. This helps massively with security and is convenient as heck!</p>
<p>One of the great features of KeepassXC is that it can store BOTH your SSH private keys AND all your new fancy PassKeys, along with taking care of TOTP and auto-fill for websites, <a href="https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/">with an additional plugin</a>. If the idea of having all that info in one place makes you nervous, then you can always add a &lsquo;passfile&rsquo; (a unique file to unlock the DB) AND Yubikey to your database, requiring 3 3-factor authentication. I&rsquo;ve confirmed that this works just fine on mobile as well via NFC on KeepassDX. To keep everything in sync, just use <a href="https://syncthing.net/">SyncThing</a> or your local file sync service of choice.</p>
<p>If the idea of having to &lsquo;self-host&rsquo; your own password manager file sync or using a few different apps to access a common database is too much, then I would recommend <a href="https://bitwarden.com">Bitwarden</a>. I use it with friends and family and it works flawlessly and supports many of the common features of KeePass.</p>
<h3 id="obsidian-md"><a href="https://obsidian.md">Obsidian MD</a></h3>
<p><a href="https://play.google.com/store/apps/details?id=md.obsidian">https://play.google.com/store/apps/details?id=md.obsidian</a></p>
<p><img src="https://obsidian.md/images/screenshot-1.0-hero-combo.png" alt=""></p>
<p>Last, but not least, is Obsidian. This app is like a <a href="https://www.jetbrains.com/pycharm/">programming IDE</a> for your notes, and just as powerful. I could easily write a whole blog post on JUST this one tool, it can do THAT much. Obsidian, in short, takes all of your <a href="https://daringfireball.net/projects/markdown/syntax">Markdown formatted notes</a> and gives you a beautiful interface to interact, search, create and edit them.</p>
<p>At work, I use the <a href="https://github.com/mgmeyers/obsidian-kanban">Kanban plugin</a> to track all my personal TO DO items, while the <a href="https://github.com/scambier/obsidian-omnisearch">Omni-search plugin</a> lets me do Google-like lookups across all my notes and save pictures as well.</p>
<p>If you&rsquo;re just looking to write MD-formatted notes, <a href="https://www.marktext.cc/">MarkText</a> works wonders as well.</p>
<h2 id="tldr">TL;DR</h2>
<p>At the end of the day, you need to find what processes, procedures and programs, work for you and your brain🧠. While I tend to lean heavily on software, others may be able to make due just fine with a pencil and notebook, and good on them if they can! Having a poor memory and struggling to concentrate each day is nothing to feel bad about, it happens to all of us, especially the more neuro-spicy ones. Being productive only matters if it brings you joy, or at very least lasting satisfaction. 💗</p>
<p><a href="https://meinmymirror.wordpress.com/2018/06/27/boggle-the-owl/">Take time out of your day to be kind to you, because someone has to.</a></p>
<p><img src="https://78.media.tumblr.com/tumblr_m0ch91uYyS1qk4alxo1_r1_540.jpg" alt=""></p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:adhd-productivity">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/adhd-productivity/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/adhd/">#adhd</a>

<a href="https://jelloeater.me/tags/automation/">#automation</a>

<a href="https://jelloeater.me/tags/beginners/">#beginners</a>

<a href="https://jelloeater.me/tags/productivity/">#productivity</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Hibernation, Ubuntu &amp; Battery Life</title>
      <link>
      https://jelloeater.me/blog/linux-battery/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/linux-battery/#comments
      </comments>
      <pubDate>Thu, 14 Mar 2024 22:43:00 -0500</pubDate>
      <category>learning</category>
      
      <category>newbie</category>
      
      <category>ubuntu</category>
      <guid>https://jelloeater.me/blog/linux-battery/</guid>
      
      <media:content url="https://jelloeater.me/blog/linux-battery/linux_battery-cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/linux-battery/linux_battery-cover.png"/>
      


    
    



      
      
      <description><![CDATA[Power savings for fun and profit!]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/linux-battery/linux_battery-cover.png" alt="Featured Image"/></p>
        
        <h2 id="intro-">Intro 👋</h2>
<p>I&rsquo;ve been playing quite a bit with my new (old) laptop, a Dell Latitude 7490. Great laptop for sure. Feel like a ThinkPad, great 1080p screen, decent battery life, i7, 16gb ram, but I digress. I would often pick up and put down what I was working on throughout the day, but not having to reopen everything each time I decide to boot back up. After much digging I discovered that while my laptop supported <strong>S3</strong> sleep, hibernation was no where to be found. I also had been struggling with getting a decently long amount of usage out of the refurbished battery it came with.</p>
<h2 id="hibernation-">Hibernation 🛏️</h2>
<p>I&rsquo;m not 100% sure if this impacts anyone running other distribution&rsquo;s, but at least for me running Ubuntu MATE 22.04 LTS, the hibernation option is <em>missing</em>. This might also be related to having a custom data partition using <strong>BTRFS</strong> (which is AMAZING BTW).</p>
<p>I did some digging around Google and realized that there were TWO things that I needed to do to fix my problem.</p>
<h3 id="how-to">How to</h3>
<p>Step 1:</p>
<p>Edit the following file and add the below and reboot.</p>
<p><code>/var/lib/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla</code></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[Re-enable hibernate by default in upower]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Identity</span><span style="color:#f92672">=</span><span style="color:#e6db74">unix-user:*</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Action</span><span style="color:#f92672">=</span><span style="color:#e6db74">org.freedesktop.upower.hibernate</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ResultActive</span><span style="color:#f92672">=</span><span style="color:#e6db74">yes</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[Re-enable hibernate by default in logind]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Identity</span><span style="color:#f92672">=</span><span style="color:#e6db74">unix-user:*</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Action</span><span style="color:#f92672">=</span><span style="color:#e6db74">org.freedesktop.login1.hibernate</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">ResultActive</span><span style="color:#f92672">=</span><span style="color:#e6db74">yes</span>
</span></span></code></pre></div><p>This would enable the menu option, but when I tried it, I would get a blank desktop. To fix this, you need to do a small edit to the GRUB boot loader.</p>
<p>Step 2:</p>
<p>Look up the UUID of your <em>swap partition</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>cat /etc/fstab | grep swap
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#75715e"># swap was on /dev/sda2 during installation</span>
</span></span><span style="display:flex;"><span>UUID<span style="color:#f92672">=</span>92cd717b-83f8-4aab-beb9-3cd7a84f9224 none            swap    sw              <span style="color:#ae81ff">0</span>       <span style="color:#ae81ff">0</span>
</span></span></code></pre></div><p>Step 3:</p>
<ul>
<li>
<p>Edit your <code>/etc/default/grub</code> file</p>
</li>
<li>
<p><strong>ADD</strong> the follow to your   <code>resume=UUID=XXXXXXXXXXXXXXXXX</code> replacing the value here with the value you found from above</p>
</li>
</ul>
<p><em>Example</em></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>GRUB_DEFAULT=&#34;0&#34;
</span></span><span style="display:flex;"><span>GRUB_TIMEOUT_STYLE=&#34;hidden&#34;
</span></span><span style="display:flex;"><span>GRUB_TIMEOUT=&#34;5&#34;
</span></span><span style="display:flex;"><span>GRUB_DISTRIBUTOR=&#34;`lsb_release -i -s 2&gt; /dev/null || echo Debian`&#34;
</span></span><span style="display:flex;"><span>GRUB_CMDLINE_LINUX_DEFAULT=&#34;resume=UUID=92cd717b-83f8-4aab-beb9-3cd7a84f9224&#34;
</span></span><span style="display:flex;"><span>GRUB_CMDLINE_LINUX=&#34;&#34;
</span></span></code></pre></div><p>Step 4:</p>
<p>Run <code>sudo update-grub</code> and <strong>REBOOT!</strong></p>
<p>Step 5:</p>
<p>Profit!</p>
<p><img src="fixed_hibernation.png" alt="Hibernate WIN"></p>
<h2 id="sleep-states-">Sleep states 💻</h2>
<p>In addition to the benefits of enabling hibernation, I would also recommend you check out both TLP (</p>
<ul>
<li><a href="https://github.com/linrunner/TLP">GitHub - linrunner/TLP: TLP - Optimize Linux Laptop Battery Life</a>) and PowerTOP (<a href="https://github.com/fenrus75/powertop">GitHub - fenrus75/powertop: The Linux PowerTOP tool</a>).</li>
</ul>
<p>TLP has some great auto tune options to help you get he best battery life you can out of your laptop. PowerTOP replicates quite a few of the tweaks in TLP, but also gives you some handy stats as well. I would say to try to not use them both at the same time, as the have slightly different ideas on what settings to tweak.</p>
<p>If your having issues, also be sure to check to see what sleep states your laptop supports via <code>sudo dmesg | grep 'S3\|suspend'</code> and <code>cat /sys/power/mem_sleep</code></p>
<p>You can also get a quick look into how your battery health is looking via <code>upower -i /org/freedesktop/UPower/devices/battery_BAT0</code> or if you really want to see all the nuts and bolts <code>upower --dump</code></p>
<p>Some useful background info on different power states:</p>
<ul>
<li>
<p><a href="https://www.kernel.org/doc/Documentation/power/states.txt">https://www.kernel.org/doc/Documentation/power/states.txt</a></p>
</li>
<li>
<p><a href="https://metebalci.com/blog/a-minimum-complete-tutorial-of-cpu-power-management-c-states-and-p-states/">A Minimum Complete Tutorial of CPU Power Management, C-states and P-states</a></p>
</li>
</ul>
<p>Running a calibrate with PowerTOP should give you a good estimate of how long your battery SHOULD last.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>powertop --calibrate
</span></span></code></pre></div><!-- TODO Add table for power states  -->
<p>If you find that your laptop is not sleeping properly, I would dig through your BIOS settings to make sure that sleep is enabled. Also updating your BIOS can helps as well, but that&rsquo;s outside the scope of this article :wink:!</p>
<p><em>- As always, if anyone has any corrections or comments, feel free to message here or drop me a email.</em></p>
<p>☮️</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:linux-battery">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/linux-battery/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/learning/">#learning</a>

<a href="https://jelloeater.me/tags/newbie/">#newbie</a>

<a href="https://jelloeater.me/tags/ubuntu/">#ubuntu</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Your tools don&#39;t matter</title>
      <link>
      https://jelloeater.me/blog/tools-dont-matter/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/tools-dont-matter/#comments
      </comments>
      <pubDate>Mon, 25 Sep 2023 20:58:00 -0500</pubDate>
      <category>developer-tools</category>
      
      <category>learning</category>
      
      <category>newbie</category>
      
      <category>tools</category>
      <guid>https://jelloeater.me/blog/tools-dont-matter/</guid>
      
      <media:content url="https://jelloeater.me/blog/tools-dont-matter/tools_dont_matter-cover.png" medium="image" type="image/png"/>
      <media:thumbnail url="https://jelloeater.me/blog/tools-dont-matter/tools_dont_matter-cover.png"/>
      


    
    



      
      
      <description><![CDATA[... except when they do]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/tools-dont-matter/tools_dont_matter-cover.png" alt="Featured Image"/></p>
        
        <p><em><a href="https://forum.contextualelectronics.com/t/bench-check-please-share-your-setup/734/44">Cover photo - contextualelectronics.com</a></em></p>
<p><a href="#tools-that-work-platform-agnostic">tl;dr What DOES work</a></p>
<h2 id="the-3-fs">The 3 F&rsquo;s</h2>
<p>When I think of tooling, I think of my dad&rsquo;s electronics shop, a big sprawling room, filled with random parts, power supplies and oscilloscopes. I used to spend my Saturdays with him as a kid. He would &ldquo;put me to work&rdquo; and I would help with small tasks, unsolder some old burnt-out capacitors, or log data on faulty power supplies. Nothing critical, but it was neat getting to learn and play at the same time. Anytime there was a big project around the house, my dad would rope me in. Fix a car, build a shed, my dad always had the right tool for the right job, <em>form, fit and function</em>.</p>
<p><img src="/blog/tools-dont-matter/form-fit-function.png" alt="Form fit and function"></p>
<p>&hellip; he would say. This was in stark contrast to an uncle I had, who would always go out and buy the absolute &ldquo;best&rdquo; and most expensive version of what my dad owned. Why buy a 14-inch chainsaw, when you can buy a 20-inch? I later learned that less is more, but god knows sometimes overkill is just fun. But here&rsquo;s the thing, should work be &ldquo;fun&rdquo;? Does having that shiny new toy, make the process more enjoyable, or are you just showing off to the next person? It&rsquo;s ok to want nice things, but how much, is too much?</p>
<h2 id="everything-but">Everything but</h2>
<p><img src="/blog/tools-dont-matter/sink.png" alt="Everything but"></p>
<p>The friends and family with <a href="https://www.reddit.com/r/engineering/comments/2kby5e/dilbert_the_knack_the_curse_of_the_engineer/">&ldquo;the knack&rdquo;</a> tend to like their cars and trucks set up the way they like them, and desks the way they like them. Keyboards of all shapes and sizes, to suit each person. Perpetual tinkers, the lot of us.</p>
<p>As developers, we sit on the shoulders of <strong>GIANTS</strong>. As a result of this, it&rsquo;s easy to get bogged down in the latest JS framework, or Python library. When all you have to do is <code>pip install antigravity</code> or <code>npm</code>, it&rsquo;s easy to throw in everything and the kitchen sink at projects. Exploration is healthy, pushing boundaries, and learning new things. I (at times) have been very fond of chasing after the latest and greatest libraries when working on hobby projects. But there comes a point where how much, is too much. Do you NEED that extension, is that plugin going to <strong>HELP</strong> you? It&rsquo;s easier to not think TOO hard about it and sink into the mindset of &ldquo;Just another library, it&rsquo;s less code <strong>I</strong> have to write&hellip;&rdquo; or &ldquo;This plugin seems <em>helpful</em>* for X&rdquo;.</p>
<p>Projects like <a href="https://www.cookiecutter.io/">CookieCutter</a> are great for setting up template-based repositories, for consultants in particular. A nice repeatable structure, that follows a known pattern, can save time and energy. There is a catch, as with all good things. A lot of smaller projects I&rsquo;ve seen on GitHub dump heaps of neat toys, on otherwise simple codebases. Do I need (&hellip;checks notes&hellip;) twen&hellip; TWENTY-FOUR (I&rsquo;m looking at you <a href="https://github.com/cjolowicz/cookiecutter-hypermodern-python/blob/main/%7B%7Bcookiecutter.project_name%7D%7D/pyproject.toml#L27">hypermodern-python</a>) .. test modules for writing a library to turn a light switch on and off? The answer is no, not for anything this simple. For larger, more complex projects, maybe. For example, I use quite a few dev helpers on my personal projects, not because they are essential, but because they automate annoying tasks and let me think about my app, and not about structure (Black &amp; Flake8) or security (Bandit, Tartufo &amp; Whispers). (Shh, it&rsquo;s 14 🙃)</p>
<p>I&rsquo;ve lost count of how many plugins I have installed in VSCode, I&rsquo;ll admit. Each one was curated over many years of finding things that suit my taste. The same goes with my custom-tailored PyCharm, a bit less so, due to the sheer genius of JetBrains&rsquo;s developers thinking of so many things that Microsoft left up to the community. Open source vs closed source, give the people what they WANT, vs. give the people what you think they NEED.</p>
<p>There is no kill, like overkill, but sometimes, we lose sight of the problem we are trying to solve&hellip;</p>
<h2 id="too-many-options">Too many options</h2>
<p>People tend to be creatures of habit, finding comfort in the routine. This goes double (if not triple) for engineers of all trades. This idea is in stark contrast to the kitchen sink philosophy. I know what I know, and it gets the job done. Phrases like &ldquo;I just want it done now&rdquo; erode creativity. Tight deadlines, and angry clients for sure, make haste. Phrases like &ldquo;it needed to get done yesterday&rdquo;, can lower quality. There&rsquo;s a phrase that comes to your mind.</p>
<p><img src="/blog/tools-dont-matter/fast_good_cheap.png" alt="Fast Good Cheap"></p>


  
    <blockquote>
      <p><em>&ldquo;Jim Jarmusch once told me “Fast, Cheap, and Good…pick two. If it’s fast and cheap it won’t be good. If it’s cheap and good it won’t be fast. If it’s fast and good it won’t be cheap.” Fast, cheap, and good…pick (2) words to live by.&rdquo;</em></p>
<p>-Tom Waits Spills the Beans to Tom Waits,” Sound Effects Blog, Boston Globe, May 22, 2008.</p>
    </blockquote>
  
<p>When we don&rsquo;t give ourselves room to dabble, we can turn around three times and still be using COBOL&hellip; because it works (sorry if I&rsquo;m being reductive). There is value sometimes to building a better mouse trap, but I&rsquo;ve also seen folks fall prey to the <a href="https://dictionary.cambridge.org/us/dictionary/english/not-invented-here-syndrome">&ldquo;not invented here&rdquo;</a> syndrome. This battle of buy vs. build impacts us all. OpEx vs. CapEx, now vs. later, what&rsquo;s the &ldquo;best&rdquo; answer?</p>
<p>We like what we like, and we like to do things the way we&rsquo;ve always done them before because it works.</p>
<p><img src="/blog/tools-dont-matter/comic.png" alt="Comic"></p>
<h2 id="so-what-do-you-do">&ldquo;So what do you do?&rdquo;</h2>
<p>I&rsquo;ve been asked at many a family gathering, &ldquo;What do you do?&rdquo;. I usually quip back, &ldquo;I&rsquo;m a software developer&rdquo; or &ldquo;I work with the cloud&rdquo;, two easy-to-digest answers. The honest answer, convert coffee into code&hellip; which gets converted into money by folks savvy in the ways of business. We&rsquo;re in the business of solving problems, usually business problems, sometimes people problems, but always human problems.</p>
<p>(Side note: I did go to school for business&hellip; but I also was going to be a social worker as well. What you&rsquo;re good at, and what you went to school for, are sometimes, very different things -:wink:)</p>
<h2 id="common-ground--finding-balance">Common ground &amp; finding balance</h2>


  
    <blockquote>
      <p><em>&ldquo;The most dangerous phrase in the language is ‘we&rsquo;ve always done it this way&rsquo;.&rdquo;</em></p>
<p>Admiral Grace Hopper</p>
    </blockquote>
  
<p>While I&rsquo;m primarily a Python (and PowerShell) developer, I know many folks out there use a variety of different languages, each with its specific tooling. What works for Python, may not work for Java C# or Go.</p>
<p><a href="https://octoverse.github.com/2022/top-programming-languages"><img src="/blog/tools-dont-matter/Trends-in-programming-languages-2014-2022-1.jpg" alt="Top Languages"></a></p>
<p>I&rsquo;ve compiled a short list from talking amongst friends over the last few years. The whole point of this list is to <em>be short</em>, <strong>NOT</strong> exhaustive, and list flexible practices. That would defeat the core theme of this blog post if they weren&rsquo;t! All of these tools work on OSX and Linux, and SHOULD also work on <a href="https://ubuntu.com/wsl">WSL</a> if you are working on a Windows dev box. Please keep in mind, that all of these items are current as of 2023, and <em>should</em> be around for a fairly long time, nothing bleeding edge. If you don&rsquo;t like the tools of today, considering making your own, just please do your research online first. We have had enough of a problem with competing standards.</p>
<p><a href="https://xkcd.com/927/"><img src="/blog/tools-dont-matter/standards.png" alt="competing standards"></a></p>
<h2 id="tools-and-patterns-that-work-imho-platform-agnostic">Tools and patterns that work (IMHO) (Platform Agnostic)</h2>
<ul>
<li>
<p><a href="https://git-scm.com/">Git</a></p>
<ul>
<li>This one goes without saying. While there are alternatives for hosting such as <a href="https://bitbucket.org/product">Bitbucket</a> for native cloud-based hosting, products such as <a href="https://gitea.io/en-us/">GitTea</a> and <a href="https://about.gitlab.com/install/">GitLab</a>, will always be close to my heart for locally hosted Git servers. One very sobering fact I&rsquo;ve still seen, some CS programs STILL don&rsquo;t teach this in CS-101. I would say Git is not hard, but that&rsquo;s a lie 🙄</li>
<li><a href="https://www.youtube.com/watch?v=2sjqTHE0zok">A great video overview on Git from MIT&rsquo;s &ldquo;Missing Semester&rdquo; YouTube channel</a> explains Git <strong>WAY better</strong> than I can in any blog post.</li>
<li>A quick note, with GitHub, you can still always run your own GitHub Actions as self-hosted runners if you run into issues with tests running fully cloud native.</li>
</ul>
</li>
<li>
<p><a href="https://www.docker.com/">Docker</a></p>
<ul>
<li>If you aren&rsquo;t developing inside containers in 2023, you are just asking for &ldquo;it works on my computer&rdquo; problems. Solutions such as <a href="https://developer.hashicorp.com/vagrant/intro/vs/docker">Vagrant</a> aim to solve a similar problem, however, `docker run`` is about as simple as you can get while still giving you decent isolation. I would try and avoid running Docker on Windows, due to the requirement of needing Hyper-V. If you can run under WSL, you should have an easier time, but nothing beats NIX-based OS in this author&rsquo;s opinion.</li>
</ul>
</li>
<li>
<p><a href="https://devopedia.org/semantic-versioning">Semantic Versioning</a></p>
<ul>
<li>
<p>This versioning style allows for easily keeping track of how version updates will break builds during upgrades. Some vendors like to do date-style version numbers while some do not. Ex JetBrains IDEs vs VSCode.</p>
</li>
<li>
<p><strong>Versions should be formatted like the below</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>  v1.2.3-beta+684
</span></span><span style="display:flex;"><span>  Major.Minor.Patch-pre-release-type+build-number
</span></span></code></pre></div><p><img src="/blog/tools-dont-matter/version.png" alt="Versioning"></p>
<ul>
<li>Major: Incremented when incompatible API changes are made. Applications and other software that use the affected APIs will break. Hence, their code has to be updated.</li>
<li>Minor: Incremented when new functionality is added in a backward-compatible manner. It&rsquo;s safe to update to a new minor version without requiring code changes. Code changes are needed only to make use of the new features.</li>
<li>Patch: Incremented when backward-compatible bug fixes are made. No new features are added. Some call this micro.</li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="https://mermaid.js.org/">Mermaid</a></p>
<ul>
<li>
<p>A super handy way of putting diagrams in code. Many different IDEs and platforms support the format out of the box, and it is quite easy to read and write. <a href="https://plantuml.com/">PlantUML</a> offers a more feature-rich alternative, a bit with less wide adoptions and harder (but more expressive) syntax.</p>
</li>
<li>
<p><strong>Mermaid Example</strong></p>
<p><img src="/blog/tools-dont-matter/mermaid.png" alt="Mermaid"></p>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>  stateDiagram-v2
</span></span><span style="display:flex;"><span>      [*] --&gt; New_Idea
</span></span><span style="display:flex;"><span>      New_Idea --&gt; Working_On_Project:Write down idea
</span></span><span style="display:flex;"><span>      Working_On_Project --&gt; Bored:Life
</span></span><span style="display:flex;"><span>      Bored --&gt; New_Idea:Inspiration
</span></span><span style="display:flex;"><span>      Project_Done --&gt; [*] :Feeling of accomplishment
</span></span></code></pre></div></li>
<li>
<p><a href="https://editorconfig.org/">EditorConfig</a></p>
<ul>
<li>While this may not solve the age-old battle of tabs vs. spaces, you can at least enforce this standard in your repo and keep things consistent across IDEs and editors of all kinds. Just create a <code>.editorconfig</code> file at the base of your repo and you&rsquo;re done!</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#a6e22e">root</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[*]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">charset</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">utf-8</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">end_of_line</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">lf</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">indent_size</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">4</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">indent_style</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">space</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">insert_final_newline</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">trim_trailing_whitespace</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[*.md]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">indent_size</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">2</span>
</span></span></code></pre></div></li>
<li>
<p><a href="https://github.com/godaddy/tartufo/">Tartufo</a></p>
<ul>
<li>
<p>Great for scanning repositories locally for leaked keys and passwords. Works with several different languages.</p>
</li>
<li>
<p>Easy to use and deploy LOCALLY!</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>pip install tartufo
</span></span><span style="display:flex;"><span>tartufo scan-local-repo . --progress
</span></span></code></pre></div></li>
<li>
<p>Can be integrated into your local Git pre-commit hooks, see below.</p>
</li>
</ul>
</li>
</ul>
<h2 id="tools-and-patterns-that-might-work-platform-agnostic">Tools and patterns that MIGHT work (Platform Agnostic)</h2>
<ul>
<li><a href="https:www.github.com/actions">GitHub Actions</a>
<ul>
<li>While there are as many ways to do GH actions as there are software on the internet, one set I keep on coming back to is to generate releases and auto add to-do&rsquo;s. These YAML files go in your <code>.github/workflows/</code> folder, inside your Git repo.</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#e6db74">&#34;Generate TODO to Issue&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>: [<span style="color:#e6db74">&#34;push&#34;</span>]
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">build</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">runs-on</span>: <span style="color:#e6db74">&#34;ubuntu-latest&#34;</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#f92672">uses</span>: <span style="color:#e6db74">&#34;actions/checkout@v3&#34;</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#f92672">name</span>: <span style="color:#e6db74">&#34;TODO to Issue&#34;</span>
</span></span><span style="display:flex;"><span>              <span style="color:#f92672">uses</span>: <span style="color:#e6db74">&#34;alstr/todo-to-issue-action@v4&#34;</span>
</span></span><span style="display:flex;"><span>              <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>                  <span style="color:#f92672">AUTO_ASSIGN</span>: <span style="color:#66d9ef">true</span>
</span></span></code></pre></div><div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">Release</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">REGISTRY</span>: <span style="color:#ae81ff">ghcr.io</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">IMAGE_NAME</span>: <span style="color:#ae81ff">${{ github.repository }}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">push</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">tags</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#e6db74">&#34;v[0-9]+.[0-9]+.[0-9]+&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">release-gen</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">permissions</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">contents</span>: <span style="color:#ae81ff">write</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v3</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">ncipollo/release-action@v1</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">allowUpdates</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">generateReleaseNotes</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">build-and-push-image</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">permissions</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">contents</span>: <span style="color:#ae81ff">read</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">packages</span>: <span style="color:#ae81ff">write</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Checkout</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v3</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Docker meta</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">id</span>: <span style="color:#ae81ff">meta</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">docker/metadata-action@v4</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">images</span>: <span style="color:#ae81ff">ghcr.io/${{ env.IMAGE_NAME }}</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Set up QEMU</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">docker/setup-qemu-action@v2</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Set up Docker Buildx</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">docker/setup-buildx-action@v2</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Log in to the Container registry</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">docker/login-action@v2</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">registry</span>: <span style="color:#ae81ff">ghcr.io</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">username</span>: <span style="color:#ae81ff">${{ github.actor }}</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">password</span>: <span style="color:#ae81ff">${{ github.token }}</span>
</span></span><span style="display:flex;"><span>        - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Build and push Docker image</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">docker/build-push-action@v4</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">context</span>: <span style="color:#ae81ff">.</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">platforms</span>: <span style="color:#ae81ff">linux/amd64</span> <span style="color:#75715e">#,linux/arm64</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">push</span>: <span style="color:#66d9ef">true</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">tags</span>: <span style="color:#ae81ff">${{ steps.meta.outputs.tags }}</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">labels</span>: <span style="color:#ae81ff">${{ steps.meta.outputs.labels }}</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">cache-from</span>: <span style="color:#ae81ff">type=gha</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">cache-to</span>: <span style="color:#ae81ff">type=gha,mode=max</span>
</span></span></code></pre></div><ul>
<li>
<p><a href="https://www.conventionalcommits.org/en/v1.0.0/#summary">Conventional Commits</a></p>
<ul>
<li>
<p>This is more of a way of writing commit messages, than a tool per se.</p>
</li>
<li>
<p>Messages are written in the format of &ldquo;fix: foo&rdquo; or &ldquo;feat: bar&rdquo;.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git commit -m <span style="color:#e6db74">&#34;fix: Thing no longer broken
</span></span></span></code></pre></div></li>
<li>
<p>How does this relate to SemVer?</p>
<ul>
<li>fix type commits should be translated to PATCH releases (v2.3.4 -&gt; 2.3.5).</li>
<li>feat-type commits should be translated to MINOR releases (v2.3.4 -&gt; 2.4.0).</li>
<li>Commits with BREAKING CHANGE (ex. library function renames / backend data changes) in the commits, regardless of type, NEED to be translated to MAJOR releases (v2.3.4 -&gt; 3.0.0).</li>
<li><strong>If you play fast and loose with fix and feat and version numbers, PLEASE make sure you at least version-bump your Git tags for BREAKING changes, your teammates will thank you</strong>.</li>
</ul>
</li>
</ul>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span> | Type     | Description                                                    |
</span></span><span style="display:flex;"><span> | -------- | -------------------------------------------------------------- |
</span></span><span style="display:flex;"><span> | feat!    | Breaking change                                                |
</span></span><span style="display:flex;"><span> | feat     | New feature                                                    |
</span></span><span style="display:flex;"><span> | fix      | A bug fix                                                      |
</span></span><span style="display:flex;"><span> | revert   | Rollback of a change                                           |
</span></span><span style="display:flex;"><span> | docs     | Adding some documentation                                      |
</span></span><span style="display:flex;"><span> | ci       | Changes made to an infrastructure job                          |
</span></span><span style="display:flex;"><span> | chore    | Upgrades, cleaning up...                                       |
</span></span><span style="display:flex;"><span> | perf     | A performance improvement                                      |
</span></span><span style="display:flex;"><span> | refactor | A change in the code that does not affect the overall behavior |
</span></span><span style="display:flex;"><span> | style    | Formatting change                                              |
</span></span><span style="display:flex;"><span> | test     | Adding some test cases                                         |
</span></span></code></pre></div></li>
<li>
<p><a href="https://github.com/tj/git-extras/blob/master/Commands.md#git-changelog">Change Log Generation</a></p>
<p>This is a great extra included in the fantastic Git-Extras package (<code>apt-get install git-extras OR brew install git-extras</code>).
Generating a nice change log is as easy as running <code>git-changelog -p -a -x &gt;&gt; CHANGELOG.md</code> at the base of your Git directory.
As long as you have been tagging your releases with sane tag names, you should be good to go!
While GitHub releases are always beneficial, this keeps your change log close to the code, just like your README file.
Or do both with a little GitHub Actions love! Automate the boring stuff.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-markdown" data-lang="markdown"><span style="display:flex;"><span>n.n.n / 2023-04-22
</span></span><span style="display:flex;"><span>==================
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">*</span> Added Auto change log generation
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">*</span> Removed radon from suite, not being used in interactive test
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">*</span> Added pause in test
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>v2.0.0 / 2023-04-08
</span></span><span style="display:flex;"><span>===================
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">*</span> Version bump
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">*</span> Merge branch &#39;feat/cli-interface&#39;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">*</span> Readme update
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">*</span> Added keyring check
</span></span></code></pre></div></li>
<li>
<p><a href="https://pre-commit.com/">Commit hooks</a></p>
<ul>
<li>Super handy for running tests and scripts on different Git actions. I tend to tie them to Task files and Make files, as it&rsquo;s easier to update the file than the script. You can even keep it as simple as scanning your code base for secrets to prevent leaks!</li>
</ul>
</li>
<li>
<p><a href="https://www.postman.com/">Postman</a></p>
<ul>
<li>
<p>Great for testing and debugging API endpoints, a must-have for backend developers</p>
</li>
<li>
<p>For a simple CLI alternative, you might want to change out HTTPie (similar to curl)</p>
</li>
</ul>
</li>
<li>
<p><a href="https://makefiletutorial.com/">Make</a></p>
<ul>
<li>While make files are more common among compiled languages, such as C++, I&rsquo;ve been seeing a resurgence of them in the DevOps space, as an alternative to messy bash scripting and a simpler alternative to <a href="https://www.pyinvoke.org/">PyInvoke</a>.</li>
</ul>
</li>
<li>
<p><a href="https://taskfile.dev/">Taskfile</a></p>
<ul>
<li>
<p>A personal favorite of mine. Yes, I know we have Makefiles, but IMHO the syntax of this is easier to read and write. Before you get your pitchforks, please take a look, as I&rsquo;ve said before, I try and keep things in this category both language-agnostic and cross-platform.</p>
</li>
<li>
<p>In this example, we can run <code>task greet</code> and we will load and print the vars from our env file and get the directory contents of our home directory.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">version</span>: <span style="color:#e6db74">&#39;3&#39;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">ENV</span>: <span style="color:#ae81ff">testing</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">tasks</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">greet</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">dir</span>: <span style="color:#ae81ff">/home/user</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">dotenv</span>: [<span style="color:#e6db74">&#39;.env&#39;</span>, <span style="color:#e6db74">&#39;{{.ENV}}/.env.&#39;</span>, <span style="color:#e6db74">&#39;{{.HOME}}/.env&#39;</span>]
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">cmds</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">echo &#34;Using $KEYNAME and endpoint $ENDPOINT&#34;</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#ae81ff">ls</span>
</span></span></code></pre></div></li>
</ul>
</li>
<li>
<p><a href="https://docs.pyinvoke.org/en/stable/getting-started.html">PyInvoke</a></p>
<ul>
<li>
<p>This is a fantastic tool for when you need your make files to think!
This build is done via a Taskfile&hellip;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">version</span>: <span style="color:#e6db74">&#39;3&#39;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">vars</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">BUILD_DIR</span>: <span style="color:#ae81ff">pl_worker</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">tasks</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">test</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">silent</span>: <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">interactive</span>: <span style="color:#66d9ef">false</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">dotenv</span>: [<span style="color:#ae81ff">prod.env]</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">cmds</span>:
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">poetry run vulture --min-confidence 100 {{.BUILD_DIR}}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">poetry run xenon --max-absolute B --max-modules B --max-average B {{.BUILD_DIR}}</span>
</span></span><span style="display:flex;"><span>            - <span style="color:#ae81ff">poetry run pytest --cov --cov-fail-under=75</span>
</span></span></code></pre></div><p>Can ALSO be done via PyInvoke</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#f92672">from</span> dotenv <span style="color:#f92672">import</span> load_dotenv
</span></span><span style="display:flex;"><span>load_dotenv(<span style="color:#e6db74">&#34;prod.env&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#f92672">from</span> invoke <span style="color:#f92672">import</span> task
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>BUILD_DIR<span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pl_worker&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@task</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">def</span> <span style="color:#a6e22e">test</span>(c):
</span></span><span style="display:flex;"><span>    <span style="color:#e6db74">&#34;&#34;&#34;Test Build&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    c<span style="color:#f92672">.</span>run(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;poetry run vulture --min-confidence 100 </span><span style="color:#e6db74">{</span>BUILD_DIR<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>,echo<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>    c<span style="color:#f92672">.</span>run(<span style="color:#e6db74">f</span><span style="color:#e6db74">&#34;poetry run xenon --max-absolute B --max-modules B --max-average B </span><span style="color:#e6db74">{</span>BUILD_DIR<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>,echo<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span><span style="display:flex;"><span>    c<span style="color:#f92672">.</span>run(<span style="color:#e6db74">&#34;poetry run pytest --cov --cov-fail-under=75&#34;</span>,echo<span style="color:#f92672">=</span><span style="color:#66d9ef">True</span>)
</span></span></code></pre></div><p>Will I redo all of my TaskFiles for my projects? No, what I have works for me and works well. But next time I need to write a CLI script runner for myself! (Side note: I&rsquo;ve already written some neat stuff using Invoke for work&hellip; I like it 😄)</p>
</li>
</ul>
</li>
</ul>
<h2 id="plugins--apps-platform-specific">Plugins &amp; Apps (Platform Specific)</h2>
<p>While I could <a href="https://github.com/Jelloeater/awesome-osx-apps">list off dozens of neat little things I&rsquo;ve found</a> over the last year or so, I&rsquo;ll keep this list very short, just a few select plugins and apps that have really helped me be more productive. Please keep in mind that these are either IDE or platform-specific, so YMMV.</p>
<ul>
<li>
<p><a href="https://plugins.jetbrains.com/plugin/7677-awesome-console">AwesomeConsole</a></p>
<p>Brings ctrl+click to the terminal Window, a-la VS Code</p>
</li>
<li>
<p><a href="https://marketplace.visualstudio.com/items?itemName=ahgood.shift-shift">ShiftShift</a></p>
<p>On the flip side, brings the joy of a quick search from JetBrains to VS Code</p>
</li>
<li>
<p><a href="https://www.raycast.com/">RayCast</a>, <a href="http://www.wox.one/">Wox</a> &amp; <a href="https://ulauncher.io/">ULauncer</a></p>
<p>Depending on which platform you use, a quick desktop-wide search <strong>will</strong> save you hours over the months**. Really, check these out! (Yes OSX has the spotlight, and yes &ldquo;it just works&rdquo;, I would argue this is superior in every way to it)</p>
</li>
</ul>
<h2 id="conclusions">Conclusions</h2>
<p>While I know this blog post has been very VERY long, I do hope it helps those who come across it to not only improve their tooling but to also improve HOW they think about the tools they choose and choose NOT to use. I hope this blog post inspires those who read it to try some new toys&hellip; err tools!</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:tools-dont-matter">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/tools-dont-matter/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/developer-tools/">#developer-tools</a>

<a href="https://jelloeater.me/tags/learning/">#learning</a>

<a href="https://jelloeater.me/tags/newbie/">#newbie</a>

<a href="https://jelloeater.me/tags/tools/">#tools</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>Poetry (Packaging) in motion</title>
      <link>
      https://jelloeater.me/blog/poetry-in-motion/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/poetry-in-motion/#comments
      </comments>
      <pubDate>Sat, 18 Mar 2023 23:08:00 -0500</pubDate>
      <category>python</category>
      
      <category>python-projects</category>
      <guid>https://jelloeater.me/blog/poetry-in-motion/</guid>
      
      <media:content url="https://jelloeater.me/blog/poetry-in-motion/cover.jpg" medium="image" type="image/jpg"/>
      <media:thumbnail url="https://jelloeater.me/blog/poetry-in-motion/cover.jpg"/>
      


    
    



      
      
      <description><![CDATA[Publishing Public Python Packages on PyPi (WHEW!)]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/poetry-in-motion/cover.jpg" alt="Featured Image"/></p>
        
        <h2 id="intro-">Intro 👋</h2>
<p>As you might have guessed, I&rsquo;ve decided to write this entry on Poetry (as in the package manager). I&rsquo;ll start right off by saying that I&rsquo;m no expert by far. While I&rsquo;ve been programming for several years in Python, much of my original experience was just with good old Pip alone. This was partly to do with the fact that back in the early 2010&rsquo;s there weren&rsquo;t as many options as there are now. If PyPi is accurate <a href="https://pypi.org/project/pipenv/0.1.0/">Pipenv was only started back in 2017</a> and <a href="https://pypi.org/project/pipenv/2020.5.28/">didn&rsquo;t hit maturity</a> <a href="https://pypi.org/project/pipenv/2020.5.28/">until 2020</a>. <a href="https://pypi.org/project/poetry/1.1.0/">Poetry only hit version 1 at the end of 2020 as well</a>.</p>
<p>Now here&rsquo;s the interesting part. I was still working on decent-sized Python projects back then, but at that point, I discovered Docker. This magical container system let me throw caution to the wind (sort of), and finally, be out of the &ldquo;it works on my machine&rdquo; camp. I was happily tossing <code>requirements.txt</code> files in via <code>pip freeze</code> into my containers (yea, I know&hellip;). I did have a few issues with having to pin certain versions of <a href="https://pypi.org/project/waitress/">Waitress</a> to keep my apps running properly. It was annoying for sure, but at least Docker let me sidestep the problems that other developers had created.</p>


  
    <blockquote>
      <p>A quick Side note, the only reason why I was using Waitress was because I was developing on a Windows 7 Pro box. The app I was working on needed to run on a Debian Python 3.7 Docker image, so you can see my conundrum 😅. Looking back, I really wish I was rocking Linux on my work PC. Yes, I was aware of PyCharm&rsquo;s remote development, Docker on Windows (gross!), and running a Debian Desktop VM, but I didn&rsquo;t want to make waves or headaches. I made due with what I had. At least I had GitLab and PyTest back then to save my bacon.</p>
    </blockquote>
  
<p>Fast forward to late 2022, I was still sticking to using Docker and requirements files, if it ain&rsquo;t broke don&rsquo;t fix it. But then I stumbled upon a Github Actions file that I was reviewing for work&hellip; what was this <em>Pipenv</em> thing. I started to dig&hellip;
&ldquo;Oh, it&rsquo;s like if VirturalEnv&rsquo;s were easy,&rdquo; I said to myself, oversimplifying a tad bit. A glance at a few CookieCutter templates, and a little YAML later, I had something to start with. For sure it was a taste of things to come!</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">Test</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">pull_request</span>: {}
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">push</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">branches</span>: <span style="color:#ae81ff">main</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">tags</span>: <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">test</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v2</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Setup Python</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/setup-python@v1</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">python-version</span>: <span style="color:#ae81ff">3.10</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Install dependencies with pipenv</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          pip install pipenv
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">          pipenv install --deploy --dev</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">pipenv run isort --recursive --diff .</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">pipenv run black --check .</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">pipenv run flake8</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">pipenv run mypy</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">run</span>: <span style="color:#ae81ff">pipenv run pytest --cov --cov-fail-under=100</span>
</span></span></code></pre></div><h2 id="a-package-with-a-purpose-">A Package with a purpose 💪</h2>
<p>For an excellent short read on the history of Python packages, <a href="https://www.pypa.io/en/latest/history/">check out this link</a></p>
<h3 id="pipenv">PipEnv</h3>
<p>It was shortly after I had dug into PipEnv that I decided to start back up working on some personal Python projects. I had spent the last several months working mostly with Powershell and Terraform for work and I missed Python. It was my digital mother tongue, warm to me like that favorite pair of PJs right out of the dryer. Well&hellip; that&rsquo;s a half lie, TECHNICALLY my first programming language was Java (I did play with BASIC when I was a kid as well), but Python was the first language I learned to use WELL.
This new project is a simple script to change the color of a porch light bulb to a more holiday-appropriate theme.</p>
<p><img src="/blog/poetry-in-motion/light.jpg" alt="Alt text"></p>
<p>Cute, right? Microscale and tiny scope, a perfect project to relax after work with. Nothing too crazy&hellip;</p>
<p>PipEnv seemed to be filling and improving what I had been doing with a <code>requirements.txt</code> back in the day. It was simple enough and easy to update and add to. Removing packages wasn&rsquo;t always the cleanest. You can run <code>pipenv clean</code> and <code>pipenv update</code> to get your virtualenv in line with your project manifest. I never ran into any problems on the smaller projects I&rsquo;ve worked on (with PipEnv), but I was only looking to pin my module versions and nothing more. One of the big shortcomings of PipEnv is that it does NOT handle publishing packages. For that, you need a package builder. After a quick Google and Reddit search, <a href="https://github.com/pypa/flit">I came up with <strong>Flit</strong></a>.</p>
<h3 id="flit">Flit</h3>
<p>One thing Flit IS is an easy-to-use build system. Churning out installable packages in the name of the game with it. But there&rsquo;s a catch&hellip;
Flit also doesn’t help you manage dependencies: you have to add them to <code>pyproject.toml</code> by hand. For small projects, this isn&rsquo;t too bad, but the manual steps are tedious for sure. Below is a nice simple example of a Flit project file.</p>
<p><strong>The TOML file will typically read as follows:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[build-system]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">requires</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;flit_core &gt;=3.2,&lt;4&#34;]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">build-backend</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;flit_core.buildapi&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[project]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;APP_NAME_HERE&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">authors</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[{name = &#34;YourNameHere&#34;, email = &#34;username@gmail.com&#34;}]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dependencies</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;flit_core &gt;=3.8.0&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    &#34;requests&#34;,</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">readme</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;README.md&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">license</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">{file = &#34;LICENSE&#34;}</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">classifiers</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;License :: OSI Approved :: MIT License&#34;]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">dynamic</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;version&#34;, &#34;description&#34;]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[project.urls]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">Home</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://github.com/username/APP_NAME_HERE</span>
</span></span></code></pre></div><p>A simple <code>flit build</code> and <code>flit publish</code> and you&rsquo;re off to the races more or less. I would normally dig in further on Flit, but at this point, I saw the limitations of having to use two tools that would not stay in sync with each other easily. This annoyed the heck out of me. I wanted something to &ldquo;just work&rdquo; and not to fight with, especially during my free time after work. Yeah I could script my way out of it with some Make / TaskFile commands as I&rsquo;ve seen some do, but I discovered Poetry&hellip; and it was beautiful. And on that note, onto the main event (sorry Flit)&hellip;</p>
<h3 id="poetry">Poetry</h3>
<p>I had now (after some digging) landed on Poetry. Poetry for all practical purposes combines BOTH building/packaging along with dependency management.
Even if you never plan on publishing anything to PyPi, Poetry offers better dependency resolution out of the box. I did a few small tests to compare the two.
I found that PipEnv worked well enough when I was not doing any version pinning and installed all my dev packages properly, but I would be hesitant to use it for any larger, more complex projects due to the amount of flack it&rsquo;s gotten online. YMMV.</p>
<p>Poetry (like <code>pipenv install --dev</code>) supports a superset of required packages, used just for dev environments/testing, using <code>poetry install</code> to install everything listed in your manifest, or to only install what is needed to run <code>poetry install --no-root --without dev</code>.</p>
<p>The <code>pyproject.toml</code> looks a little different compared to Flit but is easy enough to make sense of. A key difference is that your version is defined in the <code>pyproject.toml</code> file, not via the version set in your module. This is because Poetry does dependency management, in addition to packaging.</p>
<p><strong>The TOML file will typically read as follows for Poetry:</strong></p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[tool.poetry]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;APP_NAME_HERE&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">version</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;1.0.0&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">description</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Fill in this&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">authors</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;You &lt;you@gmail.com&gt;&#34;]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">license</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;MIT License&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">readme</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;README.md&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">homepage</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;https://github.com/you/repo&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">keywords</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;neat&#34;, &#34;app&#34;]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">classifiers</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;Development Status :: 5 - Production/Stable&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> &#34;Environment :: No Input/Output (Daemon)&#34;,
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> &#34;Operating System :: OS Independent&#34;,</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[tool.poetry.dependencies]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">python</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;^3.10&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[tool.poetry.group.dev.dependencies]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">setuptools</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">pytest</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">pytest-cov</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">python-dotenv</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">pytest-pycharm</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;*&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[build-system]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">requires</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;poetry-core&#34;]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">build-backend</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;poetry.core.masonry.api&#34;</span>
</span></span></code></pre></div><h3 id="the-pyprojecttoml-advantage-">The <code>PyProject.toml</code> Advantage 🤓</h3>
<p>Poetry and its associated PyProject file shine when things start to get complicated, as all your project settings can be consolidated into one handy place.</p>
<p>For example, my project manifest includes some additional settings for PyTest and some handy linting. Everything is in one nice place! (Feel free to take some inspiration from these settings)</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-ini" data-lang="ini"><span style="display:flex;"><span><span style="color:#66d9ef">[tool.pytest.ini_options]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">pythonpath</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[&#34;.&#34;]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">testpaths</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;test/&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">log_cli</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">log_cli_level</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;DEBUG&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">log_cli_format</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;[%(asctime)s] [%(levelname)8s] --- %(message)s (%(filename)s:%(funcName)s():%(lineno)s)&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">log_cli_date_format</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;%Y-%m-%d %H:%M:%S&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[tool.black]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">line-length</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">120</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">skip-string-normalization</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[tool.flake8]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">exclude</span> <span style="color:#f92672">=</span><span style="color:#e6db74">[&#39;./tests&#39;]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">max-line-length</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">120</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">count</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">false</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">statistics</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">diff</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">format</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;pylint&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[tool.isort]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">multi_line_output</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">3</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">include_trailing_comma</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;True&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">force_grid_wrap</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">0</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">use_parentheses</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;True&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">line_length</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">120</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">profile</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;black&#34;</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">[tool.tartufo]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">repo-path</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;.&#34;</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">regex</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">entropy</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">true</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">exclude-path-patterns</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> {path-pattern = &#39;poetry\.lock&#39;},
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> {path-pattern = &#39;pyproject\.toml&#39;},
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> # To not have to escape `\` in regexes, use single quoted
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> # TOML &#39;literal strings&#39;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74"> {path-pattern = &#39;docs/source/(.*)\.rst&#39;},</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">]</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">exclude-entropy-patterns</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">[
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    {path-pattern = &#39;\.github/workflows/.*\.yml&#39;, pattern = &#39;uses: .*@[a-zA-Z0-9]{40}&#39;, reason = &#39;GitHub Actions&#39;},
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    {path-pattern = &#39;poetry\.lock&#39;, pattern = &#39;.&#39;},
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    {path-pattern = &#39;Pipfile\.lock&#39;, pattern = &#39;.&#39;},
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">    {path-pattern = &#39;README\.md&#39;, pattern = &#39;.&#39;},</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">]</span>
</span></span></code></pre></div><h2 id="versioning">Versioning</h2>
<p>Another issue you may run into is keeping your project version in sync with your Git tags (which tend to be used for releases).</p>
<p>There is an elegant solution to this, provided you are using Poetry for your build/publish workflow</p>
<ol>
<li>
<p>Update <code>pyproject.toml</code> to have a generic version placeholder.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span>[<span style="color:#ae81ff">tool.poetry]</span>
</span></span><span style="display:flex;"><span><span style="color:#ae81ff">version = &#34;0.0.0&#34;</span>
</span></span></code></pre></div></li>
<li>
<p>Update your release script to fetch the git version before building the package artifacts.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>poetry version <span style="color:#66d9ef">$(</span>git describe --tags --abbrev<span style="color:#f92672">=</span>0<span style="color:#66d9ef">)</span>
</span></span><span style="display:flex;"><span>poetry build
</span></span></code></pre></div></li>
</ol>
<p>With this setup, poetry will fetch and use the latest git tag as its version. You can even integrate this as a GitHub Action.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">Publish</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">release</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">types</span>: [<span style="color:#ae81ff">created]</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">deploy</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">ubuntu-latest</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v2</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Set up Python</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/setup-python@v2</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">python-version</span>: <span style="color:#e6db74">&#39;3.x&#39;</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Install dependencies</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        python -m pip install --upgrade pip
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        pip install poetry</span>
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Build and publish</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">run</span>: |<span style="color:#e6db74">
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        poetry version $(git describe --tags --abbrev=0)
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        poetry build
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">        poetry publish --username ${{ secrets.PYPI_USERNAME }} --password ${{ secrets.PYPI_PASSWORD }}</span>
</span></span></code></pre></div><h2 id="folder-structure-">Folder Structure 📁</h2>
<p>Well, part of my digital journey was digging in on the question of folder structure in projects. Flat vs module vs src. The answer to which to choose is, it depends on one big question, will this project be used as a library or not? If the project will never be a library, then you can just go with the flat layout.</p>
<p><a href="https://blog.ionelmc.ro/2014/05/25/python-packaging/">For a really good deeper read on folder structure check this article out.</a></p>
<h3 id="flat">Flat</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>├── README.md
</span></span><span style="display:flex;"><span>├── pyproject.toml
</span></span><span style="display:flex;"><span>├── app.py
</span></span><span style="display:flex;"><span>└── test_app.py
</span></span></code></pre></div><p>I&rsquo;d recommend against this for anything but the simplest projects. Mixing source code with tests and non-source code files is just going to get messy fast. Don&rsquo;t do this.</p>
<h3 id="module">Module</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>├── README.md
</span></span><span style="display:flex;"><span>├── pyproject.toml
</span></span><span style="display:flex;"><span>├── app
</span></span><span style="display:flex;"><span>│   ├── __init__.py
</span></span><span style="display:flex;"><span>│   └── app.py
</span></span><span style="display:flex;"><span>└── tests/
</span></span><span style="display:flex;"><span>    └── test_app.py
</span></span></code></pre></div><p>This is easy enough to manage, you can still have multiple folders for each different module. I would recommend you keep your tests separate from your module code, to avoid having your tests mixed when you build/publish. The module-based approach also allows you to include multiple packages in your namespace without having to have lots of path statements. A nice compromise between chaos and strict structure.</p>
<h3 id="src">Src</h3>
<p>This allows for import purity and having multiple modules in one source code folder. By moving your code into /src, you prevent folks from being able to run your project from the root directory. Simply put your Python path and working directory gets moved one layer down. To test your code properly, you will need to install it.  This keeps things consistent with how an end user would run the code and related imports.</p>
<p>PyCharm and other IDEs will also let you pick your source root for running your code and tests. This lets you leverage src without too much headache. Poetry and PyTest as well handle the src structure well too for testing and building.</p>
<h3 id="testing-builds-">Testing builds 🗑️🔥</h3>
<p>If you do any builds, please do them using Docker. If you don&rsquo;t do an isolated test, at least at some point in your build, you could potentially run into packages not being representative of what the end user will see. I would recommend you do something along the lines of the example below in your <code>Dockerfile</code>.</p>
<p>This will let you test your build, while still keeping your tests bundled in. If everything is in line, the build should pass. While this is not quite as nice as having everything bundled in one <code>git checkout</code>, it should keep you out of hot water, at least for smaller projects.</p>
<p>Both module and src layouts keep your project builds clean by only including the relevant code and not everything in the repository when your packaging tools run.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-dockerfile" data-lang="dockerfile"><span style="display:flex;"><span><span style="color:#66d9ef">FROM</span><span style="color:#e6db74"> python:3.10-slim AS base</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Setup env</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">ENV</span> LANG<span style="color:#f92672">=</span>C.UTF-8<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">ENV</span> LC_ALL<span style="color:#f92672">=</span>C.UTF-8<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">ENV</span> PYTHONDONTWRITEBYTECODE<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">ENV</span> PYTHONFAULTHANDLER<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">ENV</span> PYTHONHASHSEED<span style="color:#f92672">=</span>random
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">ENV</span> PYTHONUNBUFFERED<span style="color:#f92672">=</span><span style="color:#ae81ff">1</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">#FROM base AS python-deps</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">WORKDIR</span><span style="color:#e6db74"> /app</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Set timezone</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">ENV</span> TZ<span style="color:#f92672">=</span>America/New_York<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> ln -snf /usr/share/zoneinfo/$TZ /etc/localtime <span style="color:#f92672">&amp;&amp;</span> echo $TZ &gt; /etc/timezone<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Install python dependencies</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> apt-get update <span style="color:#f92672">&amp;&amp;</span> apt-get install -y --no-install-recommends gcc git tree<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Setup Poetry</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> pip install poetry<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Skip venvs for Docker</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> poetry config virtualenvs.create false<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Install application into container</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Don&#39;t forget to check the .dockerignore</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Install ALL packages</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> poetry init<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> poetry add pytest<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> poetry add python-dotenv<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> poetry add git+https://github.com/username/repo.git<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">COPY</span> tests tests<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> tree<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Create and switch to a new user</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">RUN</span> useradd --create-home appuser<span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">USER</span><span style="color:#e6db74"> appuser</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#75715e"># Run the executable</span><span style="color:#960050;background-color:#1e0010">
</span></span></span><span style="display:flex;"><span><span style="color:#960050;background-color:#1e0010"></span><span style="color:#66d9ef">CMD</span> [ <span style="color:#e6db74">&#34;pytest&#34;</span> ]<span style="color:#960050;background-color:#1e0010">
</span></span></span></code></pre></div><h2 id="badges-theyre-legit-">Badges (they&rsquo;re legit) 💯</h2>
<p><img src="/blog/poetry-in-motion/badges.png" alt="Badges"></p>
<p>I would highly recommend adding (a few!) badges to any repository that you plan on publishing. You can get some great badges from <a href="https://shields.io/">https://shields.io/</a> along with the info on how to actually generate them. If your repository is public, this should be easy enough. I would say to avoid spamming a ton and having your README looks like a <a href="https://en.wikipedia.org/wiki/The_Midnight_Gospel">technicolor dreamland</a>. Just having things like package health, SourceRank and dependencies can help inspire faith in a smaller project. Having that ✅ can set you apart by showing that your code works! 😄</p>
<table>
  <thead>
      <tr>
          <th>Badge</th>
          <th>Where to find</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Test CI/CD</td>
          <td><a href="https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge">https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge</a></td>
      </tr>
      <tr>
          <td>CodeQL</td>
          <td><a href="https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning-with-codeql">https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning-with-codeql</a></td>
      </tr>
      <tr>
          <td>Libraries.io</td>
          <td><a href="https://libraries.io/">https://libraries.io/</a></td>
      </tr>
      <tr>
          <td>Package Health</td>
          <td><a href="https://snyk.io/advisor">https://snyk.io/advisor</a></td>
      </tr>
      <tr>
          <td>PyPi Version &amp; GH Licence</td>
          <td><a href="https://img.shields.io">https://img.shields.io</a></td>
      </tr>
  </tbody>
</table>
<h2 id="pulling-packages-from-git-directly-">Pulling packages from Git directly 🌐</h2>
<p>A very neat feature that is included in most package managers is the ability to pull packages with correct manifests and install them direct without the need to publish the source on PyPi. I&rsquo;m including this because it will hopefully come in handy for folks not wanting to publish their private repositories to PyPi or just looking to keep everything on GitHub for very small projects.</p>
<table>
  <thead>
      <tr>
          <th>Package Manager</th>
          <th>Manifest File</th>
          <th>Code</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Pip</td>
          <td><code>requirements.txt</code></td>
          <td><code>packagename @ git+https://github.com/ACCOUNT_NAME/PROJECT_NAME.git@master</code></td>
      </tr>
      <tr>
          <td>PipEnv</td>
          <td><code>Pipfile</code></td>
          <td><code>packagename = {git = &quot;https://github.com/ACCOUNT_NAME/PROJECT_NAME.git&quot;, editable = true, ref = &quot;master&quot;}</code></td>
      </tr>
      <tr>
          <td>Poetry</td>
          <td><code>PyProject.toml</code></td>
          <td><code>packagename = {git = &quot;https://github.com/ACCOUNT_NAME/PROJECT_NAME.git&quot;}</code></td>
      </tr>
  </tbody>
</table>
<h2 id="packaging-tool-comparison-and-related-conclusions-tldr-">Packaging Tool Comparison and related conclusions (TL;DR) 😅</h2>
<p>To summarize the above in a short little chart, if all you need to do is upgrade from <code>requirements.txt</code>, give <strong>PipEnv</strong> a try. It&rsquo;s very easy to start with (as I did).
If you think you will want to give the packaging a try, like a consolidated project config, or <strong>if you want to pick &ldquo;just one&rdquo;, go with Poetry.</strong> It&rsquo;s easy to start with and grow into and there is a reason why it has <em>23,000 stars</em> on GitHub. I would also say going with a src-less module-based structure is both easy to use and easy to publish.</p>


  
    <blockquote>
      <p><strong>PipEnv is nice, but Poetry is nicer</strong></p>
    </blockquote>
  
<table>
  <thead>
      <tr>
          <th>Tool</th>
          <th>Package Management</th>
          <th>Environment management</th>
          <th>App Publishing</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Pip</td>
          <td>Yes</td>
          <td>No</td>
          <td>No</td>
      </tr>
      <tr>
          <td>PipEnv</td>
          <td>Yes</td>
          <td>Yes</td>
          <td>No</td>
      </tr>
      <tr>
          <td>Flit</td>
          <td>No</td>
          <td>No</td>
          <td>Yes</td>
      </tr>
      <tr>
          <td>Poetry</td>
          <td>Yes</td>
          <td>Yes</td>
          <td>Yes</td>
      </tr>
  </tbody>
</table>
<p><a href="https://www.githubcompare.com/python-poetry/poetry+pypa/pipenv+pypa/flit+pdm-project/pdm"><img src="/blog/poetry-in-motion/repo-compare.png" alt="Repo Compare"></a></p>


  
    <blockquote>
      <p>Full disclosure, I did not review Conda or Hatch fully. Not that there is anything explicitly wrong with either of them. Conda is too specific to the scientific community for my general taste. Hatch seems to go well with Conda and also uses the PyProject manifest as well. It&rsquo;s nice that it gives you several built in tools, similar to commit hooks, but I tend to like to roll my own via a <a href="https://taskfile.dev/">Taskfile</a> and run them with Poetry.</p>
<p>PDM has definitely caught my eye, and I will be trying to find the time down the road to look into it further once it matures more. I have a rule of thumb, if my IDE doesn&rsquo;t support the build system fully (Like Poetry and PipEnv), I&rsquo;m going to have a hard time adopting it.</p>
    </blockquote>
  
<p><em>If anyone reading this would like to weigh in, please feel free to either comment here or email me.</em> 🤘</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:poetry-in-motion">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/poetry-in-motion/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/python/">#python</a>

<a href="https://jelloeater.me/tags/python-projects/">#python-projects</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title>while(True)try</title>
      <link>
      https://jelloeater.me/blog/while-true-try/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/blog/while-true-try/#comments
      </comments>
      <pubDate>Wed, 08 Feb 2023 01:16:00 -0500</pubDate>
      <category>career</category>
      
      <category>learning</category>
      
      <category>newbie</category>
      
      <category>python</category>
      <guid>https://jelloeater.me/blog/while-true-try/</guid>
      
      <media:content url="https://jelloeater.me/blog/while-true-try/smile.jpg" medium="image" type="image/jpg"/>
      <media:thumbnail url="https://jelloeater.me/blog/while-true-try/smile.jpg"/>
      


    
    



      
      
      <description><![CDATA[Cannot stop, won&#39;t stop]]></description>
      
      <content:encoded>
        <![CDATA[
        
          <p><img src="https://jelloeater.me/blog/while-true-try/smile.jpg" alt="Featured Image"/></p>
        
        <h2 id="initial-commit">Initial Commit</h2>
<p>It&rsquo;s been a while since I&rsquo;ve written anything substantial in Python.
Up until this point, I&rsquo;ve mostly just written little toy programs here and there, as you can probably tell from my Github&rsquo;s list of half-finished projects (like any seasoned developer has).</p>
<p>For a little context, I wasn&rsquo;t always a dev. I started off originally going to my community college in 2003, fresh out of high school, for computer science. VB (not .net) was my first real introduction to programming, aside from BASIC when I was a child. But comp-sci sadly didn&rsquo;t work out for me at the time. My first semester was all A&rsquo;s, but by my second semester I had hit a wall.</p>
<p>It was a double whammy of Java and Assembly, a one-two punch! Assembly was too abstract for my eighteen year old brain, so I tried my best to throw my weight into Java. Functions, objects, if then statements- I was getting it, at least somewhat (sad to say, I never got error handling). And I made the mistake of some newbies in that I didn&rsquo;t find a strong mentor to show me the digital ropes.</p>
<p><img src="/blog/while-true-try/suffolkcars.jpg" alt="LaterSCCC"></p>
<h2 id="changing-gears">Changing Gears</h2>
<p>I ended up switching my major to liberal arts in 2004 and from there went all the way through to getting a bachelors in Psychology. I figured if I couldn&rsquo;t understand computers, at least maybe I could understand and help people. In the meantime, I still couldn&rsquo;t quite stay away from technology- I just had an itch to build and explore the digital world. For the next 10 years I bounced around, always tinkering and learning, but tech was still just a side gig. It was never something I thought I could do as a career.</p>
<p>I got a job in the copy center at Staples part-time while making an Adult Swim-esque web-series with some friends. I then ended up working in a carpet store and writing Tweets for a social-media marketing company. I spent some time trying different things that let me express myself and I learned what worked and what didn&rsquo;t work for me. And I never stopped creating- I mixed music and worked weddings as a photographer. Art was always fun for me.</p>
<p>In 2012 I decided to pursue my Masters in Information Systems Management instead of going for my Masters in social work. I was a bit older and had come to find where my talents and interests intersected to form the right career path for me. And years of having people close to me say I should pursue IT helped me get there too.</p>
<p>When summer 2013 rolled around I said, &ldquo;Java be damned, I won&rsquo;t let my story end with not knowing how to do a try-and-catch!&rdquo;. I&rsquo;m still not quite sure what sparked it. Maybe it was pride that made me want to re-write the last page in that chapter of my life. So I started typing away, trying to make something work. It was a stock ticker app, because I was A) a little bit of a finance nerd, and B) didn&rsquo;t feel like paying for any of the over-priced apps to run on Windows XP. This didn&rsquo;t work out too well. Folder after folder, zip file after zip file- it was getting messy fast. I Google&rsquo;d <em>&ldquo;How to backup Java&rdquo;</em>&hellip; <strong>&ldquo;How to backup Java CODE&rdquo;</strong>&ldquo;Use Git&rdquo;, some snarky commenter on Hacker News said.</p>
<p>So the very first thing I learned after VB and Java was&hellip; Git. Yeah, I should have given up right then and there. HA! I soldiered on- commit after terrible commit, no branches, no tags, just one ugly line. At least it didn&rsquo;t look like a kid&rsquo;s crayon drawing of a Git graph. A decade later, and I can still read the comment history-</p>
<p>Commit messages like <em>&ldquo;Shit I&rsquo;m tired, its 1:45 am. I&rsquo;ll work on this tomorrow. At least I picked up how to use Maven.&rdquo;</em> and <em>&ldquo;We now have a true singleton, my first,<em>tear</em>&rdquo;</em> still make me laugh looking back.</p>
<p><img src="/blog/while-true-try/stockticker.png" alt="StockTicker Git History"></p>
<p>Around a year later I was deep into playing Minecraft with my college friends. Keep in mind, this was before it was COOL and popular amongst Gen-Z. We were playing with a mod called ComputerCraft (<a href="https://github.com/dan200/ComputerCraft">https://github.com/dan200/ComputerCraft</a>), which was AND still is quite neat. We had talked amongst ourselves and decided that having a message board inside the game that you can view from outside the game would be neat, if not a little over-kill.</p>
<p>So I was off to build this message board. I was tired of Java this and Java that- I wanted something new, something fun. VB seemed too old school, so off to Google I went again. <em>&ldquo;What&rsquo;s a good programming language to learn&hellip;&rdquo;</em> Python seemed like a good start.</p>
<h2 id="off-to-python">Off to Python</h2>
<p>This was 2014, so keep in mind that there wasn&rsquo;t a blog article for everything yet. I fired up Amazon and looked at the top reviewed books&hellip;
<a href="https://www.amazon.com/gp/product/193518220X/"><img src="/blog/while-true-try/PythonBook.jpg" alt="The Quick Python Book, Second Edition"></a></p>
<p>This book would become my guide book to learning this new (and weirdly formatted) programming language.</p>
<p>Two long weeks later I had this&hellip;</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-python" data-lang="python"><span style="display:flex;"><span><span style="color:#75715e">#!/usr/bin/env python2.7</span>
</span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;&#34;&#34;
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">About:
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">A simple WSGI API server, aka take table from SQLite and make web page and API.
</span></span></span><span style="display:flex;"><span><span style="color:#e6db74">&#34;&#34;&#34;</span>
</span></span><span style="display:flex;"><span>__author__ <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;Jelloeater&#34;</span>
</span></span><span style="display:flex;"><span>__license__ <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;GNU GPL v3.0&#34;</span>
</span></span></code></pre></div><p>That was the start of my very first Python app.
I hacked away for a solid 2 months, and in the end I had quite the ugly web page!</p>
<p>This was a big deal for me in 2014. Keep in mind that I didn&rsquo;t know about Django or Flask at the time and all I had was my trusty paper sidekick. I ended up deploying it on a Debian 6 VM, bare metal, no Docker yet for me.</p>
<p>I had a working prototype, though definitely not the first of it&rsquo;s kind. To paraphrase: it was too strange to live, but too weird to die. But old code never dies, it just rots away&hellip;</p>
<p>Funny thing, 10 years later, <code>apt-get install python2</code>, some crossed fingers&hellip;</p>


  
    <blockquote>
      <p><strong>&hellip; Yes! My old bad code still works!</strong></p>
    </blockquote>
  
<p>Jeez could I do a much better job now, but hey- it DID work.</p>
<h2 id="then-and-now">Then and now</h2>
<p>2014 had come and gone. At this point I was working my first help desk job, fixing printers and pulling cable. It wasn&rsquo;t exactly what I wanted to do career-wise, but it was at least something I actually enjoyed (sort of). I spent the next eight years tinkering at home with micro controllers (ESP8266&rsquo;s &amp; MicroPython) and working on hobby projects- I just couldn&rsquo;t let it go.</p>
<p>I worked as a sys admin for a decade plus at several companies which gave me the background I needed to make the jump to programming. Career wise, I was eventually able to move into programming more, taking on bigger and bigger automation projects at work. While I did have less and less for personal projects, I still tried to keep up here and there, tinkering where I could. A billion side projects, unfinished- the classic nerd hobby problem. I was at least able to get temperature sensor logging to a SQLLite DB- silly, but it was nice to see some soldered garbage spit out real data.</p>
<p>I have been fortunate though to have met a lot of great folks over the last decade that have pushed me to try new things and think differently, as cliche as that sounds. Honestly, the best part of all of it wasn&rsquo;t building software or designing systems, but teaching those friends and colleges what I had learned, and watching them get inspired as well! Personally, I&rsquo;ve been lucky to have the support of friends and loved ones, and to be inspired by them as well to keep on trying new things. Don&rsquo;t ever forget where you&rsquo;ve come from&hellip; and don&rsquo;t ever forget, that no matter how many neat things you build or problems you solve, try and take a minute to breathe and take a slow sip of that cup of coffee or tea. You only get <strong>one</strong>.</p>
<p><img src="/blog/while-true-try/field.jpg" alt="Louie"></p>
<p>❤️ Louie</p>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:while-true-try">📧 Email Me</a> |
<a href="https://jelloeater.me/blog/while-true-try/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
<a href="https://jelloeater.me/tags/career/">#career</a>

<a href="https://jelloeater.me/tags/learning/">#learning</a>

<a href="https://jelloeater.me/tags/newbie/">#newbie</a>

<a href="https://jelloeater.me/tags/python/">#python</a>

        ]]>
        </content:encoded>
    </item>
    <item>
      <title></title>
      <link>
      https://jelloeater.me/link/
      </link>
      <dc:creator>Jelloeater</dc:creator>
      <comments>
      https://jelloeater.me/link/#comments
      </comments>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://jelloeater.me/link/</guid>
      


    
    
    
    

    
    


    
        



    

    

    <media:content url="https://jelloeater.me/link/gen-cover.png" medium="image" type="image/png"/>
    <media:thumbnail url="https://jelloeater.me/link/gen-cover.png"/>
    



      
      
      <content:encoded>
        <![CDATA[
        
        <head>
    <!-- Tailwind CSS CDN -->
    <script src="https://cdn.tailwindcss.com"></script>
    <!-- Font Awesome CDN for icons -->
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
    <style>
        /* Custom styles to override or extend Tailwind, if necessary */

        .link-button {
            transition: all 0.2s ease-in-out;
            min-height: 4rem; /* Ensures consistent height for all buttons */
            @apply shadow-md border border-transparent; /* Apply common border and shadow */
            color: white !important;
        }
        .link-button:hover {
            transform: translateY(-2px);
            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3);
        }
        /* Style for the profile picture border */
        .profile-pic-border {
            border: 3px solid #ffffff; /* Blue border around the profile picture */
        }
        .section-title {
            color: #ffffff; /* Blue color for section titles */
            margin-top: 2rem;
            margin-bottom: 1rem;
            font-size: 1.5rem; /* Larger font size for titles */
            font-weight: bold;
        }

        /* Specific Link Colors from Lynx v1.3.1 */
        .link-amazon { background-color: #ff9900; color: #neutral-900; }
        .link-apple { background-color: #333; }
        .link-codepen { background-color: #1e1f26; }
        .link-dev { background-color: #0a0a0a; color: white; }
        .link-discord { background-color: #7289da; }
        .link-dribbble { background-color: #ea4c89; }
        .link-facebook { background-color: #1877f2; }
        .link-flickr { background-color: #ff0184; }
        .link-foursquare { background-color: #0732a2; }
        .link-github { background-color: #333; }
        .link-gitlab { background-color: #554488; }
        .link-google { background-color: #4285f4; }
        .link-instagram { background: linear-gradient(45deg, #405de6, #5851db, #833ab4, #c13584, #e1306c, #fd1d1d); }
        .link-keybase { background-color: #33a0ff; }
        .link-kickstarter { background-color: #06ce78; color: #neutral-900; }
        .link-lastfm { background-color: #d51007; }
        .link-linkedin { background-color: #0077b5; }
        .link-mastodon { background-color: #6364ff; }
        .link-medium { background-color: #00ab6c; }
        .link-microsoft { background-color: #08a6f0; }
        .link-orcid { background-color: #a6ce39; color: white; }
        .link-patreon { background-color: #ff434d; }
        .link-pinterest { background-color: #e60023; }
        .link-reddit { background-color: #ff4500; }
        .link-researchgate { background-color: #40ba9c; }
        .link-slack { background-color: #4a154b; }
        .link-snapchat { background-color: #fffc00; color: #neutral-900; }
        .link-soundcloud { background: linear-gradient(120deg, #ff8800, #ff3300); }
        .link-spotify { background-color: #1db954; }
        .link-steam { background-color: #000; }
        .link-telegram { background-color: #25a3e1; }
        .link-threads { background-color: #000; }
        .link-tiktok { background-color: #fe2d55; }
        .link-tumblr { background-color: #001935; }
        .link-twitch { background-color: #9146ff; }
        .link-twitter { background-color: rgb(63, 136, 222); }
        .link-whatsapp { background: linear-gradient(120deg, #12990b, #45d82c); }
        .link-x { background-color: #000; }
        .link-youtube { background-color: #ff0000; }
        .link-email { background-color: #c260ff; }
        .link-stack-exchange { background-color: #0095ff; }
        .link-stack-overflow { background-color: #f48024; color: white;}

        .link-chess { color: white; background: black; }
        .link-hashnode { color: white; background: #2766FF; }
        .link-vimeo { color: white; background: #00ADEF; }
        .link-pgp { color: white; background: #ac0056; }
        .link-bitcoin { color: white; background: #F7931A; }
        .link-eth { color: white; background: #4337C9; }
        .link-matrix { color: white; background: #0dbb89; }
        .link-key { color: white; background: #757CE5; }
        .link-bluesky { color: white; background: #1185FE; }
        .link-hacker { color: white; background: #FF6600; }
        .link-kofi { color: white; background: #FF5C5B; }
        .link-code { color: white; background: #007db7; }
        .link-rss { color: white; background: #F78829; }
        .link-instapaper { color: white; background: black; }
        .link-libio { background-color: #66314C; }
        .link-statsfm { background-color: #25D865; }
        .link-homepage { color: white; background: #009fb7; }
        .link-letterboxd { color: white; background: #00E054; }
        .link-discogs { color: white; background: #31312F; }
        .link-mal { color: white; background: #2E51A2; }
        .link-hardcover { color: white; background: #4338CA; }
        .link-simplex { color: white; background: linear-gradient(45deg, #0092f7, #00e6f9); }
        .link-signal { color: white; background: #3A76F0; }
        .link-spacehey { color: white; background: #173EAD; }
        .link-pixelfed { color: white; background: #6366F1; }
        .link-lemmy { color: white; background: #222222; }
        .link-devrant { color: white; background: #222222; }
        .link-substack { color: white; background: #FF6719; }
        .link-listenbrainz { color: #EB743B; background: #353070; }
        .link-wonderful { color: white; background: #4A90E2; }
        .link-dimensional { color: white; background: #782e71; }
        /* Fallback for links without specific color class */
        .link-button:not([class*="link-"]):not(.link) {
            background-color: #b5b5b5; /* Slightly lighter dark gray for buttons */
            color: #E0E0E0; /* Light gray text */
        }
    </style>
</head>
<body >
    <div class="w-full max-w-md mx-auto text-center">
        <!-- Social & Personal Links Section -->
        <h2 class="section-title">Social & Personal</h2>
        <div class="space-y-4">
            <!-- Bluesky -->
            <a href="https://bsky.app/profile/jelloeater.bsky.social" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-bluesky">
                <i class="fas fa-cloud text-xl mr-3"></i>
                <span class="text-lg font-semibold">BlueSky</span>
            </a>

            <!-- Mastodon -->
            <a href="https://mastodon.social/@jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-mastodon">
                <i class="fab fa-mastodon text-xl mr-3"></i>
                <span class="text-lg font-semibold">Mastodon</span>
            </a>

            <!-- Email -->
            <a href="mailto:jello@jelloeater.me"
               class="link-button flex items-center justify-center p-4 rounded-xl link-email">
                <i class="fas fa-envelope text-xl mr-3"></i>
                <span class="text-lg font-semibold">Email</span>
            </a>

            <!-- RSS Feed -->
            <a href="https://subscribeopenly.net/subscribe/?url=http://jelloeater.me/feed.xml" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-rss">
                <i class="fas fa-rss text-xl mr-3"></i>
                <span class="text-lg font-semibold">RSS Feed</span>
            </a>

            <!-- Matrix -->
            <a href="https://matrix.to/#/@jelloeater:matrix.org" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-matrix">
                <i class="fas fa-comments text-xl mr-3"></i> <!-- Generic chat icon for Matrix -->
                <span class="text-lg font-semibold">Matrix</span>
            </a>

            <!-- Lichess -->
            <a href="https://lichess.org/@/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-chess">
                <i class="fas fa-chess-knight text-xl mr-3"></i>
                <span class="text-lg font-semibold">Lichess</span>
            </a>

            <!-- SpaceHey -->
            <a href="https://spacehey.com/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-spacehey">
                <i class="fas fa-user-friends text-xl mr-3"></i>
                <span class="text-lg font-semibold">SpaceHey</span>
            </a>

            <!-- Substack -->
            <a href="https://substack.com/@jelloeater42" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-substack">
                <i class="fas fa-newspaper text-xl mr-3"></i>
                <span class="text-lg font-semibold">Substack</span>
            </a>

            <!-- Pixelfed -->
            <a href="https://pxlmo.com/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-pixelfed">
                <i class="fas fa-camera text-xl mr-3"></i>
                <span class="text-lg font-semibold">Pixelfed</span>
            </a>

            <!-- Lemmy -->
            <a href="https://lemmy.world/u/jelloeater85" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-lemmy">
                <i class="fas fa-users text-xl mr-3"></i>
                <span class="text-lg font-semibold">Lemmy</span>
            </a>
        </div>

        <!-- Media & Entertainment Links Section -->
        <h2 class="section-title">Media & Entertainment</h2>
        <div class="space-y-4">
            <!-- Last.fm -->
            <a href="https://www.last.fm/user/dcwill42" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-lastfm">
                <i class="fab fa-lastfm text-xl mr-3"></i>
                <span class="text-lg font-semibold">Last.fm</span>
            </a>

            <!-- listenbrainz -->
            <a href="https://listenbrainz.org/user/jelloeater" target="_blank" rel="noopener noreferrer"
            class="link-button flex items-center justify-center p-4 rounded-xl link-listenbrainz">
                <i class="fas fa-headphones text-xl mr-3"></i>
                <span class="text-lg font-semibold">ListenBrainz</span>
            </a>

            <!-- Hardcover -->
            <a href="https://hardcover.app/@jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-hardcover">
                <i class="fas fa-book text-xl mr-3"></i>
                <span class="text-lg font-semibold">Hardcover</span>
            </a>

            <!-- Stats.fm (Spotify) -->
            <a href="https://stats.fm/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-statsfm">
                <i class="fab fa-spotify text-xl mr-3"></i>
                <span class="text-lg font-semibold">Stats.fm</span>
            </a>

            <!-- Letterboxd -->
            <a href="https://letterboxd.com/jelloeater/activity/" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-letterboxd">
                <i class="fas fa-film text-xl mr-3"></i>
                <span class="text-lg font-semibold">Letterboxd</span>
            </a>

            <!-- Twitch -->
            <a href="https://twitch.tv/jelloeater42" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-twitch">
                <i class="fab fa-twitch text-xl mr-3"></i>
                <span class="text-lg font-semibold">Twitch</span>
            </a>

            <!-- MyAnimeList -->
            <a href="https://myanimelist.net/profile/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-mal">
                <i class="fas fa-tv text-xl mr-3"></i>
                <span class="text-lg font-semibold">MyAnimeList</span>
            </a>

            <!-- Soundcloud -->
            <a href="https://soundcloud.com/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-soundcloud">
                <i class="fab fa-soundcloud text-xl mr-3"></i>
                <span class="text-lg font-semibold">Soundcloud</span>
            </a>

            <!-- Discogs -->
            <a href="https://www.discogs.com/user/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-discogs">
                <i class="fas fa-compact-disc text-xl mr-3"></i>
                <span class="text-lg font-semibold">Discogs</span>
            </a>

            <!-- Dimensional -->
            <a href="https://www.dimensional.me/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-dimensional">
                <i class="fas fa-user text-xl mr-3"></i>
                <span class="text-lg font-semibold">Dimensional</span>
            </a>

        </div>

        <!-- Developer & Security Links Section -->
        <h2 class="section-title">Developer & Security</h2>
        <div class="space-y-4">
            <!-- GitHub -->
            <a href="https://github.com/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-github">
                <i class="fab fa-github text-xl mr-3"></i>
                <span class="text-lg font-semibold">GitHub</span>
            </a>

            <!-- DevRant -->
            <a href="https://devrant.com/users/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-devrant">
                <i class="fas fa-laptop-code text-xl mr-3"></i>
                <span class="text-lg font-semibold">DevRant</span>
            </a>

            <!-- Keyoxide -->
            <a href="https://keyoxide.org/9EE9D74850C55BBB4C0CD87D92A044CF962D21D3" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-key">
                <i class="fas fa-key text-xl mr-3"></i>
                <span class="text-lg font-semibold">Keyoxide</span>
            </a>

            <!-- Tokscale -->
            <a href="https://tokscale.ai/u/Jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-code">
                <i class="fas fa-chart-line text-xl mr-3"></i>
                <span class="text-lg font-semibold">Tokscale</span>
            </a>
            
            <!-- Hashnode -->
            <a href="https://hashnode.com/@jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-hashnode">
                <i class="fab fa-hashnode text-xl mr-3"></i>
                <span class="text-lg font-semibold">Hashnode</span>
            </a>

            <!-- Orcid -->
            <a href="https://orcid.org/0009-0008-0590-6983" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-orcid">
                <i class="fas fa-id-card text-xl mr-3"></i>
                <span class="text-lg font-semibold">Orcid</span>
            </a>

            <!-- Libraries.io -->
            <a href="https://libraries.io/github/Jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-libio">
                <i class="fas fa-code-branch text-xl mr-3"></i>
                <span class="text-lg font-semibold">Libraries.io</span>
            </a>

            <!-- PGP -->
            <a href="https://keys.openpgp.org/vks/v1/by-email/jello@jelloeater.me" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-pgp">
                <i class="fas fa-lock text-xl mr-3"></i>
                <span class="text-lg font-semibold">PGP</span>
            </a>

            <!-- Stack Overflow -->
            <a href="https://stackoverflow.com/users/23488558/jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-stack-overflow">
                <i class="fab fa-stack-overflow text-xl mr-3"></i>
                <span class="text-lg font-semibold">Stack Overflow</span>
            </a>

            <!-- Hacker News -->
            <a href="https://news.ycombinator.com/user?id=jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-hacker">
                <i class="fab fa-hacker-news text-xl mr-3"></i>
                <span class="text-lg font-semibold">HackerNews</span>
            </a>

            <!-- Dev.to -->
            <a href="https://dev.to/jelloeater/" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-dev">
                <i class="fab fa-dev text-xl mr-3"></i>
                <span class="text-lg font-semibold">Dev.to</span>
            </a>

            <!-- Wonderful.dev -->
            <a href="https://wonderful.dev/Jelloeater" target="_blank" rel="noopener noreferrer"
               class="link-button flex items-center justify-center p-4 rounded-xl link-wonderful">
                <i class="fa-solid fa-code text-xl mr-3"></i>
                <span class="text-lg font-semibold">Wonderful.dev</span>
            </a>
        </div>
    </div>
    <br>
</body>

        <br>
<div class="rss_avatar">
    
<a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" target="_blank" rel="noopener noreferrer">
  <img
  class="gravatar-img"
  
  alt="Avatar"
  loading="lazy"
  src="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=250"
  />
</a>

</div>
<style>
.rss_avatar{
    float: right;
}
.rss_avatar img{
    border-radius: 100%;
    max-height: 150px;
}
</style>
<br>
<hr>
Reply:
<a href="https://mastodon.social/@jelloeater">🐘 @jelloeater - Masto</a> |
<a href="https://bsky.app/profile/jelloeater.bsky.social">🦋 @jelloeater - Bsky</a> |
<a href="https://bsky.app/profile/did:plc:srmltlrjqfr7mbfdejuxrbss/rss">🦋 @jelloeater - Bsky RSS</a> |
<a href="mailto:jello@jelloeater.me?subject=RE:">📧 Email Me</a> |
<a href="https://jelloeater.me/link/#comments">💬 Comment</a>
<br>
<a href="https://jelloeater.me/link/">🌳 LinkTree</a> |
<a href="https://ko-fi.com/jelloeater">☕ Buy me a coffee</a>
<hr>


Tags:
        ]]>
        </content:encoded>
    </item>
  </channel>
</rss>
