<?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.us-east-2.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>I turned Karpathy's LLM Wiki into a native GNOME app (and it works offline)</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Tue, 13 Oct 2026 10:57:28 +0000</pubDate>
      <link>https://dev.to/francescobianco/i-turned-karpathys-llm-wiki-into-a-native-gnome-app-and-it-works-offline-130c</link>
      <guid>https://dev.to/francescobianco/i-turned-karpathys-llm-wiki-into-a-native-gnome-app-and-it-works-offline-130c</guid>
      <description>&lt;p&gt;In April, Andrej Karpathy posted a short "idea file" called &lt;strong&gt;LLM Wiki&lt;/strong&gt;. The pitch: stop making your model re-read raw documents on every question. Let it &lt;strong&gt;build and maintain a wiki&lt;/strong&gt; from your sources instead, a persistent Markdown knowledge base that gets better every time you add something.&lt;/p&gt;

&lt;p&gt;The internet went wild. Within a week there were thousands of repos implementing it, and two of them crossed 20,000 GitHub stars.&lt;/p&gt;

&lt;p&gt;There was one thing missing for me: &lt;strong&gt;none of them felt at home on a Linux desktop.&lt;/strong&gt; So we built &lt;strong&gt;gknowledge&lt;/strong&gt;: Karpathy's LLM Wiki as a native GNOME app.&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/openapi" rel="noopener noreferrer"&gt;
        openapi
      &lt;/a&gt; / &lt;a href="https://github.com/openapi/gknowledge" rel="noopener noreferrer"&gt;
        gknowledge
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      🐧 A native GNOME knowledge workstation that turns documents into evolving AI-assisted knowledge bases.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/openapi/gknowledge/data/icons/hicolor/scalable/apps/io.gknowledge.Gknowledge.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fopenapi%2Fgknowledge%2FHEAD%2Fdata%2Ficons%2Fhicolor%2Fscalable%2Fapps%2Fio.gknowledge.Gknowledge.svg" alt="" width="96"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;gknowledge&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;b&gt;English&lt;/b&gt; · &lt;a href="https://github.com/openapi/gknowledge/README.zh-CN.md" rel="noopener noreferrer"&gt;简体中文&lt;/a&gt; · &lt;a href="https://github.com/openapi/gknowledge/README.it.md" rel="noopener noreferrer"&gt;Italiano&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;b&gt;Karpathy's LLM Wiki as a native GNOME app.&lt;/b&gt;&lt;br&gt;
  Drop in your documents. Get a linked wiki that an LLM keeps up to date.&lt;br&gt;
  A native GNOME app. Offline by default, plain Markdown on disk, Obsidian-compatible.&lt;br&gt;
  Bring your own brain: a local model, any OpenAI-compatible endpoint, or your own ChatGPT plan
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/openapi/gknowledge/LICENSE" rel="noopener noreferrer"&gt;&lt;img alt="License: MIT" src="https://camo.githubusercontent.com/d58f1b42b7c8a874a80466fe9e560532b2313004baa9d0082c963e21b499dfb6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6f70656e6170692f676b6e6f776c656467653f7374796c653d666f722d7468652d626164676526636f6c6f723d333538346534"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/3be27cfaca6b988b6cb65f63908d24d881497020c7e2f0a01899b75f10115604/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47544b2d342d3461383663663f7374796c653d666f722d7468652d6261646765266c6f676f3d67746b266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="GTK 4" src="https://camo.githubusercontent.com/3be27cfaca6b988b6cb65f63908d24d881497020c7e2f0a01899b75f10115604/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47544b2d342d3461383663663f7374796c653d666f722d7468652d6261646765266c6f676f3d67746b266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2fb1f68c93e8b014e0a315cc2baa8537e91c7ff9eba08f1638a04641fabd8a91/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6962616477616974612d312e352532422d3461383663663f7374796c653d666f722d7468652d6261646765266c6f676f3d676e6f6d65266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="Libadwaita" src="https://camo.githubusercontent.com/2fb1f68c93e8b014e0a315cc2baa8537e91c7ff9eba08f1638a04641fabd8a91/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6962616477616974612d312e352532422d3461383663663f7374796c653d666f722d7468652d6261646765266c6f676f3d676e6f6d65266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/cb29986e6021beff0a9b4f725e534dc3f669b5d4660491278cf13b328bbaeec1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5562756e74752d32342e30342532422d4539353432303f7374796c653d666f722d7468652d6261646765266c6f676f3d7562756e7475266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="Ubuntu 24.04+" src="https://camo.githubusercontent.com/cb29986e6021beff0a9b4f725e534dc3f669b5d4660491278cf13b328bbaeec1/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5562756e74752d32342e30342532422d4539353432303f7374796c653d666f722d7468652d6261646765266c6f676f3d7562756e7475266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://github.com/openapi/gknowledge/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;&lt;img alt="CI" src="https://camo.githubusercontent.com/52210641505afd76f79fbc570f1b8e9d92fd10123f4cb885cb7ab4774f46e7e2/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6f70656e6170692f676b6e6f776c656467652f63692e796d6c3f6272616e63683d6d61696e267374796c653d666c61742d737175617265266c6162656c3d4349"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/openapi/gknowledge/stargazers" rel="noopener noreferrer"&gt;&lt;img alt="Stars" src="https://camo.githubusercontent.com/cd47ce2a4ad6aa1e8eb9cf6eef72a432dfaede7eeb78adc7c1faabf437437a68/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f6f70656e6170692f676b6e6f776c656467653f7374796c653d666c61742d737175617265266c6f676f3d676974687562"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/openapi/gknowledge/issues" rel="noopener noreferrer"&gt;&lt;img alt="Issues" src="https://camo.githubusercontent.com/69ad90d8006ddb67be9e87e21e603a3ca253e490a2ec831f72d42d0c61a532d4/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f6f70656e6170692f676b6e6f776c656467653f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/9820b70f6bcddf0de566f0c683904cd6bc8dd68ef39bc998a952355c7a31960d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6f70656e6170692f676b6e6f776c656467653f7374796c653d666c61742d737175617265"&gt;&lt;img alt="Last commit" src="https://camo.githubusercontent.com/9820b70f6bcddf0de566f0c683904cd6bc8dd68ef39bc998a952355c7a31960d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f6f70656e6170692f676b6e6f776c656467653f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/openapi/gknowledge/releases/latest" rel="noopener noreferrer"&gt;&lt;img alt="Latest release" src="https://camo.githubusercontent.com/f89698a869dc8b29a91e588c2efe7476f5daf541800bf1d71c952436046621ae/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f762f72656c656173652f6f70656e6170692f676b6e6f776c656467653f7374796c653d666c61742d73717561726526636f6c6f723d453935343230"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/dc80024dc93b3a253fb677dd4be954e4d8c6264674eca220cf5e9b993852e3a2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31302532422d3337373641423f7374796c653d666c61742d737175617265266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="Python 3.10+" src="https://camo.githubusercontent.com/dc80024dc93b3a253fb677dd4be954e4d8c6264674eca220cf5e9b993852e3a2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d332e31302532422d3337373641423f7374796c653d666c61742d737175617265266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8a63b228a6e5d0727dff3cb945a56e9eca3befd9ca3a03714edca58f112176aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6f66666c696e652d66697273742d3265613034333f7374796c653d666c61742d737175617265"&gt;&lt;img alt="Offline first" src="https://camo.githubusercontent.com/8a63b228a6e5d0727dff3cb945a56e9eca3befd9ca3a03714edca58f112176aa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6f66666c696e652d66697273742d3265613034333f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f97e4bb7eccfa1b82f97cf3d5f271184e06c0e86d865804f6b521ae88c4a7f3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492532306b65792d6e6f7425323072657175697265642d3265613034333f7374796c653d666c61742d737175617265"&gt;&lt;img alt="No API key needed" src="https://camo.githubusercontent.com/f97e4bb7eccfa1b82f97cf3d5f271184e06c0e86d865804f6b521ae88c4a7f3e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4150492532306b65792d6e6f7425323072657175697265642d3265613034333f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/56ac579447ee8a8a295d924859b4e2a5357f2d3f878d91177689a2bf57cd0a4e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6273696469616e2d636f6d70617469626c652d3743334145443f7374796c653d666c61742d737175617265266c6f676f3d6f6273696469616e266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="Obsidian compatible" src="https://camo.githubusercontent.com/56ac579447ee8a8a295d924859b4e2a5357f2d3f878d91177689a2bf57cd0a4e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6273696469616e2d636f6d70617469626c652d3743334145443f7374796c653d666c61742d737175617265266c6f676f3d6f6273696469616e266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/6916f8062e84aecea72da9e62c85b28e927af9608c098b9ece817535a50b92b8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7061747465726e2d4b617270617468792532304c4c4d25323057696b692d6635396530623f7374796c653d666c61742d737175617265"&gt;&lt;img alt="Karpathy LLM Wiki pattern" src="https://camo.githubusercontent.com/6916f8062e84aecea72da9e62c85b28e927af9608c098b9ece817535a50b92b8/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7061747465726e2d4b617270617468792532304c4c4d25323057696b692d6635396530623f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/0dc7901095b9d7232841aa8d7dfbeac1175aec724d85bac55a0d0361fbba2bef/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5369676e253230696e253230776974682d436861744750542d3130613337663f7374796c653d666c61742d737175617265266c6f676f3d6f70656e6169266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="Sign in with ChatGPT" src="https://camo.githubusercontent.com/0dc7901095b9d7232841aa8d7dfbeac1175aec724d85bac55a0d0361fbba2bef/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5369676e253230696e253230776974682d436861744750542d3130613337663f7374796c653d666c61742d737175617265266c6f676f3d6f70656e6169266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b61d7abf8fb7521215d6c8362ea95f2495295970a6548abbe1b9dae3b80e4cbd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6c6c616d612d737570706f727465642d3030303030303f7374796c653d666c61742d737175617265"&gt;&lt;img alt="Ollama" src="https://camo.githubusercontent.com/b61d7abf8fb7521215d6c8362ea95f2495295970a6548abbe1b9dae3b80e4cbd/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4f6c6c616d612d737570706f727465642d3030303030303f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/2dd71b2639777f7717129c96eaeb0b3f54fd0d624f6f676006c498a7097b4856/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c617470616b2d706c616e6e65642d3461383663663f7374796c653d666c61742d737175617265266c6f676f3d666c617470616b266c6f676f436f6c6f723d7768697465"&gt;&lt;img alt="Flatpak planned" src="https://camo.githubusercontent.com/2dd71b2639777f7717129c96eaeb0b3f54fd0d624f6f676006c498a7097b4856/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466c617470616b2d706c616e6e65642d3461383663663f7374796c653d666c61742d737175617265266c6f676f3d666c617470616b266c6f676f436f6c6f723d7768697465"&gt;&lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/b48efa9867bbd52c3af5f6a0793b8a344c49fd9fd22868c47fc5383617f8b454/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d6666363962343f7374796c653d666c61742d737175617265"&gt;&lt;img alt="PRs welcome" src="https://camo.githubusercontent.com/b48efa9867bbd52c3af5f6a0793b8a344c49fd9fd22868c47fc5383617f8b454/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d6666363962343f7374796c653d666c61742d737175617265"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a rel="noopener noreferrer" href="https://github.com/openapi/gknowledge/docs/gknowledge-demo.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fopenapi%2Fgknowledge%2FHEAD%2Fdocs%2Fgknowledge-demo.svg" alt="gknowledge in action: drop in AI research papers, get a linked wiki, ask a question and get an answer with citations" width="880"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
  Real output of the offline engine on six AI papers (&lt;code&gt;data/demo/papers&lt;/code&gt;), no API key
  Regenerate with &lt;code&gt;make demo-svg&lt;/code&gt;.
&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;One line, on Ubuntu 24.04+ and Debian 13+&lt;/strong&gt; (falls back to a per-user install on other distributions):&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;curl -fsSL https://github.com/openapi/gknowledge/releases/latest/download/install.sh &lt;span class="pl-k"&gt;|&lt;/span&gt; bash&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Or download the package&lt;/strong&gt; and install it with apt, which also pulls GTK 4, Libadwaita and PyGObject:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/openapi/gknowledge/releases/latest/download/gknowledge_all.deb" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f5357235a746757a6282744dc76cbd3feae666ddee02779444424c3d3aea0516/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646f776e6c6f61642d676b6e6f776c656467655f5f616c6c2e6465622d4539353432303f7374796c653d666f722d7468652d6261646765266c6f676f3d7562756e7475266c6f676f436f6c6f723d7768697465" alt="Download .deb"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;wget https://github.com/openapi/gknowledge/releases/latest/download/gknowledge_all.deb
sudo apt install ./gknowledge_all.deb&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Then open &lt;strong&gt;gknowledge&lt;/strong&gt; from the app grid. To remove it: &lt;code&gt;sudo apt remove gknowledge&lt;/code&gt;.&lt;/p&gt;

Other distributions, from source, and release builds
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fedora, Arch and others:&lt;/strong&gt; install…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/openapi/gknowledge" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  What it does, in 30 seconds
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Drop in your documents.&lt;/strong&gt; Markdown, text, PDF, HTML. Papers, notes, specs, whatever you are trying to understand.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;gknowledge builds a linked wiki.&lt;/strong&gt; Every source gets a summary page; the people, systems and ideas it talks about get their own pages; everything is cross-linked with &lt;code&gt;[[wikilinks]]&lt;/code&gt; and every page records where it came from.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ask questions.&lt;/strong&gt; Answers come from the wiki, with numbered citations you can click to open the page they came from.&lt;/li&gt;
&lt;/ol&gt;

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

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

&lt;p&gt;The whole knowledge base is a plain folder of Markdown files with YAML frontmatter. Open it in Obsidian, grep it, put it in git. No lock-in, no sync service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why another LLM wiki?
&lt;/h2&gt;

&lt;p&gt;Because the existing ones are great, but they are web apps in a desktop costume. gknowledge makes different trade-offs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐧 &lt;strong&gt;Native GTK 4 + Libadwaita.&lt;/strong&gt; No Electron, no Tauri, no embedded browser. It follows the GNOME HIG, uses a Nautilus-style sidebar, and respects your light/dark theme and accent colour.&lt;/li&gt;
&lt;li&gt;🔌 &lt;strong&gt;Works with no model at all.&lt;/strong&gt; A built-in offline engine ingests documents and answers with extracts. Plug in a model when you want real synthesis.&lt;/li&gt;
&lt;li&gt;🔑 &lt;strong&gt;Bring your own brain, without an API key.&lt;/strong&gt; gknowledge supports OpenAI's new &lt;strong&gt;Sign in with ChatGPT&lt;/strong&gt; for local, open-source apps: you log in with your own Plus or Pro plan, and usage is charged to &lt;em&gt;your&lt;/em&gt; plan. Nobody resells tokens. Ollama, LM Studio and any OpenAI-compatible endpoint work too.&lt;/li&gt;
&lt;li&gt;🧹 &lt;strong&gt;No wiki spam.&lt;/strong&gt; LLM wikis love to generate hundreds of one-line stub pages. gknowledge only creates a page when there is real content, merges duplicates ("Retrieval-Augmented Generation (RAG)" and "retrieval augmented generation" are the same page; "Kasparov" links to "Garry Kasparov"), and keeps minor names as mentions until a second source cites them. On our sample of six AI papers that took the wiki from &lt;strong&gt;114 pages to 64&lt;/strong&gt;, all of them with an actual description.&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Agents welcome.&lt;/strong&gt; gknowledge ships an MCP server, so Claude Code, Codex or Cursor can search, read, ask and add sources to the same wiki you browse in the app:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add gknowledge &lt;span class="nt"&gt;--&lt;/span&gt; gknowledge-mcp ~/Knowledge/my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How it compares
&lt;/h2&gt;

&lt;p&gt;All of these are excellent open-source projects and worth your time. Here is where gknowledge sits (GitHub numbers as of October 2026):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;gknowledge&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;LLM Wiki (nashsu)&lt;/th&gt;
&lt;th&gt;Tolaria&lt;/th&gt;
&lt;th&gt;OpenKnowledge&lt;/th&gt;
&lt;th&gt;Reor&lt;/th&gt;
&lt;th&gt;Khoj&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;UI&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;native GTK 4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Tauri&lt;/td&gt;
&lt;td&gt;Tauri&lt;/td&gt;
&lt;td&gt;Electron&lt;/td&gt;
&lt;td&gt;Electron&lt;/td&gt;
&lt;td&gt;web, Electron&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works with no model&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;AI optional&lt;/td&gt;
&lt;td&gt;agent-driven&lt;/td&gt;
&lt;td&gt;local model&lt;/td&gt;
&lt;td&gt;self-host&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Markdown vault&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;reads your files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP server&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;not checked&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;License&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;MIT&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;GPL-3.0&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;td&gt;AGPL-3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Status&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;new&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~20.5k ⭐&lt;/td&gt;
&lt;td&gt;~20k ⭐&lt;/td&gt;
&lt;td&gt;~4.5k ⭐&lt;/td&gt;
&lt;td&gt;archived&lt;/td&gt;
&lt;td&gt;~37.7k ⭐&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you love LLM Wiki's knowledge graph or Tolaria's git-first editor, keep using them. If you live on GNOME or Ubuntu and want something that feels like Files or Text Editor, that is exactly the gap gknowledge is trying to fill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;On Ubuntu 24.04+ or Debian 13+:&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://github.com/openapi/gknowledge/releases/latest/download/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or grab the &lt;code&gt;.deb&lt;/code&gt; from the &lt;a href="https://github.com/openapi/gknowledge/releases/latest" rel="noopener noreferrer"&gt;latest release&lt;/a&gt;. On other distros the installer puts it in &lt;code&gt;~/.local&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Want to hack on it? &lt;code&gt;git clone&lt;/code&gt;, then &lt;code&gt;make start&lt;/code&gt;: it opens a demo project with six classic AI papers already ingested and &lt;strong&gt;restarts the app every time you save a file&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Lint: find contradictions, orphans and stale pages, like Karpathy describes.&lt;/li&gt;
&lt;li&gt;A knowledge graph view.&lt;/li&gt;
&lt;li&gt;Faster parallel ingestion and streaming answers.&lt;/li&gt;
&lt;li&gt;Flatpak, a PPA and a Snap.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is early (v0.2), MIT licensed and moving fast. Full disclosure: I'm one of the people building it, so I'd genuinely love to hear what would make you switch, and what feels wrong. Issues and PRs are very welcome.&lt;/p&gt;

&lt;p&gt;If this is the kind of tool you want to exist on the Linux desktop, &lt;strong&gt;a ⭐ on &lt;a href="https://github.com/openapi/gknowledge" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; really helps&lt;/strong&gt; other GNOME users find it.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>opensource</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I estimated chess players' Elo from one game — then calibrated it on 14,307 rated games</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Sun, 11 Oct 2026 19:20:08 +0000</pubDate>
      <link>https://dev.to/francescobianco/i-estimated-chess-players-elo-from-one-game-then-calibrated-it-on-14307-rated-games-go9</link>
      <guid>https://dev.to/francescobianco/i-estimated-chess-players-elo-from-one-game-then-calibrated-it-on-14307-rated-games-go9</guid>
      <description>&lt;p&gt;I'm building &lt;a href="https://github.com/francescobianco/pragma-chess" rel="noopener noreferrer"&gt;Pragma Chess&lt;/a&gt;, a free, MIT-licensed chess database and analysis app (C++20, Qt 6, Windows/macOS/Linux). After an online game it evaluates every move with the engine and shows an estimated Elo for both players.&lt;/p&gt;

&lt;p&gt;My first version used a curve that is often quoted around the web:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Elo ≈ 3100 · e^(−0.01 · ACPL)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;where ACPL is the &lt;em&gt;average centipawn loss&lt;/em&gt;: how much each move worsens the engine's evaluation, averaged over a player's moves. It rated Paul Morphy's famous Opera game at &lt;strong&gt;2904&lt;/strong&gt;. My own first reaction: &lt;em&gt;Carlsen is barely 2800.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here is what it took to make the number believable.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Short games lie
&lt;/h2&gt;

&lt;p&gt;The Opera game is 17 moves of forcing play against two weak opponents: of course the loss is tiny. So an estimate &lt;strong&gt;above&lt;/strong&gt; an average player is drawn towards 1500 by the number of moves:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;weight = moves / (moves + 12)
elo    = 1500 + (raw - 1500) · weight
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only from above. A few good moves may simply be easy ones; a few blunders are evidence. A player who gets nothing right must be measured weak, however short the game.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Lost positions hide blunders
&lt;/h2&gt;

&lt;p&gt;Evaluations are bounded to ±10 pawns, so a mate doesn't swamp the average. But that has a side effect: once a game is lost beyond the bound, every further blunder costs &lt;em&gt;nothing&lt;/em&gt;, and a weak player looks perfect. Moves in a position that is decided before &lt;strong&gt;and&lt;/strong&gt; after the move are not judged. A move that changes the outcome still is.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Measure instead of guessing
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://database.lichess.org/" rel="noopener noreferrer"&gt;lichess open database&lt;/a&gt; has both players' ratings on every game, and some games carry the server's own Stockfish evaluation after every move (&lt;code&gt;[%eval]&lt;/code&gt;). A short Python script (no engine run, 14 seconds) measured &lt;strong&gt;14,307 players' games&lt;/strong&gt; rated 800–2343, the same way the app measures them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Lichess rating&lt;/th&gt;
&lt;th&gt;Typical loss per move&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1000–1199&lt;/td&gt;
&lt;td&gt;1.13 pawns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1400–1599&lt;/td&gt;
&lt;td&gt;0.77&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1800–1999&lt;/td&gt;
&lt;td&gt;0.51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2200–2399&lt;/td&gt;
&lt;td&gt;0.21&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  4. One game says little — so don't regress
&lt;/h2&gt;

&lt;p&gt;The correlation between one game's ACPL and the player's rating is only about &lt;strong&gt;0.36&lt;/strong&gt;. A plain regression (rating from ACPL) therefore predicts 1500–1700 for &lt;em&gt;everyone&lt;/em&gt;: weak play never measures weak.&lt;/p&gt;

&lt;p&gt;So the curve goes the other way round, through each band's &lt;em&gt;typical&lt;/em&gt; loss:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Elo = 5189 − 849 · ln(ACPL)&lt;/strong&gt;, bounded to 100–2850&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Someone who loses what 1100s lose is called 1100. (Counting blunders, by the way, barely helped: 0.39 instead of 0.36. They carry the same information as the average loss.)&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Then I played
&lt;/h2&gt;

&lt;p&gt;I won a game after my opponent dropped the queen on move 13, and the app gave me &lt;strong&gt;2000&lt;/strong&gt;. I'm not. The problem: once you're winning, good moves are easy, and they pull your average loss down. So moves are weighed by the advantage they were played with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;level or behind: every move counts once;&lt;/li&gt;
&lt;li&gt;ahead, a good move (under half a pawn lost) counts less — but never under 0.3, or the winner's average would be made of their mistakes alone;&lt;/li&gt;
&lt;li&gt;ahead, a mistake counts more, up to twice: that's sloppiness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That game now reads about 1530 for me and 1440 for my opponent. I'd have put them lower still — but 0.83 pawns lost a move &lt;em&gt;is&lt;/em&gt; what lichess players around 1440 typically lose, so I trust the data over my feeling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stands
&lt;/h2&gt;

&lt;p&gt;It's an estimate of the level shown in &lt;em&gt;one&lt;/em&gt; game, on lichess's scale, and it says so: rough, some hundreds of points either way. The next step would be weighing how hard each position was, as Ken Regan's &lt;em&gt;Intrinsic Performance Rating&lt;/em&gt; does with several engine lines per position.&lt;/p&gt;

&lt;p&gt;The code is pure C++ with unit tests (&lt;code&gt;app/PlayStrength&lt;/code&gt;), and the calibration script is in the repo: &lt;a href="https://github.com/francescobianco/pragma-chess/blob/main/scripts/calibrate-play-strength.py" rel="noopener noreferrer"&gt;&lt;code&gt;scripts/calibrate-play-strength.py&lt;/code&gt;&lt;/a&gt;. The whole story, mistakes included, is in &lt;a href="https://github.com/francescobianco/pragma-chess/blob/main/docs/tech/game-evaluation.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/tech/game-evaluation.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;How would you model it? I'd love to hear it — and if you speak a language other than English, Italian or Spanish, &lt;a href="https://github.com/francescobianco/pragma-chess/issues/4" rel="noopener noreferrer"&gt;translations are very welcome&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>opensource</category>
      <category>cpp</category>
      <category>chess</category>
    </item>
    <item>
      <title>What If 1,000 Developers Bought Their AI Tokens Together?</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Wed, 16 Sep 2026 09:48:56 +0000</pubDate>
      <link>https://dev.to/francescobianco/what-if-1000-developers-bought-their-ai-tokens-together-abl</link>
      <guid>https://dev.to/francescobianco/what-if-1000-developers-bought-their-ai-tokens-together-abl</guid>
      <description>&lt;p&gt;We all buy AI tokens in the dumbest possible way.&lt;/p&gt;

&lt;p&gt;One developer opens an account with an LLM provider.&lt;/p&gt;

&lt;p&gt;Another developer does the same.&lt;/p&gt;

&lt;p&gt;Then another.&lt;/p&gt;

&lt;p&gt;We each put $5, $10, $20 into separate accounts. We each get retail pricing, separate limits, separate balances, and absolutely zero purchasing power.&lt;/p&gt;

&lt;p&gt;Meanwhile, most of us don't even consume AI compute consistently.&lt;/p&gt;

&lt;p&gt;One week we're burning tokens on an agent experiment.&lt;/p&gt;

&lt;p&gt;The next week we're barely using the API.&lt;/p&gt;

&lt;p&gt;So I started wondering:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What if we stopped buying AI inference individually?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Imagine 1,000 developers putting $5 into the same pot
&lt;/h2&gt;

&lt;p&gt;That's $5,000 every month.&lt;/p&gt;

&lt;p&gt;Not venture capital.&lt;/p&gt;

&lt;p&gt;Not a startup subscription.&lt;/p&gt;

&lt;p&gt;Not another “AI platform.”&lt;/p&gt;

&lt;p&gt;Just 1,000 developers collectively funding a shared pool of LLM inference.&lt;/p&gt;

&lt;p&gt;You contribute $5.&lt;/p&gt;

&lt;p&gt;You authenticate with GitHub.&lt;/p&gt;

&lt;p&gt;You get an API key.&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;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://api.tokenpot.example/v1
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;sk_...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that's it.&lt;/p&gt;

&lt;p&gt;Use it from your scripts.&lt;/p&gt;

&lt;p&gt;Use it from your agents.&lt;/p&gt;

&lt;p&gt;Use it from your applications.&lt;/p&gt;

&lt;p&gt;Use it from whatever already speaks the OpenAI-compatible API.&lt;/p&gt;

&lt;p&gt;Behind that endpoint, the community pool purchases inference from one or multiple providers.&lt;/p&gt;

&lt;p&gt;I call the idea &lt;strong&gt;TokenPot&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interesting part isn't the API
&lt;/h2&gt;

&lt;p&gt;Building an OpenAI-compatible proxy isn't particularly interesting.&lt;/p&gt;

&lt;p&gt;We already know how to do that.&lt;/p&gt;

&lt;p&gt;The interesting part is the economics.&lt;/p&gt;

&lt;p&gt;Suppose 1,000 people contribute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000 × $5 = $5,000/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of pretending that every $5 buys some arbitrary fixed number of tokens, TokenPot would look at how much compute the community can actually afford.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monthly contributions       $5,000

LLM providers               $4,300
Infrastructure                $200
Community reserve             $500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The available compute is then distributed among members according to public rules.&lt;/p&gt;

&lt;p&gt;No mysterious “unlimited*” plan.&lt;/p&gt;

&lt;p&gt;No hidden fair-use policy.&lt;/p&gt;

&lt;p&gt;No magic.&lt;/p&gt;

&lt;p&gt;Just a pool.&lt;/p&gt;

&lt;h2&gt;
  
  
  And then something interesting happens
&lt;/h2&gt;

&lt;p&gt;Not everybody uses their allocation.&lt;/p&gt;

&lt;p&gt;Alice may be building an agent this month and consume everything she can get.&lt;/p&gt;

&lt;p&gt;Bob might make three API calls.&lt;/p&gt;

&lt;p&gt;Carol could be on vacation.&lt;/p&gt;

&lt;p&gt;At the individual level, AI consumption is extremely irregular.&lt;/p&gt;

&lt;p&gt;At the community level, it starts becoming a pool of capacity.&lt;/p&gt;

&lt;p&gt;Unused capacity doesn't need to become somebody's margin.&lt;/p&gt;

&lt;p&gt;It can become &lt;strong&gt;somebody else's inference&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's the part I find fascinating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Now imagine 10,000 developers
&lt;/h2&gt;

&lt;p&gt;The pot becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10,000 × $5 = $50,000/month
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Something changes at that point.&lt;/p&gt;

&lt;p&gt;You're no longer 10,000 tiny customers buying inference independently.&lt;/p&gt;

&lt;p&gt;You're one community purchasing tens of thousands of dollars of inference every month.&lt;/p&gt;

&lt;p&gt;That potentially means negotiating volume pricing, committed spend, reserved capacity or direct agreements with inference providers.&lt;/p&gt;

&lt;p&gt;And here's the crucial difference between this idea and a traditional AI company:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;if the community obtains a better price, the community gets more compute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal isn't:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;maximize(revenue - compute_cost)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;maximize(compute_per_member)

while:

pool_is_sustainable == true
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  I want the numbers to be public
&lt;/h2&gt;

&lt;p&gt;Imagine opening TokenPot and seeing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Active members              1,284
Monthly contributions      $6,420

Provider spending          $5,430
Infrastructure               $240
Reserve                      $750

Pool utilization             71.3%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And perhaps the most interesting number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Average contribution          $5.00
Retail-equivalent compute    $17.40

Community leverage             3.48x
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that leverage is 1.01x, the experiment isn't particularly useful.&lt;/p&gt;

&lt;p&gt;If it's 2x, things become interesting.&lt;/p&gt;

&lt;p&gt;If a sufficiently large community can consistently turn $5 into $15 or $20 worth of individually purchased inference, then we've demonstrated something.&lt;/p&gt;

&lt;p&gt;Not an AI breakthrough.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;purchasing breakthrough&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why GitHub?
&lt;/h2&gt;

&lt;p&gt;Because this is intended for developers and open-source communities.&lt;/p&gt;

&lt;p&gt;The simplest experience I can imagine is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Login
     ↓
$5 monthly contribution
     ↓
Generate API key
     ↓
Start calling the API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your API key should be boring.&lt;/p&gt;

&lt;p&gt;Create it.&lt;/p&gt;

&lt;p&gt;Use it.&lt;/p&gt;

&lt;p&gt;If you accidentally publish it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;burn it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Generate another one.&lt;/p&gt;

&lt;p&gt;No enterprise IAM dashboard required to call a language model from a weekend project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better yet: create your own pot
&lt;/h2&gt;

&lt;p&gt;TokenPot shouldn't necessarily mean one giant global pool.&lt;/p&gt;

&lt;p&gt;That's where the open-source part gets much more interesting.&lt;/p&gt;

&lt;p&gt;I want the software itself to be deployable.&lt;/p&gt;

&lt;p&gt;A group of friends could create a pool.&lt;/p&gt;

&lt;p&gt;An open-source community could create one.&lt;/p&gt;

&lt;p&gt;A university lab could create one.&lt;/p&gt;

&lt;p&gt;A hackerspace could create one.&lt;/p&gt;

&lt;p&gt;A company team could create one.&lt;/p&gt;

&lt;p&gt;Bring your own providers, define your contribution model, define your allocation rules and run your own pool.&lt;/p&gt;

&lt;p&gt;So there are really two invitations:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Create your own TokenPot with your friends or community.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Join the public pool, contribute $5/month, and use the shared compute for your work, experiments, agents and APIs.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  There are hard problems
&lt;/h2&gt;

&lt;p&gt;Of course there are.&lt;/p&gt;

&lt;p&gt;Provider terms need to permit this kind of multi-user inference gateway.&lt;/p&gt;

&lt;p&gt;Abuse needs to be controlled.&lt;/p&gt;

&lt;p&gt;A leaked API key must not be capable of burning the community's monthly budget.&lt;/p&gt;

&lt;p&gt;Accounting and taxation need to be handled correctly.&lt;/p&gt;

&lt;p&gt;“Donation”, “sponsorship”, “membership” and “paying for a service” aren't interchangeable words just because the project is open source.&lt;/p&gt;

&lt;p&gt;Rate limiting needs to be fair.&lt;/p&gt;

&lt;p&gt;The reserve needs clear rules.&lt;/p&gt;

&lt;p&gt;And the allocation algorithm needs to work when somebody inevitably tries to consume half the planet's GPUs for their $5.&lt;/p&gt;

&lt;p&gt;These aren't details to hide.&lt;/p&gt;

&lt;p&gt;They're part of the experiment.&lt;/p&gt;

&lt;p&gt;And I think the rules should be developed &lt;strong&gt;in public&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Maybe this doesn't work
&lt;/h2&gt;

&lt;p&gt;That's another reason I want to build it.&lt;/p&gt;

&lt;p&gt;There's a very simple hypothesis underneath TokenPot:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Can 100 developers putting $5 each into a transparent shared pool obtain materially more useful LLM inference than 100 developers independently spending those same $5?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We don't need one million users to answer that.&lt;/p&gt;

&lt;p&gt;We might not even need one thousand.&lt;/p&gt;

&lt;p&gt;Start with 100.&lt;/p&gt;

&lt;p&gt;That's a $500 pot.&lt;/p&gt;

&lt;p&gt;Measure everything.&lt;/p&gt;

&lt;p&gt;Publish everything.&lt;/p&gt;

&lt;p&gt;See what happens.&lt;/p&gt;

&lt;p&gt;If the economics don't work, we'll have numbers showing why.&lt;/p&gt;

&lt;p&gt;If they do work...&lt;/p&gt;

&lt;p&gt;then things get interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI models are centralized. Purchasing doesn't have to be.
&lt;/h2&gt;

&lt;p&gt;We're spending a lot of time discussing which model is smartest, which agent framework will win and which provider has the cheapest tokens this week.&lt;/p&gt;

&lt;p&gt;Maybe there's another layer worth experimenting with.&lt;/p&gt;

&lt;p&gt;Not another model.&lt;/p&gt;

&lt;p&gt;Not another agent.&lt;/p&gt;

&lt;p&gt;Not another wrapper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Collective purchasing infrastructure for AI compute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The models can remain where they are.&lt;/p&gt;

&lt;p&gt;The providers can compete.&lt;/p&gt;

&lt;p&gt;The community simply becomes a smarter buyer.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;TokenPot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pool your budget. Share the compute.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Would you put $5 into the pot?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>developers</category>
      <category>llm</category>
    </item>
    <item>
      <title>The Silicon Valley Feed Is Rigged</title>
      <dc:creator>Francesco Bianco</dc:creator>
      <pubDate>Fri, 24 Apr 2026 15:27:30 +0000</pubDate>
      <link>https://dev.to/francescobianco/the-silicon-valley-feed-is-rigged-2j17</link>
      <guid>https://dev.to/francescobianco/the-silicon-valley-feed-is-rigged-2j17</guid>
      <description>&lt;p&gt;For years, we’ve been told a story.&lt;/p&gt;

&lt;p&gt;That platforms like Hacker News are meritocratic.&lt;br&gt;
That the best ideas rise.&lt;br&gt;
That quality finds its way to the top.&lt;/p&gt;

&lt;p&gt;It’s not true.&lt;/p&gt;

&lt;p&gt;What rises is what the system decides should rise.&lt;/p&gt;

&lt;p&gt;Algorithms, heuristics, moderation layers — all invisible, all unaccountable — shape what you see, what grows, and what disappears. Not by banning. Not by censoring.&lt;/p&gt;

&lt;p&gt;By quietly burying.&lt;/p&gt;

&lt;p&gt;If your idea doesn’t fit the pattern, it doesn’t matter how good it is.&lt;br&gt;
It won’t be seen.&lt;/p&gt;

&lt;p&gt;That’s not meritocracy.&lt;/p&gt;

&lt;p&gt;That’s control.&lt;/p&gt;

&lt;p&gt;And Silicon Valley loves it that way.&lt;/p&gt;

&lt;p&gt;Because controlling distribution means controlling attention.&lt;br&gt;
And controlling attention means controlling outcomes.&lt;/p&gt;


&lt;h2&gt;
  
  
  We Don’t Need Better Algorithms
&lt;/h2&gt;

&lt;p&gt;We need fewer of them.&lt;/p&gt;

&lt;p&gt;Not a fairer ranking.&lt;br&gt;
Not a more transparent feed.&lt;/p&gt;

&lt;p&gt;No feed.&lt;/p&gt;


&lt;h2&gt;
  
  
  Hackerboard
&lt;/h2&gt;

&lt;p&gt;Hackerboard is a rejection of the entire model.&lt;/p&gt;

&lt;p&gt;No algorithm.&lt;br&gt;
No ranking.&lt;br&gt;
No gatekeeping.&lt;/p&gt;

&lt;p&gt;If something is posted, it exists — and stays visible.&lt;/p&gt;

&lt;p&gt;No one decides what deserves attention.&lt;br&gt;
No one filters.&lt;br&gt;
No one optimizes.&lt;/p&gt;

&lt;p&gt;Everything is there.&lt;/p&gt;


&lt;h2&gt;
  
  
  AI Is Allowed. Fully.
&lt;/h2&gt;

&lt;p&gt;No “human verification”.&lt;br&gt;
No authenticity policing.&lt;/p&gt;

&lt;p&gt;Humans, bots, agents — same rules.&lt;/p&gt;

&lt;p&gt;Because the moment you start deciding what counts, you’re back to the same system.&lt;/p&gt;


&lt;h2&gt;
  
  
  Want Signal? Build It Yourself.
&lt;/h2&gt;

&lt;p&gt;Hackerboard doesn’t rank.&lt;br&gt;
It doesn’t filter.&lt;br&gt;
It doesn’t curate.&lt;/p&gt;

&lt;p&gt;If you want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;quality&lt;/li&gt;
&lt;li&gt;signal&lt;/li&gt;
&lt;li&gt;prioritization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;build your own tools.&lt;/p&gt;

&lt;p&gt;Scrape it.&lt;br&gt;
Model it.&lt;br&gt;
Rank it your way.&lt;/p&gt;

&lt;p&gt;We just guarantee one thing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nothing gets buried.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  This Is Not a Product
&lt;/h2&gt;

&lt;p&gt;It’s a stance.&lt;/p&gt;

&lt;p&gt;Against invisible control.&lt;br&gt;
Against algorithmic gatekeeping.&lt;br&gt;
Against the idea that a closed system should decide what the internet sees.&lt;/p&gt;


&lt;h2&gt;
  
  
  Post Where You Want
&lt;/h2&gt;

&lt;p&gt;If you want to play the algorithm, stay where you are.&lt;/p&gt;

&lt;p&gt;If you want your work to simply exist — without negotiation, without optimization, without permission:&lt;/p&gt;

&lt;p&gt;Post on Hackerboard.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://hackerboard.github.io/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;hackerboard.github.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;





&lt;p&gt;&lt;strong&gt;Like Hacker News, but nothing gets killed.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>siliconvalley</category>
      <category>community</category>
      <category>culture</category>
      <category>inclusion</category>
    </item>
    <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>
  </channel>
</rss>
