<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jelloeater 👉jelloeater.me</title>
    <description>The latest articles on DEV Community by Jelloeater 👉jelloeater.me (@jelloeater).</description>
    <link>https://dev.to/jelloeater</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1170720%2Fb97c397e-13fa-42b4-880c-d0890ea2da3d.jpeg</url>
      <title>DEV Community: Jelloeater 👉jelloeater.me</title>
      <link>https://dev.to/jelloeater</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jelloeater"/>
    <language>en</language>
    <item>
      <title>Phonebook Cleanup</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Sat, 04 Oct 2025 21:22:48 +0000</pubDate>
      <link>https://dev.to/jelloeater/phonebook-cleanup-4pd9</link>
      <guid>https://dev.to/jelloeater/phonebook-cleanup-4pd9</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;So honestly I feel like I’m that guy that never deletes a single contact. I get notifications on my phone for birthdays for people I don’t like. And more importantly applications like WhatsApp and even my beloved Telegram will sync my local contacts with people who I don’t really want to talk to anymore.&lt;/p&gt;

&lt;p&gt;I’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’s about $5 more than I’d really like to have considering some of these people I never wanted to talk to again.&lt;/p&gt;

&lt;p&gt;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’t like call me or text me.&lt;/p&gt;

&lt;p&gt;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’t complain too much consider I’m using a product made by a search company Linux Roots be damned.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  DecSync
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jelloeater.me/blog/phonebook-cleanup/decsync.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0hvx63hbunjs8pa97u19.png" width="800" height="934"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Export all of your contacts from people you don’t want to talk to anymore into one giant VCF.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;This is where DecSync comes in. You can import that VCF file of those people you don’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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://f-droid.org/packages/org.decsync.cc" rel="noopener noreferrer"&gt;https://f-droid.org/packages/org.decsync.cc&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Alternate
&lt;/h2&gt;

&lt;p&gt;So for all the folks reading this if you want to still get that caller ID notification for somebody who you don’t like but you don’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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://apt.izzysoft.de/packages/com.lulu786.Alternate" rel="noopener noreferrer"&gt;https://apt.izzysoft.de/packages/com.lulu786.Alternate&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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’t like while still having them not show up in your signal chats by accident.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jelloeater.me/blog/phonebook-cleanup/Alternate.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj4cdqe4zt43pbcofo4lb.png" width="800" height="954"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If this blog post helps you out please let me know because God knows I’m always trying to figure out a better solution for privacy on my mobile devices.&lt;/p&gt;

</description>
      <category>android</category>
      <category>privacy</category>
    </item>
    <item>
      <title>How to Identify and Heal Burnout from Work</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Sun, 06 Jul 2025 02:58:27 +0000</pubDate>
      <link>https://dev.to/jelloeater/how-to-identify-and-heal-burnout-from-work-1gc0</link>
      <guid>https://dev.to/jelloeater/how-to-identify-and-heal-burnout-from-work-1gc0</guid>
      <description>&lt;h2&gt;
  
  
  How it started 🔰
&lt;/h2&gt;

&lt;p&gt;This one hits close to home for me. I started working from home about five years ago, and at first, it was great!&lt;br&gt;
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!&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;that’s&lt;/em&gt; relaxing!&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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. 😅&lt;/p&gt;

&lt;p&gt;&lt;a href="https://jelloeater.me/blog/identify-heal-burnout/healing.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu8d1aiiew0rh7md0e132.png" alt="Bird" width="800" height="789"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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…&lt;/p&gt;

&lt;p&gt;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 &lt;strong&gt;really&lt;/strong&gt; 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 &lt;em&gt;and&lt;/em&gt; a curse.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;


&lt;h2&gt;
  
  
  How it’s going ⏩
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jelloeater.me/blog/identify-heal-burnout/ikigai.png" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgmnubj1yqaizhi69i7pd.png" alt="ikigai" width="773" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;em&gt;and&lt;/em&gt; 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, &lt;strong&gt;bigger&lt;/strong&gt; half is what you do in the &lt;em&gt;real world&lt;/em&gt; to handle stress and turmoil. Finding the right balance is always tough for neurodivergent folks, and finding &lt;a href="https://www.dictionary.com/browse/ikigai" rel="noopener noreferrer"&gt;ikigai&lt;/a&gt; is even harder!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So, real talk time...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;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 &lt;a href="https://scholar.google.com/scholar?hl=en&amp;amp;as_sdt=0%2C33&amp;amp;q=burnt+out+employees&amp;amp;btnG=&amp;amp;oq=burntout" rel="noopener noreferrer"&gt;look at a few studies&lt;/a&gt;, 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.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mental Health Tools 🧠
&lt;/h3&gt;

&lt;p&gt;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. ❤&lt;/p&gt;
&lt;h4&gt;
  
  
  Stages of Burnout
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://jelloeater.me/blog/identify-heal-burnout/stages_burntout.webp" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjz12ik8y6w94q3jxhvy6.webp" alt="Burnout" width="800" height="806"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Compulsion to Prove Oneself:&lt;/strong&gt; Constantly feeling the need to validate your worth and overextending yourself.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Working Harder:&lt;/strong&gt; Unable to disconnect, often working during off-hours and taking on too many tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neglecting Needs:&lt;/strong&gt; Forgetting basic needs like eating or socializing, prioritizing work over well-being.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Displacement of Conflicts:&lt;/strong&gt; Avoiding issues, attributing problems to “just stress,” and becoming defensive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Revision of Values:&lt;/strong&gt; Work dominates your personal life, overshadowing relationships and interests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Denial of Problems:&lt;/strong&gt; Blaming others and overlooking your own increasing stress and irritability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Withdrawal:&lt;/strong&gt; Preferring solitude, avoiding social events, possibly turning to substances for comfort.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Odd Behavioral Changes:&lt;/strong&gt; Acting out of character, with noticeable mood swings or impulsive decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depersonalization:&lt;/strong&gt; Feeling detached, viewing achievements as just tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inner Emptiness:&lt;/strong&gt; Feeling a void, resorting to various means to fill it—this is a sign you need help.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Depression:&lt;/strong&gt; Constantly drained, hopeless about the future, struggling with motivation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Burnout Syndrome:&lt;/strong&gt; At a critical point, feeling overwhelmed and possibly experiencing severe anxiety.&lt;/li&gt;
&lt;/ol&gt;




&lt;h4&gt;
  
  
  Signs You’ve Hit Burnout
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://jelloeater.me/blog/identify-heal-burnout/burnout.webp" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzt9jiyl1ak29p32ln10b.webp" alt="Burnout" width="800" height="790"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You’re easily irritated.&lt;/li&gt;
&lt;li&gt;You feel completely unmotivated, even for things you normally enjoy.&lt;/li&gt;
&lt;li&gt;You’re experiencing anxiety or panic attacks.&lt;/li&gt;
&lt;li&gt;You’re having trouble sleeping; either it takes hours to fall asleep, or your sleep is broken throughout the night.&lt;/li&gt;
&lt;li&gt;You have almost no patience and find yourself being short with colleagues and family.&lt;/li&gt;
&lt;li&gt;You’re experiencing indigestion; low-grade stomach aches or constant “butterflies.”&lt;/li&gt;
&lt;li&gt;You start crying unexpectedly.&lt;/li&gt;
&lt;li&gt;You feel detached from reality, going through your days without emotional connection.&lt;/li&gt;
&lt;li&gt;You feel empty.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Digital Tools 📱
&lt;/h3&gt;

&lt;p&gt;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. &lt;a href="https://www.amazon.com/gp/product/B0BYV2DJ1K" rel="noopener noreferrer"&gt;These ones from Amazon&lt;/a&gt; are great for short breaks!&lt;/p&gt;

&lt;h4&gt;
  
  
  HowWeFeel (Mood Tracker)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://howwefeel.org/" rel="noopener noreferrer"&gt;https://howwefeel.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h4&gt;
  
  
  Diaro (Diary)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.pixelcrater.Diaro" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.pixelcrater.Diaro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h4&gt;
  
  
  GymRun (Exercise)
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.imperon.android.gymapp" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.imperon.android.gymapp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Info
&lt;/h2&gt;

&lt;p&gt;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 &lt;a href="https://dev.to/blogroll/#mental-health-i-classfa-solid-fa-braini-i-classfa-solid-fa-heart-pulsei"&gt;my “must reads” section&lt;/a&gt; on my blog.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping it up 🎁
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://jelloeater.me/blog/identify-heal-burnout/kind.webp" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmevb3lwpturv8635osv8.webp" alt="Its okay" width="686" height="960"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and take care of yourself. 💛&lt;/p&gt;

&lt;h2&gt;
  
  
  Additional Resources 📚
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mental Health Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Worldwide Directory: &lt;a href="https://findahelpline.com/i/iasp" rel="noopener noreferrer"&gt;https://findahelpline.com/i/iasp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;International Directory: &lt;a href="https://www.opencounseling.com/suicide-hotlines" rel="noopener noreferrer"&gt;https://www.opencounseling.com/suicide-hotlines&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Places to Find a Therapist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://therapists.psychologytoday.com/rms/?tr=Hdr_SubBrand" rel="noopener noreferrer"&gt;Psychology Today&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.goodtherapy.org/find-therapist.html" rel="noopener noreferrer"&gt;Good Therapy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openpathcollective.org/" rel="noopener noreferrer"&gt;Open Path Collective&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.inclusivetherapists.com/" rel="noopener noreferrer"&gt;Inclusive Therapists&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.unmute.today/" rel="noopener noreferrer"&gt;Unmute&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Cover by Irhan Prabasukma&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>mentalhealth</category>
      <category>selfcare</category>
      <category>burnout</category>
    </item>
    <item>
      <title>Review - AI Tooling</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Fri, 23 May 2025 21:34:01 +0000</pubDate>
      <link>https://dev.to/jelloeater/review-ai-tooling-2ec7</link>
      <guid>https://dev.to/jelloeater/review-ai-tooling-2ec7</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;The AI tooling landscape has exploded recently, and it can be overwhelming to sift through the noise.  This review covers some  tools I've found genuinely handy. There's also a really nice PDF report I've attached below, worth a read if you have the time.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="//jelloeater.me/blog/ai-tools/report"&gt;AI Tooling Review and Analysis&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Search Engines
&lt;/h2&gt;

&lt;h3&gt;
  
  
  perplexity.ai
&lt;/h3&gt;

&lt;p&gt;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's magic yo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Gemini
&lt;/h3&gt;

&lt;p&gt;Google'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're ok with that...). I'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.&lt;/p&gt;

&lt;h3&gt;
  
  
  phind.com
&lt;/h3&gt;

&lt;p&gt;Phind works as a great alternative and second source to engines like Gemini and Perplexity. I do wish I used it more, but it's usually worth a shot if the other two aren't cutting it.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Tools
&lt;/h2&gt;

&lt;p&gt;I've also dug through a fair bit a tooling as I often do. I've had, of all things, Gemini fill in the gaps below, as I've been pretty busy with work. &lt;strong&gt;Aichat&lt;/strong&gt; in particular, I'd say check out out. It'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.&lt;/p&gt;

&lt;h3&gt;
  
  
  LTM (Long-Term Memory) - Pieces
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Links &amp;amp; Stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/pieces-app/cli-agent" rel="noopener noreferrer"&gt;https://github.com/pieces-app/cli-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fpieces-app%2Fcli-agent%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fpieces-app%2Fcli-agent%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repo stars" width="120" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fpieces-app%2Fcli-agent%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fpieces-app%2Fcli-agent%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Downloads (all assets, all releases)" width="168" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fpieces-app%2Fcli-agent%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fpieces-app%2Fcli-agent%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub last commit" width="227" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fpieces-app%2Fcli-agent%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fpieces-app%2Fcli-agent%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub commit activity" width="240" height="28"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  AI Agent - Goose
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Links &amp;amp; Stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/block/goose" rel="noopener noreferrer"&gt;https://github.com/block/goose&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fblock%2Fgoose%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fblock%2Fgoose%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repo stars" width="129" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fblock%2Fgoose%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fblock%2Fgoose%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Downloads (all assets, all releases)" width="177" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fblock%2Fgoose%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fblock%2Fgoose%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub last commit" width="227" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fblock%2Fgoose%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fblock%2Fgoose%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub commit activity" width="257" height="28"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  AI Chat - aichat
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;aichat&lt;/code&gt; 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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Links &amp;amp; Stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/sigoden/aichat" rel="noopener noreferrer"&gt;https://github.com/sigoden/aichat&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fsigoden%2Faichat%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fsigoden%2Faichat%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repo stars" width="134" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fsigoden%2Faichat%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fsigoden%2Faichat%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Downloads (all assets, all releases)" width="168" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fsigoden%2Faichat%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fsigoden%2Faichat%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub last commit" width="244" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fsigoden%2Faichat%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fsigoden%2Faichat%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub commit activity" width="240" height="28"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  GUI - Jan
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Links &amp;amp; Stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/menloresearch/jan" rel="noopener noreferrer"&gt;https://github.com/menloresearch/jan&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmenloresearch%2Fjan%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fmenloresearch%2Fjan%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repo stars" width="129" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fmenloresearch%2Fjan%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fmenloresearch%2Fjan%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Downloads (all assets, all releases)" width="175" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fmenloresearch%2Fjan%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fmenloresearch%2Fjan%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub last commit" width="237" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fmenloresearch%2Fjan%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fmenloresearch%2Fjan%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub commit activity" width="257" height="28"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  IDE Plugin - ProxyAI
&lt;/h3&gt;

&lt;p&gt;ProxyAI integrates AI assistance directly into your IDE, providing code completion, generation, and refactoring suggestions.  This tight integration can significantly speed up development workflows.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Links &amp;amp; Stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/carlrobertoh/ProxyAI" rel="noopener noreferrer"&gt;https://github.com/carlrobertoh/ProxyAI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fcarlrobertoh%2FProxyAI%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fcarlrobertoh%2FProxyAI%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repo stars" width="134" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fcarlrobertoh%2FProxyAI%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2Fcarlrobertoh%2FProxyAI%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Downloads (all assets, all releases)" width="168" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fcarlrobertoh%2FProxyAI%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2Fcarlrobertoh%2FProxyAI%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub last commit" width="247" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fcarlrobertoh%2FProxyAI%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2Fcarlrobertoh%2FProxyAI%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub commit activity" width="248" height="28"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Model - Qwen2.5-Coder
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Links &amp;amp; Stats&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/QwenLM/Qwen2.5-Coder" rel="noopener noreferrer"&gt;https://github.com/QwenLM/Qwen2.5-Coder&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2FQwenLM%2FQwen2.5-Coder%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2FQwenLM%2FQwen2.5-Coder%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repo stars" width="129" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2FQwenLM%2FQwen2.5-Coder%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fdownloads%2FQwenLM%2FQwen2.5-Coder%2Ftotal%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Downloads (all assets, all releases)" width="284" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2FQwenLM%2FQwen2.5-Coder%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Flast-commit%2FQwenLM%2FQwen2.5-Coder%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub last commit" width="181" height="28"&gt;&lt;/a&gt; &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2FQwenLM%2FQwen2.5-Coder%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fcommit-activity%2Fm%2FQwenLM%2FQwen2.5-Coder%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub commit activity" width="240" height="28"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Honorable Mentions (Local Based)
&lt;/h2&gt;

&lt;p&gt;Running AI tools locally offers benefits in terms of privacy, security, and customization.  These options are worth exploring:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;App&lt;/th&gt;
&lt;th&gt;Link&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IDE (JetBrains + VSCode)&lt;/td&gt;
&lt;td&gt;Tabby&lt;/td&gt;
&lt;td&gt;&lt;a href="https://www.tabbyml.com" rel="noopener noreferrer"&gt;https://www.tabbyml.com&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE (VSCode)&lt;/td&gt;
&lt;td&gt;Privy&lt;/td&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=Privy.privy-vscode" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=Privy.privy-vscode&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IDE (VSCode)&lt;/td&gt;
&lt;td&gt;Ollama Autocoder&lt;/td&gt;
&lt;td&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=10nates.ollama-autocoder" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=10nates.ollama-autocoder&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;Ollama&lt;/td&gt;
&lt;td&gt;&lt;a href="https://ollama.com/" rel="noopener noreferrer"&gt;https://ollama.com/&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server&lt;/td&gt;
&lt;td&gt;llama.cpp&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/ggerganov/llama.cpp" rel="noopener noreferrer"&gt;https://github.com/ggerganov/llama.cpp&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;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'm excited to see what the future holds for AI-powered tooling.&lt;/p&gt;

</description>
      <category>cli</category>
      <category>ai</category>
      <category>utils</category>
    </item>
    <item>
      <title>Joan Westenberg Blog</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Wed, 21 May 2025 07:12:58 +0000</pubDate>
      <link>https://dev.to/jelloeater/joan-westenberg-blog-54jk</link>
      <guid>https://dev.to/jelloeater/joan-westenberg-blog-54jk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzko1zckavod1nkqaaup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuzko1zckavod1nkqaaup.png" alt="Featured Image" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ve been following &lt;a href="https://www.joanwestenberg.com/about/" rel="noopener noreferrer"&gt;Joan Westenberg&lt;/a&gt; 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.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;a href="https://www.joanwestenberg.com/the-death-of-critical-thinking-will-kill-us-long-before-ai/" rel="noopener noreferrer"&gt;The Death of Critical Thinking Will Kill Us Long Before AI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.joanwestenberg.com/i-miss-the-internet/" rel="noopener noreferrer"&gt;I Miss the Internet&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.joanwestenberg.com/fuck-the-cult-of-productivity/" rel="noopener noreferrer"&gt;Fuck the Cult of Productivity&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://www.joanwestenberg.com/the-art-of-not-sharing/" rel="noopener noreferrer"&gt;The Art of Not Sharing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.gravatar.com/avatar/38b1e3a9923c356e248e749ace56d4fd?s=800" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1ke8ap30k701pau5or8.png" alt="Avatar" width="250" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reply: &lt;a href="https://mastodon.social/@jelloeater" rel="noopener noreferrer"&gt;🐘 Mastodon&lt;/a&gt; | &lt;a href="https://bsky.app/profile/jelloeater.bsky.social" rel="noopener noreferrer"&gt;🦋 Bluesky&lt;/a&gt; | &lt;a href="//mailto:jello+rss@jelloeater.me?subject=RE:posts-by-westenberg"&gt;📧 Email&lt;/a&gt; | &lt;a href="https://jelloeater.me/post/posts-by-westenberg/#comments" rel="noopener noreferrer"&gt;💬 Comment&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://ko-fi.com/jelloeater" rel="noopener noreferrer"&gt;☕ Buy me a coffee&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Tags: &lt;a href="https://jelloeater.me/tags/small-web/" rel="noopener noreferrer"&gt;#small-web&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Publishing CLI Apps (with Apt &amp; YUM)</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Wed, 02 Oct 2024 17:35:04 +0000</pubDate>
      <link>https://dev.to/jelloeater/publishing-cli-apps-with-apt-yum-568c</link>
      <guid>https://dev.to/jelloeater/publishing-cli-apps-with-apt-yum-568c</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr866t0uw3c5ie6l63fq1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr866t0uw3c5ie6l63fq1.png" alt=" " width="800" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;I’ve gotten to become quite the fan of CLI apps as of late. Maybe it’s the allure of the terminal of my childhood (starting with DOS on a 486/33 and my dad’s old &lt;a href="https://en.wikipedia.org/wiki/Apple_IIe" rel="noopener noreferrer"&gt;Apple IIe&lt;/a&gt;). I was born a little too late for the Gen X &lt;a href="https://en.wikipedia.org/wiki/Commodore_64" rel="noopener noreferrer"&gt;Commodore64&lt;/a&gt; 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 &lt;a href="https://en.wikipedia.org/wiki/Bulletin_board_system" rel="noopener noreferrer"&gt;what a BBS is&lt;/a&gt;. “Grandpa computers” they’ll probably say 🤣. &lt;em&gt;“GET OFF MY LAWN” ✊✊&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Projects like &lt;a href="https://www.omgubuntu.co.uk/2016/11/make-cool-retro-terminal-ubuntu" rel="noopener noreferrer"&gt;CoolRetroTerm&lt;/a&gt; definitely have a warm place in my heart, for brining back the CLI love. I still prefer to do some of my blogging in &lt;a href="https://micro-editor.github.io/" rel="noopener noreferrer"&gt;Micro&lt;/a&gt; on my old Netbook, really let’s you concentrate on just writing. VSCode &lt;a href="https://code.visualstudio.com/docs/getstarted/userinterface#_zen-mode" rel="noopener noreferrer"&gt;ZenMode&lt;/a&gt; and &lt;a href="https://www.marktext.cc/" rel="noopener noreferrer"&gt;MarkText&lt;/a&gt; come close I guess?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
Build_App --&amp;gt; GH_Actions --&amp;gt; ??? --&amp;gt; Profit!!!

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Packaging
&lt;/h2&gt;

&lt;p&gt;Anyway, I digress…&lt;/p&gt;

&lt;p&gt;So after writing my little CLI app &lt;a href="https://dev.to/blog/stampy"&gt;Stampy&lt;/a&gt; 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 &lt;a href="https://dev.to/blog/poetry-in-motion"&gt;wrath of Python Packaging&lt;/a&gt;. 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.&lt;/p&gt;

&lt;p&gt;Normally to get your app built you would just do a simple &lt;code&gt;go build .&lt;/code&gt; and boom, instant binary. As great as this is for local dev, it doesn’t do much good for cross platform compiles. There are some nice guides to &lt;a href="https://opensource.com/article/21/1/go-cross-compiling" rel="noopener noreferrer"&gt;show you how to do it&lt;/a&gt;, but… tl;dr for my 🐟🧠. So I did some more digging, there had to be a nice tool… and sure as heck, there is &lt;a href="https://goreleaser.com/" rel="noopener noreferrer"&gt;GoReleaser&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;After reading through some very well written documentation, I was able to do a quick local cross platform build, easy-peasy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;goreleaser --snapshot --clean

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Getting builds to happen with GitHub releases was easy as well, as they have nice pre-written &lt;a href="https://goreleaser.com/ci/actions/" rel="noopener noreferrer"&gt;GH Actions&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Users can now just install my app with tools like &lt;a href="https://github.com/zyedidia/eget" rel="noopener noreferrer"&gt;eget (good)&lt;/a&gt; and &lt;a href="https://github.com/marwanhawari/stew" rel="noopener noreferrer"&gt;stew (way better)&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;While you can also &lt;code&gt;go install github.com/xxx&lt;/code&gt; 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 &lt;strong&gt;who already have Go installed&lt;/strong&gt;. Not really a option for the average user IMHO. 😅&lt;/p&gt;

&lt;p&gt;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 &lt;code&gt;apt-get install stampy&lt;/code&gt;. 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 &lt;a href="https://packagecloud.io/" rel="noopener noreferrer"&gt;Packagecloud&lt;/a&gt; to handle the signing and repo hosting for the low low cost of $0 per month😉.&lt;/p&gt;

&lt;p&gt;You can see a example of the whole workflow &lt;a href="https://github.com/Jelloeater/stampy/blob/main/.github/workflows/release.yml" rel="noopener noreferrer"&gt;HERE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’ll also include a stripped down version of it here in a code block, for anybody stumbling across the blog post itself.&lt;/p&gt;

&lt;p&gt;For a high level overview the GHA does the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writes out he GoReleaser config&lt;/li&gt;
&lt;li&gt;Runs the Releaser itself&lt;/li&gt;
&lt;li&gt;Uploads the .debs for the next job&lt;/li&gt;
&lt;li&gt;In chained job, we pull the .deb and upload it to PackageCloud&lt;/li&gt;
&lt;li&gt;Done!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  GitHub Actions Example
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Release

on:
  pull_request:
  push:
    # run only against tags
    tags:
      - "*"

permissions:
  contents: write
  packages: write
  issues: write

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: stable

      - name: Release config
        run: |
          cat &amp;lt;&amp;lt; EOF &amp;gt; /tmp/goreleaser-github.yaml
          project_name: EXAMPLE
          version: 2
          builds:
            - env: [CGO_ENABLED=0]
              goos:
                - linux
              goarch:
                - amd64
          nfpms:
            -
              maintainer: YOU &amp;lt;your@email.com&amp;gt;
              bindir: /usr/local/bin
              description: Copy formatted timestamp to system clipboard
              homepage: https://github.com/USERNAME/REPO
              license: MIT
              formats:
                - deb

          release:
            draft: false # If set to true, will not auto-publish the release.
            replace_existing_draft: true
            replace_existing_artifacts: true
            target_commitish: "{{ .Commit }}"
            prerelease: auto
            make_latest: true
            mode: replace
            include_meta: true
          EOF          

      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v6
        with:
          distribution: goreleaser
          # 'latest', 'nightly', or a semver
          version: "~&amp;gt; v2"
          args: release --clean --verbose --config /tmp/goreleaser-github.yaml
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Upload .deb artifact x86
        uses: actions/upload-artifact@v3
        with:
          name: deb-package
          path: dist/*amd64.deb

  pkgcld_amd64-deb:
    runs-on: ubuntu-latest
    needs:
      - goreleaser
    strategy:
      max-parallel: 3
      matrix:
        distro:
        - debian/bookworm
        - ubuntu/noble
        - ubuntu/jammy
    steps:
      - name: Download .deb artifact
        uses: actions/download-artifact@v3
        with:
          name: deb-package

      - name: Push package to packagecloud.io
        uses: computology/packagecloud-github-action@v0.6
        with:
          package-name: ./*.deb
          packagecloud-username: USERNAME
          packagecloud-reponame: APP_NAME
          packagecloud-distro: ${{ matrix.distro }}
          packagecloud-token: ${{ secrets.PACKAGECLOUD_TOKEN }}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;blockquote&gt;
&lt;p&gt;ℹ️ Important&lt;/p&gt;

&lt;p&gt;You’ll want to make sure things like program structure and your &lt;code&gt;go.mod&lt;/code&gt; file &lt;a href="https://go.dev/doc/modules/layout" rel="noopener noreferrer"&gt;are properly setup&lt;/a&gt;, or you’re going to run into issues with publishing your app properly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Side note: You can also &lt;a href="https://goreleaser.com/customization/homebrew" rel="noopener noreferrer"&gt;distribute your app with Homebrew&lt;/a&gt;, but I didn’t bother due to the extra GH Actions complexity involving PAT secrets and the fact that I’m pretty well covered with &lt;em&gt;Apt&lt;/em&gt;, &lt;em&gt;Yum&lt;/em&gt;, and &lt;em&gt;Stew&lt;/em&gt;… tasty! 🥘&lt;/p&gt;

&lt;p&gt;This leads me to the big second thing when releasing a app. &lt;strong&gt;👏DOCUMENTATION👏&lt;/strong&gt; and the much neglected &lt;code&gt;Readme.md&lt;/code&gt;😭!&lt;/p&gt;

&lt;h2&gt;
  
  
  Readme Formatting
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;I highly recommend you follow this format for crafting your own readme! I’m a big fan of badges for flair, but I feel like having a little &lt;strong&gt;GIF&lt;/strong&gt; demo really shows folks what it’s about, just like listing &lt;strong&gt;screenshots&lt;/strong&gt; of your GUI apps. Using ASCIINEMA was easy enough, and they have a nice &lt;strong&gt;GIF&lt;/strong&gt; converter as well to get everything looking just right.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 Tip&lt;/p&gt;

&lt;p&gt;As a side note &lt;a href="https://github.com/carlrobertoh/CodeGPT" rel="noopener noreferrer"&gt;I did have CodeGPT write me some GoLang unit tests&lt;/a&gt;, which I know are normally painful to write. It’s a fantastic plugin if you’re on the JetBrains suite.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Readme Example
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.github.com/en/actions/use-cases-and-examples/building-and-testing/building-and-testing-go" rel="noopener noreferrer"&gt;Test badges&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://asciinema.org/" rel="noopener noreferrer"&gt;GIF Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vladopajic/go-test-coverage" rel="noopener noreferrer"&gt;Coverage badges&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://goreportcard.com" rel="noopener noreferrer"&gt;Go Report card&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Install

&lt;ul&gt;
&lt;li&gt;Package manager (ex apt)&lt;/li&gt;
&lt;li&gt;Binary install (ex eget)&lt;/li&gt;
&lt;li&gt;Go Install snip&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Usage

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://idea-instructions.com/quick-sort.png" rel="noopener noreferrer"&gt;CLEAR INSTRUCTIONS and example code snips&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Settings

&lt;ul&gt;
&lt;li&gt;Where settings get saved&lt;/li&gt;
&lt;li&gt;Do you use INI files, JSON, Env Vars?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;How to access built-in help&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;How to build the app from source&lt;/strong&gt;&lt;/li&gt;

&lt;li&gt;Prior art (aka previous work/inspiration)&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap up
&lt;/h2&gt;

&lt;p&gt;Similar to when I set out to learn how to publish Python apps, I’m glad to be able to say I feel like I can properly distribute any app I write in GoLang going forward. It’s a neat skill that I picked up, and with this blog post, I hope it can help others do the same! Cheers!&lt;/p&gt;

&lt;p&gt;-Jelloeater&lt;/p&gt;




&lt;p&gt;&lt;a href="https://mastodon.social/@jelloeater" rel="noopener noreferrer"&gt;🐘 Mastodon&lt;/a&gt; | &lt;a href="//mailto:jello@jelloeater.me?subject=RE:publishing-cli-apps"&gt;📧 Email&lt;/a&gt; | &lt;a href="https://jelloeater.me/blog/publishing-cli-apps/#comments" rel="noopener noreferrer"&gt;💬 Comments&lt;/a&gt; | &lt;a href="https://ko-fi.com/jelloeater" rel="noopener noreferrer"&gt;☕ Buy me a coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>apt</category>
      <category>publishing</category>
    </item>
    <item>
      <title>Stampy</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Mon, 09 Sep 2024 02:17:36 +0000</pubDate>
      <link>https://dev.to/jelloeater/stampy-1nnp</link>
      <guid>https://dev.to/jelloeater/stampy-1nnp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbquf6jvksdea3syy4izv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbquf6jvksdea3syy4izv.png" alt="Featured Image" width="700" height="700"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over the last couple of weeks I’ve been needing to do something very simple, in theory, type out a timestamp.&lt;/p&gt;

&lt;p&gt;Yeah, I could just use one of the 1000’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 &lt;a href="https://github.com/Jelloeater/UptimeParserGo" rel="noopener noreferrer"&gt;custom SNMP parser&lt;/a&gt; for the monitoring app &lt;a href="https://www.paessler.com/prtg" rel="noopener noreferrer"&gt;PRTG&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The issue I originally ran into was that the Python single threaded app didn’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🤣.&lt;/p&gt;

&lt;p&gt;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’t have the time or the patience to tackle something with that STEEP of a learning curve in my free time. IMHO GoLang is “fast enough” 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.&lt;/p&gt;

&lt;p&gt;Anyway, &lt;a href="https://github.com/Jelloeater/stampy" rel="noopener noreferrer"&gt;I hope you like Stampy 💝&lt;/a&gt;, drop me a comment or a email if you like it?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/Jelloeater/stampy/stargazers" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fimg.shields.io%2Fgithub%2Fstars%2Fjelloeater%2Fstampy%3Fstyle%3Dfor-the-badge%26logo%3Dgithub" alt="GitHub Repo stars" width="112" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdh8x8xtpngrtpmqwxva3.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdh8x8xtpngrtpmqwxva3.gif" width="741" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks!&lt;/p&gt;




&lt;p&gt;Contact Info:&lt;br&gt;&lt;br&gt;
&lt;a href="https://mastodon.social/@jelloeater" rel="noopener noreferrer"&gt;🐘 Mastodon&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="//mailto:jello@jelloeater.me"&gt;📧 Email&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://jelloeater.me/feed.xml" rel="noopener noreferrer"&gt;📰 Site RSS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
    </item>
    <item>
      <title>ADHD, Productivity and Time Management</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Tue, 16 Apr 2024 06:10:03 +0000</pubDate>
      <link>https://dev.to/jelloeater/adhd-productivity-and-time-management-43o6</link>
      <guid>https://dev.to/jelloeater/adhd-productivity-and-time-management-43o6</guid>
      <description>&lt;p&gt;&lt;em&gt;(Image credit to bphope.com)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;So it's no secret among my friends and family that I'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've &lt;a href="https://jesses.dev/tools-dont-matter" rel="noopener noreferrer"&gt;covered some great tooling before&lt;/a&gt;, this time, I'd like to review a few neat things I've found that more normal users can benefit from.&lt;/p&gt;

&lt;p&gt;I make no effort to hide the fact that I have a really bad case of ADHD. No, not the "I cannot concentrate when I have a TV on in the background bad", more like, I've sat staring at my monitor for 45 minutes and cannot make my brain engage in something I know I &lt;strong&gt;NEED&lt;/strong&gt; 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.&lt;/p&gt;

&lt;p&gt;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 L-Theanine gummies every morning do help. Also be sure to drink water, &lt;strong&gt;like a lot of it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Staying Focused
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://focusmeter.app/" rel="noopener noreferrer"&gt;Focusmeter&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=co.zeitic.focusmeter" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=co.zeitic.focusmeter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FOfW0vfTGFaKIe9f1CZ7REsSEigMK2B7xIH6etF11IbiuCwwC4NVgySErWJ7iDg4R8aM" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FOfW0vfTGFaKIe9f1CZ7REsSEigMK2B7xIH6etF11IbiuCwwC4NVgySErWJ7iDg4R8aM" width="279" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Block
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.wverlaek.block" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.wverlaek.block&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FyrmXbi7NFsMkOT1DQeb6mNqi-fcwOIkzfZgF5_qRA8YRPJB5z1icBRVChxxzKFGpsYSI" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FyrmXbi7NFsMkOT1DQeb6mNqi-fcwOIkzfZgF5_qRA8YRPJB5z1icBRVChxxzKFGpsYSI" width="256" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While having a *&lt;em&gt;Pomodoro&lt;/em&gt; timer on my phone lets me know how much time I have left, it does not, however, keep me from &lt;a href="https://en.wikipedia.org/wiki/Doomscrolling" rel="noopener noreferrer"&gt;doom-scrolling&lt;/a&gt; between breaks. This is where Block comes in. While there are dozens of app blockers, all the ones I've tried had tons of features tacked on, bloated GUIs and junk I just didn't need. This app does what it says on the tin, and does it WELL.&lt;/p&gt;

&lt;p&gt;If you're looking for a more physical approach, &lt;a href="https://www.amazon.com/dp/B0CRB4BTRQ" rel="noopener noreferrer"&gt;I've also gotten this timer as well&lt;/a&gt; for a few folks, and it works quite well.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.appgenix-software.com/" rel="noopener noreferrer"&gt;Business Calendar 2&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.appgenix.bizcal" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.appgenix.bizcal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2F9v6_bQCaSO0-UUGEhp-eTkKlUZDeYAQgv5rR9tM_FogEcF3f0XnlTvDCCJ3rz_5jO5k" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2F9v6_bQCaSO0-UUGEhp-eTkKlUZDeYAQgv5rR9tM_FogEcF3f0XnlTvDCCJ3rz_5jO5k" width="512" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been using this calendar app for YEARS, back when I first switched to Android from a BlackBerry Curve 😉&lt;/p&gt;

&lt;p&gt;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 ...&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://sectograph.com/" rel="noopener noreferrer"&gt;Sectograph Day &amp;amp; Time planner&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=prox.lab.calclock" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=prox.lab.calclock&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FPIQOdExIHKKMRIgv2tS3ADD9Nhc77ToawtKbquQnwIm_FP_O5_ZN6IwZXF2U5Da5Jyw" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FPIQOdExIHKKMRIgv2tS3ADD9Nhc77ToawtKbquQnwIm_FP_O5_ZN6IwZXF2U5Da5Jyw" width="512" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is my default watch face for my smartwatch. I've been using it for years, as I'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.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://maygo.github.io/tockler/" rel="noopener noreferrer"&gt;Tockler&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94jx3kh9q6rjyfvq4g2l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F94jx3kh9q6rjyfvq4g2l.png" width="800" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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'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 &lt;a href="https://activitywatch.net/" rel="noopener noreferrer"&gt;Activity Watch which I initially discovered&lt;/a&gt;. Nothing wrong with this app, and I'd encourage you to try both and see which one works best for you. &lt;a href="https://github.com/nomeata/arbtt" rel="noopener noreferrer"&gt;Arbtt&lt;/a&gt; seems nice if you're really into CLI apps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Offloading
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://calendly.com/" rel="noopener noreferrer"&gt;Calendly&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.calendly.app" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.calendly.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhelp.calendly.com%2Fhc%2Farticle_attachments%2F4403029413655" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fhelp.calendly.com%2Fhc%2Farticle_attachments%2F4403029413655" width="2528" height="1162"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No more "So what time works for you?", 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.&lt;/p&gt;

&lt;p&gt;It also has a great "meeting poll" feature to figure out when your group/team is ALL free.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.inoreader.com/" rel="noopener noreferrer"&gt;Inoreader&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.innologica.inoreader" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.innologica.inoreader&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FTfcyw9cNgHFiY8uzF9_AVBSwoyssMQ58YOg3VKE6ECUeEnL7zd9P0y_PGfN-iCD3Zw" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fplay-lh.googleusercontent.com%2FTfcyw9cNgHFiY8uzF9_AVBSwoyssMQ58YOg3VKE6ECUeEnL7zd9P0y_PGfN-iCD3Zw" width="512" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm sure many of you were bummed when &lt;a href="https://news.ycombinator.com/item?id=26581434" rel="noopener noreferrer"&gt;Google Reader finally&lt;/a&gt; shut down. I had used them for years to follow &lt;a href="https://techcrunch.com/2018/04/07/rss-is-undead/" rel="noopener noreferrer"&gt;RSS feeds&lt;/a&gt;. Incase you aren'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'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 &lt;a href="https://github.com/noinnion/greader" rel="noopener noreferrer"&gt;gReader, which rocks&lt;/a&gt; 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.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://instapaper.com" rel="noopener noreferrer"&gt;Instapaper&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs2tdsssboo4asbc726b.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbs2tdsssboo4asbc726b.jpeg" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.instapaper.android" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.instapaper.android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another big issue I'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 'read it later' 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 &lt;a href="https://www.mozilla.org/en-US/firefox/pocket/" rel="noopener noreferrer"&gt;Pocket&lt;/a&gt; as well. I did give it a short try, but I've found Instapaper much easier to use and consume. It's JUST for reading and comprehending articles, nothing more, nothing less.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://keepassxc.org/" rel="noopener noreferrer"&gt;KeepassXC&lt;/a&gt; &amp;amp; &lt;a href="https://www.keepassdx.com/" rel="noopener noreferrer"&gt;KeepassDX&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femotr1xekqzcec0shigp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Femotr1xekqzcec0shigp.png" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.kunzisoft.keepass.free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm sure most folks in tech circles use a password manager. 1Password has been a household name for years. I'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!&lt;/p&gt;

&lt;p&gt;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, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/keepassxc-browser/" rel="noopener noreferrer"&gt;with an additional plugin&lt;/a&gt;. If the idea of having all that info in one place makes you nervous, then you can always add a 'passfile' (a unique file to unlock the DB) AND Yubikey to your database, requiring 3 3-factor authentication. I've confirmed that this works just fine on mobile as well via NFC on KeepassDX. To keep everything in sync, just use &lt;a href="https://syncthing.net/" rel="noopener noreferrer"&gt;SyncThing&lt;/a&gt; or your local file sync service of choice.&lt;/p&gt;

&lt;p&gt;If the idea of having to 'self-host' your own password manager file sync or using a few different apps to access a common database is too much, then I would recommend &lt;a href="https://bitwarden.com" rel="noopener noreferrer"&gt;Bitwarden&lt;/a&gt;. I use it with friends and family and it works flawlessly and supports many of the common features of KeePass.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://obsidian.md" rel="noopener noreferrer"&gt;Obsidian MD&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://play.google.com/store/apps/details?id=md.obsidian" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=md.obsidian&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4lfvhgdp0a3020fybqs4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4lfvhgdp0a3020fybqs4.png" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Last, but not least, is Obsidian. This app is like a &lt;a href="https://www.jetbrains.com/pycharm/" rel="noopener noreferrer"&gt;programming IDE&lt;/a&gt; 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 &lt;a href="https://daringfireball.net/projects/markdown/syntax" rel="noopener noreferrer"&gt;Markdown formatted notes&lt;/a&gt; and gives you a beautiful interface to interact, search, create and edit them.&lt;/p&gt;

&lt;p&gt;At work, I use the &lt;a href="https://github.com/mgmeyers/obsidian-kanban" rel="noopener noreferrer"&gt;Kanban plugin&lt;/a&gt; to track all my personal TO DO items, while the &lt;a href="https://github.com/scambier/obsidian-omnisearch" rel="noopener noreferrer"&gt;Omni-search plugin&lt;/a&gt; lets me do Google-like lookups across all my notes and save pictures as well.&lt;/p&gt;

&lt;p&gt;If you're just looking to write MD-formatted notes, &lt;a href="https://www.marktext.cc/" rel="noopener noreferrer"&gt;MarkText&lt;/a&gt; works wonders as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;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. 💗&lt;/p&gt;

&lt;p&gt;&lt;a href="https://meinmymirror.wordpress.com/2018/06/27/boggle-the-owl/" rel="noopener noreferrer"&gt;Take time out of your day to be kind to you, because someone has to.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz0k9zgmc1lbtj9plg76.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foz0k9zgmc1lbtj9plg76.jpg" width="486" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>beginners</category>
      <category>adhd</category>
    </item>
    <item>
      <title>Your tools don't matter</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Sat, 30 Sep 2023 21:00:07 +0000</pubDate>
      <link>https://dev.to/jelloeater/your-tools-dont-matter-e9a</link>
      <guid>https://dev.to/jelloeater/your-tools-dont-matter-e9a</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;a href="https://forum.contextualelectronics.com/t/bench-check-please-share-your-setup/734/44" rel="noopener noreferrer"&gt;Cover photo - contextualelectronics.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;tl;dr What DOES work&lt;/p&gt;

&lt;h2&gt;
  
  
  The 3 F's
&lt;/h2&gt;

&lt;p&gt;When I think of tooling, I think of my dad'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 "put me to work" 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, &lt;em&gt;form, fit and function&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0g48rijk0eqau7dosd6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw0g48rijk0eqau7dosd6.png" alt="Form fit and function" width="444" height="284"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;... he would say. This was in stark contrast to an uncle I had, who would always go out and buy the absolute "best" 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's the thing, should work be "fun"? Does having that shiny new toy, make the process more enjoyable, or are you just showing off to the next person? It's ok to want nice things, but how much, is too much?&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything but
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwon2oko8f2kc715qsc7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwon2oko8f2kc715qsc7o.png" alt="Everything but" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The friends and family with &lt;a href="https://www.reddit.com/r/engineering/comments/2kby5e/dilbert_the_knack_the_curse_of_the_engineer/" rel="noopener noreferrer"&gt;"the knack"&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;As developers, we sit on the shoulders of &lt;strong&gt;GIANTS&lt;/strong&gt;. As a result of this, it's easy to get bogged down in the latest JS framework, or Python library. When all you have to do is &lt;code&gt;pip install antigravity&lt;/code&gt; or &lt;code&gt;npm&lt;/code&gt;, it'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 &lt;strong&gt;HELP&lt;/strong&gt; you? It's easier to not think TOO hard about it and sink into the mindset of "Just another library, it's less code &lt;strong&gt;I&lt;/strong&gt; have to write..." or "This plugin seems &lt;em&gt;helpful&lt;/em&gt;* for X".&lt;/p&gt;

&lt;p&gt;Projects like &lt;a href="https://www.cookiecutter.io/" rel="noopener noreferrer"&gt;CookieCutter&lt;/a&gt; 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've seen on GitHub dump heaps of neat toys, on otherwise simple codebases. Do I need (...checks notes...) twen... TWENTY-FOUR (I'm looking at you &lt;a href="https://github.com/cjolowicz/cookiecutter-hypermodern-python/blob/main/%7B%7Bcookiecutter.project_name%7D%7D/pyproject.toml#L27" rel="noopener noreferrer"&gt;hypermodern-python&lt;/a&gt;) .. 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;amp; Flake8) or security (Bandit, Tartufo &amp;amp; Whispers). (Shh, it's 14 🙃)&lt;/p&gt;

&lt;p&gt;I've lost count of how many plugins I have installed in VSCode, I'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'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.&lt;/p&gt;

&lt;p&gt;There is no kill, like overkill, but sometimes, we lose sight of the problem we are trying to solve...&lt;/p&gt;

&lt;h2&gt;
  
  
  Too many options
&lt;/h2&gt;

&lt;p&gt;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 "I just want it done now" erode creativity. Tight deadlines, and angry clients for sure, make haste. Phrases like "it needed to get done yesterday", can lower quality. There's a phrase that comes to your mind.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fgztfovnq4utogd0hp0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fgztfovnq4utogd0hp0.png" alt="Fast Good Cheap" width="500" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Jim Jarmusch once told me Fast, Cheap, and Goodpick two. If its fast and cheap it wont be good. If its cheap and good it wont be fast. If its fast and good it wont be cheap. Fast, cheap, and goodpick (2) words to live by."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;-Tom Waits Spills the Beans to Tom Waits, Sound Effects Blog, Boston Globe, May 22, 2008.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When we don't give ourselves room to dabble, we can turn around three times and still be using COBOL... because it works (sorry if I'm being reductive). There is value sometimes to building a better mouse trap, but I've also seen folks fall prey to the &lt;a href="https://dictionary.cambridge.org/us/dictionary/english/not-invented-here-syndrome" rel="noopener noreferrer"&gt;"not invented here"&lt;/a&gt; syndrome. This battle of buy vs. build impacts us all. OpEx vs. CapEx, now vs. later, what's the "best" answer?&lt;/p&gt;

&lt;p&gt;We like what we like, and we like to do things the way we've always done them before because it works.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjet2fk4i4urkyrp26qe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxjet2fk4i4urkyrp26qe.png" alt="Comic" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  "So what do you do?"
&lt;/h2&gt;

&lt;p&gt;I've been asked at many a family gathering, "What do you do?". I usually quip back, "I'm a software developer" or "I work with the cloud", two easy-to-digest answers. The honest answer, convert coffee into code... which gets converted into money by folks savvy in the ways of business. We're in the business of solving problems, usually business problems, sometimes people problems, but always human problems.&lt;/p&gt;

&lt;p&gt;(Side note: I did go to school for business... but I also was going to be a social worker as well. What you're good at, and what you went to school for, are sometimes, very different things -😉)&lt;/p&gt;

&lt;h2&gt;
  
  
  Common ground &amp;amp; finding balance
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"The most dangerous phrase in the language is we've always done it this way'."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Admiral Grace Hopper&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;While I'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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://octoverse.github.com/2022/top-programming-languages" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcxgncg2fi6foc3yr88q6.jpg" alt="Top Languages" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've compiled a short list from talking amongst friends over the last few years. The whole point of this list is to &lt;em&gt;be short&lt;/em&gt;, &lt;strong&gt;NOT&lt;/strong&gt; exhaustive, and list flexible practices. That would defeat the core theme of this blog post if they weren't! All of these tools work on OSX and Linux, and SHOULD also work on &lt;a href="https://ubuntu.com/wsl" rel="noopener noreferrer"&gt;WSL&lt;/a&gt; if you are working on a Windows dev box. Please keep in mind, that all of these items are current as of 2023, and &lt;em&gt;should&lt;/em&gt; be around for a fairly long time, nothing bleeding edge. If you don'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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xkcd.com/927/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffx9ecyv6i1394advqiev.png" alt="competing standards" width="500" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools and patterns that work (IMHO) (Platform Agnostic)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://git-scm.com/" rel="noopener noreferrer"&gt;Git&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.docker.com/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://devopedia.org/semantic-versioning" rel="noopener noreferrer"&gt;Semantic Versioning&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://mermaid.js.org/" rel="noopener noreferrer"&gt;Mermaid&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://editorconfig.org/" rel="noopener noreferrer"&gt;EditorConfig&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/godaddy/tartufo/" rel="noopener noreferrer"&gt;Tartufo&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools and patterns that MIGHT work (Platform Agnostic)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="//https:www.github.com/actions"&gt;GitHub Actions&lt;/a&gt;

&lt;ul&gt;
&lt;li&gt;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's. These YAML files go in your &lt;code&gt;.github/workflows/&lt;/code&gt; folder, inside your Git repo.
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: "Generate TODO to Issue"
on: ["push"]
jobs:
    build:
        runs-on: "ubuntu-latest"
        steps:
            - uses: "actions/checkout@v3"
            - name: "TODO to Issue"
              uses: "alstr/todo-to-issue-action@v4"
              with:
                  AUTO_ASSIGN: true


name: Release

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

on:
  push:
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+"

jobs:
    release-gen:
        runs-on: ubuntu-latest
        permissions:
          contents: write
        steps:
        - uses: actions/checkout@v3
        - uses: ncipollo/release-action@v1
          with:
            allowUpdates: true
            generateReleaseNotes: true

    build-and-push-image:
      runs-on: ubuntu-latest
      permissions:
        contents: read
        packages: write
      steps:
        - name: Checkout
          uses: actions/checkout@v3
        - name: Docker meta
          id: meta
          uses: docker/metadata-action@v4
          with:
            images: ghcr.io/${{ env.IMAGE_NAME }}
        - name: Set up QEMU
          uses: docker/setup-qemu-action@v2
        - name: Set up Docker Buildx
          uses: docker/setup-buildx-action@v2
        - name: Log in to the Container registry
          uses: docker/login-action@v2
          with:
            registry: ghcr.io
            username: ${{ github.actor }}
            password: ${{ github.token }}
        - name: Build and push Docker image
          uses: docker/build-push-action@v4
          with:
            context: .
            platforms: linux/amd64 #,linux/arm64
            push: true
            tags: ${{ steps.meta.outputs.tags }}
            labels: ${{ steps.meta.outputs.labels }}
            cache-from: type=gha
            cache-to: type=gha,mode=max

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.conventionalcommits.org/en/v1.0.0/#summary" rel="noopener noreferrer"&gt;Conventional Commits&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tj/git-extras/blob/master/Commands.md#git-changelog" rel="noopener noreferrer"&gt;Change Log Generation&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://pre-commit.com/" rel="noopener noreferrer"&gt;Commit hooks&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://makefiletutorial.com/" rel="noopener noreferrer"&gt;Make&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://taskfile.dev/" rel="noopener noreferrer"&gt;Taskfile&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.pyinvoke.org/en/stable/getting-started.html" rel="noopener noreferrer"&gt;PyInvoke&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Plugins &amp;amp; Apps (Platform Specific)
&lt;/h2&gt;

&lt;p&gt;While I could &lt;a href="https://github.com/Jelloeater/awesome-osx-apps" rel="noopener noreferrer"&gt;list off dozens of neat little things I've found&lt;/a&gt; over the last year or so, I'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.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://plugins.jetbrains.com/plugin/7677-awesome-console" rel="noopener noreferrer"&gt;AwesomeConsole&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://marketplace.visualstudio.com/items?itemName=ahgood.shift-shift" rel="noopener noreferrer"&gt;ShiftShift&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.raycast.com/" rel="noopener noreferrer"&gt;RayCast&lt;/a&gt;, &lt;a href="http://www.wox.one/" rel="noopener noreferrer"&gt;Wox&lt;/a&gt; &amp;amp; &lt;a href="https://ulauncher.io/" rel="noopener noreferrer"&gt;ULauncer&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;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... err tools!&lt;/p&gt;

</description>
      <category>programming</category>
      <category>tutorial</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Poetry (Packaging) in motion</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Thu, 28 Sep 2023 02:25:57 +0000</pubDate>
      <link>https://dev.to/jelloeater/poetry-packaging-in-motion-185h</link>
      <guid>https://dev.to/jelloeater/poetry-packaging-in-motion-185h</guid>
      <description>&lt;h2&gt;
  
  
  Intro 👋
&lt;/h2&gt;

&lt;p&gt;As you might have guessed, I've decided to write this entry on Poetry (as in the package manager). I'll start right off by saying that I'm no expert by far. While I'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's there weren't as many options as there are now. If PyPi is accurate &lt;a href="https://pypi.org/project/pipenv/0.1.0/" rel="noopener noreferrer"&gt;Pipenv was only started back in 2017&lt;/a&gt; and &lt;a href="https://pypi.org/project/pipenv/2020.5.28/" rel="noopener noreferrer"&gt;didn't hit maturity&lt;/a&gt; &lt;a href="https://pypi.org/project/pipenv/2020.5.28/" rel="noopener noreferrer"&gt;until 2020&lt;/a&gt;. &lt;a href="https://pypi.org/project/poetry/1.1.0/" rel="noopener noreferrer"&gt;Poetry only hit version 1 at the end of 2020 as well&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now here'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 "it works on my machine" camp. I was happily tossing &lt;code&gt;requirements.txt&lt;/code&gt; files in via &lt;code&gt;pip freeze&lt;/code&gt; into my containers (yea, I know...). I did have a few issues with having to pin certain versions of &lt;a href="https://pypi.org/project/waitress/" rel="noopener noreferrer"&gt;Waitress&lt;/a&gt; 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.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;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's remote development, Docker on Windows (gross!), and running a Debian Desktop VM, but I didn'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.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Fast forward to late 2022, I was still sticking to using Docker and requirements files, if it ain't broke don't fix it. But then I stumbled upon a Github Actions file that I was reviewing for work... what was this &lt;em&gt;Pipenv&lt;/em&gt; thing. I started to dig... "Oh, it's like if VirturalEnv's were easy," 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!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Test
on:
  pull_request: {}
  push:
    branches: main
    tags: "*"
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup Python
        uses: actions/setup-python@v1
        with:
          python-version: 3.10
      - name: Install dependencies with pipenv
        run: |
          pip install pipenv
          pipenv install --deploy --dev
      - run: pipenv run isort --recursive --diff .
      - run: pipenv run black --check .
      - run: pipenv run flake8
      - run: pipenv run mypy
      - run: pipenv run pytest --cov --cov-fail-under=100

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  A Package with a purpose 💪
&lt;/h2&gt;

&lt;p&gt;For an excellent short read on the history of Python packages, &lt;a href="https://www.pypa.io/en/latest/history/" rel="noopener noreferrer"&gt;check out this link&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PipEnv
&lt;/h3&gt;

&lt;p&gt;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... that'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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4ntalm3jukl1mvdxi51.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft4ntalm3jukl1mvdxi51.jpg" alt="Alt text" width="800" height="530"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cute, right? Microscale and tiny scope, a perfect project to relax after work with. Nothing too crazy...&lt;/p&gt;

&lt;p&gt;PipEnv seemed to be filling and improving what I had been doing with a &lt;code&gt;requirements.txt&lt;/code&gt; back in the day. It was simple enough and easy to update and add to. Removing packages wasn't always the cleanest. You can run &lt;code&gt;pipenv clean&lt;/code&gt; and &lt;code&gt;pipenv update&lt;/code&gt; to get your virtualenv in line with your project manifest. I never ran into any problems on the smaller projects I'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, &lt;a href="https://github.com/pypa/flit" rel="noopener noreferrer"&gt;I came up with &lt;strong&gt;Flit&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flit
&lt;/h3&gt;

&lt;p&gt;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's a catch... Flit also doesnt help you manage dependencies: you have to add them to &lt;code&gt;pyproject.toml&lt;/code&gt; by hand. For small projects, this isn't too bad, but the manual steps are tedious for sure. Below is a nice simple example of a Flit project file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The TOML file will typically read as follows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[build-system]
requires = ["flit_core &amp;gt;=3.2,&amp;lt;4"]
build-backend = "flit_core.buildapi"

[project]
name = "APP_NAME_HERE"
authors = [{name = "YourNameHere", email = "username@gmail.com"}]
dependencies = [
    "flit_core &amp;gt;=3.8.0",
    "requests",
]
readme = "README.md"
license = {file = "LICENSE"}
classifiers = ["License :: OSI Approved :: MIT License"]
dynamic = ["version", "description"]

[project.urls]
Home = "https://github.com/username/APP_NAME_HERE

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple &lt;code&gt;flit build&lt;/code&gt; and &lt;code&gt;flit publish&lt;/code&gt; and you'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 "just work" 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've seen some do, but I discovered Poetry... and it was beautiful. And on that note, onto the main event (sorry Flit)...&lt;/p&gt;

&lt;h3&gt;
  
  
  Poetry
&lt;/h3&gt;

&lt;p&gt;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's gotten online. YMMV.&lt;/p&gt;

&lt;p&gt;Poetry (like &lt;code&gt;pipenv install --dev&lt;/code&gt;) supports a superset of required packages, used just for dev environments/testing, using &lt;code&gt;poetry install&lt;/code&gt; to install everything listed in your manifest, or to only install what is needed to run &lt;code&gt;poetry install --no-root --without dev&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;pyproject.toml&lt;/code&gt; 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 &lt;code&gt;pyproject.toml&lt;/code&gt; file, not via the version set in your module. This is because Poetry does dependency management, in addition to packaging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The TOML file will typically read as follows for Poetry:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[tool.poetry]
name = "APP_NAME_HERE"
version = "1.0.0"
description = "Fill in this"
authors = ["You &amp;lt;you@gmail.com&amp;gt;"]
license = "MIT License"
readme = "README.md"
homepage = "https://github.com/you/repo"
keywords = ["neat", "app"]
classifiers = ["Development Status :: 5 - Production/Stable",
 "Environment :: No Input/Output (Daemon)",
 "Operating System :: OS Independent",
]

[tool.poetry.dependencies]
python = "^3.10"

[tool.poetry.group.dev.dependencies]
setuptools = "*"
pytest = "*"
pytest-cov = "*"
python-dotenv = "*"
pytest-pycharm = "*"

[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The &lt;code&gt;PyProject.toml&lt;/code&gt; Advantage 🤓
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[tool.pytest.ini_options]
pythonpath = ["."]
testpaths = "test/"
log_cli = true
log_cli_level = "DEBUG"
log_cli_format = "[%(asctime)s] [%(levelname)8s] --- %(message)s (%(filename)s:%(funcName)s():%(lineno)s)"
log_cli_date_format = "%Y-%m-%d %H:%M:%S"

[tool.black]
line-length = 120
skip-string-normalization = true

[tool.flake8]
exclude =['./tests']
max-line-length = 120
count = false
statistics = true
diff = true
format = "pylint"

[tool.isort]
multi_line_output = 3
include_trailing_comma = "True"
force_grid_wrap = 0
use_parentheses = "True"
line_length = 120
profile = "black"

[tool.tartufo]
repo-path = "."
regex = true
entropy = true
exclude-path-patterns = [
 {path-pattern = 'poetry\.lock'},
 {path-pattern = 'pyproject\.toml'},
 # To not have to escape `\` in regexes, use single quoted
 # TOML 'literal strings'
 {path-pattern = 'docs/source/(.*)\.rst'},
]
exclude-entropy-patterns = [
    {path-pattern = '\.github/workflows/.*\.yml', pattern = 'uses: .*@[a-zA-Z0-9]{40}', reason = 'GitHub Actions'},
    {path-pattern = 'poetry\.lock', pattern = '.'},
    {path-pattern = 'Pipfile\.lock', pattern = '.'},
    {path-pattern = 'README\.md', pattern = '.'},
]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Versioning
&lt;/h2&gt;

&lt;p&gt;Another issue you may run into is keeping your project version in sync with your Git tags (which tend to be used for releases).&lt;/p&gt;

&lt;p&gt;There is an elegant solution to this, provided you are using Poetry for your build/publish workflow&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Update &lt;code&gt;pyproject.toml&lt;/code&gt; to have a generic version placeholder.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Update your release script to fetch the git version before building the package artifacts.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With this setup, poetry will fetch and use the latest git tag as its version. You can even integrate this as a GitHub Action.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Publish

on:
  release:
    types: [created]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: '3.x'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install poetry
    - name: Build and publish
      run: |
        poetry version $(git describe --tags --abbrev=0)
        poetry build
        poetry publish --username ${{ secrets.PYPI_USERNAME }} --password ${{ secrets.PYPI_PASSWORD }}

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Folder Structure 📁
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.ionelmc.ro/2014/05/25/python-packaging/" rel="noopener noreferrer"&gt;For a really good deeper read on folder structure check this article out.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Flat
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; README.md
 pyproject.toml
 app.py
 test_app.py

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'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't do this.&lt;/p&gt;

&lt;h3&gt;
  
  
  Module
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; README.md
 pyproject.toml
 app
    __init__.py
    app.py
 tests/
     test_app.py

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Src
&lt;/h3&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Testing builds 🗑🔥
&lt;/h3&gt;

&lt;p&gt;If you do any builds, please do them using Docker. If you don'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 &lt;code&gt;Dockerfile&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;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 &lt;code&gt;git checkout&lt;/code&gt;, it should keep you out of hot water, at least for smaller projects.&lt;/p&gt;

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM python:3.10-slim AS base

# Setup env
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONFAULTHANDLER=1
ENV PYTHONHASHSEED=random
ENV PYTHONUNBUFFERED=1

#FROM base AS python-deps
WORKDIR /app

# Set timezone
ENV TZ=America/New_York
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime &amp;amp;&amp;amp; echo $TZ &amp;gt; /etc/timezone

# Install python dependencies
RUN apt-get update &amp;amp;&amp;amp; apt-get install -y --no-install-recommends gcc git tree

# Setup Poetry
RUN pip install poetry
# Skip venvs for Docker
RUN poetry config virtualenvs.create false

# Install application into container
# Don't forget to check the .dockerignore
# Install ALL packages
RUN poetry init
RUN poetry add pytest
RUN poetry add python-dotenv
RUN poetry add git+https://github.com/username/repo.git

COPY tests tests
RUN tree
# Create and switch to a new user
RUN useradd --create-home appuser
USER appuser
# Run the executable
CMD ["pytest"]

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Badges (they're legit) 💯
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7r0q54tvomj1t7vbw1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc7r0q54tvomj1t7vbw1m.png" alt="Badges" width="455" height="112"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I would highly recommend adding (a few!) badges to any repository that you plan on publishing. You can get some great badges from &lt;a href="https://shields.io/" rel="noopener noreferrer"&gt;https://shields.io/&lt;/a&gt; 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 &lt;a href="https://en.wikipedia.org/wiki/The_Midnight_Gospel" rel="noopener noreferrer"&gt;technicolor dreamland&lt;/a&gt;. 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! 😄&lt;/p&gt;

&lt;p&gt;| Badge | Where to find |&lt;br&gt;
| Test CI/CD | &lt;a href="https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge" rel="noopener noreferrer"&gt;https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/adding-a-workflow-status-badge&lt;/a&gt; |&lt;br&gt;
| CodeQL | &lt;a href="https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning-with-codeql" rel="noopener noreferrer"&gt;https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/about-code-scanning-with-codeql&lt;/a&gt; |&lt;br&gt;
| Libraries.io | &lt;a href="https://libraries.io/" rel="noopener noreferrer"&gt;https://libraries.io/&lt;/a&gt; |&lt;br&gt;
| Package Health | &lt;a href="https://snyk.io/advisor" rel="noopener noreferrer"&gt;https://snyk.io/advisor&lt;/a&gt; |&lt;br&gt;
| PyPi Version &amp;amp; GH Licence | &lt;a href="https://img.shields.io" rel="noopener noreferrer"&gt;https://img.shields.io&lt;/a&gt; |&lt;/p&gt;

&lt;h2&gt;
  
  
  Pulling packages from Git directly 🌐
&lt;/h2&gt;

&lt;p&gt;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'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.&lt;/p&gt;

&lt;p&gt;| Package Manager | Manifest File | Code |&lt;br&gt;
| Pip | &lt;code&gt;requirements.txt&lt;/code&gt; | &lt;code&gt;packagename @ git+https://github.com/ACCOUNT_NAME/PROJECT_NAME.git@master&lt;/code&gt; |&lt;br&gt;
| PipEnv | &lt;code&gt;Pipfile&lt;/code&gt; | &lt;code&gt;packagename = {git = "https://github.com/ACCOUNT_NAME/PROJECT_NAME.git", editable = true, ref = "master"}&lt;/code&gt; |&lt;br&gt;
| Poetry | &lt;code&gt;PyProject.toml&lt;/code&gt; | &lt;code&gt;packagename = {git = "https://github.com/ACCOUNT_NAME/PROJECT_NAME.git"}&lt;/code&gt; |&lt;/p&gt;

&lt;h2&gt;
  
  
  Packaging Tool Comparison and related conclusions (TL;DR) 😅
&lt;/h2&gt;

&lt;p&gt;To summarize the above in a short little chart, if all you need to do is upgrade from &lt;code&gt;requirements.txt&lt;/code&gt;, give &lt;strong&gt;PipEnv&lt;/strong&gt; a try. It'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 &lt;strong&gt;if you want to pick "just one", go with Poetry.&lt;/strong&gt; It's easy to start with and grow into and there is a reason why it has &lt;em&gt;23,000 stars&lt;/em&gt; on GitHub. I would also say going with a src-less module-based structure is both easy to use and easy to publish.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;PipEnv is nice, but Poetry is nicer&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;| Tool | Package Management | Environment management | App Publishing |&lt;br&gt;
| Pip | Yes | No | No |&lt;br&gt;
| PipEnv | Yes | Yes | No |&lt;br&gt;
| Flit | No | No | Yes |&lt;br&gt;
| Poetry | Yes | Yes | Yes |&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.githubcompare.com/python-poetry/poetry+pypa/pipenv+pypa/flit+pdm-project/pdm" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybpd119rkdq3sogjhu2m.png" alt="Repo Compare" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;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'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 &lt;a href="https://taskfile.dev/" rel="noopener noreferrer"&gt;Taskfile&lt;/a&gt; and run them with Poetry.&lt;/p&gt;

&lt;p&gt;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't support the build system fully (Like Poetry and PipEnv), I'm going to have a hard time adopting it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;If anyone reading this would like to weigh in, please feel free to either comment here or email me.&lt;/em&gt; 🤘&lt;/p&gt;

</description>
      <category>python</category>
      <category>poetry</category>
      <category>pipenv</category>
      <category>beginners</category>
    </item>
    <item>
      <title>while(True):try</title>
      <dc:creator>Jelloeater 👉jelloeater.me</dc:creator>
      <pubDate>Tue, 26 Sep 2023 15:45:52 +0000</pubDate>
      <link>https://dev.to/jelloeater/whiletruetry-1a6k</link>
      <guid>https://dev.to/jelloeater/whiletruetry-1a6k</guid>
      <description>&lt;h2&gt;
  
  
  Initial Commit
&lt;/h2&gt;

&lt;p&gt;It's been a while since I've written anything substantial in Python.&lt;br&gt;
Up until this point, I've mostly just written little toy programs here and there, as you can probably tell from my Github's list of half-finished projects (like any seasoned developer has).&lt;/p&gt;

&lt;p&gt;For a little context, I wasn'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't work out for me at the time. My first semester was all A's, but by my second semester I had hit a wall.&lt;/p&gt;

&lt;p&gt;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't find a strong mentor to show me the digital ropes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4sl9hgcnwi7toi97bvb.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd4sl9hgcnwi7toi97bvb.jpg" alt="LaterSCCC" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Changing Gears
&lt;/h2&gt;

&lt;p&gt;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't understand computers, at least maybe I could understand and help people. In the meantime, I still couldn'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.&lt;/p&gt;

&lt;p&gt;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't work for me. And I never stopped creating- I mixed music and worked weddings as a photographer. Art was always fun for me.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;When summer 2013 rolled around I said, "Java be damned, I won't let my story end with not knowing how to do a try-and-catch!". I'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't feel like paying for any of the over-priced apps to run on Windows XP. This didn't work out too well. Folder after folder, zip file after zip file- it was getting messy fast. I Google'd &lt;em&gt;"How to backup Java"&lt;/em&gt;... &lt;strong&gt;"How to backup Java CODE"&lt;/strong&gt;"Use Git", some snarky commenter on Hacker News said.&lt;/p&gt;

&lt;p&gt;So the very first thing I learned after VB and Java was... 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't look like a kid's crayon drawing of a Git graph. A decade later, and I can still read the comment history-&lt;/p&gt;

&lt;p&gt;Commit messages like &lt;em&gt;"Shit I'm tired, its 1:45 am. I'll work on this tomorrow. At least I picked up how to use Maven."&lt;/em&gt; and &lt;em&gt;"We now have a true singleton, my first,*tear&lt;/em&gt;"* still make me laugh looking back.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpjgq5ysdt3181vxasp2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpjgq5ysdt3181vxasp2.png" alt="StockTicker Git History" width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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 (&lt;a href="https://github.com/dan200/ComputerCraft" rel="noopener noreferrer"&gt;https://github.com/dan200/ComputerCraft&lt;/a&gt;), 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.&lt;/p&gt;

&lt;p&gt;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. &lt;em&gt;"What's a good programming language to learn..."&lt;/em&gt; Python seemed like a good start.&lt;/p&gt;
&lt;h2&gt;
  
  
  Off to Python
&lt;/h2&gt;

&lt;p&gt;This was 2014, so keep in mind that there wasn't a blog article for everything yet. I fired up Amazon and looked at the top reviewed books...&lt;br&gt;
&lt;a href="https://www.amazon.com/gp/product/193518220X/" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foqxmnku42gshl4equnno.jpg" alt="The Quick Python Book, Second Edition" width="399" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This book would become my guide book to learning this new (and weirdly formatted) programming language.&lt;/p&gt;

&lt;p&gt;Two long weeks later I had this...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python2.7
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
About:
A simple WSGI API server, aka take table from SQLite and make web page and API.
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="n"&gt;__author__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Jelloeater&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;__license__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GNU GPL v3.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was the start of my very first Python app.&lt;br&gt;
I hacked away for a solid 2 months, and in the end I had quite the ugly web page!&lt;/p&gt;

&lt;p&gt;This was a big deal for me in 2014. Keep in mind that I didn'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.&lt;/p&gt;

&lt;p&gt;I had a working prototype, though definitely not the first of it's kind. To paraphrase: it was too strange to live, but too weird to die. But old code never dies, it just rots away...&lt;/p&gt;

&lt;p&gt;Funny thing, 10 years later, &lt;code&gt;apt-get install python2&lt;/code&gt;, some crossed fingers...&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;... Yes! My old bad code still works!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jeez could I do a much better job now, but hey- it DID work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then and now
&lt;/h2&gt;

&lt;p&gt;2014 had come and gone. At this point I was working my first help desk job, fixing printers and pulling cable. It wasn'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's &amp;amp; MicroPython) and working on hobby projects- I just couldn't let it go.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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'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'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't ever forget where you've come from... and don'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 &lt;strong&gt;one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvb69zcicykhe2dbljthr.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvb69zcicykhe2dbljthr.jpg" alt="&amp;lt;3" width="800" height="353"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>learning</category>
      <category>career</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
