<?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: Francesco Bianco</title>
    <description>The latest articles on DEV Community by Francesco Bianco (@francescobianco).</description>
    <link>https://dev.to/francescobianco</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%2F241887%2F08e705a2-fd61-487b-a24f-908ff8eef211.png</url>
      <title>DEV Community: Francesco Bianco</title>
      <link>https://dev.to/francescobianco</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/francescobianco"/>
    <language>en</language>
    <item>
      <title>🧠 How to Write Shell Scripts That Access Memory Safely</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Mon, 19 May 2025 14:16:10 +0000</pubDate>
      <link>https://dev.to/francescobianco/how-to-write-shell-scripts-that-access-memory-safely-399f</link>
      <guid>https://dev.to/francescobianco/how-to-write-shell-scripts-that-access-memory-safely-399f</guid>
      <description>&lt;p&gt;Rust became popular for one key reason: it made &lt;strong&gt;memory safety&lt;/strong&gt; a core principle. In a world where a small mistake like a segmentation fault or a race condition can crash an application—or worse, open it up to serious vulnerabilities—Rust stepped up and said: &lt;em&gt;“No more.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;But what about us? Those of us who write shell scripts every day to automate DevOps tasks, manage CI/CD pipelines, handle data, files, and processes? &lt;strong&gt;Do we have any tools that help us write "memory-safe" shell code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not quite like Rust. But we &lt;em&gt;do&lt;/em&gt; have a few tools to make things better. One of the most underrated? The &lt;code&gt;local&lt;/code&gt; keyword.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛡️ Why &lt;code&gt;local&lt;/code&gt; Is Important
&lt;/h2&gt;

&lt;p&gt;In Bash, when you define variables inside a function, those variables are &lt;strong&gt;global by default&lt;/strong&gt;. This means that your function can accidentally change the global environment even after it finishes.&lt;/p&gt;

&lt;p&gt;Here’s a simple example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

foo&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"modified"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"original"&lt;/span&gt;
foo
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;  &lt;span class="c"&gt;# -&amp;gt; prints "modified"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function &lt;code&gt;foo&lt;/code&gt; unexpectedly changed the global variable &lt;code&gt;var&lt;/code&gt;. This can lead to &lt;strong&gt;hard-to-debug issues&lt;/strong&gt;, especially in larger scripts or CI/CD environments with many functions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Use &lt;code&gt;local&lt;/code&gt; to Contain State
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;local&lt;/code&gt; keyword solves this problem by making a variable &lt;strong&gt;local to the function scope&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;foo&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"modified"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;var&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"original"&lt;/span&gt;
foo
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$var&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;  &lt;span class="c"&gt;# -&amp;gt; prints "original"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Just like Rust ensures memory isolation and ownership, &lt;code&gt;local&lt;/code&gt; helps isolate variable state and prevent cross-function contamination.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ But Be Careful &lt;em&gt;How&lt;/em&gt; You Use &lt;code&gt;local&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;A very common mistake is doing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;myfunc&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;&lt;span class="nv"&gt;myvar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;some_command&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;strong&gt;not safe&lt;/strong&gt;. If &lt;code&gt;some_command&lt;/code&gt; fails, behaves unexpectedly, or produces weird output, it may interfere with the &lt;code&gt;local&lt;/code&gt; declaration.&lt;/p&gt;

&lt;p&gt;Also, ShellCheck (an amazing Bash linter) warns against this with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;SC2155&lt;/strong&gt;: Declare and assign separately to avoid masking return values.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The correct, safe way is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;myfunc&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;myvar
  &lt;span class="nv"&gt;myvar&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;some_command&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separates the &lt;strong&gt;declaration&lt;/strong&gt; (&lt;code&gt;local myvar&lt;/code&gt;) from the &lt;strong&gt;assignment&lt;/strong&gt; (&lt;code&gt;myvar=$(...)&lt;/code&gt;), avoiding unintended behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Practical Example
&lt;/h2&gt;

&lt;p&gt;Let’s say you want a function that returns the size of a file in bytes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;get_file_size&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;local &lt;/span&gt;size
  &lt;span class="nv"&gt;size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;stat&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt;%s &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$size&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"example.txt"&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Size: &lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;get_file_size &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; bytes"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;size&lt;/code&gt; is local and won’t affect other parts of the script&lt;/li&gt;
&lt;li&gt;The function is &lt;strong&gt;safe and reusable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;You avoid unexpected side effects&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔚 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;No, &lt;code&gt;local&lt;/code&gt; isn’t Rust. But in the world of shell scripting, it’s one of the best tools we have for writing &lt;strong&gt;modular, safe, and maintainable&lt;/strong&gt; code. Using it correctly helps prevent bugs and makes your scripts more robust and predictable.&lt;/p&gt;

&lt;p&gt;If you're writing scripts for DevOps, CI/CD, or system automation, make &lt;code&gt;local&lt;/code&gt; your default when working with function variables. It’s a small habit that brings huge value.&lt;/p&gt;




&lt;p&gt;💬 &lt;strong&gt;Do you know other tips or patterns for writing safer, cleaner shell scripts?&lt;/strong&gt; Share them in the comments! The more we exchange ideas, the stronger our scripting practices become.&lt;/p&gt;

</description>
      <category>memory</category>
      <category>shell</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>What Would Rust Be Without Cargo? A Beautiful Disaster</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Wed, 07 May 2025 22:02:05 +0000</pubDate>
      <link>https://dev.to/francescobianco/what-would-rust-be-without-cargo-a-beautiful-disaster-1o1o</link>
      <guid>https://dev.to/francescobianco/what-would-rust-be-without-cargo-a-beautiful-disaster-1o1o</guid>
      <description>&lt;p&gt;Ask any developer who’s used Rust what made the experience special.&lt;br&gt;
Sure, they’ll mention memory safety, fearless concurrency, and expressive types.&lt;/p&gt;

&lt;p&gt;But dig a little deeper, and something else almost always comes up:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Cargo.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rust’s package manager and build tool isn’t just “nice to have.”&lt;br&gt;
It’s the invisible architecture that makes Rust practical, structured, and even joyful.&lt;/p&gt;

&lt;p&gt;Now imagine Rust without it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No standard project layout.&lt;/li&gt;
&lt;li&gt;No dependency management.&lt;/li&gt;
&lt;li&gt;No easy testing or publishing.&lt;/li&gt;
&lt;li&gt;No &lt;code&gt;cargo build&lt;/code&gt;, &lt;code&gt;cargo test&lt;/code&gt;, or &lt;code&gt;cargo run&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just a complex, opinionated systems language... with zero guidance or tooling.&lt;/p&gt;

&lt;p&gt;It would be a &lt;strong&gt;beautiful disaster&lt;/strong&gt;—full of promise, but hard to harness.&lt;/p&gt;
&lt;h3&gt;
  
  
  Now Think About Shell Scripts
&lt;/h3&gt;

&lt;p&gt;Shell is ancient, universal, and indispensable.&lt;br&gt;
But if we’re honest, scripting in Bash or Dash often feels like stepping back in time.&lt;/p&gt;

&lt;p&gt;Despite its power, &lt;strong&gt;shell scripting is stuck in the dark ages&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scripts are ad-hoc and fragile.&lt;/li&gt;
&lt;li&gt;Logic is duplicated everywhere.&lt;/li&gt;
&lt;li&gt;There's no clear way to structure or modularize projects.&lt;/li&gt;
&lt;li&gt;Reuse? Testing? Versioning? Almost nonexistent.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s like we’ve been using Rust, but &lt;strong&gt;without Cargo&lt;/strong&gt;—for decades.&lt;/p&gt;
&lt;h3&gt;
  
  
  What If Cargo Existed for Shell?
&lt;/h3&gt;

&lt;p&gt;That’s the question that led me to something surprisingly elegant:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Mush&lt;/strong&gt; — &lt;em&gt;Modular Unix SHell&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mush brings to shell scripting what Cargo brings to Rust:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A project structure&lt;/li&gt;
&lt;li&gt;Dependency management&lt;/li&gt;
&lt;li&gt;Reusable packages and modules&lt;/li&gt;
&lt;li&gt;Testing and build automation&lt;/li&gt;
&lt;li&gt;Easy distribution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mush speaks native shell, but gives it &lt;strong&gt;modern development tooling&lt;/strong&gt;—without breaking the Unix philosophy.&lt;/p&gt;
&lt;h3&gt;
  
  
  Mush in Action
&lt;/h3&gt;

&lt;p&gt;Let’s say you want to start a portable, testable, modular shell script project. Just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl get.javanile.org/mush | sh
mush new hello_world
&lt;span class="nb"&gt;cd &lt;/span&gt;hello_world
mush run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In seconds, you're working inside a fully structured shell project, with support for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;extern&lt;/code&gt; packages&lt;/li&gt;
&lt;li&gt;cross-shell compatibility (Bash, Dash, Zsh, Ksh, BusyBox)&lt;/li&gt;
&lt;li&gt;integrated testing&lt;/li&gt;
&lt;li&gt;easy publishing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can even compose complex toolchains by stacking modules, just like you would with Rust crates.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It Matters
&lt;/h3&gt;

&lt;p&gt;Just as Cargo turned Rust into a practical ecosystem, &lt;strong&gt;Mush is doing the same for shell scripting&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Without tooling, even the most elegant language becomes brittle.&lt;br&gt;
And with the right tooling, even an ancient language like shell becomes powerful again.&lt;/p&gt;

&lt;p&gt;Mush doesn't try to reinvent shell—it &lt;strong&gt;unlocks its potential&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Closing Thought
&lt;/h3&gt;

&lt;p&gt;Rust without Cargo would have been a niche tool for systems nerds.&lt;/p&gt;

&lt;p&gt;Shell without Mush... well, that’s what we’ve been living with.&lt;br&gt;
It’s time for that to change.&lt;/p&gt;

&lt;p&gt;If you believe scripting deserves structure,&lt;br&gt;
If you want reuse, modularity, and sanity in your shell workflows—&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Give Mush a try.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>cargo</category>
      <category>shell</category>
      <category>devops</category>
    </item>
    <item>
      <title>If You Run Your CI Locally, You’ve Already Failed</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Thu, 24 Apr 2025 23:30:14 +0000</pubDate>
      <link>https://dev.to/francescobianco/if-you-run-your-ci-locally-youve-already-failed-28fn</link>
      <guid>https://dev.to/francescobianco/if-you-run-your-ci-locally-youve-already-failed-28fn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“Run your GitHub Actions locally!” — &lt;em&gt;ACT&lt;/em&gt;&lt;br&gt;&lt;br&gt;
“Why would you want to do that?” — &lt;em&gt;Me, genuinely wondering&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We live in an era where Continuous Integration (CI) — one of the most mature and battle-tested DevOps practices — is constantly being reinvented and reinterpreted. And then comes &lt;strong&gt;ACT&lt;/strong&gt;, a popular tool that lets you &lt;em&gt;run GitHub Actions locally&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;How convenient, right?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wrong. It's the symptom, not the cure.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Dream Gone Wrong: CI as a Fancy Makefile&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;ACT was born out of a real frustration: testing GitHub workflow files is painful. Commit, push, wait, fail, repeat. We've all been there.&lt;/p&gt;

&lt;p&gt;So someone thought: “Let’s run it locally!”&lt;br&gt;&lt;br&gt;
And &lt;em&gt;boom&lt;/em&gt;, ACT was born.&lt;/p&gt;

&lt;p&gt;But here’s the kicker: &lt;strong&gt;you’ve completely misunderstood what CI is supposed to be.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CI is &lt;strong&gt;not&lt;/strong&gt; part of your development loop.&lt;br&gt;&lt;br&gt;
CI is &lt;strong&gt;not&lt;/strong&gt; a fancy Makefile.&lt;br&gt;&lt;br&gt;
CI is &lt;strong&gt;not&lt;/strong&gt; something you “test until it works and then push.”&lt;/p&gt;

&lt;p&gt;CI is a gate.&lt;br&gt;&lt;br&gt;
CI is the external referee.&lt;br&gt;&lt;br&gt;
CI is the “&lt;strong&gt;Stop. This isn’t ready. Fix it before it hits the repo.&lt;/strong&gt;”&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The Anti-Pattern: Turning CI into a Dev Loop&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;When you use ACT to “test” your GitHub Actions workflows before pushing, you’re not optimizing — you’re subverting the entire purpose of CI.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;CI is not here to help your code &lt;em&gt;pass&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
It’s here to &lt;em&gt;block&lt;/em&gt; your code when it shouldn’t pass.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you need to test your CI pipeline endlessly before pushing, then one of these is true:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your CI is overly complex.&lt;/li&gt;
&lt;li&gt;Your CI is too fragile.&lt;/li&gt;
&lt;li&gt;Your CI lacks modularity and good design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that’s not a tooling issue — that’s a &lt;strong&gt;design flaw&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;CI Failures Are Bugs — Compensatory Bugs&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let me say this loud and clear:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CI failures are not annoyances — they are bugs.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Not in your code, but in your &lt;em&gt;process&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When your CI fails in production but passes locally, you’ve written compensatory logic. You’re covering up deeper issues with fragile CI setups that can’t scale or generalize.&lt;/p&gt;

&lt;p&gt;ACT lets you hide from those failures. It lets you live in the illusion of “it worked locally, so it should work on GitHub too.”&lt;/p&gt;

&lt;p&gt;That illusion is dangerous.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;ACT Isn’t the Problem — Misuse Is&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;To be clear: ACT isn’t evil. It’s actually quite elegant.&lt;br&gt;&lt;br&gt;
It’s useful in emergencies, debugging, or extremely isolated edge cases.&lt;/p&gt;

&lt;p&gt;But using it as part of your &lt;strong&gt;regular development flow&lt;/strong&gt;?&lt;br&gt;&lt;br&gt;
That’s like testing the fire alarm with a match and saying, “See? It beeped.”&lt;/p&gt;

&lt;p&gt;You’ve completely missed the point.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;So What Should You Do Instead?&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Design simpler workflows.&lt;/strong&gt; Don’t shove your entire pipeline into &lt;code&gt;yaml&lt;/code&gt; hell.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use modular, testable shell scripts&lt;/strong&gt; that your CI orchestrates, not defines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embrace CI failures&lt;/strong&gt; as red flags, not hurdles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use ACT as a microscope&lt;/strong&gt;, not as a mirror.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thought&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;ACT is another example of devs chasing convenience over correctness.&lt;br&gt;&lt;br&gt;
It’s appealing, sure. But it betrays the whole point of what CI is supposed to be.&lt;/p&gt;

&lt;p&gt;So next time you “run your CI locally,” ask yourself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Are you solving the real problem — or just hiding from it?&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because if you need to run your CI locally to make sure it passes…&lt;br&gt;&lt;br&gt;
&lt;strong&gt;You’ve already failed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Flame on.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
      <category>githubactions</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Everyone Loves Open Source… Until It's Time to Contribute</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Wed, 23 Apr 2025 20:00:02 +0000</pubDate>
      <link>https://dev.to/francescobianco/everyone-loves-open-source-until-its-time-to-contribute-2hng</link>
      <guid>https://dev.to/francescobianco/everyone-loves-open-source-until-its-time-to-contribute-2hng</guid>
      <description>&lt;p&gt;We live in an era where open source is everywhere. From backend tools to frontend frameworks, from infrastructure-as-code to machine learning libraries — open source is the backbone of modern software development.&lt;/p&gt;

&lt;p&gt;And yet, when it comes to &lt;strong&gt;contributing&lt;/strong&gt;, most developers are… missing in action.&lt;/p&gt;

&lt;p&gt;This isn't a rant. It’s a reflection based on data, observations, and a little bit of lived experience. Let’s dig in.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Hypothesis
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Everyone loves open source, but when asked to contribute — even a little — participation is surprisingly low."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sound familiar? If you've ever maintained or promoted an open source project, you've likely seen this pattern.&lt;/p&gt;




&lt;h2&gt;
  
  
  📊 The Data Doesn’t Lie
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. A Tiny Core Does the Heavy Lifting
&lt;/h3&gt;

&lt;p&gt;Most open source projects are maintained by a &lt;strong&gt;very small group of contributors&lt;/strong&gt;. GitHub's &lt;a href="https://octoverse.github.com/" rel="noopener noreferrer"&gt;Octoverse reports&lt;/a&gt; over the years consistently show that a vast majority of contributions come from a minority of users.&lt;/p&gt;

&lt;p&gt;A &lt;a href="https://dev.to/szabgab/the-problem-with-open-source-not-enough-contributors-5gpm"&gt;DEV article by @szabgab&lt;/a&gt; hits the nail on the head:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“There are hundreds of thousands of open source projects out there. Most of them have few contributors. Many have exactly one.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Barriers Are Real
&lt;/h3&gt;

&lt;p&gt;According to a &lt;a href="https://www.sciencedirect.com/science/article/pii/S1319157820305139" rel="noopener noreferrer"&gt;2020 study on ScienceDirect&lt;/a&gt;, developers face numerous obstacles that prevent them from contributing, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lack of clear documentation&lt;/li&gt;
&lt;li&gt;Complex or unfamiliar codebases&lt;/li&gt;
&lt;li&gt;Poor or no response from maintainers&lt;/li&gt;
&lt;li&gt;Imposter syndrome (especially among juniors or underrepresented groups)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not always about laziness — sometimes it’s about &lt;strong&gt;not knowing how to start&lt;/strong&gt; or not feeling welcomed.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Recognition Is Rare
&lt;/h3&gt;

&lt;p&gt;Contributing takes time. And when contributors feel their efforts aren’t acknowledged, they’re less likely to stick around.&lt;/p&gt;

&lt;p&gt;As pointed out in &lt;a href="https://opensauced.pizza/blog/the-need-for-recognition-in-open-source" rel="noopener noreferrer"&gt;this piece by OpenSauced&lt;/a&gt;, recognition isn't just about ego — it's about visibility, growth, and belonging.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 Why This Bias Matters
&lt;/h2&gt;

&lt;p&gt;It’s easy to fall into the trap of blaming "the community" for lack of participation. But understanding the &lt;strong&gt;psychological, structural, and social factors&lt;/strong&gt; behind the gap helps us build better systems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If we want more contributions, we need to lower the barriers and raise the rewards.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ✅ What Can We Do?
&lt;/h2&gt;

&lt;p&gt;Here are a few practical steps to improve participation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Good First Issues&lt;/strong&gt;: Label them well and make sure they’re actually beginner-friendly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mentorship or buddy systems&lt;/strong&gt;: Pair new contributors with experienced ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear contribution guidelines&lt;/strong&gt;: A simple &lt;code&gt;CONTRIBUTING.md&lt;/code&gt; goes a long way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Say thank you&lt;/strong&gt;: Shout out contributors in README files, releases, or community posts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lower the entry bar&lt;/strong&gt;: Sometimes a typo fix is the first step to a lifelong contributor.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎯 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Loving open source is easy.&lt;br&gt;
Using open source is convenient.&lt;br&gt;
&lt;strong&gt;Contributing&lt;/strong&gt; to open source is a choice — one that we can make easier for others.&lt;/p&gt;

&lt;p&gt;If you’re reading this, maybe it’s time to open that first PR. Or if you’re a maintainer, maybe it’s time to open the door a little wider.&lt;/p&gt;

&lt;p&gt;Let’s turn passive users into active contributors — together.&lt;/p&gt;




&lt;p&gt;Want to discuss this or collaborate on something open source? Drop a comment or ping me on GitHub!&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>community</category>
      <category>contributorswanted</category>
    </item>
    <item>
      <title>Stop Writing Messy Bash Scripts: Build Real Internal Tools with Mush</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Tue, 22 Apr 2025 22:42:25 +0000</pubDate>
      <link>https://dev.to/francescobianco/stop-writing-messy-bash-scripts-build-real-internal-tools-with-mush-53ca</link>
      <guid>https://dev.to/francescobianco/stop-writing-messy-bash-scripts-build-real-internal-tools-with-mush-53ca</guid>
      <description>&lt;p&gt;In the DevOps world, internal tooling is not a luxury—it's a &lt;strong&gt;necessity&lt;/strong&gt;. Whether you're deploying to Kubernetes, releasing software, or bootstrapping new services, &lt;strong&gt;custom scripts&lt;/strong&gt; often bridge the gap between teams, tools, and infrastructure.&lt;/p&gt;

&lt;p&gt;But let's face it: internal scripts tend to start as quick-and-dirty Bash hacks, and over time, they become &lt;strong&gt;unreadable&lt;/strong&gt;, &lt;strong&gt;unmaintainable&lt;/strong&gt;, and &lt;strong&gt;fragile&lt;/strong&gt;. Sound familiar?&lt;/p&gt;

&lt;p&gt;What if we could treat Bash like a &lt;strong&gt;real programming language&lt;/strong&gt;, with structure, modules, versioning, and installable tools?&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;&lt;a href="https://github.com/javanile/mush" rel="noopener noreferrer"&gt;Mush&lt;/a&gt;&lt;/strong&gt; comes in.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;The State of Internal Tooling in DevOps&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Almost every DevOps team builds their own tools. Here are some real-world examples:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool Name&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;deploy.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploy a service with custom settings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;release.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a new release and update changelogs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;check-env&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Verify if the developer machine has the required dependencies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;onboard.sh&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Set up a new repo with templates and CI/CD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;kube-wrapper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Simplify Kubernetes commands across namespaces and clusters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git-policies&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Enforce Git commit rules and tag naming&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These tools often grow from &lt;strong&gt;a one-liner in a README&lt;/strong&gt; to a &lt;strong&gt;critical script used by the entire team&lt;/strong&gt;—yet we rarely invest in making them maintainable.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Bash Scripts Get Ugly&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;No module system (copy-paste culture)&lt;/li&gt;
&lt;li&gt;Zero discoverability (&lt;code&gt;--help&lt;/code&gt;? What help?)&lt;/li&gt;
&lt;li&gt;Hard to test&lt;/li&gt;
&lt;li&gt;Impossible to version cleanly&lt;/li&gt;
&lt;li&gt;No proper CLI structure or autocompletion&lt;/li&gt;
&lt;li&gt;Unclear dependencies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What if we could fix all of that—without leaving Bash?&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Meet Mush: Modular Shell Scripting&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mush&lt;/strong&gt; is a lightweight ecosystem that gives your Bash scripts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A clear project structure (&lt;code&gt;src/&lt;/code&gt;, &lt;code&gt;tests/&lt;/code&gt;, &lt;code&gt;mush.yaml&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Modular architecture (&lt;code&gt;module&lt;/code&gt; primitive to load other scripts)&lt;/li&gt;
&lt;li&gt;Built-in CLI command dispatching&lt;/li&gt;
&lt;li&gt;Automatic &lt;code&gt;--help&lt;/code&gt; generation&lt;/li&gt;
&lt;li&gt;Dependency management via Git&lt;/li&gt;
&lt;li&gt;Easy install and distribution (&lt;code&gt;mush build&lt;/code&gt;, &lt;code&gt;mush install&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of it like Cargo for Shell.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;A Real Example: Hello, Bash Tool&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s build a simple CLI tool using Mush.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mush new hello-bash
&lt;span class="nb"&gt;cd &lt;/span&gt;hello-bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create your main file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# src/main.sh&lt;/span&gt;
main&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Hello, Bash World!"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your config file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Manifest.toml&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;hello&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Build and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mush build &lt;span class="nt"&gt;--release&lt;/span&gt;
./bin/hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ ./bin/hello
Hello, Bash World!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have a real executable, with structure, dispatch, and versioning—using only Bash.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Internal DevOps Tooling with Mush&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Let’s imagine some real DevOps use cases:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;A CLI to Standardize Deployments&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# src/deploy.sh&lt;/span&gt;
module utils

devops::deploy&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;env&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  utils::banner &lt;span class="s2"&gt;"Deploying to &lt;/span&gt;&lt;span class="nv"&gt;$env&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;
  kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; k8s/&lt;span class="nv"&gt;$env&lt;/span&gt;.yaml
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./devops deploy staging
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have &lt;code&gt;devops deploy&lt;/code&gt;, &lt;code&gt;devops help&lt;/code&gt;, &lt;code&gt;devops version&lt;/code&gt;... all for free.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Kubernetes Wrapper Tool&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubetool logs app-name &lt;span class="nt"&gt;--env&lt;/span&gt; prod
kubetool switch-context dev
kubetool apply-all teamX
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood: one script per command in &lt;code&gt;src/&lt;/code&gt;, loaded with &lt;code&gt;module&lt;/code&gt; and structured like a Go or Rust CLI.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Project Onboarding Tool&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;onboard new-service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Clones a template repo&lt;/li&gt;
&lt;li&gt;Sets up CI/CD&lt;/li&gt;
&lt;li&gt;Creates GitHub repo&lt;/li&gt;
&lt;li&gt;Registers service in monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Organized as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── main.sh
├── git.sh
├── ci.sh
├── register.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reused across teams. Versioned. Maintained. Documented.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Why Mush Matters&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For DevOps teams&lt;/strong&gt;, Mush is a game changer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No more spaghetti Bash&lt;/li&gt;
&lt;li&gt;Encourages structure and reuse&lt;/li&gt;
&lt;li&gt;Teams can collaborate on shared modules&lt;/li&gt;
&lt;li&gt;Tools can be versioned, installed, and reused&lt;/li&gt;
&lt;li&gt;Easy to write, even easier to maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mush brings modern software development practices to &lt;strong&gt;one of the most widely used languages in infrastructure&lt;/strong&gt;—Bash.&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Final Thoughts&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every time you write a script like &lt;code&gt;deploy.sh&lt;/code&gt;, you’re building a tool.&lt;br&gt;&lt;br&gt;
Why not treat it like one?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mush&lt;/strong&gt; lets you build real, structured, maintainable tools—&lt;strong&gt;with zero dependencies&lt;/strong&gt; and 100% Bash.&lt;/p&gt;

&lt;p&gt;So next time your team needs a CLI helper, skip the Python and Go boilerplate. Use Mush, and make your scripts proud.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Try it out&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/javanile/mush" rel="noopener noreferrer"&gt;github.com/javanile/mush&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew install javanile/tap/mush&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mush init my-tool &amp;amp;&amp;amp; cd my-tool &amp;amp;&amp;amp; mush build&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy scripting!&lt;/p&gt;

</description>
      <category>devops</category>
      <category>tooling</category>
      <category>kubernetes</category>
      <category>git</category>
    </item>
    <item>
      <title>101 Ideas for Smart DevOps Tools 🚀🛠️</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Fri, 18 Apr 2025 07:21:53 +0000</pubDate>
      <link>https://dev.to/francescobianco/101-ideas-for-smart-devops-tools-27hp</link>
      <guid>https://dev.to/francescobianco/101-ideas-for-smart-devops-tools-27hp</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;💡 This list was created to inspire developers, sysadmins, and DevOps enthusiasts to build their own tools instead of spending thousands of dollars on vendor-locked SaaS platforms.  &lt;/p&gt;

&lt;p&gt;A true DevOps engineer doesn't just &lt;em&gt;use&lt;/em&gt; tools—they &lt;em&gt;build&lt;/em&gt; them.  &lt;/p&gt;

&lt;p&gt;This is the mindset that separates a &lt;strong&gt;button-pusher&lt;/strong&gt; from a &lt;strong&gt;toolsmith&lt;/strong&gt;. 👩‍🔬&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Too many modern DevOps teams rely on tools that are closed, bloated, overpriced, and slow to evolve. Real DevOps culture is about &lt;strong&gt;automation&lt;/strong&gt;, &lt;strong&gt;transparency&lt;/strong&gt;, and &lt;strong&gt;self-sufficiency&lt;/strong&gt;. 🧰&lt;/p&gt;

&lt;p&gt;That’s why I’ve curated this list of &lt;strong&gt;101 CLI-based tool ideas&lt;/strong&gt; you can build, contribute to, or adapt for your stack.&lt;br&gt;&lt;br&gt;
Perfect for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hackathons 🎎
&lt;/li&gt;
&lt;li&gt;Side Projects 🌱
&lt;/li&gt;
&lt;li&gt;GitHub Actions and GitLab CI pipelines 🤖
&lt;/li&gt;
&lt;li&gt;Learning Bash, Go, Python, Rust 🐍🦀
&lt;/li&gt;
&lt;li&gt;Automation scripts at work 💼
&lt;/li&gt;
&lt;li&gt;Showing off your DevOps chops 💪
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🐳 Docker &amp;amp; Container Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DockClean&lt;/strong&gt; – Clean up unused Docker containers, volumes, and images.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ dockclean --all&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ImageShrink&lt;/strong&gt; – Optimize Dockerfiles and reduce image sizes.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ imageshrink my-image:latest&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LayerView&lt;/strong&gt; – Visualize Docker image layers in the terminal.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ layerview my-image:latest&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TagWatch&lt;/strong&gt; – Monitor Docker Hub for new image tags.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ tagwatch nginx&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PrivPush&lt;/strong&gt; – CLI for interacting with a private Docker registry.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ privpush myregistry.io/my-image&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SecretScan&lt;/strong&gt; – Scan Docker images for secrets.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ secretscan my-image:latest&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ComposeDiff&lt;/strong&gt; – Compare two Docker Compose files.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ composediff docker-compose.old.yml docker-compose.new.yml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LayerDiff&lt;/strong&gt; – Show changes between Docker image layers.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ layerdiff image1 image2&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OrphanWipe&lt;/strong&gt; – Remove orphaned Docker volumes.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ orphanwipe&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DockSpy&lt;/strong&gt; – Monitor container CPU, memory, and network usage.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ dockspy container-id&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  ☸️ Kubernetes Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubePodRestart&lt;/strong&gt; – List pods with frequent restarts.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubepodrestart --threshold 5&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubePort&lt;/strong&gt; – Port-forward to a pod/service with autocomplete.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubeport my-service&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeSnapshot&lt;/strong&gt; – Snapshot current cluster resources.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubesnapshot --output snapshot.yaml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeNSwitch&lt;/strong&gt; – Quickly switch namespaces.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubenswitch dev&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeGarbage&lt;/strong&gt; – Clean up old deployments and jobs.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubegarbage --older-than 7d&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeWhoami&lt;/strong&gt; – Show current context, user, and namespace.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubewhoami&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeSecretEdit&lt;/strong&gt; – Edit secrets in a safe and encrypted way.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubesecretedit my-secret&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeHPAWatch&lt;/strong&gt; – Monitor Horizontal Pod Autoscaler behavior.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubehpawatch deployment-name&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeNodes&lt;/strong&gt; – Show node stats (CPU, mem, pods).&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubenodes --all&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KubeLinterWrap&lt;/strong&gt; – Wrapper for kube-linter with presets.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ kubelintwrap ./manifests&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧪 CI/CD Pipeline Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PipelineTimer&lt;/strong&gt; – Measure execution time of CI stages.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ pipelinetimer .gitlab-ci.yml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CIEnvExport&lt;/strong&gt; – Export CI environment variables locally.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cienvexport &amp;gt; .env&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitCITrigger&lt;/strong&gt; – Trigger pipelines from CLI.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ gitcitrigger --project my/repo --ref main&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CITestMatrix&lt;/strong&gt; – Generate matrix builds from YAML.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ citestmatrix matrix.yml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CISecretsAudit&lt;/strong&gt; – Check pipeline for secret leaks.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cisecretsaudit .github/workflows/main.yml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CIEmojiStatus&lt;/strong&gt; – Display emoji-based status of last CI run.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ ciemojistatus&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ArtifactFetch&lt;/strong&gt; – Fetch CI/CD artifacts easily.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ artifactfetch build.zip&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CIYamlMerge&lt;/strong&gt; – Merge multiple CI yaml files into one.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ ciyamlmerge base.yml env.yml &amp;gt; final.yml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CIJobKill&lt;/strong&gt; – Kill hanging CI jobs from CLI.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cijobkill --job 12345&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WebhookFire&lt;/strong&gt; – Trigger test webhooks locally.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ webhookfire --url http://localhost --event push&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧑‍💻 Git &amp;amp; GitHub Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitWIP&lt;/strong&gt; – List all WIP branches across repos.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ gitwip&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PRCreator&lt;/strong&gt; – Open PRs from terminal with template.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ prcreator --title "Fix bug"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BranchLinter&lt;/strong&gt; – Enforce branch naming policies.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ branchlinter --check&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GHStatus&lt;/strong&gt; – Check GitHub Actions CI status of repo.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ ghstatus&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RepoSync&lt;/strong&gt; – Sync forks or mirror repositories.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ reposync --all&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;StarStats&lt;/strong&gt; – Show star growth of a repo.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ starstats myrepo&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GHDash&lt;/strong&gt; – Terminal dashboard of GitHub issues and PRs.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ ghdash&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GHReviewers&lt;/strong&gt; – Suggest reviewers for PRs based on history.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ ghreviewers PR-ID&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitConfigCheck&lt;/strong&gt; – Ensure global/local configs are set.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ gitconfigcheck&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PRConflictCheck&lt;/strong&gt; – Check if a PR is conflicting before merge.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ prconflictcheck PR-ID&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧠 Dev Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SnippetGen&lt;/strong&gt; – Generate code boilerplates.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ snippetgen react-component&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RandData&lt;/strong&gt; – Generate fake data for DB seeding.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ randdata --rows 100 --format csv&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;RandUser&lt;/strong&gt; – Generate fake user profiles.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ randuser --count 5&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PassGen&lt;/strong&gt; – Strong password generator.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ passgen --length 20&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NickGen&lt;/strong&gt; – Generate nicknames for users/bots.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ nickgen&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Text2Speech&lt;/strong&gt; – Convert text to audio (mp3).&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ text2speech "Hello world"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TextSummary&lt;/strong&gt; – Summarize a text using OpenAI.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ textsummary my-report.txt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;FlashcardCSV&lt;/strong&gt; – Convert text into flashcards CSV for Anki.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ flashcardcsv notes.txt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HT2PDF&lt;/strong&gt; – Convert HTML to PDF.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ ht2pdf index.html&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MD2HTML&lt;/strong&gt; – Convert Markdown to HTML.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ md2html README.md&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🛠️ System &amp;amp; Infra Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PortScan&lt;/strong&gt; – Scan open ports on a host.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ portscan 192.168.1.1&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DiskWatch&lt;/strong&gt; – Watch disk usage over time.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ diskwatch /mnt/data&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MemCheck&lt;/strong&gt; – Print memory usage of top processes.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ memcheck&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CpuTemp&lt;/strong&gt; – Display CPU temperature.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ cputemp&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ProcWatch&lt;/strong&gt; – Monitor a process by name or PID.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ procwatch nginx&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LoadAvg&lt;/strong&gt; – Show system load average.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ loadavg&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LogTail&lt;/strong&gt; – Tail and grep multiple logs.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ logtail /var/log/*.log --grep ERROR&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SysUpdate&lt;/strong&gt; – Unified updater for multiple Linux distros.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ sysupdate&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DnsPing&lt;/strong&gt; – Test DNS resolution and latency.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ dnsping google.com&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;UptimeTop&lt;/strong&gt; – Visual uptime and reboot history.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ uptimetop&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🔐 Security Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JwtDecode&lt;/strong&gt; – Decode and verify JWTs.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ jwtdecode token.jwt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;VaultPeek&lt;/strong&gt; – View secrets in Vault without revealing full value.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ vaultpeek secret/myapp&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CertCheck&lt;/strong&gt; – Check SSL certificate expiry.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ certcheck google.com&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PortAudit&lt;/strong&gt; – Find services exposed on public IPs.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ portaudit&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BashSafe&lt;/strong&gt; – Scan bash scripts for insecure patterns.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ bashsafe deploy.sh&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;KeyGenRSA&lt;/strong&gt; – Generate RSA key pairs.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ keygenrsa --bits 2048&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HashFile&lt;/strong&gt; – Compute hash (md5, sha1, sha256) of a file.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ hashfile my.zip --algo sha256&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;YaraWatch&lt;/strong&gt; – Run YARA rules on files or folders.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ yarawatch ./bin&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IPBanCheck&lt;/strong&gt; – Check if your IP is in common blocklists.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ ipbancheck&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SecureWipe&lt;/strong&gt; – Securely delete files.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ securewipe secrets.txt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📦 Package &amp;amp; Build Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BinSize&lt;/strong&gt; – Check the size of compiled binaries.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ binsize ./myapp&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PkgVersion&lt;/strong&gt; – Auto-increment semver version.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ pkgversion patch&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TarPlus&lt;/strong&gt; – Enhanced tar wrapper with progress.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ tarplus -czf archive.tar.gz folder/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MakeGraph&lt;/strong&gt; – Visualize Makefile dependencies.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ makegraph Makefile&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DebMaker&lt;/strong&gt; – Create .deb packages easily.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ debmaker ./build&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PyInstallerWrap&lt;/strong&gt; – Simplified CLI for PyInstaller.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ pyinstallerwrap app.py&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GoBuildScan&lt;/strong&gt; – Scan Go binaries for debug info.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ gobuildscan mytool&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NPMSizeCheck&lt;/strong&gt; – Check size of npm dependencies.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ npmsizecheck&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;LicenseCheck&lt;/strong&gt; – Check open-source licenses in your project.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ licensecheck&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;BinCompat&lt;/strong&gt; – Check binary compatibility across systems.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ bincompat ./app&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📊 Monitoring &amp;amp; Visualization Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GrafLog&lt;/strong&gt; – Convert logs to Grafana-friendly JSON.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ graflog access.log&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AlertTest&lt;/strong&gt; – Trigger mock alerts to test integrations.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ alerttest --channel slack&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DashTerm&lt;/strong&gt; – Terminal-based live dashboard.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ dashterm&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TracePlot&lt;/strong&gt; – Visualize HTTP traces.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ traceplot traces.json&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HeatmapGen&lt;/strong&gt; – Generate activity heatmaps.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ heatmapgen git-log.txt&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MetricGen&lt;/strong&gt; – Create mock Prometheus metrics.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ metricgen --type gauge&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;StatusTicker&lt;/strong&gt; – Show system status in ticker format.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ statusticker&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;JsonStat&lt;/strong&gt; – Summarize large JSON logs.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ jsonstat logs.json&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TrendDiff&lt;/strong&gt; – Show visual diffs in metric trends.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ trenddiff --before old.json --after new.json&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PulseBeat&lt;/strong&gt; – Show heartbeat events in terminal.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ pulsebeat --interval 10&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🧰 Misc Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;TodoLog&lt;/strong&gt; – Add todos with timestamps.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ todolog "Fix NGINX config"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ClipShare&lt;/strong&gt; – Share clipboard text via short URL.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ clipshare&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;QrText&lt;/strong&gt; – Generate QR codes from text.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ qrtext "https://my.site"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DirSizeTop&lt;/strong&gt; – Show largest directories.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ dirsizetop /var&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AsciiArtify&lt;/strong&gt; – Convert images to ASCII.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ asciiartify logo.png&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SleepCalc&lt;/strong&gt; – Calculate optimal sleep cycles.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ sleepcalc --now&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;WakeMe&lt;/strong&gt; – Schedule a command to run at wakeup.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ wakeme "notify-send \"Get to work!\""&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HttpDump&lt;/strong&gt; – Dump HTTP requests/responses.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ httpdump --port 8080&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ChatMem&lt;/strong&gt; – Store short chat memory notes.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ chatmem "Need to check cron jobs"&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;NowWhat&lt;/strong&gt; – Suggest a random productivity tip.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ nowwhat&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;ToolSuggest&lt;/strong&gt; – Suggest a random tool idea from this list.&lt;br&gt;&lt;br&gt;
&lt;code&gt;$ toolsuggest&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  📣 Join the Hackathon!
&lt;/h2&gt;

&lt;p&gt;I'm launching a community &lt;strong&gt;DevOps Hackathon&lt;/strong&gt; 👨‍💻👩‍💻&lt;br&gt;&lt;br&gt;
Build one of these tools (or your own!)&lt;br&gt;&lt;br&gt;
Fork it, share it, improve it, make it yours.&lt;br&gt;&lt;br&gt;
And &lt;strong&gt;submit it for feedback, visibility, and collaboration!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;More info coming soon. Stay tuned on my &lt;a href="https://www.linkedin.com/in/yafb/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt; and &lt;a href="https://github.com/javanile" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Share This With Your Team
&lt;/h2&gt;

&lt;p&gt;👈 If you found even &lt;strong&gt;one idea useful&lt;/strong&gt;, hit ❤️ and&lt;br&gt;&lt;br&gt;
📬 &lt;strong&gt;share this list in your company Slack or Discord channel&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
💬 Ask: "Which one shall we build in our next hackday?"&lt;br&gt;&lt;br&gt;
🚀 Let's stop buying stuff we can build better ourselves.&lt;/p&gt;




&lt;h1&gt;
  
  
  🔁 Like. Share. Build.
&lt;/h1&gt;

&lt;p&gt;Let’s bring the &lt;em&gt;craft&lt;/em&gt; back to DevOps.&lt;br&gt;&lt;br&gt;
Let’s build smart tools, not just use bloated ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which idea will you build first?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Let me know in the comments 👇👇👇&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
      <category>shell</category>
      <category>cli</category>
    </item>
    <item>
      <title>🌟 Hackathon Tamasha: Where DevOps Meets Creativity! 🚀</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Sat, 29 Mar 2025 13:07:20 +0000</pubDate>
      <link>https://dev.to/francescobianco/hackathon-tamasha-where-devops-meets-creativity-o3o</link>
      <guid>https://dev.to/francescobianco/hackathon-tamasha-where-devops-meets-creativity-o3o</guid>
      <description>&lt;p&gt;&lt;strong&gt;Calling All DevOps Innovators – Join the Challenge &amp;amp; Win! 🏆&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Are you ready to showcase your DevOps skills and compete in a global hackathon? Hackathon Tamasha is here to challenge your creativity and technical expertise! Whether you’re a seasoned DevOps engineer or just starting, this is your chance to shine, win prizes, and connect with a growing community of like-minded innovators.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 What’s the Challenge?
&lt;/h2&gt;

&lt;p&gt;Your mission is to create a command-line tool that simplifies daily DevOps tasks using Mush – a new, game-changing tool designed to revolutionize embedded scripting and automation in DevOps workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Example project ideas:
&lt;/h3&gt;

&lt;p&gt;A script to stop all running Docker containers.&lt;/p&gt;

&lt;p&gt;A tool to clean up unused containers and free up disk space.&lt;/p&gt;

&lt;p&gt;A utility to extract files from a running container.&lt;/p&gt;

&lt;p&gt;If you love automation and want to build something impactful, this is your moment! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 How to Participate
&lt;/h2&gt;

&lt;p&gt;1️⃣ Fork the Repository &amp;amp; Get Started&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://www.javanile.org/hackathon/" rel="noopener noreferrer"&gt;Click here to Fork &amp;amp; Start the Challenge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2️⃣ Set Up Your Environment&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl get.javanile.org/mush | sh
mush init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ Build, Test &amp;amp; Push Your Code&lt;/p&gt;

&lt;p&gt;Develop your tool using Mush &amp;amp; Bash.&lt;/p&gt;

&lt;p&gt;Document it with a clear README.md.&lt;/p&gt;

&lt;p&gt;Implement a GitHub Action to automate tests or other tasks.&lt;/p&gt;

&lt;p&gt;Invite your friends to star ⭐ your project and gain visibility!&lt;/p&gt;

&lt;p&gt;4️⃣ Check the Leaderboard &amp;amp; Win Prizes 🎯&lt;/p&gt;

&lt;p&gt;The project with the most GitHub stars ⭐ by April 14th wins $10! 💰&lt;/p&gt;

&lt;h3&gt;
  
  
  🎉 Why Should You Join?
&lt;/h3&gt;

&lt;p&gt;✅ Boost Your DevOps Portfolio – Get hands-on experience in automation &amp;amp; CI/CD. ✅ Gain Recognition in the Open Source World – Your project will be part of a growing DevOps ecosystem. ✅ Connect with the Community – Join our WhatsApp group &amp;amp; collaborate with other DevOps enthusiasts.&lt;/p&gt;

&lt;p&gt;👥 Join the Mush DevOps Community 👉 &lt;a href="https://chat.whatsapp.com/Lt7wfx0wU8yKb8d9SFINUE" rel="noopener noreferrer"&gt;WhatsApp Group&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🌍 Why Indian Developers Should Join
&lt;/h3&gt;

&lt;p&gt;India is a powerhouse of tech talent, with one of the largest DevOps and cloud engineering communities. Hackathon Tamasha is designed to give Indian developers a global stage to showcase their skills. Whether you’re a student, a professional, or an open-source contributor, this is your opportunity to gain visibility, sharpen your skills, and win prizes!&lt;/p&gt;

&lt;p&gt;🚀 Let’s build the future of DevOps together!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.javanile.org/hackathon/" rel="noopener noreferrer"&gt;Click here to Fork &amp;amp; Join the Hackathon&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>devops</category>
      <category>bash</category>
      <category>github</category>
    </item>
    <item>
      <title>How to Make Conventional Commits a Lasting Habit?</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Mon, 24 Mar 2025 20:42:08 +0000</pubDate>
      <link>https://dev.to/francescobianco/convcommit-the-tool-that-makes-conventional-commits-a-habit-2n0n</link>
      <guid>https://dev.to/francescobianco/convcommit-the-tool-that-makes-conventional-commits-a-habit-2n0n</guid>
      <description>&lt;p&gt;Conventional commits sound great in theory: structured, readable commit messages that make history tracking easier. But let's be honest—most of us try them for a few days and then fall back into our old habits. Why? Because it’s tedious to remember the exact syntax, and we often don’t have the patience to write proper commit messages when we’re in the zone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: Conventional Commits Fade Away Quickly
&lt;/h2&gt;

&lt;p&gt;If you've ever attempted to enforce conventional commits in your projects, you might have noticed this pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Day 1:&lt;/strong&gt; You're excited and commit with messages like &lt;code&gt;feat: add authentication module&lt;/code&gt; or &lt;code&gt;fix: resolve login bug&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 3:&lt;/strong&gt; You start forgetting the exact format and write something like &lt;code&gt;feat(auth): added stuff&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Day 7:&lt;/strong&gt; You're back to &lt;code&gt;fix bug&lt;/code&gt; or &lt;code&gt;wip&lt;/code&gt;, and conventional commits are a thing of the past.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s not that you don’t see the value—it’s just hard to stay consistent without frictionless tooling. That’s where &lt;code&gt;convcommit&lt;/code&gt; comes in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meet Convcommit: Your Memory Booster for Commit Messages
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;convcommit&lt;/code&gt; is a simple but powerful CLI tool that ensures you never fall back into bad commit habits. It does a few things:&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Guides you through commit message selection&lt;/strong&gt; – No need to memorize commit types or scopes.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Stores and suggests your previous messages&lt;/strong&gt; – If you’ve used a message before, you can quickly reuse it.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Works with &lt;code&gt;git add .&lt;/code&gt; and &lt;code&gt;git push&lt;/code&gt; seamlessly&lt;/strong&gt; – Keeping your workflow fast and efficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;Using &lt;code&gt;convcommit&lt;/code&gt; is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install it (if you haven’t already):
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   mush &lt;span class="nb"&gt;install &lt;/span&gt;convcommit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Run it whenever you commit:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   convcommit &lt;span class="nt"&gt;-a&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Select the commit type, scope (if any), and message from suggestions or enter a new one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it! No more second-guessing your commit messages or breaking your commit history structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Should Start Using It Today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Develop muscle memory&lt;/strong&gt;: The more you use it, the more natural conventional commits become.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintain a clean commit history&lt;/strong&gt;: Future-you (and your teammates) will thank you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boost your personal branding&lt;/strong&gt;: Writing clean commits is a sign of professionalism in open-source projects.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try It Now and Make Your Commits Count!
&lt;/h2&gt;

&lt;p&gt;You can check out &lt;code&gt;convcommit&lt;/code&gt; on GitHub, give it a star ⭐, and start using it today:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/francescobianco/convcommit" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let me know what you think, and if you have ideas for improvements, PRs are always welcome! Happy committing! 🚀&lt;/p&gt;

</description>
      <category>conventionalcommit</category>
      <category>git</category>
      <category>commit</category>
      <category>programming</category>
    </item>
    <item>
      <title>Stop Bloating Your Containers! Why Your Cron Jobs Don't Belong There 🚀</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Sun, 23 Mar 2025 09:29:40 +0000</pubDate>
      <link>https://dev.to/francescobianco/stop-bloating-your-containers-why-your-cron-jobs-dont-belong-there-60m</link>
      <guid>https://dev.to/francescobianco/stop-bloating-your-containers-why-your-cron-jobs-dont-belong-there-60m</guid>
      <description>&lt;p&gt;Are you still stuffing cron jobs inside your Docker containers? In 2025, that's like wearing socks with sandals to a tech conference! Let me blow your mind with a game-changing approach that will make your DevOps colleagues worship the ground you walk on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Nightmare Inside Your Containers
&lt;/h2&gt;

&lt;p&gt;We've all been there. You build this beautiful, sleek container for your application, and then someone says: "Hey, we need to run a scheduled task every hour to clean up temp files." And just like that, your elegant container becomes a bloated mess:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install cron inside your container ✅&lt;/li&gt;
&lt;li&gt;Create a crontab file ✅ &lt;/li&gt;
&lt;li&gt;Set up proper logging ✅&lt;/li&gt;
&lt;li&gt;Make sure cron daemon starts properly ✅&lt;/li&gt;
&lt;li&gt;Debug why your jobs aren't running ✅&lt;/li&gt;
&lt;li&gt;Repeat for EVERY container that needs scheduling ✅&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before you know it, your lightweight container has gained 50MB of unnecessary bulk, and you're spending more time debugging cron than working on your actual application. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There's a better way.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enter javanile/crontab: The Docker Composer's Dream
&lt;/h2&gt;

&lt;p&gt;What if I told you there's a way to keep your containers lean and focused on their primary purpose while managing all your scheduled tasks from a single, centralized place? Meet &lt;a href="https://github.com/javanile/crontab" rel="noopener noreferrer"&gt;javanile/crontab&lt;/a&gt; - the superhero your Docker Compose setup has been waiting for.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Will Change Your Container Life Forever
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Ridiculously Simple Setup
&lt;/h3&gt;

&lt;p&gt;Just add this to your docker-compose.yml and you're ready to schedule anything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;crontab&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;javanile/crontab&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;ping&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;8.8.8.8"&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;0&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;rm&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;-fr&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/tmp"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No more installing cron packages, no more fighting with startup scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Your Containers Stay Pure and Focused
&lt;/h3&gt;

&lt;p&gt;By extracting scheduled tasks out of your application containers, each component in your architecture becomes cleaner and more maintainable. Your application containers do what they do best - run your application. Period.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Centralized Schedule Management
&lt;/h3&gt;

&lt;p&gt;Imagine updating a cron schedule without rebuilding containers. Imagine seeing all your scheduled tasks in one place. With javanile/crontab, you're not just dreaming anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Superpowers
&lt;/h2&gt;

&lt;p&gt;Need something more complex? No problem. Mount your application directory and the Docker socket to enable true scheduling superpowers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3"&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;crontab&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;javanile/crontab&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;*&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;bash&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;/app/my-project-script.sh"&lt;/span&gt;
    &lt;span class="na"&gt;volumes&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="c1"&gt;# Mount local path '.' over '/app' to access your scripts&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.:/app&lt;/span&gt;      
      &lt;span class="c1"&gt;# Mount 'docker.sock' to enable your script to run 'docker compose' commands&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;/var/run/docker.sock:/var/run/docker.sock&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can schedule scripts that interact with your other containers! Want to run a backup of your database container every night at 2 AM? Easy. Need to restart a service once a week? Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cherry on Top: Effortless Logging
&lt;/h2&gt;

&lt;p&gt;Debugging cron jobs is usually a special circle of hell. But with javanile/crontab, all logs are automatically sent to stdout. Just run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; crontab
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And watch your scheduled tasks execute in real-time. No more digging through system logs or wondering why your job didn't run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Time to Change Is Now
&lt;/h2&gt;

&lt;p&gt;Still not convinced? Consider this: Every unnecessary component in your container is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;More potential security vulnerabilities&lt;/li&gt;
&lt;li&gt;More disk space used&lt;/li&gt;
&lt;li&gt;Longer build times&lt;/li&gt;
&lt;li&gt;More complex debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By extracting your scheduled tasks to a dedicated crontab container, you're not just following best practices - you're embracing the true Docker philosophy of single-purpose containers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started Today
&lt;/h2&gt;

&lt;p&gt;Ready to revolutionize how you handle scheduled tasks in your Docker environment? Head over to &lt;a href="https://github.com/javanile/crontab" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; and star the project that's changing the game for DevOps professionals worldwide.&lt;/p&gt;

&lt;p&gt;Remember: Your containers should do one thing and do it well. Let javanile/crontab handle the scheduling, so your application containers can focus on what matters.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Licensed under MIT - because great tools should be free to use and improve.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;What's your experience with scheduled tasks in Docker? Have you tried this approach? Let me know in the comments below! 👇&lt;/p&gt;

</description>
      <category>cron</category>
      <category>docker</category>
      <category>containers</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>The Secret Chamber Every Developer Should Have: Unleashing the Power of Side Repositories</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Fri, 21 Mar 2025 16:52:20 +0000</pubDate>
      <link>https://dev.to/francescobianco/the-secret-chamber-every-developer-should-have-unleashing-the-power-of-side-repositories-1j3</link>
      <guid>https://dev.to/francescobianco/the-secret-chamber-every-developer-should-have-unleashing-the-power-of-side-repositories-1j3</guid>
      <description>&lt;p&gt;Have you ever found yourself struggling with sensitive files that shouldn't be committed to your main repository? Or perhaps you have common utilities that you reuse across projects but don't want to maintain multiple copies of? What if I told you there's a secret development pattern that can solve these problems and more?&lt;/p&gt;

&lt;p&gt;Enter the &lt;strong&gt;side repository&lt;/strong&gt; — a complementary codebase that works alongside your main project, offering a hidden chamber of possibilities that many developers overlook.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Exactly Is a Side Repository?
&lt;/h2&gt;

&lt;p&gt;A side repository is exactly what it sounds like: a secondary Git repository that exists parallel to your main project repository. It's not a fork or a branch, but a completely separate repository with its own history, purpose, and contents that somehow integrates with your primary codebase.&lt;/p&gt;

&lt;p&gt;Think of it as your project's secret vault — a place to store valuable assets that don't belong in your main codebase but are still essential to your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why You Might Need a Secret Chamber
&lt;/h2&gt;

&lt;p&gt;You might be wondering: "My &lt;code&gt;.gitignore&lt;/code&gt; works fine, why complicate things?" Here's where side repositories shine:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Sensitive Configuration Management
&lt;/h3&gt;

&lt;p&gt;While &lt;code&gt;.gitignore&lt;/code&gt; helps you avoid committing sensitive files, it doesn't help you share or back them up. A side repo can store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; files with different configurations&lt;/li&gt;
&lt;li&gt;API keys and credentials&lt;/li&gt;
&lt;li&gt;Development certificates&lt;/li&gt;
&lt;li&gt;License files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All while keeping them organized and versioned, but separate from your main code.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Team Resources Without the Noise
&lt;/h3&gt;

&lt;p&gt;Ever had to send a configuration file to a new team member or found yourself saying, "Oh, you need to create this file locally"? A side repo eliminates these friction points by providing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A shared storage for development tools&lt;/li&gt;
&lt;li&gt;Template configurations that new team members can access&lt;/li&gt;
&lt;li&gt;Documentation that doesn't belong in the main repo&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Cross-Project Resource Management
&lt;/h3&gt;

&lt;p&gt;Perhaps the most powerful use case is maintaining resources that span multiple projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared scripts and utilities&lt;/li&gt;
&lt;li&gt;Common CI/CD configurations&lt;/li&gt;
&lt;li&gt;Design assets and templates&lt;/li&gt;
&lt;li&gt;Database seeds or fixtures&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Making It Even Easier with git-popper
&lt;/h2&gt;

&lt;p&gt;For those who want a more streamlined approach to managing side repositories, check out &lt;a href="https://github.com/francescobianco/git-popper" rel="noopener noreferrer"&gt;&lt;strong&gt;git-popper&lt;/strong&gt;&lt;/a&gt;, a minimalist side repository manager that automates the integration between your main and side repositories.&lt;/p&gt;

&lt;p&gt;This tool, available at &lt;a href="https://github.com/francescobianco/git-popper" rel="noopener noreferrer"&gt;&lt;strong&gt;https://github.com/francescobianco/git-popper&lt;/strong&gt;&lt;/a&gt;, simplifies the entire process with a declarative approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;## Use this as side repository&lt;/span&gt;
FROM https://github.com/your-side-repo.git

&lt;span class="c"&gt;## Store and sync local files into this remote directory of the repository&lt;/span&gt;
WORKDIR projects/2025/myproject

&lt;span class="c"&gt;## Sync local files into side repo to prevent losing secret files&lt;/span&gt;
ADD .env
ADD .secrets
ADD Makefile-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With git-popper, you can define which files to synchronize in a &lt;code&gt;.gitpopper&lt;/code&gt; configuration file and use simple commands to maintain the connection between repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git-popper &lt;span class="nb"&gt;sync&lt;/span&gt;   &lt;span class="c"&gt;# Synchronize changes between repositories&lt;/span&gt;
git-popper pull   &lt;span class="c"&gt;# Get latest changes from side repository&lt;/span&gt;
git-popper push   &lt;span class="c"&gt;# Push changes to side repository&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's an elegant solution that takes the manual work out of the patterns described below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Your Secret Chamber
&lt;/h2&gt;

&lt;p&gt;Creating a side repository is straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a new repository (private if it contains sensitive information)&lt;/li&gt;
&lt;li&gt;Structure it according to your needs&lt;/li&gt;
&lt;li&gt;Clone it alongside your main repository
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;projects/
├── main-project/  # Your main repository
└── main-project-side/  # Your side repository
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Integration Patterns
&lt;/h2&gt;

&lt;p&gt;There are several ways to integrate a side repository with your main project:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Symlink Approach
&lt;/h3&gt;

&lt;p&gt;Create symbolic links from your main project to files in your side repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; ../main-project-side/config/.env .env
&lt;span class="nb"&gt;ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; ../main-project-side/scripts ./scripts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The Copy-on-Setup Approach
&lt;/h3&gt;

&lt;p&gt;Copy necessary files during project setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# In your setup script&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; ../main-project-side/config/&lt;span class="k"&gt;*&lt;/span&gt; ./config/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. The Automation Tool Approach
&lt;/h3&gt;

&lt;p&gt;Create a simple script that manages synchronization:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;
&lt;span class="c"&gt;# sync-side-repo.sh&lt;/span&gt;
rsync &lt;span class="nt"&gt;-av&lt;/span&gt; &lt;span class="nt"&gt;--exclude&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'.git'&lt;/span&gt; ../main-project-side/shared/ ./
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. The Git Submodule Approach (Advanced)
&lt;/h3&gt;

&lt;p&gt;For more sophisticated integration, Git submodules can link repositories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git submodule add git@github.com:your-org/main-project-side.git side
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real-World Success Stories
&lt;/h2&gt;

&lt;p&gt;At my company, we implemented a side repository pattern for our microservices architecture. Each service had its own repository, but we maintained a shared side repository containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Common Docker configurations&lt;/li&gt;
&lt;li&gt;Shared authentication utilities&lt;/li&gt;
&lt;li&gt;Local development environment setup&lt;/li&gt;
&lt;li&gt;Database migration tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach reduced duplication by 70% and cut onboarding time for new developers from days to hours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pitfalls to Avoid
&lt;/h2&gt;

&lt;p&gt;Like any pattern, side repositories come with potential downsides:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drift&lt;/strong&gt; - If not properly maintained, your side repo can become out of sync&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency Management&lt;/strong&gt; - Creating circular dependencies between repos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overuse&lt;/strong&gt; - Using the side repo as a dumping ground for anything&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Is a Side Repository Right for You?
&lt;/h2&gt;

&lt;p&gt;A side repository makes the most sense when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You have sensitive configurations that need version control&lt;/li&gt;
&lt;li&gt;Your team frequently shares non-code resources&lt;/li&gt;
&lt;li&gt;You maintain similar setups across multiple projects&lt;/li&gt;
&lt;li&gt;You need controlled access to certain resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're nodding your head to any of these points, it might be time to open your own secret chamber.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started Today
&lt;/h2&gt;

&lt;p&gt;Begin small:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Identify files that are currently in your &lt;code&gt;.gitignore&lt;/code&gt; but would benefit from version control&lt;/li&gt;
&lt;li&gt;Create a private repository&lt;/li&gt;
&lt;li&gt;Move those files there with a clear organization structure&lt;/li&gt;
&lt;li&gt;Implement one of the integration patterns described above or try &lt;a href="https://github.com/francescobianco/git-popper" rel="noopener noreferrer"&gt;&lt;strong&gt;git-popper&lt;/strong&gt;&lt;/a&gt; for a more automated approach&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You can install git-popper quickly with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/francescobianco/git-popper/main/bin/git-popper | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; /usr/local/bin/git-popper &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/git-popper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The side repository pattern isn't revolutionary, but it's remarkably effective. It provides a clean separation of concerns, keeps your main repository focused, and solves common development workflow issues that every team faces.&lt;/p&gt;

&lt;p&gt;Have you used side repositories in your projects? What integration patterns worked best for you? Share your experiences in the comments!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Francesco Bianco is a senior developer with over a decade of experience optimizing development workflows and architecture patterns across enterprise applications.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>secrets</category>
      <category>backup</category>
      <category>devops</category>
      <category>dotenv</category>
    </item>
    <item>
      <title>Organizing Large Shell Script Codebases with Mush</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Mon, 24 Feb 2025 18:52:09 +0000</pubDate>
      <link>https://dev.to/francescobianco/organizing-large-shell-script-codebases-with-mush-10i7</link>
      <guid>https://dev.to/francescobianco/organizing-large-shell-script-codebases-with-mush-10i7</guid>
      <description>&lt;p&gt;Shell scripting is a powerful tool for automation, system administration, and software deployment. However, as your shell scripts grow in size and complexity, maintaining them can become a nightmare. Code duplication, lack of modularization, and difficulty in testing are common pitfalls.&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;Mush&lt;/strong&gt; by Javanile—an innovative framework designed to bring structure and maintainability to large shell script projects. In this article, we’ll explore how Mush can help you organize your shell scripts efficiently and improve code reusability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Do Large Shell Script Codebases Become Unmanageable?
&lt;/h2&gt;

&lt;p&gt;Traditional shell scripts tend to evolve in an ad-hoc manner. As the codebase expands, you may face:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spaghetti Code&lt;/strong&gt;: Scripts grow into monolithic, hard-to-read files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Duplication&lt;/strong&gt;: No clear way to reuse functions across different scripts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Poor Dependency Management&lt;/strong&gt;: Sourcing multiple files manually is cumbersome.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Difficult Debugging&lt;/strong&gt;: Large scripts lack structured error handling and logging.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mush offers a structured approach to shell scripting, making it easier to scale and maintain your scripts.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is Mush?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mush&lt;/strong&gt; (short for &lt;strong&gt;Modular Unix Shell&lt;/strong&gt;) is a framework that enhances shell scripting by introducing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modular architecture&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dependency management&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autoloading functions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Built-in testing and debugging tools&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mush is inspired by modern programming paradigms, allowing shell scripts to be structured similarly to software projects in Python or JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up a Mush-Based Shell Script Project
&lt;/h2&gt;

&lt;p&gt;To start using Mush, you need to install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://mush.sh/install | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once installed, you can initialize a new Mush project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mush init my-shell-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-shell-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a structured project layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-shell-project/
├── bin/       # Main executable scripts
├── mush/      # Mush modules (functions and utilities)
├── test/      # Unit tests for your scripts
└── Mushfile   # Dependency and module definitions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Structuring Your Shell Scripts with Mush
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Breaking Code into Modules
&lt;/h3&gt;

&lt;p&gt;Instead of writing large scripts, you can modularize your functions inside &lt;code&gt;mush/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# mush/logger.sh&lt;/span&gt;
log_info&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

log_error&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"[ERROR] &lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, any script inside &lt;code&gt;bin/&lt;/code&gt; can use the &lt;code&gt;log_info&lt;/code&gt; and &lt;code&gt;log_error&lt;/code&gt; functions without manually sourcing them.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Autoloading Modules with Mushfile
&lt;/h3&gt;

&lt;p&gt;Mush provides automatic module loading using &lt;code&gt;Mushfile&lt;/code&gt;. Define your dependencies like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;module logger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can use &lt;code&gt;log_info&lt;/code&gt; and &lt;code&gt;log_error&lt;/code&gt; without explicitly sourcing &lt;code&gt;logger.sh&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Writing Executable Scripts
&lt;/h3&gt;

&lt;p&gt;Create a script in &lt;code&gt;bin/&lt;/code&gt; that utilizes your modules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/usr/bin/env mush&lt;/span&gt;

log_info &lt;span class="s2"&gt;"Starting process..."&lt;/span&gt;
&lt;span class="c"&gt;# Your script logic here&lt;/span&gt;
log_info &lt;span class="s2"&gt;"Process completed."&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Make it executable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x bin/myscript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And run it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./bin/myscript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  4. Managing Dependencies
&lt;/h3&gt;

&lt;p&gt;Mush allows you to manage dependencies in an elegant way. You can install modules from external sources or repositories, ensuring your scripts remain lightweight and modular.&lt;/p&gt;

&lt;p&gt;To add an external module:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mush add https://github.com/example/shell-utils.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  5. Testing Your Shell Scripts
&lt;/h3&gt;

&lt;p&gt;Mush provides a built-in testing framework. Create a test script in &lt;code&gt;test/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# test/logger_test.sh&lt;/span&gt;
assert_log_info&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;output&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;log_info &lt;span class="s2"&gt;"Test message"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$output&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"[INFO] Test message"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run your tests with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mush &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;p&gt;Mush transforms shell scripting from a chaotic, hard-to-maintain practice into a structured and scalable development approach. By modularizing your scripts, automating dependency management, and integrating testing, you can build &lt;strong&gt;large-scale shell applications&lt;/strong&gt; with confidence.&lt;/p&gt;

&lt;p&gt;Ready to streamline your shell scripts? Try &lt;strong&gt;Mush&lt;/strong&gt; today and bring order to your codebase!&lt;/p&gt;

&lt;p&gt;🔗 &lt;a href="https://github.com/javanile/mush" rel="noopener noreferrer"&gt;Learn more about Mush&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>shell</category>
      <category>bash</category>
      <category>linux</category>
    </item>
    <item>
      <title>Unveiling the Power of Alphabetor: Enhancing Cryptographic Prowess and Password Mastery 🚀💻🔐</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Thu, 08 Feb 2024 09:01:52 +0000</pubDate>
      <link>https://dev.to/francescobianco/unveiling-the-power-of-alphabetor-enhancing-cryptographic-prowess-and-password-mastery-594</link>
      <guid>https://dev.to/francescobianco/unveiling-the-power-of-alphabetor-enhancing-cryptographic-prowess-and-password-mastery-594</guid>
      <description>&lt;p&gt;Are you a developer fascinated by the intricate world of cryptography? Do you find yourself intrigued by the art of crafting powerful passwords that stand as guardians of digital fortresses? If so, then let's embark on a journey together, exploring the significance of memorizing the alphabet's letter positions and how it can empower your cryptographic endeavors.&lt;/p&gt;

&lt;p&gt;Alphabetor, a captivating game crafted with the sole purpose of honing your memory of alphabetical order, serves as our gateway into this realm of cryptographic mastery. By engaging in this interactive challenge, you not only sharpen your ability to recall the sequence of letters in the alphabet but also lay the foundation for a deeper understanding of cryptographic principles.&lt;/p&gt;

&lt;p&gt;In the world of cybersecurity, where threats loom at every virtual corner, the ability to generate robust passwords swiftly and retain them securely is paramount. Here lies the crux of our discourse – the profound link between memorizing letter positions and the creation of potent passwords.&lt;/p&gt;

&lt;p&gt;Consider this: armed with the knowledge of the alphabet's order, you possess the key to construct passwords with unprecedented speed and complexity. Each letter's position becomes a building block in the fortress of your password, fortifying it against malicious intruders seeking to breach your defenses.&lt;/p&gt;

&lt;p&gt;Furthermore, mastering the alphabet's sequence empowers you to navigate cryptographic algorithms with finesse, unraveling their intricacies and harnessing their potential to safeguard sensitive data. Whether you're delving into symmetric or asymmetric encryption, your proficiency in alphabet memorization serves as a guiding star illuminating the path to cryptographic excellence.&lt;/p&gt;

&lt;p&gt;But let us not forget the practical implications of this endeavor. Beyond the realm of cryptography, the ability to swiftly recall letter positions fosters efficiency in various coding tasks, from array manipulation to string operations. It streamlines your workflow, enhancing productivity and proficiency in diverse programming endeavors.&lt;/p&gt;

&lt;p&gt;In essence, Alphabetor transcends the confines of a mere game; it becomes a gateway to unlocking the full spectrum of your cryptographic prowess and coding acumen. As you ascend the ranks of the leaderboard, remember the underlying significance of your quest – to forge stronger passwords, fortify digital defenses, and chart new frontiers in the realm of cybersecurity.&lt;/p&gt;

&lt;p&gt;So, fellow developers and cryptography enthusiasts, heed the call of Alphabetor. Let us embrace the challenge, empower ourselves with the knowledge of letter positions, and embark on a journey toward cryptographic excellence. Together, we shall conquer the virtual landscapes, safeguarding our digital realms with passwords forged in the crucible of our mastery.&lt;/p&gt;

&lt;p&gt;For those brave souls ready to embark on this noble quest, venture forth to Alphabetor's domain &lt;a href="https://github.com/francescobianco/alphabetor" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and may your endeavors be as legendary as the passwords you forge.&lt;/p&gt;

&lt;p&gt;This post is licensed under the MIT license. For more details, refer to the LICENSE file in the Alphabetor repository. 📝🔒🚀&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>password</category>
      <category>programming</category>
      <category>vanillajs</category>
    </item>
  </channel>
</rss>
