<?xml version="1.0" encoding="UTF-8"?>
<rss 
    version="2.0"
    xmlns:dc="http://purl.org/dc/elements/1.1/" 
    xmlns:content="http://purl.org/rss/1.0/modules/content/" 
    xmlns:atom="http://www.w3.org/2005/Atom" 
    xmlns:media="http://search.yahoo.com/mrss/" 
>
    <channel>
        <title><![CDATA[Linux Handbook]]></title>
        <description><![CDATA[An independent, reader-supported publication focusing on Linux Command Line, Server, Self-hosting, DevOps and Cloud Learning]]></description>
        <link>https://linuxhandbook.com</link>
        <image>
            <url>https://linuxhandbook.com/favicon.png</url>
            <title>Linux Handbook</title>
            <link>https://linuxhandbook.com</link>
        </image>
        <generator>Ghost 6.47</generator>
        <lastBuildDate>Sun, 12 Jul 2026 11:47:31 +0530</lastBuildDate>
        <atom:link href="https://linuxhandbook.com" rel="self" type="application/rss+xml"/>
        <ttl>60</ttl>

                <item>
                    <title><![CDATA[LHB Linux Digest #26.08: Two Kernel Bugs You Need to Know, SSH Tunneling, and AI Pentesting]]></title>
                    <description><![CDATA[Imagine you could automate pentesting with a bunch of AI agents.]]></description>
                    <link>https://linuxhandbook.com/newsletter/26-09/</link>
                    <guid isPermaLink="false">6a4f88cf3dddcd0001738f30</guid>

                        <category><![CDATA[Newsletter]]></category>

                        <dc:creator><![CDATA[Abhishek Prakash]]></dc:creator>

                    <pubDate>Fri, 10 Jul 2026 17:21:32 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/lhb-newsletter.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/lhb-newsletter.png" alt="LHB Linux Digest #26.08: Two Kernel Bugs You Need to Know, SSH Tunneling, and AI Pentesting"/> <p>Short one this week my friend, energy's a bit low on my end, but two kernel vulnerabilities landed that are too important to skip, so let's get into it.</p><p>Two old, nasty kernel bugs got public exploits this week. If you're running KVM or any kind of multi-tenant containers, this is a "patch today, not this weekend" situation.</p><p><a href="https://thehackernews.com/2026/07/15-year-old-ghostlock-flaw-enables-root.html?ref=linuxhandbook.com">GhostLock (CVE-2026-43499) is a 15-year-old use-after-free bug</a> in the Linux kernel's futex/rtmutex subsystem. It lets an unprivileged local user grab root and escape containers on unpatched systems. This one's been sitting quietly since 2011, affects pretty much every major distro, and researchers have already shown a reliable exploit that gets root in about five seconds. It also breaks container isolation, so if you're self-hosting anything multi-tenant, take this seriously.</p><p><a href="https://www.bleepingcomputer.com/news/linux/new-januscape-linux-kernel-flaw-allows-vm-escape-on-intel-amd-devices/?ref=linuxhandbook.com" rel="noreferrer">Januscape (CVE-2026-53359) is a 16-year-old use-after-free in KVM</a>'s shadow MMU implementation. It can let an attacker escape a guest VM and run code on the host, on both Intel and AMD systems. Cloud providers and anyone running untrusted workloads in virtualized environments are the biggest targets, but if you run KVM at home, it's worth checking your patch status too.</p><p>Two decade-plus-old bugs surfacing with working exploits in the same week is a good reminder that "old and stable" doesn't mean "safe to ignore."</p><h2 id="%F0%9F%93%9A-worth-reading-from-linux-handbook">📚 Worth reading from Linux Handbook</h2><p>A Postgres instance on a remote server, port 5432 not exposed to the internet (rightly so). How to access it? The fix is SSH tunneling, and <a href="https://linuxhandbook.com/ssh-tunneling/">this tutorial</a> walks through all three flavors with the actual commands and real use cases behind them.</p><ul><li><strong>Local forwarding (<code>-L</code>)</strong> to reach a remote service, like that Postgres box, as if it were running on your own machine</li><li><strong>Remote forwarding (<code>-R</code>)</strong> to expose something local, like a webhook receiver on your dev machine, to the outside world through a VPS</li><li><strong>Dynamic forwarding (<code>-D</code>)</strong> to turn your SSH connection into a SOCKS proxy for encrypting your traffic on untrusted WiFi</li></ul><p> If you've ever wanted to skip standing up a VPN just to reach one service, this is worth ten minutes of your time. <a href="https://linuxhandbook.com/ssh-tunneling/">Read the full guide</a>.</p><p><strong>Also recent, in case you missed them:</strong></p><ul><li><a href="https://linuxhandbook.com/blog/fzf-command/">I Like This Fuzzy Search Finder Better Than Find Command in Linux</a>, a quick case for swapping <code>find</code> for <code>fzf</code> in your daily workflow</li><li><a href="https://linuxhandbook.com/blog/docker-workflow-tools/">These 11 Open Source Tools Completely Improved My Docker Workflow</a>, a practical roundup if you're managing more than a couple of containers</li></ul><h2 id="%F0%9F%92%A1quick-terminal-tip"><strong>💡Quick terminal tip</strong></h2><p>Most Linux users know how to extract archives, but tar includes several lesser-known options that can make working with archives safer and more efficient.</p><p>Before extracting an archive, inspect its contents:</p><pre><code>tar -tf archive.tar.gz
</code></pre><p>This lists every file and directory inside the archive without extracting anything.</p><p>To avoid cluttering your current directory, extract the archive into its own automatically created folder:</p><pre><code>tar -xf archive.tar.gz --one-top-level
</code></pre><p>If you prefer a custom directory name instead, specify it explicitly:</p><pre><code>tar -xf archive.tar.gz --one-top-level=archive
</code></pre><p>Finally, you don't have to extract the entire archive. To restore only specific files or directories, list them after the archive name:</p><pre><code>tar -xf archive.tar.gz path/to/file.txt docs/
</code></pre><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/07/tar-tip-command.png" class="kg-image" alt="" loading="lazy" width="1248" height="665" srcset="https://linuxhandbook.com/content/images/size/w600/2026/07/tar-tip-command.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/07/tar-tip-command.png 1000w, https://linuxhandbook.com/content/images/2026/07/tar-tip-command.png 1248w" sizes="(min-width: 720px) 720px"></figure><p>This is particularly useful when working with large source archives or backups where you only need a handful of files.</p><h2 id="%F0%9F%9B%A0%EF%B8%8F-tool-discovery">🛠️ Tool discovery</h2><p>Let's find your next favorite software in this section.</p><h3 id="darkmoon-ai-powered-autonomous-penetration-testing-platform">DarkMoon: AI-Powered Autonomous Penetration Testing Platform</h3><p><a href="https://github.com/ASCIT31/Dark-Moon?ref=linuxhandbook.com">DarkMoon</a> is an open-source platform that runs full penetration tests using AI agents that plan, execute, and validate real exploits against a target, across web apps, Active Directory, and Kubernetes.</p><p>Why use it? Well, manual pentesting takes weeks and a proper consultant costs thousands a day, and Dark-Moon automates that entire loop, from recon to a structured, evidence-backed report, using 50+ integrated tools like Nuclei, sqlmap, and BloodHound under the hood. </p><p>It also runs a local privacy gateway that keeps your real IPs, hosts, and credentials from ever reaching the LLM provider. Good fit for DevSecOps pipelines, bug bounty workflows, or just testing your own homelab exposure before someone else does. </p><p>You can <a href="https://github.com/ASCIT31/Dark-Moon?ref=linuxhandbook.com">self-host it</a> or purchase a <a href="https://dark-moon.org/?ref=linuxhandbook.com">plan from their website</a>.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/ASCIT31/Dark-Moon?ref=linuxhandbook.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - ASCIT31/Dark-Moon: Autonomous AI pentesting engine, continuous offensive security across web, cloud, AD &amp; Kubernetes. Agentic reasoning + real exploit execution deliver proof-based vulnerabilities. Privacy gateway: the LLM never sees your real IPs, hosts, creds or paths (deterministic placeholders rehydrated locally), nothing leaves your perimeter.</div><div class="kg-bookmark-description">Autonomous AI pentesting engine, continuous offensive security across web, cloud, AD &amp;amp; Kubernetes. Agentic reasoning + real exploit execution deliver proof-based vulnerabilities. Privacy gatewa…</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://linuxhandbook.com/content/images/icon/pinned-octocat-093da3e6fa40-f245d2c8-e7fd-4b0f-b7dc-bad39609d3b7.svg" alt=""><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">ASCIT31</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://linuxhandbook.com/content/images/thumbnail/Dark-Moon-d9a1ee7d-8df5-46e9-8907-062f3e20702c" alt="" onerror="this.style.display = 'none'"></div></a></figure><h3 id="dashy-self-hosted-dashboard-for-homelab-and-infrastructure-services">Dashy: Self-Hosted Dashboard for Homelab and Infrastructure Services</h3><p><a href="https://github.com/Lissy93/dashy?ref=linuxhandbook.com" rel="noreferrer">Dashy</a> is an open-source, self-hosted dashboard that provides a unified homepage for accessing infrastructure services, applications, and development tools. It combines link management with service health monitoring, widgets, authentication, and extensive customization, making it a practical landing page for homelabs, self-hosted environments, and DevOps teams managing numerous services.</p><ul><li>🚦 <strong>Service Health Monitoring</strong>: Displays real-time availability and status checks for configured applications and services.</li><li>📊 <strong>Rich Widget Ecosystem</strong>: Integrates dynamic widgets for self-hosted services, system information, and external APIs to create an operational dashboard.</li><li>🎨 <strong>Highly Customizable UI</strong>: Supports multiple themes, icon packs, custom CSS, configurable layouts, and a built-in visual configuration editor.</li><li>🔍 <strong>Fast Navigation</strong>: Includes instant search, keyboard shortcuts, multiple pages, and flexible launch options for quickly accessing services.</li><li>🐳 <strong>Easy Deployment</strong>: Runs via Docker, Docker Compose, or directly from source, with support for multi-architecture container images.</li></ul><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/Lissy93/dashy?ref=linuxhandbook.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - lissy93/dashy: 🚀 A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more!</div><div class="kg-bookmark-description">🚀 A self-hostable personal dashboard built for you. Includes status-checking, widgets, themes, icon packs, a UI editor and tons more! - lissy93/dashy</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://linuxhandbook.com/content/images/icon/pinned-octocat-093da3e6fa40-827d0cec-983c-4d1a-a579-a29e6cefa93e.svg" alt=""><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">lissy93</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://linuxhandbook.com/content/images/thumbnail/82f850a2-b1af-4e9f-9245-c92700d74856-f62e909c-bf5f-4d38-967e-7bc16354f3fe" alt="" onerror="this.style.display = 'none'"></div></a></figure><h2 id="%F0%9F%93%B0-linux-news-that-matters">📰 Linux news that matters</h2><ul><li><a href="https://www.helpnetsecurity.com/2026/07/07/apple-container-open-source-linux-mac/?ref=linuxhandbook.com">Apple has released version 1.0 of its open-source Container project</a>, a Swift-based tool that runs OCI-compatible Linux containers inside lightweight virtual machines on Apple silicon Macs. The stable release introduces persistent Linux environments through the new container machine command, adopts TOML-based configuration, and adds capabilities such as host-to-container file copying while establishing a stable baseline for future development.</li><li>The German state of <a href="https://itsfoss.com/news/german-state-ditches-sharepoint/?ref=linuxhandbook.com">Mecklenburg-Vorpommern is expanding its open-source strategy</a> by rolling out a self-hosted Nextcloud platform across state and municipal administration, with a long-term target of more than 50,000 public-sector employees. The initiative replaces Microsoft SharePoint for collaboration, is operated on state-controlled infrastructure, and forms part of a broader digital sovereignty strategy that also includes OpenProject and a locally controlled AI assistant based on OpenWebUI while emphasizing open standards and European technologies.</li><li>AWS has expanded its <a href="https://www.infoq.com/news/2026/07/aws-devops-ai-agent/?ref=linuxhandbook.com">DevOps Agent with release management capabilities</a> that automatically review code changes, validate dependency impacts and access controls, and execute functional verification in managed environments before software is deployed. The enhancement moves the agent beyond troubleshooting and operations into pre-production quality assurance, positioning it as an AI-assisted release engineer integrated into the software delivery lifecycle.</li><li>Researchers at Noma Security disclosed <a href="https://devops.com/gitlost-flaw-lets-attackers-trick-github-ai-agent-into-leaking-private-repos/?ref=linuxhandbook.com">GitLost, a prompt-injection technique</a> that tricks GitHub Agentic Workflows into reading data from private repositories and publishing it in a public repository comment. The attack requires only a crafted GitHub Issue in a public repository when the organization's AI workflow has read access to private repositories, illustrating how natural-language instructions embedded in untrusted content can override the agent's intended behavior.</li></ul><h2 id="%F0%9F%98%82-geek-humor">😂 Geek humor</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/07/meme-july-9-2026.jpg" class="kg-image" alt="" loading="lazy" width="1080" height="1080" srcset="https://linuxhandbook.com/content/images/size/w600/2026/07/meme-july-9-2026.jpg 600w, https://linuxhandbook.com/content/images/size/w1000/2026/07/meme-july-9-2026.jpg 1000w, https://linuxhandbook.com/content/images/2026/07/meme-july-9-2026.jpg 1080w" sizes="(min-width: 720px) 720px"></figure><h2 id="%F0%9F%92%8C-keep-on-loving-linux-handbook">💌 Keep on loving Linux Handbook</h2><p>GitOps course is nearly ready. It should arrive next week. </p><p>Perfect time to <a href="https://linuxhandbook.com/#/portal/signup">become a Pro member</a> and enjoy unlimited access to our <a href="https://linuxhandbook.com/ebooks/">eBooks</a>, <a href="https://linuxhandbook.com/courses/">courses</a> and in-depth tutorials.</p><p><strong>Missed the previous editions?</strong>&nbsp;You can&nbsp;<a href="https://linuxhandbook.com/newsletter/">access the newsletter archives.</a></p><p>You may also <a href="https://linuxhandbook.com/write-for-us/">contribute to Linux Handbook</a> and share your experience and expertise with the community.</p><p>I like reading your messages, so just hit the reply button and share your thoughts 😄</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[SSH Tunneling: How I Securely Access Anything From Anywhere]]></title>
                    <description><![CDATA[By default, you can only ssh into other machines on your local network. With SSH tunneling, remote connections are made possible.]]></description>
                    <link>https://linuxhandbook.com/ssh-tunneling/</link>
                    <guid isPermaLink="false">6a315dd60fd5850001a08cd0</guid>

                        <category><![CDATA[SSH Advanced]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Mon, 29 Jun 2026 17:24:26 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/06/ssh-tunneling.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/06/ssh-tunneling.png" alt="SSH Tunneling: How I Securely Access Anything From Anywhere"/> <p>There's a moment every Linux user eventually hits, you need to access something on a remote machine, but it's not exposed to the internet. Maybe it's a database running on port 5432, a local web app on port 3000, or a service hidden behind a firewall. The "obvious" solution is to punch a hole in the firewall and expose it. The <em>*right*</em> solution is SSH tunneling.</p><p>I started using SSH tunnels out of necessity. I had a PostgreSQL database running on a remote server, and the sysadmin (correctly) refused to open port 5432 to the internet. Someone in the team mentioned that I could just "tunnel through SSH" to access it. I had no idea what that meant. Twenty<em> </em>minutes<em> </em>of<em> </em>reading<em> </em>later<em>, </em>I had it working and I've been using SSH tunnels regularly ever since for everything from accessing remote services to getting around restrictive networks.</p><p>I'll walk through what SSH tunneling actually is, how each type works, how I set them up, and <strong>importantly,</strong> what the risks are and how to stay on the right side of them.</p><h2 id="what-is-ssh-tunneling"><strong>What is SSH Tunneling?</strong></h2><p>SSH (Secure Shell) is usually thought of as a way to get a remote terminal. But <a href="https://linuxhandbook.com/ssh-port-forwarding/" rel="noreferrer">SSH also has the ability to forward ports</a>; it can take network traffic on one port and route it through the encrypted SSH connection to emerge somewhere else entirely.</p><p>That's SSH tunneling in a sentence: <strong>using an SSH connection as a secure pipe to route other traffic.</strong></p><p>The traffic inside that pipe is encrypted by SSH, which means it gets the same protection as your terminal session. A service that has no encryption of its own, an old database, a plain HTTP admin panel, a Redis instance, suddenly gets full TLS-grade protection just because you're reaching it through SSH.</p><p>There are three types of SSH tunnels. Understanding which one solves your problem is most of the battle:</p><p><strong>Local forwarding:</strong> <code>-L</code> tunnel forwards a port on <em>your machine</em> to somewhere the <em>remote server</em> can reach.<br><strong>Remote forwarding:</strong> <code>-R</code> tunnel forwards a port on the <em>remote server</em> to something on <em>your machine.</em><br><strong>Dynamic forwarding:</strong> SOCKS proxy, <code>-D</code> tunnel turns the SSH connection into a proxy that routes any traffic through the remote.</p><p>Let's go through each one the way I actually use them.</p><h2 id="local-port-forwarding-accessing-remote-services-locally">Local Port Forwarding: Accessing Remote Services Locally</h2><p>This is the one I use most. Local forwarding lets me open a port on my laptop and have traffic on that port come out on the remote server, as if I'm connecting from the server itself.</p><p><strong>My exact use case:</strong> I needed to connect my local database client (DBeaver) to a PostgreSQL instance running on a remote server. Port 5432 was not open to the internet. SSH port 22 was.</p><pre><code class="language-bash">ssh -L 5433:localhost:5432 username@remote-server.example.com
</code></pre><p>Breaking this down: <code>-L</code> tells SSH we're doing local forwarding, <code>5433</code> is the port I'm opening on <em><strong>my machine,</strong></em> <code>localhost:5432</code> is where the traffic should go <em>from the remote server's perspective,</em> <code>lhb@remote-server.example.com</code> is the SSH server I'm tunneling through.</p><p>After running this, I opened DBeaver, pointed it at <code>localhost:5433</code>, and it connected to the PostgreSQL instance on the remote server, over an encrypted channel, as if the database were running locally.</p><p>The tunnel is active for as long as the SSH session stays open. When you exit, the tunnel closes. If you don't need an interactive shell, just the tunnel - add <code>-N</code> to suppress it:</p><pre><code class="language-bash">ssh -N -L 5433:localhost:5432 username@remote-server.example.com</code></pre><p>And if you want it to run in the background:</p><pre><code class="language-bash">ssh -N -f -L 5433:localhost:5432 username@remote-server.example.com</code></pre><p><code>-f</code> sends the process to the background after authenticating. The tunnel stays open without occupying your terminal.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/06/image-12.png" class="kg-image" alt="Using locally hosted docker container as remote server for example" loading="lazy" width="956" height="398" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/image-12.png 600w, https://linuxhandbook.com/content/images/2026/06/image-12.png 956w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Using locally hosted docker container as remote server for example</span></figcaption></figure><p>Here, I have used a <a href="https://hub.docker.com/_/postgres?ref=linuxhandbook.com" rel="noreferrer">Docker PostgreSQL</a> container to show the SSH connection to the remote server.</p><h2 id="remote-port-forwarding-exposing-your-local-machine-to-the-world">Remote Port Forwarding: Exposing Your Local Machine to the World</h2><p>Remote forwarding is local forwarding in reverse. Instead of bringing a remote service to me, I'm pushing something on my machine out to a remote server.</p><p><strong>My use case for this:</strong> I was developing a webhook receiver locally. The service I needed to receive webhooks from (a payment processor) needed a public URL to send to. My development machine is behind NAT, with no public IP. I had a cheap VPS with a public IP. Remote forwarding solved it.</p><pre><code class="language-bash">ssh -R 8080:localhost:3000 username@my-vps.example.com</code></pre><p>Here, <code>-R</code> for remote forwarding, <code>8080</code> is the port that opens on the <strong><em>remote server, </em></strong><code>localhost:3000</code> is where traffic on that remote port gets forwarded, back to my machine, port 3000.</p><p>After running this, anyone hitting <code>my-vps.example.com:8080</code> would have their request tunneled back to port 3000 on my laptop. My local dev server was now reachable from the internet, through an encrypted SSH connection. For the example I have setup the container for the vps as:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/06/image-14.png" class="kg-image" alt="VPS container running for reverse tunnel" loading="lazy" width="778" height="571" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/image-14.png 600w, https://linuxhandbook.com/content/images/2026/06/image-14.png 778w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">VPS container running for reverse tunnel</span></figcaption></figure><p>The VPS container is running for reverse tunneling for the requests that are coming.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/06/image-15.png" class="kg-image" alt="simulate external request to vps:8080" loading="lazy" width="1040" height="578" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/image-15.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/06/image-15.png 1000w, https://linuxhandbook.com/content/images/2026/06/image-15.png 1040w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">simulate external request to vps:8080</span></figcaption></figure><p>curl from inside the container simulates the external request to the vps:8080 endpoint.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/06/image-16.png" class="kg-image" alt="python server logs" loading="lazy" width="790" height="243" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/image-16.png 600w, https://linuxhandbook.com/content/images/2026/06/image-16.png 790w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">python server logs</span></figcaption></figure><p>Python server verifying and logging the connected request from the internet that comes to the VPS and then to the <code>localhost:3000</code></p><p><strong>When to use this:</strong> Remote forwarding is incredibly useful for quick webhook testing, sharing a local demo with a client, or giving someone remote access to something on your internal network without setting up a VPN.</p><h2 id="dynamic-port-forwarding-ssh-as-a-socks-proxy">Dynamic Port Forwarding: SSH as a SOCKS Proxy</h2><p>Dynamic forwarding is the most flexible of the three. Instead of forwarding a specific port to a specific destination, it creates a <a href="https://en.wikipedia.org/wiki/SOCKS?ref=linuxhandbook.com">SOCKS proxy</a> on your machine. Any application that supports SOCKS proxies can route all its traffic through your SSH connection and it will appear as if that traffic is coming from the remote server.</p><p>Command that can be used:</p><pre><code class="language-bash">ssh -D 1080 -N yash@remote-server.example.com</code></pre><p>This opens a SOCKS5 proxy on <code>localhost:1080</code> on my machine. Any traffic I route through that proxy goes through the SSH tunnel and exits from <code>remote-server.example.com</code>.</p><p>I have used it as:</p><pre><code class="language-bash">ssh -f -D 1080 -N \
  -i ~/ITSFOSS/REVIEW/SSH\ Tunneling/docker-demo/demo_key \
  -p 2223 -o StrictHostKeyChecking=no \
  vpsuser@localhost
ss -tlnp | grep 1080</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/06/image-17.png" class="kg-image" alt="proxy is bound to localhost:1080" loading="lazy" width="772" height="242" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/image-17.png 600w, https://linuxhandbook.com/content/images/2026/06/image-17.png 772w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">proxy is bound to localhost:1080</span></figcaption></figure><p>Then I can setup the network proxy through the network settings as:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/06/image-18.png" class="kg-image" alt="Network SOCKS proxy setup" loading="lazy" width="922" height="547" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/image-18.png 600w, https://linuxhandbook.com/content/images/2026/06/image-18.png 922w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Network SOCKS proxy setup</span></figcaption></figure><p>Then, you need to set up the SOCKS proxy through the network settings.</p><p><strong>When to use this:</strong> When you are in a coffee shop with WiFi and want to encrypt all your browsing, you need to access something that's only reachable from a specific server (e.g., an internal admin panel that only allows connections from the VPS's IP), or you want to test how your website looks from the perspective of another geographic location.</p><h2 id="making-tunnels-persistent">Making Tunnels Persistent</h2><p>Running long <code>ssh -L ...</code> commands every time is annoying. I put my common tunnels in <code>~/.ssh/config</code> so I can activate them with a short alias:</p><pre><code class="language-bash">Host db-tunnel
    HostName remote-server.example.com
    User yash
    LocalForward 5433 localhost:5432
    ServerAliveInterval 60
    ServerAliveCountMax 3

Host socks-proxy
    HostName my-vps.example.com
    User yash
    DynamicForward 1080
    ServerAliveInterval 60
    ServerAliveCountMax 3</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/06/image-19.png" class="kg-image" alt="config at ~/.ssh/config" loading="lazy" width="777" height="543" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/image-19.png 600w, https://linuxhandbook.com/content/images/2026/06/image-19.png 777w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">config at ~/.ssh/config</span></figcaption></figure><p>Now activating the database tunnel is just:</p><pre><code class="language-bash">ssh -N db-tunnel</code></pre><p>And the SOCKS proxy:</p><pre><code class="language-bash">ssh -N socks-proxy</code></pre><h2 id="the-risks-and-how-to-handle-them">The Risks And How to Handle Them</h2><p>SSH tunneling is powerful, and like most powerful tools, it can cause problems if misused or misconfigured. This is the part most tutorials skip.</p><h3 id="risk-1-unauthorized-tunnel-creation">Risk 1: Unauthorized Tunnel Creation</h3><p>The flip side of remote forwarding (<code>-R</code>) is that if someone has SSH access to your server, they can open tunnels out of it, potentially bypassing your network security controls. An attacker with a compromised SSH key could use your server as a relay to reach systems inside your network.</p><p><strong>Mitigation:</strong> Restrict what SSH users can do. In <code>/etc/ssh/sshd_config</code>:</p><pre><code class="language-bash"># Disable port forwarding for all users by default
AllowTcpForwarding no
GatewayPorts no

# Then allow it only for specific trusted users:
Match User deploy-user
    AllowTcpForwarding local</code></pre><p>Use SSH keys (not passwords), enforce key-based auth only, and audit your <code>~/.ssh/authorized_keys</code> files regularly.</p><h3 id="risk-2-tunnel-misuse-on-corporatemanaged-networks">Risk 2: Tunnel Misuse on Corporate/Managed Networks</h3><p>Dynamic SSH tunneling (<code>-D</code>) is a common technique for bypassing network monitoring and content filters. On a corporate or university network, using a SOCKS proxy to route traffic through an external server may violate acceptable use policies, even if you have a legitimate reason.</p><p>I use it when I'm on untrusted public WiFi to protect my own traffic, which is reasonable. Using it to bypass your employer's security controls on company equipment is a different matter; read your acceptable use policy, and don't be surprised if your IT team can see that you're making an encrypted SSH connection to an external server even if they can't see inside it.</p><h3 id="risk-3-exposing-tunnels-beyond-localhost">Risk 3: Exposing Tunnels Beyond Localhost</h3><p>When you run <code>-L 5433:localhost:5432</code>, by default the tunnel binds to <code>127.0.0.1</code> on your machine, only you can use it. But if you bind it to <code>0.0.0.0</code>, anyone on your local network (or beyond) can use that forwarded port to reach the remote service.</p><pre><code class="language-bash"># DANGEROUS — binds to all interfaces
ssh -L 0.0.0.0:5433:localhost:5432 user@remote-server.example.com</code></pre><p>Unless you specifically need to share a tunnel with other people on your network, always let the tunnel bind to <code>127.0.0.1</code> (the default). You can explicitly enforce this:</p><pre><code class="language-bash"># Safe — explicitly binds to loopback only
ssh -L 127.0.0.1:5433:localhost:5432 user@remote-server.example.com</code></pre><h3 id="risk-4-keeping-ssh-keys-secure">Risk 4: Keeping SSH Keys Secure</h3><p>All of this relies on the security of your SSH keys. If your private key is stolen, your tunnels and everything behind them are compromised.</p><p><strong>My key hygiene:</strong> Use <code>ssh-keygen -t ed25519</code> for new keys, as Ed25519 keys are smaller, faster, and considered stronger than RSA-4096 for most use cases, always set a passphrase on private keys, use <code>ssh-agent</code> to avoid retyping the passphrase constantly while keeping the key protected at rest, never share private keys or put them in version control.</p><pre><code class="language-bash"># Generate a new Ed25519 key with a passphrase
ssh-keygen -t ed25519 -C "yash@workstation" -f ~/.ssh/id_ed25519_tunnel

# Add it to ssh-agent so you don't retype the passphrase every session
ssh-add ~/.ssh/id_ed25519_tunnel
```
</code></pre><h2 id="a-quick-reference-when-to-use-which-tunnel">A Quick Reference: When to Use Which Tunnel</h2><table>
<thead>
<tr>
<th>Situation</th>
<th>Tunnel type</th>
<th>Command pattern</th>
</tr>
</thead>
<tbody>
<tr>
<td>Access a remote database or service locally</td>
<td>Local <code>-L</code></td>
<td><code>ssh -L localport:host:remoteport user@server</code></td>
</tr>
<tr>
<td>Share a local dev server with the internet</td>
<td>Remote <code>-R</code></td>
<td><code>ssh -R remoteport:localhost:localport user@server</code></td>
</tr>
<tr>
<td>Encrypt all browsing on untrusted WiFi</td>
<td>Dynamic <code>-D</code></td>
<td><code>ssh -D 1080 -N user@server</code></td>
</tr>
</tbody>
</table>
<h2 id="wrapping-up">Wrapping Up</h2><p>What I like about SSH tunneling is that it solves real problems without adding infrastructure. No VPN server to configure, no WireGuard keypairs to exchange, no nginx proxy rules to write. The SSH connection you already use for server access can also carry your database traffic, your webhook traffic, or your browsing traffic, all encrypted, all without opening extra firewall ports.</p><p>Local forwarding (<code>-L</code>) is the one I reach for most often, any time I need to access a service on a remote machine from a local client. Remote forwarding (<code>-R</code>) is what I use when I need to do the reverse: expose something local to the internet temporarily. Dynamic forwarding (<code>-D</code>) is the occasional privacy tool for when I'm not on a network I trust.</p><p>The risks are real but manageable: keep port forwarding locked down on your SSH servers, bind tunnels to localhost unless you have a specific reason not to, and treat your SSH keys with the same care you'd give a password.</p><p>The setup is one command. The maintenance is minimal. The usefulness compounds the more remote infrastructure you work with.</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[LHB Linux Digest #26.08: Knowledge Base Boosting, Local AI, Terminal Course, Podman 6.0 and More]]></title>
                    <description><![CDATA[Create your perosnal knoweldge base, if you have not already.]]></description>
                    <link>https://linuxhandbook.com/newsletter/26-08/</link>
                    <guid isPermaLink="false">6a3a71090fd5850001a0af0b</guid>

                        <category><![CDATA[Newsletter]]></category>

                        <dc:creator><![CDATA[Abhishek Prakash]]></dc:creator>

                    <pubDate>Fri, 26 Jun 2026 18:39:54 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/lhb-newsletter.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/lhb-newsletter.png" alt="LHB Linux Digest #26.08: Knowledge Base Boosting, Local AI, Terminal Course, Podman 6.0 and More"/> <p>A good Linux user takes notes all the time. A better Linux user organizes them in a proper knowledge base. </p><p>From <a href="https://obsidian.md/?ref=linuxhandbook.com">Obsidian</a> to <a href="https://tolaria.md/?ref=linuxhandbook.com">Tolaria</a>, there are plenty of choices. You could explore <a href="https://linuxhandbook.com/blog/self-hosted-knowledge-base-tools/">some self-hosted knowledge base tools</a> that may even help your team.</p><p>If your knowledge base grows bigger, you can <a href="https://linuxhandbook.com/blog/personal-knowledge-base-with-local-ai/">plugin an AI and get answers from your personal notes</a>. </p><p>Lately, we have been exploring AI... local AI mostly with open source models running on your machine and keeping the data private on your system. </p><p>For example, take <a href="https://linuxhandbook.com/blog/ai-file-sorter/">this AI powered file sorter app</a>. To a seasoned sysadmin, this could be a shell script but it could still fit someone's need I think.</p><p>Then there is agent based automation. So we took <a href="https://linuxhandbook.com/blog/zeroclaw-ai-with-fizzy-automation/">ZeroClaw and plugged it with Fizzy CLI to manage Kanban task board</a>. Interesting times we live in.</p><p>I still find it amsuing that many new age developers are not familiar with even the basics of Linux command line. Our <a href="https://linuxhandbook.com/courses/command-line-basics/">intro course is free</a> so feel free to use it and share it with others.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://linuxhandbook.com/courses/command-line-basics/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Quick Introduction to Linux Command Line</div><div class="kg-bookmark-description">Learn the basics of Linux commands in this short introductory course. Also contains videos.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://linuxhandbook.com/content/images/icon/Linux-Handbook-New-Logo-206.png" alt=""><span class="kg-bookmark-author">Linux Handbook</span><span class="kg-bookmark-publisher">Ted LeRoy</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://linuxhandbook.com/content/images/thumbnail/Learning-Linux-beginners-1.webp" alt="" onerror="this.style.display = 'none'"></div></a></figure><p>And for advanced Linux users, the <a href="https://linuxhandbook.com/courses/systemd-playbook/" rel="noreferrer">systemd Playbook</a> is a good way to make more out of systemd.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://linuxhandbook.com/courses/systemd-playbook/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">The systemd Playbook: Learn by Doing</div><div class="kg-bookmark-description">Master systemd the practical way—one lab at a time.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://linuxhandbook.com/content/images/icon/Linux-Handbook-New-Logo-207.png" alt=""><span class="kg-bookmark-author">Linux Handbook</span><span class="kg-bookmark-publisher">Bhuwan Mishra</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://linuxhandbook.com/content/images/thumbnail/systemd-playbook-1.webp" alt="" onerror="this.style.display = 'none'"></div></a></figure><h2 id="%F0%9F%92%A1quick-terminal-tip"><strong>💡Quick terminal tip</strong></h2><p>Ever need to document a complex deployment, or share the exact errors a script threw with a teammate? Instead of manually copying and pasting from your terminal, you can record the entire session, both the commands you typed and their visual outputs to a single text file.</p><p>Launch a dedicated logging session using the built-in <code>script</code> command:</p><pre><code>script sample.txt -T sample_time
</code></pre><p>Here, the <code>sample_time</code> file saves the timing information, needed to replay the content later.</p><p>From this moment on, your terminal behaves normally, but every keystroke, command, and output is quietly recorded in the background.</p><p>When your task is finished, simply exit the recording session:</p><pre><code>exit</code></pre><p>Now you have a perfect, chronologically ordered transcript (sample.txt) ready for documentation or debugging.</p><p>To replay the commands, use:</p><pre><code>scriptreplay -B sample.txt -T sample_time
</code></pre><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/06/script_command.gif" class="kg-image" alt="" loading="lazy" width="883" height="537" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/script_command.gif 600w, https://linuxhandbook.com/content/images/2026/06/script_command.gif 883w" sizes="(min-width: 720px) 720px"></figure><h2 id="%F0%9F%9B%A0%EF%B8%8F-tool-discovery">🛠️ Tool discovery</h2><p>Let's find your next favorite software in this section.</p><h3 id="wtf-build-a-personal-devops-dashboard-inside-your-terminal">WTF: Build a Personal DevOps Dashboard Inside Your Terminal</h3><p><a href="https://github.com/wtfutil/wtf?ref=linuxhandbook.com" rel="noreferrer">WTF (wtfutil)</a> is an open-source terminal dashboard that aggregates operational data, development workflows, and personal productivity information into a single TUI interface. Instead of constantly switching between GitHub, Jira, Kubernetes dashboards, calendars, monitoring tools, and terminal windows, WTF presents everything through configurable modules arranged in a customizable grid layout.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/wtfutil/wtf?ref=linuxhandbook.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - wtfutil/wtf: The personal information dashboard for your terminal</div><div class="kg-bookmark-description">The personal information dashboard for your terminal - wtfutil/wtf</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://linuxhandbook.com/content/images/icon/pinned-octocat-093da3e6fa40-116.svg" alt=""><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">wtfutil</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://linuxhandbook.com/content/images/thumbnail/wtf" alt="" onerror="this.style.display = 'none'"></div></a></figure><h3 id="goaccess-real-time-web-log-analytics-without-tracking-scripts">GoAccess: Real-Time Web Log Analytics Without Tracking Scripts</h3><p><a href="https://github.com/allinurl/goaccess?ref=linuxhandbook.com" rel="noreferrer">GoAccess</a> is an open-source web log analyzer that provides real-time traffic analytics directly from web server logs. Unlike Google Analytics and similar services, it requires no JavaScript trackers, cookies, databases, or external services, making it a privacy-friendly choice for self-hosted environments. It runs in the terminal or generates live HTML dashboards, allowing administrators to monitor traffic, bandwidth usage, response times, errors, and suspicious activity directly from Apache, Nginx, Caddy, CloudFront, and other log sources.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/allinurl/goaccess?ref=linuxhandbook.com"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - allinurl/goaccess: GoAccess is a real-time web log analyzer and interactive viewer that runs in a terminal in *nix systems or through your browser.</div><div class="kg-bookmark-description">GoAccess is a real-time web log analyzer and interactive viewer that runs in a terminal in *nix systems or through your browser. - allinurl/goaccess</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://linuxhandbook.com/content/images/icon/pinned-octocat-093da3e6fa40-117.svg" alt=""><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">allinurl</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://linuxhandbook.com/content/images/thumbnail/bdc5dce2-ba47-4b00-bcea-a049c2394391" alt="" onerror="this.style.display = 'none'"></div></a></figure><h2 id="%F0%9F%93%B0-linux-news-that-matters">📰 Linux news that matters</h2><ul><li><a href="https://github.com/podman-container-tools/podman/releases?ref=linuxhandbook.com">Podman 6.0 is here with some breaking and some interesting features</a>. In cleaning, cgroups v1, iptables, CNI networking, slirp4netns, Intel Mac, and Windows 10 support are all dropped. BoltDB is gone and Podman auto-migrates to SQLite. Network isolation now defaults to enabled. New additions: AMD GPU support via <code>--gpus</code>, a <code>podman machine os update</code> command, and a patch for CVE-2026-57231 (host env var leakage via malformed image metadata)</li><li><a href="https://arstechnica.com/security/2026/06/windows-and-linux-users-the-deadline-to-update-secure-boot-keys-is-near/?ref=linuxhandbook.com"><u>Microsoft's long-planned Secure Boot certificate rollover</u></a> has reached its final stage as legacy certificates issued in 2011 begin expiring in June 2026, requiring systems to transition to newer 2023 certificate chains. The change is intended to maintain UEFI trust integrity and enable future security updates that protect against firmware attacks, bootkits, and supply-chain compromises.</li><li>The <a href="https://www.linuxfoundation.org/press/linux-foundation-announces-intent-to-launch-agent-name-service-to-establish-trusted-identity-infrastructure-for-ai-agents?ref=linuxhandbook.com"><u>Linux Foundation announced its intent to launch the Agent Name Service (ANS)</u></a>, an open standard that extends DNS to provide identity, verification, and discovery mechanisms for AI agents operating across organizations and platforms. ANS aims to create a federated trust layer that allows operators to verify who an agent represents, what permissions it has, and whether its software remains authentic, without relying on proprietary registries or centralized control.</li><li><a href="https://www.phoronix.com/news/Linux-7.2-Drops-strncpy?ref=linuxhandbook.com"><u>Linux 7.2 removes the final uses of the strncpy() function</u></a> from the kernel after roughly six years of work and more than 360 patches spread across numerous subsystems. The API has long been discouraged because its semantics frequently lead to truncation bugs, non-terminated strings, and other memory-handling mistakes, prompting kernel developers to replace it with safer alternatives.</li><li><a href="https://www.infoq.com/news/2026/06/aws-blocks-framework-preview/?ref=linuxhandbook.com"><u>AWS has released AWS Blocks in public preview</u></a>, an open-source TypeScript framework that packages application code, local development environments, and AWS infrastructure definitions into reusable modules called "Blocks." The framework provides local Postgres, authentication, messaging, storage, and other backend services without requiring an AWS account, while generating production AWS infrastructure automatically during deployment.</li><li><a href="https://thenewstack.io/vercel-launches-eve-an-open-source-framework-that-treats-agents-as-directories/?ref=linuxhandbook.com"><u>Vercel has released <strong>eve</strong></u></a>, an open-source framework that defines AI agents as directories containing Markdown instructions, skills, and TypeScript tools, allowing agents to be developed using a filesystem-first workflow. The framework ships with production-oriented capabilities such as durable execution, sandboxed compute, subagents, approvals, and workflow orchestration already integrated rather than requiring developers to assemble multiple infrastructure components.</li><li><a href="https://devops.com/github-retires-its-free-ai-model-playground-what-developers-need-to-know/?ref=linuxhandbook.com"><u>GitHub has started retiring GitHub Models</u></a>, the free AI playground and API layer introduced in 2024, with new customers already blocked from accessing the service as of June 16, 2026. Existing users can continue using the playground, APIs, and hosted models for now, but GitHub has confirmed that the service is heading toward full retirement and is directing new projects toward Azure AI Foundry.</li></ul><h2 id="%F0%9F%98%82-geek-humor">😂 Geek humor</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/06/lhb-meme-june-2026.jpg" class="kg-image" alt="" loading="lazy" width="1080" height="1080" srcset="https://linuxhandbook.com/content/images/size/w600/2026/06/lhb-meme-june-2026.jpg 600w, https://linuxhandbook.com/content/images/size/w1000/2026/06/lhb-meme-june-2026.jpg 1000w, https://linuxhandbook.com/content/images/2026/06/lhb-meme-june-2026.jpg 1080w" sizes="(min-width: 720px) 720px"></figure><h2 id="%F0%9F%92%8C-keep-on-loving-linux-handbook">💌 Keep on loving Linux Handbook</h2><p>We are working on a few new courses. GitOps is the next in publishing queue followed by GNS3. </p><p>And if you like the LHB Linux digest, you can&nbsp;<strong>encourage others to</strong>&nbsp;subscribe to this newsletter. (<a href="https://linuxhandbook.com/newsletter/">From here</a>)</p><p><a href="https://linuxhandbook.com/#/portal/signup">Become a Pro member</a> and enjoy unlimited access to our <a href="https://linuxhandbook.com/ebooks/">eBooks</a>, <a href="https://linuxhandbook.com/courses/">courses</a> and in-depth tutorials.</p><p><strong>Missed the previous editions?</strong>&nbsp;You can&nbsp;<a href="https://linuxhandbook.com/newsletter/">access the newsletter archives.</a></p><p>You may also <a href="https://linuxhandbook.com/write-for-us/">contribute to Linux Handbook</a> and share your experience and expertise with the community.</p><p>I like reading your messages, so just hit the reply button and share your thoughts 😄</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[I Used a Local AI Tool To Organize My Files and Folders]]></title>
                    <description><![CDATA[My folders, specially the download folder is a mess. This little AI tool helped me sort them.]]></description>
                    <link>https://linuxhandbook.com/blog/ai-file-sorter/</link>
                    <guid isPermaLink="false">6a1987de0fd5850001a074bb</guid>

                        <category><![CDATA[AI 🤖🧠]]></category>
                        <category><![CDATA[blog]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 23 Jun 2026 17:10:21 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/06/ai-file-sorter.webp" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/06/ai-file-sorter.webp" alt="I Used a Local AI Tool To Organize My Files and Folders"/> <p>My Downloads folder is a crime scene. My home directo</p><p>Thousands of files with names like <code>IMG_2048.jpg</code>, <code>Copy_of_final_FINAL_v3.pdf</code>, and <code>untitled(2).docx</code> accumulated over years of telling myself I'd sort it out later. I never did.</p><p>I tried manual sorting. I tried renaming scripts. Nothing stuck because the real problem isn't laziness, it's that I don't know what half the files actually are without opening them first.</p><p><strong>AI File Sorter</strong> takes a different approach. Instead of applying fixed rules, it reads your files, actually looks at images using a visual LLM, extracts text from documents, reads audio/video metadata and then <strong><em>suggests</em></strong> what each file is and where it should go. You review the suggestions before anything moves. Nothing happens without your approval.</p><p>With over <strong>1,000 stars on GitHub</strong> and 16 releases since launch, this isn't an abandoned proof-of-concept. It's a cross-platform desktop app actively being developed, and version 1.8.0 just shipped with meaningful improvements to the visual model and local learning.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/hyperfield/ai-file-sorter?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">AI File Sorter | GitHub</a></div><h2 id="what-ai-file-sorter-actually-does">What AI File Sorter Actually Does</h2><p>Let me be precise about this, because "AI file organizer" can mean very different things.<br>AI File Sorter does three related but distinct things:</p><p><strong>Categorization</strong> - It analyzes each file (by name, extension, content, and folder context) and assigns it a category and optional subcategory. "Photography", "Work Documents", "Music", "Screenshots" - then creates the folders and moves files into them. You pick the categories or let the model suggest them freely.</p><p><strong>Rename suggestions</strong> - For images, it uses a visual LLM to actually look at the picture and suggest a descriptive filename. IMG_2048.jpg might become sunset_over_lake.jpg. For documents, it reads the text content and proposes a cleaner name. For audio/video, it reads the embedded metadata tags and turns them into a consistent library-style name like 2024_artist_album_title.mp3.</p><p><strong>Review before action</strong> - This one matters. None of the above actually happens until you see the suggestions in a review table, approve what you want, edit anything you don't like, and click confirm. Nothing is irreversible without your sign-off.</p><h2 id="getting-it-running-on-linux">Getting It Running on Linux</h2><p>I tested this on Ubuntu 24.04. The prebuilt <code>.deb</code> package from <a href="https://filesorter.app/?ref=linuxhandbook.com">https://filesorter.app/</a><br>First, install the runtime prerequisites:</p><pre><code class="language-bash">sudo apt update &amp;&amp; sudo apt install -y \
  libqt6widgets6 libcurl4 libjsoncpp25 libfmt9 libopenblas0-pthread \
  libvulkan1 mesa-vulkan-drivers patchelf</code></pre><p>Then download the latest released version <code>deb</code> file form <a href="https://filesorter.app/download/?ref=linuxhandbook.com">https://filesorter.app/download/</a> and then install it:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-47.png" class="kg-image" alt="Supported OS for ai-file-sorter app" loading="lazy" width="714" height="944" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-47.png 600w, https://linuxhandbook.com/content/images/2026/05/image-47.png 714w"><figcaption><span style="white-space: pre-wrap;">Supported OS for ai-file-sorter app</span></figcaption></figure><p>After that install the package:</p><pre><code class="language-bash">sudo apt install ./aifilesorter_*.deb</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-49.png" class="kg-image" alt="Installing aifilesorter" loading="lazy" width="776" height="110" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-49.png 600w, https://linuxhandbook.com/content/images/2026/05/image-49.png 776w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Installing aifilesorter</span></figcaption></figure><p>Once installed, launch it from your application menu or run:</p><pre><code class="language-bash">aifilesorter</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-50.png" class="kg-image" alt="Application running on linux" loading="lazy" width="736" height="860" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-50.png 600w, https://linuxhandbook.com/content/images/2026/05/image-50.png 736w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Application running on linux</span></figcaption></figure><h2 id="choosing-your-llm-backend">Choosing Your LLM Backend</h2><p>This is the first real decision you make, and it shapes the whole experience. AI File Sorter supports several options:<br><br><strong>Local models (no internet required): Gemma 3 4B IT,</strong> the new default for both text and visual analysis. Downloads once via the in-app Select LLM dialog.<strong> Gemma 1.1 7B,</strong> a solid local text-only choice for categorization. <strong>Mistral 7B,</strong> another built-in option with broader category language support. <strong>Your own GGUF,</strong> any compatible model you already have can be registered<br><br><strong>Remote models (API key required): -</strong> <strong>ChatGPT,</strong> your own OpenAI API key, any model (gpt-4o-mini, gpt-4.1, etc.). <strong>Gemini,</strong> your own Google AI Studio key (gemini-2.5-flash, gemini-2.5-pro, etc.). <strong>Custom OpenAI-compatible endpoint,</strong> LM Studio, Ollama, or any local server you're already running<br></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-51.png" class="kg-image" alt="Interface of aifilesorter" loading="lazy" width="987" height="832" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-51.png 600w, https://linuxhandbook.com/content/images/2026/05/image-51.png 987w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Interface of aifilesorter</span></figcaption></figure><p>After that there is option to analyse the folder which starts the analysis and one by one parses the files from that folder and categorises it as follows:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-52.png" class="kg-image" alt="file categorization by aifilesorter" loading="lazy" width="1097" height="750" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-52.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-52.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-52.png 1097w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">file categorization by aifilesorter</span></figcaption></figure><p>A few things I noticed in the review: An old screenshot was correctly categorized as "Screenshots/Desktop UI" rather than as a generic "Image" and the images are structured under the folder as per the content and not just by name of the files.</p><p>It asks for your permission to proceed and turn the given randomly stuffed files into categorised, well-structured files. Now, after accepting the changes, you will be able to see the structured files in your Downloads folder:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-53.png" class="kg-image" alt="Structured categorization after analysis of aifilesorter" loading="lazy" width="881" height="524" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-53.png 600w, https://linuxhandbook.com/content/images/2026/05/image-53.png 881w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Structured categorization after analysis of aifilesorter</span></figcaption></figure><p>In the <code>Downloads</code>, there are multiple folders created, like <code>Images</code>: which contains different folders like <code>General</code>, <code>Logos</code> and <code>Photographs</code> which are created with the help of categorization of <code>aifilesorter</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-54.png" class="kg-image" alt="Documents folder containing categorized files" loading="lazy" width="871" height="553" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-54.png 600w, https://linuxhandbook.com/content/images/2026/05/image-54.png 871w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Documents folder containing categorized files</span></figcaption></figure><p><code>Documents</code>: which contain different documents categorized after the analysis by <code>aifilesorter</code>. The rename suggestions aren't always perfect. Some generic outdoor shots got overly generic names</p><h2 id="document-analysis-reading-the-file-not-just-the-name">Document Analysis: Reading the File, Not Just the Name</h2><p>Document analysis uses the same LLM (text mode, no mmproj needed) to extract text from supported file types and generate a summary and filename suggestion. Supported formats include:</p><p>Plain text: <code>.txt</code>, <code>.md</code>, <code>.rtf</code>, <code>.csv</code>, <code>.json</code>, <code>.yaml</code>, <code>.log</code>, <code>.html</code><br>PDF: built-in PDFium extractor (no pdftotext dependency needed)<br>Office formats: <code>.docx</code>, <code>.xlsx</code>, <code>.pptx</code>, <code>.odt</code>, <code>.ods</code>, <code>.odp</code></p><p>For my test files, a <code>.pdf</code> result certificate got the <code>Academic_record.pdf</code> based on its opening paragraph. A <code>.odt</code> export from a bank statement was categorized as "Finance" correctly. An old HTML file from a downloaded web page got correctly identified as a web capture rather than a document.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-55.png" class="kg-image" alt="result certificate renamed and categorized in Academic Records" loading="lazy" width="871" height="553" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-55.png 600w, https://linuxhandbook.com/content/images/2026/05/image-55.png 871w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">result certificate renamed and categorized in Academic Records</span></figcaption></figure><h2 id="gpu-acceleration-vulkan-cuda-and-cpu-fallback">GPU Acceleration: Vulkan, CUDA, and CPU Fallback</h2><p>The app supports GPU acceleration via CUDA (NVIDIA) and Vulkan (AMD, Intel, NVIDIA). On Linux, the launcher script auto-detects available backends and prefers CUDA over Vulkan, falling back to CPU if neither is detected.</p><p>You can check and force backends with flags:</p><pre><code class="language-bash"># Force CPU only
aifilesorter --cuda=off --vulkan=off

# Force Vulkan
aifilesorter --vulkan=on --cuda=off</code></pre><h2 id="category-whitelists-and-consistency-controls">Category Whitelists and Consistency Controls</h2><p>One thing I appreciated after my first run: you can constrain what categories the model can pick. Under <strong>Settings → Manage category whitelists…</strong>, you create named lists of allowed categories.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-56.png" class="kg-image" alt="Category whitelist options in aifilesorter" loading="lazy" width="871" height="553" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-56.png 600w, https://linuxhandbook.com/content/images/2026/05/image-56.png 871w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Category whitelist options in aifilesorter</span></figcaption></figure><p>On a re-run of my Downloads folder with a whitelist set to <code>["Work", "Personal", "Finance", "Software", "Media", "Archive"]</code>, the suggestions became noticeably more consistent. Files weren't spread across thirty micro-categories; they clustered into the buckets I actually wanted.</p><p>The docs recommend keeping whitelists to 15–20 entries so they don't overflow smaller local model context windows. For a tightly defined use case (organizing a project folder, sorting a media library), whitelists are the right tool.<br><br>Pair whitelists with "More Consistent" categorization mode for the strongest uniformity across a batch.</p><h2 id="what-works-well">What Works Well</h2><p><strong>The review-first workflow is the right design</strong>. Nothing moves until you approve it. This sounds obvious, but a lot of "automatic" organizers just move your files and hope for the best. The review table with inline editing gives you real control.</p><p><strong>Visual analysis on images is genuinely useful</strong>. Calling a local 4B model to look at actual pixel content and suggest a descriptive name is the thing that separates this app from any rename-by-rules script. It won't always be perfect, but it's directionally right far more often than filename heuristics.</p><p><strong>It runs entirely offline</strong>. No data leaves your machine when using local models. Images, filenames, document text, all processed locally. For people sorting sensitive files, this matters.</p><p><strong>The 1.8.0 screenshot-awareness is a real improvement</strong>. UI screenshots no longer get misclassified as generic photos. The app adds specific prompt guidance for dashboards, forms, mockups, and terminal captures.</p><p><strong>The undo feature works</strong>. Edit → Undo last run reverses the moves on a best-effort basis. Combined with dry-run mode, the safety net is solid for cautious users.</p><h2 id="what-to-be-aware-of">What to Be Aware Of</h2><p><strong>Analysis time scales with folder size and model.</strong> Processing a 500-file folder with visual analysis on every image takes meaningful time on CPU. Plan for it, don't run this right before you need your machine for something else.</p><p><strong>Legacy Office formats (.doc, .xls, .ppt) are not supported.</strong> Only the modern Office XML formats (.docx, .xlsx, .pptx) and OpenDocument equivalents are handled. Old binary formats need converting first.</p><p><strong>The visual model needs two GGUF files.</strong> The main model and the mmproj projector. If you download one and forget the other, image analysis is silently disabled. The app will prompt you to open the Select LLM dialog, but it's easy to miss if you're not looking.</p><p><strong>Rename suggestions on images aren't always specific.</strong> A generic outdoor photo might get a generic descriptive name. The model does its best with what it can see, but "mountain_landscape.jpg" is only marginally better than "IMG_2048.jpg" if you have fifty of them. The categorization accuracy is stronger than the rename precision.</p><h2 id="conclusion">Conclusion</h2><p><strong>AI File Sorter</strong> is doing something meaningfully different from rename scripts and rules-based organizers. Reading actual image content with a visual LLM, extracting document text, reading audio metadata and then letting you review everything before a single file moves, is the right design for a tool that touches your files.<br><br>The local-first approach is a genuine differentiator. My images, documents, and filenames stayed on my machine throughout. No API key, no cloud, no data leaving my hard drive.<br><br>The 1.8.0 improvements to the visual model (Gemma 3 4B IT as default, better screenshot detection, local learning from your approved reviews) make this a noticeably better version than what shipped a few months ago. It's not a finished, polished SaaS product; it's an actively developed open-source desktop app with rough edges, but for the specific problem of <strong>"I need to make sense of this chaotic folder of files,"</strong> it works.</p><p>I am loving to use local AI. It started with <a href="https://linuxhandbook.com/blog/personal-knowledge-base-with-local-ai/" rel="noreferrer">using AI for knowledgebase</a> and now for file sorting. I got to keep exploring 😄</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[11 Self-Hosted Knowledge Base Tools (For Individuals and Teams)]]></title>
                    <description><![CDATA[Take control of your notes and convert them into a proper knowledgebase. I discuss various tools for specific needs.]]></description>
                    <link>https://linuxhandbook.com/blog/self-hosted-knowledge-base-tools/</link>
                    <guid isPermaLink="false">69ddb66c918745000127f27a</guid>

                        <category><![CDATA[blog]]></category>
                        <category><![CDATA[Self Host]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Fri, 05 Jun 2026 15:59:39 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/06/self-host-knowledgebase.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/06/self-host-knowledgebase.png" alt="11 Self-Hosted Knowledge Base Tools (For Individuals and Teams)"/> <p>I spent time evaluating these across personal homelab setups, team documentation workflows, and AI-augmented note-taking, filtering down to 11 tools that solve real problems that cloud-only solutions like Notion and Confluence leave unaddressed.</p><p>There's a reason self-hosted knowledge bases are surging in interest right now: <strong>local AI integration</strong>. Tools like Claude (via MCP), <a href="https://linuxhandbook.com/blog/personal-knowledge-base-with-local-ai/" rel="noreferrer">Ollama-backed local LLMs, and RAG pipelines mean you can now ask your own knowledge base questions in natural language</a>, without sending your private notes to a third-party server. The difference between a knowledge base that supports Markdown on disk and one that locks you into a proprietary format is now the difference between AI-queryable and AI-blind. </p><p><strong>Short on time?</strong> Jump to the comparison table below, or use the headers to find your fit.</p><h2 id="at-a-glance-all-11-tools-compared"><strong>At a Glance: All 11 Tools Compared</strong></h2><p>Here's a quick overview before the full breakdowns.</p><table>
<thead>
<tr>
<th>Tool</th>
<th>Best For</th>
<th>AI Integration</th>
<th>Managed Hosting</th>
<th>Our Pick</th>
</tr>
</thead>
<tbody>
<tr>
<td>Outline</td>
<td>Team wikis with Claude/MCP support</td>
<td>MCP + built-in AI search</td>
<td>✅ Official cloud</td>
<td>🏆 Top Pick</td>
</tr>
<tr>
<td>BookStack</td>
<td>Simple structured team docs</td>
<td>API-connectable</td>
<td>❌ Self-host only</td>
<td>Best for Simplicity</td>
</tr>
<tr>
<td>Wiki.js</td>
<td>Developer-first wikis</td>
<td>Via modules + API</td>
<td>❌ Self-host only</td>
<td>Best for Devs</td>
</tr>
<tr>
<td>Obsidian</td>
<td>Personal knowledge + AI plugins</td>
<td>Ollama + Claude plugins</td>
<td>✅ Obsidian Sync (paid)</td>
<td>Best Personal PKM</td>
</tr>
<tr>
<td>AFFiNE</td>
<td>Notion-like all-in-one + whiteboard</td>
<td>Built-in Copilot (Claude/OpenAI/Gemini)</td>
<td>✅ AFFiNE Cloud</td>
<td>Best Notion Alternative</td>
</tr>
<tr>
<td>SiYuan</td>
<td>Private block-based PKM</td>
<td>Local AI proxy support</td>
<td>✅ Official service</td>
<td>Best Privacy-First Pick</td>
</tr>
<tr>
<td>Logseq</td>
<td>Networked thought + graph view</td>
<td>Ollama + API plugins</td>
<td>❌ Self-host only</td>
<td>Best Graph Thinker</td>
</tr>
<tr>
<td>AppFlowy</td>
<td>Open Notion replacement</td>
<td>AI integrations in progress</td>
<td>✅ AppFlowy Cloud</td>
<td>Best Growing Alternative</td>
</tr>
<tr>
<td>Trilium Notes</td>
<td>Deep hierarchical personal knowledge</td>
<td>API scripting + LLM bridges</td>
<td>❌ Self-host only</td>
<td>Best Power User PKM</td>
</tr>
<tr>
<td>Anytype</td>
<td>Local-first object-based knowledge</td>
<td>Planned</td>
<td>✅ Anytype Sync</td>
<td>Best for Offline-First</td>
</tr>
<tr>
<td>Joplin</td>
<td>Portable encrypted notes + sync</td>
<td>AI plugins + Joplin AI</td>
<td>✅ Joplin Cloud (paid)</td>
<td>Best Portable Notes</td>
</tr>
</tbody>
</table>
<p>Now let's go through each one.</p><h2 id="outlinebest-team-knowledge-base-with-native-claudemcp-integration">Outline - Best Team Knowledge Base with Native Claude/MCP Integration</h2><p>Outline is a fast, Markdown-based team wiki and knowledge base that has quietly become the go-to self-hosted alternative to Notion/Confluence for small-to-medium teams - and its Model Context Protocol (MCP) support now lets you connect Claude directly to your Outline wiki to search, read, and write documents through natural language.</p><p><strong>Who it's best for: </strong>Engineering teams and small companies who want a clean, fast, team-accessible wiki that doesn't require a Confluence subscription - especially teams that want Claude or other AI assistants to be able to query the wiki directly.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">git clone https://github.com/vicalloy/outline-docker-compose.git
cd outline-docker-compose
cp scripts/config.sh.sample scripts/config.sh
# update config file: vim scripts/config.sh
make install  # Create a docker-compose config file and start it. Initializing the oidc-server(add oidc client for outline and create a superuser).</code></pre><p>You will be asked to set up the username and the password for the authentication. Once you set all the things, you will see the outline running on localhost:8888 as below:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-29.png" class="kg-image" alt="Home page of Outline." loading="lazy" width="1920" height="1051" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-29.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-29.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-29.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-29.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Home page of Outline.</span></figcaption></figure><p>The Claude/MCP integration is the headline feature here. With the Outline MCP server, Claude can search your wiki, fetch document contents, and even create or update documents.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-30.png" class="kg-image" alt="API integration feature of Outline." loading="lazy" width="1920" height="1051" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-30.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-30.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-30.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-30.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">API integration feature of Outline.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Built-in AI-powered search that answers questions from your docs<br>- Official MCP server for Claude, Cursor, and VS Code AI integrations<br>- Export any document or entire workspace as Markdown, HTML, or JSON<br>- Guest links, public collections, and team permissions<br>- Official managed cloud option if self-hosting isn't your preference</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- Self-hosting requires PostgreSQL + Redis<br>- Not a trivial single-container setup<br>- OIDC/SSO setup adds complexity for secure multi-user deployments<br>- Real-time collaboration editing is limited compared to Google Docs</div></div><p><strong>Verdict:</strong> The most AI-forward self-hosted team wiki available today. If your team uses Claude and wants the AI to actually <em>know</em> what's in your internal docs, Outline's MCP integration makes that real.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/outline/outline?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | Outline </a></div><h2 id="bookstackbest-self-hosted-wiki-for-simple-structured-team-documentation">BookStack - Best Self-Hosted Wiki for Simple, Structured Team Documentation</h2><p>BookStack is a self-hosted documentation platform organized around a physical book metaphor: <strong>Books → Chapters → Pages</strong>. It's opinionated in the best way, the structure makes sense immediately, and there's virtually no setup overhead for the end user.</p><p><strong>Who it's best for: </strong>Small teams, IT departments, and homlab operators who need a clean, no-frills internal wiki for SOPs, runbooks, and project docs and don't want to spend time configuring the tool itself before using it.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">#docker compose file
services:
  bookstack:
    image: lscr.io/linuxserver/bookstack:latest
    container_name: my_bookstack
    environment:
      - PUID=1000
      - PGID=1000
      - APP_URL=http://localhost:6875
      - APP_KEY=[key]
      - DB_HOST=my_bookstack_db
      - DB_USER=bookstack
      - DB_PASS=yourpassword
      - DB_DATABASE=bookstackapp
    volumes:
      - ./bookstack_app_data:/config
    ports:
      - 6875:80
    restart: unless-stopped
    depends_on:
      - bookstack_db

  bookstack_db:
    image: lscr.io/linuxserver/mariadb:latest
    container_name: my_bookstack_db
    environment:
      - PUID=1000
      - PGID=1000
      - MYSQL_ROOT_PASSWORD=yourpassword
      - TZ=Etc/UTC
      - MYSQL_DATABASE=bookstackapp
      - MYSQL_USER=bookstack
      - MYSQL_PASSWORD=yourpassword
    volumes:
      - ./bookstack_db_data:/config
    restart: unless-stopped</code></pre><p>You need to set the parameters as per your requirements, then after <code>docker compose up</code> you will see the application running on <code>localhost:6875</code>. You just need to generate one <code>APP_KEY</code> then you can replace the same and run the compose file.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-31.png" class="kg-image" alt="Bookstack running on localhost:6875." loading="lazy" width="1920" height="1051" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-31.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-31.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-31.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-31.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Bookstack running on localhost:6875.</span></figcaption></figure><p>You will see a simple minimalist view which represents the books, chapters and pages. Export formats: <strong>Markdown, HTML, PDF, Plain Text, ZIP</strong> (portable backup of an entire Book or shelf).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-32.png" class="kg-image" alt="Bookstack feature showing stack arrangement." loading="lazy" width="1920" height="1051" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-32.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-32.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-32.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-32.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Bookstack feature showing stack arrangement.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Extremely clean UX, non-technical users don't need training<br>- Full REST API for AI integrations and automation<br>- Export: MD, HTML, PDF, TXT, Portable ZIP for full backups<br>- Diagram support (draw.io) built in-Active development, large community, great documentation- LDAP and SAML SSO support</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- No official managed hosting, you self-host or look for third-party providers<br>- Page editor is limited for power users compared to Notion-like block editors<br>- No graph view, backlinks, or bidirectional linking- AI integration requires third-party tooling via the API</div></div><p><strong>Verdict:</strong> The most production-ready, plug-and-play wiki on this entire list. If your team has been putting off setting up internal documentation because every option felt complex, BookStack removes that excuse.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/BookStackApp/BookStack?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | BookStack </a></div><h2 id="wikijsbest-self-hosted-wiki-for-developer-teams">Wiki.js - Best Self-Hosted Wiki for Developer Teams</h2><p>Wiki.js is a modern, Node.js-based wiki platform with multiple storage backends, including <strong>Git sync -</strong> meaning your documentation can live as Markdown files in a Git repository, automatically synced both ways. This makes it trivially easy to point AI tools at your docs.</p><p><strong>Who it's best for: </strong>Developer teams who want their documentation to live in Git alongside their code and want a clean web UI on top without giving up version history, PRs, or `git blame` for docs.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: wiki
      POSTGRES_PASSWORD: wikijsrocks
      POSTGRES_USER: wikijs
    volumes:
      - db-data:/var/lib/postgresql/data
    restart: unless-stopped

  wiki:
    image: ghcr.io/requarks/wiki:2
    depends_on:
      - db
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: wikijsrocks
      DB_NAME: wiki
    ports:
      - "3000:3000"
    restart: unless-stopped

volumes:
  db-data:
</code></pre><p>After running the compose, you will be able to see the application running:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-33.png" class="kg-image" alt="Wiki.js initial configuration page." loading="lazy" width="1920" height="1008" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-33.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-33.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-33.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-33.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Wiki.js initial configuration page.</span></figcaption></figure><p>After the initial setup of the email and password, you will get to see different features like search engines, API access, authentication, storage, analytics and many more.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-34.png" class="kg-image" alt="Wiki.js in action." loading="lazy" width="1920" height="968" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-34.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-34.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-34.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-34.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Wiki.js in action.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Git-backed storage keeps docs in Markdown in a real Git repo<br>- Multiple database backends: PostgreSQL, MySQL, SQLite, MSSQL<br>- LDAP, SAML, Auth0, Google, GitHub SSO all configurable<br>- Beautiful, modern reader and editor UI</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- No managed hosting option (self-host only)<br>- Setup is heavier than BookStack<br>- Wiki.js 3.x has been in development for a long time;c stable 2.x is the current release<br>- No graph/backlink view</div></div><p><strong>Verdict:</strong> The best choice for engineering teams who want their wiki to behave like their code, in Git, reviewable, version-controlled, and introspectable by any AI tool that can read a repo.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/Requarks/wiki?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | Wiki.js </a></div><h2 id="obsidianbest-personal-knowledge-base-with-ai-plugin-ecosystem">Obsidian - Best Personal Knowledge Base with AI Plugin Ecosystem</h2><p>Obsidian stores your notes as plain Markdown files on disk, which sounds simple, but it means you have the most AI-friendly knowledge base possible. Every local LLM (via Ollama), every AI agent (including Claude via MCP), and every search tool can work directly with your notes without any export step.</p><p><strong>Who it's best for: </strong>Researchers, writers, developers, and knowledge workers who want a powerful personal knowledge base with bidirectional links, a graph view, and access to the richest AI plugin ecosystem of any PKM tool available.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">services:
  obsidian:
    image: lscr.io/linuxserver/obsidian:latest
    container_name: obsidian
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - obsidian-config:/config
    ports:
      - 3000:3000
      - 3001:3001
    restart: unless-stopped
    shm_size: "1gb"

volumes:
  obsidian-config:
</code></pre><p>After setting up your obsidian will be running on <code>localhost:3000</code> </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-35.png" class="kg-image" alt="Obsidian running on localhost:3000." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-35.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-35.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-35.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-35.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Obsidian running on localhost:3000.</span></figcaption></figure><p>It supports many open source and community plugins and the graph view is one of the most promising features. Through these plugins, like <a href="https://github.com/aaronsb/obsidian-mcp-plugin?ref=linuxhandbook.com" rel="noreferrer">obsidian-mcp</a> you can expose your Obsidian vault to Claude desktop.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-36.png" class="kg-image" alt="AI Plugins integration in obsidian." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-36.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-36.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-36.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-36.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">AI Plugins integration in obsidian.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Files are just <code spellcheck="false" style="white-space: pre-wrap;">.md</code> files in a folder, zero lock-in, maximum AI compatibility<br>- Graph view shows the full web of connected notes<br>- 1000+ community plugins including mature AI integrations (Ollama, Claude, OpenAI)<br>- Bidirectional links, tags, data views, daily notes, canvases<br>- Claude MCP integration lets Claude read your vault natively</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- Not a team/shared knowledge base, designed for a single user's vault<br>- AI plugins require setup time, no "AI that just works" out of the box<br>- Graph view can become overwhelming with large vaults</div></div><p><strong>Verdict:</strong> The most AI-ready knowledge base because it's the most file-system-friendly. Your notes are just Markdown. Claude can read them via MCP. Ollama can embed them for RAG. If AI augmentation of your personal knowledge base matters, start here.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/obsidianmd?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | Obsidian </a></div><h2 id="affinebest-all-in-one-knowledge-base-with-built-in-ai-copilot">AFFiNE - Best All-in-One Knowledge Base with Built-In AI Copilot</h2><p>AFFiNE is an open-source, self-hostable Notion alternative that combines documents, databases, and an <strong>infinite whiteboard canvas</strong> - with a built-in AI Copilot that supports Claude, OpenAI, and Gemini models, configurable from the admin console of your self-hosted instance.</p><p><strong>Who it's best for: </strong>Teams and individuals who want the Notion all-in-one experience (notes + projects + databases + visual thinking) but want to self-host their data and plug in their own AI provider, including Claude.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">name: affine
services:
  affine:
    image: ghcr.io/toeverything/affine:${AFFINE_REVISION:-stable}
    container_name: affine_server
    ports:
      - '${PORT:-3010}:3010'
    depends_on:
      redis:
        condition: service_healthy
      postgres:
        condition: service_healthy
      affine_migration:
        condition: service_completed_successfully
    volumes:
      # custom configurations
      - ${UPLOAD_LOCATION}:/root/.affine/storage
      - ${CONFIG_LOCATION}:/root/.affine/config
    env_file:
      - .env
    environment:
      - REDIS_SERVER_HOST=redis
      - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/${DB_DATABASE:-affine}
      - AFFINE_INDEXER_ENABLED=false
    restart: unless-stopped

  affine_migration:
    image: ghcr.io/toeverything/affine:${AFFINE_REVISION:-stable}
    container_name: affine_migration_job
    volumes:
      # custom configurations
      - ${UPLOAD_LOCATION}:/root/.affine/storage
      - ${CONFIG_LOCATION}:/root/.affine/config
    command: ['sh', '-c', 'node ./scripts/self-host-predeploy.js']
    env_file:
      - .env
    environment:
      - REDIS_SERVER_HOST=redis
      - DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@postgres:5432/${DB_DATABASE:-affine}
      - AFFINE_INDEXER_ENABLED=false
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy

  redis:
    image: redis
    container_name: affine_redis
    healthcheck:
      test: ['CMD', 'redis-cli', '--raw', 'incr', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  postgres:
    image: pgvector/pgvector:pg16
    container_name: affine_postgres
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ${DB_DATABASE:-affine}
      POSTGRES_INITDB_ARGS: '--data-checksums'
      # you better set a password for you database
      # or you may add 'POSTGRES_HOST_AUTH_METHOD=trust' to ignore postgres security policy
      POSTGRES_HOST_AUTH_METHOD: trust
    healthcheck:
      test:
        ['CMD', 'pg_isready', '-U', "${DB_USERNAME}", '-d', "${DB_DATABASE:-affine}"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped
</code></pre><p>After setting up, your application will be running on <code>localhost:3010</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-37.png" class="kg-image" alt="AFFiNE running on localhost:3010." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-37.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-37.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-37.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-37.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">AFFiNE running on localhost:3010.</span></figcaption></figure><p>You can also manage AI integration through the settings by providing API_KEY and necessary URLs.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-38.png" class="kg-image" alt="API integration feature configuration in AFFiNE." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-38.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-38.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-38.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-38.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">API integration feature configuration in obsidian.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Built-in AI Copilot, supports Claude, OpenAI, Gemini; configure your own API key<br>- Edgeless whiteboard mode for visual thinking alongside structured docs<br>- True offline mode, works without internet connection<br>- Open-source (MIT License) with AFFiNE Cloud as managed hosting option<br>- Import from Notion (ZIP export), legit migration path</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- AI features require PostgreSQL with <code spellcheck="false" style="white-space: pre-wrap;">pgvector</code> adds infra complexity for self-hosters<br>- Still actively maturing, some rough edges vs. Notion's polish<br>- Whiteboard + docs + databases in one can feel overwhelming initially<br>- Mobile apps are new and less polished than desktop ones</div></div><p><strong>Verdict:</strong> The most feature-complete open-source Notion alternative, and the only one with a genuinely integrated AI Copilot you can point at Claude. For teams migrating from Notion who want to keep their AI features, this is the path.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/toeverything/AFFiNE?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | AFFiNE </a></div><h2 id="siyuan-notesbest-privacy-first-knowledge-base-with-local-first-architecture">SiYuan Notes - Best Privacy-First Knowledge Base with Local-First Architecture</h2><p>SiYuan is a block-based, local-first personal knowledge management system with a built-in SQLite index, which means you get powerful block-level cross-referencing and database-like queries entirely on your own machine, with no mandatory cloud connection.</p><p><strong>Who it's best for: </strong>Privacy-conscious individuals and power users who want deep block-level relational linking, a clean self-contained app, and the option to self-host their own sync server without any third-party cloud involvement.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">version: "3.9"
services:
  siyuan:
    image: b3log/siyuan
    command: ["--workspace=/siyuan/workspace/", "--accessAuthCode=siyuanrocks"]
    ports:
      - 6806:6806
    volumes:
      - siyuan-data:/siyuan/workspace
    restart: unless-stopped

volumes:
  siyuan-data:
</code></pre><p>After running the setup you need to enter the authcode that you have set in the configuration in this case: <code>siyuanrocks</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-41.png" class="kg-image" alt="SiYuan Homepage." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-41.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-41.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-41.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-41.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">SiYuan Homepage.</span></figcaption></figure><p>You can also get the AI features through the API_KEY of ChatGPT, Claude, DeepSeek, and other models that support the OpenAI interface.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-40.png" class="kg-image" alt="AI Integration configuration in SiYuan." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-40.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-40.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-40.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-40.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">AI Integration configuration in SiYuan.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Completely local-first, no cloud required for any core feature<br>- Block-level SQL queries and relational cross-referencing built in<br>- End-to-end encryption for sync, data never leaves encrypted in transit<br>- Docker server mode, self-host your own sync for family or small team<br>- AI integration via API, community projects bridge SiYuan to local LLMs</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- Native format (<code spellcheck="false" style="white-space: pre-wrap;">.sy</code>) is custom JSON, requires conversion for AI tools (use Markdown export)<br>- Community is smaller than Obsidian, with fewer third-party AI plugins<br>- Steeper learning curve than BookStack or Outline<br>- Mobile apps exist, but sync setup requires technical comfort</div></div><p><strong>Verdict:</strong> The most technically sophisticated privacy-first PKM on the list. The SQL-queryable block database is genuinely unique; no other tool on this list lets you run relational queries across your notes like this.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/siyuan-note/siyuan?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | SiYuan </a></div><h2 id="logseqbest-knowledge-base-for-networked-thought-and-graph-based-thinking"> Logseq - Best Knowledge Base for Networked Thought and Graph-Based Thinking</h2><p>Logseq is a local-first, outline-based knowledge tool built around the concept of networked thought, every bullet point is a block that can be referenced from anywhere, and a graph view visualizes the connections between all your notes. Like Obsidian, it stores everything as plain Markdown (or Org-mode) files on disk.</p><p><strong>Who it's best for: </strong>Researchers, academics, writers, and deep thinkers who work with connecting ideas across many notes, anyone who has found flat note apps limiting and wants to see how their knowledge <strong><em>relates</em></strong> to itself.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">services:
  logseq:
    image: ghcr.io/logseq/logseq-webapp:latest
    ports:
      - "3001:80"
    restart: unless-stopped</code></pre><p>After deploying the setup, the Logseq will be available at <code>localhost:3001</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-42.png" class="kg-image" alt="Logseq in action." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-42.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-42.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-42.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-42.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Logseq in action.</span></figcaption></figure><p>Whiteboard and flashcards are one of the promising features from Logseq.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-43.png" class="kg-image" alt="Infinite Whiteboard feature of Logseq." loading="lazy" width="1920" height="1012" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-43.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-43.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-43.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-43.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Infinite Whiteboard feature of Logseq.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Outliner-first, every line is a block, referenceable from anywhere<br>- Graph view shows the full web of connections across all notes<br>- Plain Markdown files on disk, maximum AI compatibility<br>- Journals (daily note) workflow built in for capturing</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- Learning curve, the outliner paradigm feels different from traditional note apps<br>- No official self-hosted sync server, relies on third-party Logseq Sync<br>- Not a team/collaborative tool, fundamentally personal and local-first<br>- No managed hosting option for teams</div></div><p><strong>Verdict:</strong> The best choice for people who think in connections rather than linear documents. If you've ever wanted to see how all your research relates to itself, the graph view will immediately make sense. Pair it with Ollama and the Smart Search plugin for local AI querying.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/logseq/logseq?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | Logseq </a></div><h2 id="appflowybest-open-source-notion-alternative-with-growing-ai-features">AppFlowy - Best Open-Source Notion Alternative with Growing AI Features</h2><p>AppFlowy is an open-source, local-first Notion replacement built in Flutter, with a modular architecture designed from the ground up for customization and self-hosting. Its AI integration is under active development, with integrations for local models (Ollama) and cloud providers being added in 2024-2025.</p><p><strong>Who it's best for: </strong>Teams and individuals who want a Notion-like interface (documents, databases, kanban boards, calendars) with full local ownership and the ability to deploy their own sync server and are willing to accept that AI features are still maturing.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-bash"># clone repo
git clone https://github.com/AppFlowy-IO/AppFlowy-Cloud.git
cd AppFLowy-Cloud

# copy .env file
cp deploy.env .env

# change ports
NGINX_PORT=80
NGINX_TLS_PORT=443

docker compose up -d

docker compose ps</code></pre><p>After the setup, if there is an error of a port already in use, try changing the ports and running the application again.</p><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-44.png" class="kg-image" alt="AppFlowy in action." loading="lazy" width="1920" height="1009" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-44.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-44.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-44.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-44.png 1920w" sizes="(min-width: 720px) 720px"></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- Built for local-first ownership, your data stays on your machine<br>- Free managed cloud tier available (AppFlowy Cloud)<br>- Multi-view databases (grid, board, calendar, gallery) in the same document<br>- Open-source (AGPL) with active development<br>- Growing AI integrations - Ollama, OpenAI, Claude support added<br>- Cross-platform: Linux, macOS, Windows, iOS, Android</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- AI features are still maturing, functionality lags behind Notion AI<br>- Fewer third-party integrations than Notion<br>- Self-hosted sync server setup is non-trivial (Docker Compose with multiple services)<br>- Export formats are limited compared to other tools on this list- Performance on very large documents can still be rough</div></div><p><strong>Verdict:</strong> The most Notion-like experience in the open-source world, with local-first data ownership. The AI integrations are genuinely there, just earlier-stage. If you want to own your Notion replacement and watch it grow, AppFlowy is the right bet.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/AppFlowy-IO/AppFlowy?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | AppFlowy </a></div><h2 id="trilium-notesbest-self-hosted-tool-for-deep-hierarchical-personal-knowledge">Trilium Notes - Best Self-Hosted Tool for Deep Hierarchical Personal Knowledge</h2><p>Trilium Notes is a hierarchical personal knowledge base with an unusual superpower: <strong>scripted automation via built-in JavaScript note scripts</strong>. Notes can contain runnable JS that queries and manipulates other notes, making it a programmable knowledge system, not just a static wiki.</p><p><strong>Who it's best for: </strong>Power users and developers who want maximum flexibility in how their knowledge is organized and automated, including those who want to build custom AI integrations directly into their notes via JavaScript.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">services:
  trilium:
    image: zadam/trilium:latest
    container_name: trilium-notes
    restart: unless-stopped
    ports:
      - "50081:8080" # Mapping to an alternative port to avoid conflicts with other apps
    volumes:
      - trilium_data:/home/node/trilium-data
    environment:
      - TRILIUM_PORT=8080

volumes:
  trilium_data:</code></pre><p>After the setup the Trilium will be running on <code>localhost:50081</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-45.png" class="kg-image" alt="Trilium running on localhost:50081." loading="lazy" width="1920" height="1009" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-45.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-45.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-45.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-45.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Trilium running on localhost:50081.</span></figcaption></figure><p>It has a hierarchical structure of notes and also has the feature of canvas notes where you can add shapes, arrows and colors to your notes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-46.png" class="kg-image" alt="canvas notes feature." loading="lazy" width="1920" height="1009" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-46.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-46.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-46.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-46.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">canvas notes feature.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- JavaScript scripting inside notes, programmable knowledge base<br>- REST API (ETAPI) for external integrations, including AI tools<br>- Hierarchical tree organization can go extremely deep without losing structure<br>- Relation maps for visual linking<br>- Self-hosted sync server between desktop clients- Extensive attribute system for metadata</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- No managed cloud hosting, fully self-hosted only<br>- Trilium Notes (zadam) was archived in 2024, community fork TriliumNext is the active maintained version (use <code spellcheck="false" style="white-space: pre-wrap;">TriliumNext/Notes</code> on GitHub)<br>- UI looks dated compared to AFFiNE or Outline<br>- Not built for teams, fundamentally single-user</div></div><p><strong>Verdict: </strong>The most <strong><em>programmable</em></strong> personal knowledge base on the list. If you've ever wanted your notes to run code and call an AI API on their own, Trilium (via TriliumNext) is the only tool on this list that does that natively.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/TriliumNext/Trilium?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | Trilium</a></div><h2 id="anytypebest-local-first-knowledge-base-with-offline-first-architecture">Anytype - Best Local-First Knowledge Base with Offline-First Architecture</h2><p>Anytype is a privacy-focused, object-based personal knowledge tool built on a peer-to-peer protocol (Any-Sync). Everything is stored locally first and synced peer-to-peer; there's no central server that holds your data. Even when using Anytype's network for sync, data is end-to-end encrypted before leaving your device.</p><p><strong>Who it's best for: </strong>Privacy-focused individuals who want a Notion-like structured knowledge system with the strongest possible data sovereignty guarantees and are comfortable with a younger, still-maturing product.</p><p><strong>Quick Setup:</strong></p><p>Unlike the other projects this one needs you to download the Desktop app through their website: <a href="https://anytype.io/?ref=linuxhandbook.com">https://anytype.io/</a></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-47.png" class="kg-image" alt="Anytype Desktop Application. " loading="lazy" width="1920" height="1077" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-47.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-47.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-47.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-47.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Anytype Desktop Application. </span></figcaption></figure><p>Any experience gallery is one of the features they provide to experience different configurations created by some users for easy workflow management.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-48.png" class="kg-image" alt="Any Experience Gallery." loading="lazy" width="1920" height="1077" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-48.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-48.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-48.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-48.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Any Experience Gallery.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- End-to-end encrypted by default, data encrypted before leaving your device<br>- Self-hostable sync infrastructure (MongoDB + Redis + S3 stack)<br>- Free tier on Anytype's sync network with E2EE<br>- Object graph model, more flexible than flat notes or rigid hierarchy<br>- Import from Notion, Markdown, CSV</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- AI integration is planned but not yet available<br>- Self-hosting the Any-Sync infrastructure is complex (MongoDB + Redis + S3)<br>- Custom Any-Block format limits direct AI tool compatibility (use Markdown export)<br>- Product is still maturing, some features feel unfinished</div></div><p><strong>Verdict:</strong> The strongest privacy guarantee of any tool on this list, peer-to-peer, E2EE, and self-hostable right down to the sync layer. For users who treat data sovereignty as a non-negotiable, Anytype is the pick, even if it means waiting for AI features to land.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/anyproto?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | Anytype</a></div><h2 id="joplinbest-open-source-notes-app-with-portable-encryption-and-sync">Joplin - Best Open-Source Notes App with Portable Encryption and Sync</h2><p>Joplin is a mature, battle-tested open-source note-taking app that strikes the best balance between data portability, privacy, and accessibility across platforms. It syncs to virtually anything: Nextcloud, WebDAV, Dropbox, OneDrive, S3 and has Joplin AI and AI plugin support for LLM integration.</p><p><strong>Who it's best for: </strong>Users switching from Evernote or OneNote who want an open-source, self-hostable replacement with broad platform support, end-to-end encryption, and enough extensibility to add AI features via the plugin system.</p><p><strong>Quick Setup:</strong></p><pre><code class="language-yaml">services:
  postgres:
    image: postgres:16
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    restart: unless-stopped
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_DB=${POSTGRES_DATABASE}
    networks:
      - joplin_network

  joplinsync:
    image: joplin/server:latest
    depends_on:
      - postgres
    ports:
      - "22300:22300"
    restart: unless-stopped
    environment:
      - APP_PORT=22300
      - APP_BASE_URL=${APP_BASE_URL}
      - DB_CLIENT=pg
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
      - POSTGRES_DATABASE=${POSTGRES_DATABASE}
      - POSTGRES_USER=${POSTGRES_USER}
      - POSTGRES_PORT=5432
      - POSTGRES_HOST=postgres
    networks:
      - joplin_network

networks:
  joplin_network:
</code></pre><p>After giving the necessary parameters in your .env or values in specific parameters, the Joplin server will run at <code>localhost:22300</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-49.png" class="kg-image" alt="Joplin Homepage." loading="lazy" width="1914" height="991" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-49.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-49.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/04/image-49.png 1600w, https://linuxhandbook.com/content/images/2026/04/image-49.png 1914w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Joplin Homepage.</span></figcaption></figure><p>It has a plugin named <a href="https://joplinapp.org/plugins/plugin/joplin.plugin.alondmnt.jarvis/?ref=linuxhandbook.com" rel="noreferrer">Jarvis</a> (Joplin Assistant Running a Very Intelligent System), which&nbsp;is an AI note-taking assistant for&nbsp;Joplin, powered by online and&nbsp;offline&nbsp;LLMs (such as OpenAI's ChatGPT or GPT-4, Hugging Face, Gemini, Universal Sentence Encoder). For the Desktop application, you can download it from the official <a href="https://objects.joplinusercontent.com/v3.5.13/Joplin-3.5.13.AppImage?source=JoplinWebsite&type=New" rel="noreferrer">link</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/04/image-50.png" class="kg-image" alt="Joplin Desktop Application." loading="lazy" width="1550" height="879" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-50.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-50.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-50.png 1550w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Joplin Desktop Application.</span></figcaption></figure><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">✅</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Pros:</strong></b><br>- The most sync-target flexibility of any tool on the list (Nextcloud, S3, etc.)<br>- End-to-end encryption option for all synced notes<br>- Joplin AI plugin adds Claude/OpenAI/Ollama AI directly in the editor<br>- Battle-tested and mature, not a new or experimental product<br>- Joplin Cloud (paid) for zero-hassle managed sync</div></div><div class="kg-card kg-callout-card kg-callout-card-red"><div class="kg-callout-emoji">🔴</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Cons:</strong></b><br>- JEX native backup format is tar-based, not human-readable without Joplin<br>- Web Clipper exists but is less polished than Evernote's<br>- No graph view or bidirectional links, flat notebook hierarchy only<br>- Editor UX is functional but lacks the polish of AFFiNE or Outline</div></div><p><strong>Verdict:</strong> The safest choice for Evernote/OneNote migrants who value data portability above all else. The plugin ecosystem and AI integration make it more capable than it looks, and the sync flexibility means it fits into virtually any existing self-hosted stack.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://github.com/laurent22/joplin?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">GitHub | Joplin</a></div><h2 id=""></h2><h2 id="final-recommendation">Final Recommendation</h2><p><strong>If you need a team knowledge base with AI today, use Outline.</strong> Its MCP integration for Claude is production-ready, its Markdown export keeps you unlockedin, and the managed cloud tier means you can start without infrastructure. After that, pick based on your primary use case:</p><ul><li>Team documentation: Outline (AI-first, MCP/Claude) or BookStack (simple, structured)</li><li>Developer teams wanting Git-backed docs → Wiki.js (Markdown in Git, then any AI agent can query it)</li><li>Personal knowledge + AI plugins: Obsidian (plain files + Ollama/Claude MCP) or Logseq (graph-first with local AI)</li><li>Notion replacement with built-in AI Copilot: AFFiNE (Claude/OpenAI/Gemini configured in admin)</li><li>Privacy-first with maximum data sovereignty: SiYuan (local-first, SQL-queryable) or Anytype (E2EE P2P sync)</li><li>Programmable personal knowledge base: TriliumNext (JavaScript scripting in notes, call AI APIs directly)</li><li>Evernote migrators: Joplin (ENEX import, E2EE sync, AI plugin available)</li></ul><p>If you have any of the self-hosted knowledge base tools not listed here, feel free to drop them in the <strong>comments!</strong></p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[How I Set Up AI Agent to Access My Kanban Task Board]]></title>
                    <description><![CDATA[Life becomes easier when I can ask my AI assistant to create and manage my Kanban task board. Here&#x27;s the set up I use.]]></description>
                    <link>https://linuxhandbook.com/blog/zeroclaw-ai-with-fizzy-automation/</link>
                    <guid isPermaLink="false">6a1172010fd5850001a06a9f</guid>

                        <category><![CDATA[AI 🤖🧠]]></category>
                        <category><![CDATA[blog]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Fri, 29 May 2026 08:09:54 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/ai-agent-with-kanban.webp" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/ai-agent-with-kanban.webp" alt="How I Set Up AI Agent to Access My Kanban Task Board"/> <p>I manage my project boards in <a href="https://www.fizzy.do/?ref=linuxhandbook.com">Fizzy</a>, Basecamp's clean, opinionated kanban tool, and I got tired of the same ritual: open the browser, navigate to the board, drag a card, close the tab, back to work,  repeat. The board lives in one app, my actual work lives somewhere else, and that context switching chips away at focus more than I'd like to admit. So I decided to fix it. Here's what I did.</p><h2 id="what-i-built">What I built</h2><p>Before going through this, I need you to know what Fizzy CLI and ZeroClaw is:</p><p>Fizzy CLI fixes half of that problem. It's an official command-line tool that lets you create cards, post comments, search your board, and manage attachments entirely from the terminal, no browser required. The other half of the problem gets solved by ZeroClaw.</p><p><a href="https://github.com/zeroclaw-labs/zeroclaw?ref=linuxhandbook.com">ZeroClaw</a> is an open-source agent runtime written in Rust, a single binary you install and configure. It connects to 30+ channels (Telegram, Discord, Matrix, email, or just your CLI), and is genuinely provider-agnostic: it talks to Anthropic, OpenAI, Gemini, Ollama, Groq, and about twenty other LLM backends, all from the same TOML config file. Everything runs on your machine, with your keys. This guide walks you through installing Fizzy CLI, authenticating it, and wiring it up to a running NanoClaw agent so you have end-to-end control of your boards from the terminal and from any messaging app.</p><p>Once you wire Fizzy into ZeroClaw as a shell tool, you can message your agent <strong><em>"add a card titled fix the auth bug to my backlog"</em></strong> and it just does it - from your phone, from Telegram, from wherever you happen to be.</p><p>I ended up installing Fizzy CLI, authenticating it, and wiring it to a ZeroClaw agent, and in this post I'm walking through exactly what I did, including the parts that didn't go smoothly.</p><h2 id="what-i-used">What I used</h2><ul>
<li>A Linux machine - I ran this on Ubuntu 22.04 LTS; Arch and Fedora should work fine too</li>
<li>An active <a href="https://fizzy.do/?ref=linuxhandbook.com">Fizzy</a> account with at least one board created</li>
<li>A Fizzy personal access token - get it from <strong>Profile → API Tokens</strong> in the Fizzy web UI</li>
<li>One of: a free <a href="https://aistudio.google.com/app/apikey?ref=linuxhandbook.com">Gemini API key from Google AI Studio</a>, or <a href="https://ollama.com/?ref=linuxhandbook.com">Ollama</a> running locally with a model pulled (e.g., <code>ollama pull qwen2.5:7b</code>)</li>
</ul>
<div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">The Gemini API has a generous free tier - 15 requests per minute and 250,000 tokens per minute on the free plan. That's more than enough for personal board management. If you already have Google One AI Premium, you get even higher limits in AI Studio.<br></div></div><h2 id="installing-fizzy-cli">Installing Fizzy CLI</h2><p>The fastest path on Linux is the official install script - it detected my architecture, pulled the right binary, and verified checksums automatically. I just ran:</p><pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/basecamp/fizzy-cli/master/scripts/install.sh | bash</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-34.png" class="kg-image" alt="Installing fizzy-cli" loading="lazy" width="1281" height="695" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-34.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-34.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-34.png 1281w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Installing fizzy-cli</span></figcaption></figure><p>Complete the installation process, it will prompt for the PAT, generate it from your personal fizzy profile and enter it when prompted. </p><p>If you're on Arch Linux or Omarchy, it's available in the AUR:</p><pre><code class="language-bash">yay -S fizzy-cli
</code></pre><p>Once the installer finishes, confirm the binary is on your PATH:</p><pre><code class="language-bash">fizzy --version
</code></pre><p>You should see the version string printed cleanly. If your shell says <code>command not found</code>, the binary likely landed in <code>~/.local/bin</code> - make sure that's in your <code>PATH</code>.</p><pre><code class="language-bash">export PATH="/home/USERNAME/.local/bin:$PATH"</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-35.png" class="kg-image" alt="fizzy working in terminal" loading="lazy" width="741" height="266" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-35.png 600w, https://linuxhandbook.com/content/images/2026/05/image-35.png 741w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">fizzy working in terminal</span></figcaption></figure><h2 id="exploring-the-basic-commands">Exploring the Basic Commands</h2><p>First I ran this to confirm my identity and grab my account slug:</p><pre><code class="language-bash">fizzy identity show</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-36.png" class="kg-image" alt="Fizzy Identity information" loading="lazy" width="866" height="117" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-36.png 600w, https://linuxhandbook.com/content/images/2026/05/image-36.png 866w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Fizzy Identity information</span></figcaption></figure><p>It will show all the identity information along with your <code>slug id</code> , use that id and run the following command:</p><pre><code class="language-bash">fizzy board list --account "slug id"</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-37.png" class="kg-image" alt="Fizzt listing boards " loading="lazy" width="962" height="99" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-37.png 600w, https://linuxhandbook.com/content/images/2026/05/image-37.png 962w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Fizzt listing boards </span></figcaption></figure><p>Here is a list of boards with their names. As I have more accounts, I need to mention the account ID for commands.</p><p>Try more commands like:</p><pre><code class="language-bash"># List cards on your default board
fizzy card list

# View details of a specific card
fizzy card show 2

# Search across your board
fizzy search "authentication bug"

# Add a comment to a card
fizzy comment create --card 42 --body "Reproduced on staging."</code></pre><p>It will display the cards, a specific card, searching across the board, etc.</p><p>Also, if you use <code>jq</code> the output will be in formatted so that you can clearly make sense of the results. </p><pre><code class="language-bash">fizzy card list --account "id" | jq</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-38.png" class="kg-image" alt="Formatted JSON output of fizzy" loading="lazy" width="1095" height="520" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-38.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-38.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-38.png 1095w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Formatted JSON output of fizzy</span></figcaption></figure><h2 id="installing-zeroclaw">Installing ZeroClaw</h2><p>ZeroClaw ships as a single Rust binary. When the install script asked me whether I wanted a prebuilt binary or a source build, I went with prebuilt - it was done in seconds:</p><pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/zeroclaw-labs/zeroclaw/master/install.sh | bash</code></pre><p>When it finishes, confirm it's available:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-39.png" class="kg-image" alt="ZeroClaw installed" loading="lazy" width="1275" height="552" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-39.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-39.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-39.png 1275w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">ZeroClaw installed</span></figcaption></figure><p>When it finishes, confirm it's available:</p><pre><code class="language-bash">zeroclaw --version</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-40.png" class="kg-image" alt="ZeroClaw installed and working" loading="lazy" width="693" height="100" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-40.png 600w, https://linuxhandbook.com/content/images/2026/05/image-40.png 693w"><figcaption><span style="white-space: pre-wrap;">ZeroClaw installed and working</span></figcaption></figure><p>ZeroClaw has no runtime dependencies. No Docker, no Node.js, no Python. The binary is self-contained.</p><h2 id="running-the-onboarding-wizard">Running the Onboarding Wizard</h2><p>ZeroClaw's config lives at <code>~/.zeroclaw/config.toml</code>. Running the onboarding wizard creates it for you:  </p><pre><code class="language-bash">zeroclaw onboard</code></pre><p>The wizard walked me through four things:</p><ul>
<li>LLM provider - which model backend to use</li>
<li>API key or endpoint - your credentials for that provider</li>
<li>At least one channel - the built-in <code>cli</code> channel works for now; you can add Telegram or Discord later</li>
<li>Agent alias - a name for your agent entry in the config</li>
</ul>
<p>For the LLM provider step, enter <code>gemini</code> and paste your Google AI Studio API key when prompted. If you're using Ollama locally, choose <code>ollama</code> instead, the wizard will ask for your model name (e.g., <code>qwen2.5:7b</code>) and leave the endpoint at the default <code>http://localhost:11434</code>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-41.png" class="kg-image" alt="ZeroClaw onboard setup" loading="lazy" width="1041" height="718" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-41.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-41.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-41.png 1041w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">ZeroClaw onboard setup</span></figcaption></figure><p>There is vast support for various channels: </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-42.png" class="kg-image" alt="Supported channel in ZeroClaw" loading="lazy" width="1041" height="718" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-42.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-42.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-42.png 1041w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Supported channel in ZeroClaw</span></figcaption></figure><p>Then there will be an option to select a memory backend, select the appropriate one as per your need:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-43.png" class="kg-image" alt="Memory backend filter " loading="lazy" width="1041" height="718" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-43.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-43.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-43.png 1041w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Memory backend filter </span></figcaption></figure><p><strong>the <code>model_provider</code> field on your agent is the only place you specify which LLM to use </strong>in your <code>~/.zeroclaw/config.toml</code> . Swapping from Gemini to Ollama to Groq is a one-line change.</p><h2 id="registering-fizzy-as-a-shell-tool">Registering Fizzy as a Shell Tool</h2><p>ZeroClaw's shell tool lets the agent run any command on your machine. To give it access to <code>fizzy</code>, add a tool entry to your config and give the agent permission to use it:</p><p>Add "fizzy" at commands in config, it will look like this:</p><pre><code class="language-toml">allowed_commands = [
    "git",
    "npm",
    "cargo",
    "ls",
    "cat",
    "grep",
    "find",
    "echo",
    "pwd",
    "wc",
    "head",
    "tail",
    "date",
    "df",
    "du",
    "uname",
    "uptime",
    "hostname",
    "python",
    "python3",
    "pip",
    "node",
    "free",
    "fizzy"
]</code></pre><p>One thing that caught me off guard: Fizzy has to be explicitly listed in allowed_commands or ZeroClaw's security layer blocks it, even if you've defined the tool entry. I learned this the hard way after getting a "Command not allowed by security policy" error.</p><p>Then add the new entry in the config: </p><pre><code class="language-toml">[tools.shell.fizzy]
description = "Manage Fizzy kanban boards via the Fizzy CLI"
command     = "fizzy"
allowed_args = ["board", "card", "comment", "search", "commands"]

[agents.assistant]
model_provider = "gemini-cli"
risk_profile   = "supervised"
tools          = ["shell.fizzy"]</code></pre><p>Follow the similar steps for ollama setup too.</p><p>Check once the parameters as per your model are selected. Whichever path you followed, the wizard ends with a quick live chat to confirm your agent is working. You'll see a prompt like:</p><h2 id="confirming-the-agent-responds">Confirming the Agent Responds</h2><p><br>Whichever path you followed, Gemini or Ollama, start the agent to confirm everything is working:</p><pre><code class="language-bash">zeroclaw agent
</code></pre><p>You should get a CLI chat prompt. Type a test message:</p><pre><code class="language-bash">Hello, are you there?</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-44.png" class="kg-image" alt="Agent responding to the model" loading="lazy" width="795" height="501" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-44.png 600w, https://linuxhandbook.com/content/images/2026/05/image-44.png 795w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Agent responding to the model</span></figcaption></figure><p>If it responds, you're done. If you are using a local LLM and see an error like <strong>model requires more system memory than is available</strong>, your chosen model is too large for the free RAM currently available. Fix it by pulling the 1B model instead and updating your config:</p><pre><code class="language-bash">ollama pull llama3.2:1b
# Then edit ~/.zeroclaw/config.toml and set: model = "llama3.2:1b"</code></pre><p>If it responds, your LLM backend is wired up correctly. Total setup time is about five minutes. Once the agent responds, you're ready to wire in Fizzy.</p><h2 id="verifying-the-fizzy-integration">Verifying the Fizzy Integration</h2><p> I asked the agent something simple to confirm the wiring:</p><pre><code class="language-bash">Use the fizzy shell tool to run: fizzy card list</code></pre><p>ZeroClaw called fizzy card list, parsed the JSON output, and summarized my cards in natural language. In supervised mode it asked for approval first - I pressed Y, and it worked.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-45.png" class="kg-image" alt="Fizzy cli with zeroclaw agent" loading="lazy" width="969" height="688" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-45.png 600w, https://linuxhandbook.com/content/images/2026/05/image-45.png 969w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Fizzy cli with zeroclaw agent</span></figcaption></figure><p>One tip I'd pass on: be explicit in your prompt. "List the cards on my board" can confuse the agent into doing a web search instead. Saying "use the fizzy shell tool to run..." removes the ambiguity entirely.</p><p>From there, you can do things like:</p><pre><code class="language-bash">Create a card titled "Review auth middleware" on my board.
Add a comment to first card saying I'll look at this after the release.
Search for anything related to "database migration".</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-46.png" class="kg-image" alt="Agent adding comment to respective cards" loading="lazy" width="974" height="385" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-46.png 600w, https://linuxhandbook.com/content/images/2026/05/image-46.png 974w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Agent adding comment to respective cards</span></figcaption></figure><h2 id="what-to-explore-next">What to Explore Next</h2><p>We have covered how to setup and get started with Fizzy CLI with ZeroClaw agent, but you can explore more things like: </p><p><strong>Per-repo board context</strong>: Create a <code>.fizzy.yaml</code> in any project directory with a <code>board</code> field. When you're inside that directory, <code>fizzy card list</code> will default to that project's board automatically, no flags needed.<br><br><strong>Swap the model</strong>: If Gemini starts hitting rate limits or you want to try something faster, add a second provider entry and change the <code>model_provider</code> alias on your agent. <br><br><strong>Add a second agent</strong>: ZeroClaw supports multiple <code>[agents.*]</code> entries pointing at different providers. You could run a lightweight Ollama model for quick card operations and route heavier reasoning tasks to Gemini, all from the same ZeroClaw instance.</p><h2 id="wrapping-up">Wrapping Up</h2><p>What I like most about this setup is the flexibility. ZeroClaw doesn't care which LLM I use. I started with Ollama locally, hit tool-calling limitations with smaller models, and switched to Gemini's free tier without touching anything except two lines in the config. </p><p>The context switching problem is what motivated all of this, and I think this setup genuinely solves it. Having Fizzy in the terminal is one improvement. It took me an afternoon to get everything right. The time it saves should compound from here.</p><p><strong>Do visit the repos and try it yourself!</strong></p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[How I Supercharged My Personal Knowledge Base with Local AI]]></title>
                    <description><![CDATA[Local notes. Local AI. Combine them and you have your own personal AI that answers based on your notes.]]></description>
                    <link>https://linuxhandbook.com/blog/personal-knowledge-base-with-local-ai/</link>
                    <guid isPermaLink="false">6a0da0870fd5850001a06639</guid>

                        <category><![CDATA[blog]]></category>
                        <category><![CDATA[AI 🤖🧠]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Fri, 22 May 2026 15:33:07 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/knowledgebase-with-local-ai.webp" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/knowledgebase-with-local-ai.webp" alt="How I Supercharged My Personal Knowledge Base with Local AI"/> <p>I have thousands of notes. <a href="https://obsidian.md/?ref=linuxhandbook.com">Obsidian</a> vaults, random Markdown files, half-finished research documents, meeting notes from three years ago. And for the longest time, they just sat there, searchable by filename, searchable by keyword, but never actually <strong><em>understood</em></strong>.</p><p>Then one evening I thought, What if I could just <strong><em>ask</em></strong> my notes a question?</p><p>You might be thinking the ChatGPT already does that, but it does not have access to your local workspace. You need to upload all the files you want to discover, not a cloud service that makes me wonder what happens to my data. </p><p>Instead, I thought of using just a small AI model, completely running on my own machine. I thought that it could handle these situations, which could read my notes and answer questions about them.</p><p>I tried it. It worked. And I have not stopped using it since. No GPU required, no monthly subscription, no data leaving my machine.</p><h2 id="the-problem-with-the-huge-pile-notes-and-how-ai-fixes-it">The problem with the huge pile notes (and how AI fixes it)</h2><p>Here is the honest truth: most knowledge management systems fail not at <strong><em>storing</em></strong> information, but at <strong><em>retrieving</em></strong> it. You spend time writing the note. You tag it. You organize it. And then, three weeks later, you cannot find it because you cannot remember what you called it or which folder you put it in.<br><br>Traditional search is keyword-based. It finds notes that contain the word "containerization", but it cannot answer "how do I deploy a container in a restricted environment?" by synthesizing your notes on Docker, your notes on firewalls, and that one Markdown file you wrote during a workshop.<br><br>That synthesis is exactly what a local AI model can do.</p><p>The technique is called <strong>RAG (Retrieval-Augmented Generation)</strong>. The AI does not memorize your notes. Instead, it reads them at query time, pulls the most relevant chunks, and uses them as context to generate an answer. </p><p>Think of it as giving the AI your notes as a reference book every time you ask a question.</p><h2 id="what-i-used-in-this-setup">What I used in this setup</h2><p>A fully local setup with three components:</p><ul><li>Ollama: Runs LLM models locally on your CPU (or GPU if you have one)</li><li>A lightweight embedding model: Converts notes into searchable vectors</li><li>AnythingLLM (or Open WebUI): UI that connects your notes to the model</li></ul><p>Everything runs on the local machine. The notes never leave the computer. The model does not even need an internet connection once it is downloaded.</p><h2 id="choosing-the-right-model">Choosing the right model</h2><p>This is the part most guides get wrong. They recommend a 7B parameter model. You try to run it on your laptop, and it takes 90 seconds to answer a simple question.<br><br>For a knowledge base assistant that runs comfortably on a CPU, even a mid-range one, the sweet spot is <strong>Phi-3 Mini</strong> (3.8B parameters from Microsoft) or <strong>Gemma 2B</strong> (from Google). Both are surprisingly capable for question-answering tasks, and they run well with 8 GB of RAM.</p><p>You can also refer to this <a href="https://itsfoss.com/testing-local-llms-without-gpu/?ref=linuxhandbook.com" rel="noreferrer">article</a> for information about models running on CPU.<br><br><strong>My recommendation</strong>: <strong>phi3:mini,</strong> it is fast, accurate, and was specifically fine-tuned for instruction-following tasks like Q&amp;A. It is the model I use for my own notes.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">📋</div><div class="kg-callout-text">These tests were done on a machine with 16 GB RAM and no dedicated GPU. Phi3:mini took roughly 5–8 seconds to respond to most queries. I find that acceptable for a personal knowledge base.</div></div><h2 id="part-1-setting-up-ollama">Part 1: Setting up Ollama</h2><p>Ollama is the engine that lets you run LLMs locally. It is a single binary, and the installation is one command.</p><h3 id="step-1-install-ollama">Step 1: Install Ollama</h3><pre><code class="language-bash">curl -fsSL https://ollama.com/install.sh | sh</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-18.png" class="kg-image" alt="Ollama installed through curl." loading="lazy" width="798" height="498" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-18.png 600w, https://linuxhandbook.com/content/images/2026/05/image-18.png 798w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Ollama installed through curl</span></figcaption></figure><p>Once installed, verify it is running:</p><pre><code class="language-bash">ollama --version</code></pre><p>Ollama starts a background service automatically. You can check its status:</p><pre><code class="language-bash">systemctl status ollama</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-19.png" class="kg-image" alt="Ollama version and running status." loading="lazy" width="798" height="498" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-19.png 600w, https://linuxhandbook.com/content/images/2026/05/image-19.png 798w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Ollama version and running status</span></figcaption></figure><h3 id="step-2-pull-the-model">Step 2: Pull the model</h3><p>Now download the model. For the CPU-friendly, low-resource setup I recommend:</p><pre><code class="language-bash">ollama pull phi3:mini</code></pre><p>This will download about 2.3 GB. Grab a coffee. If you have more RAM available (16 GB+) and want slightly better answers, you can also try:</p><pre><code class="language-bash">ollama pull gemma2:2b</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-20.png" class="kg-image" alt="pulling phi3:mini model through ollama." loading="lazy" width="740" height="289" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-20.png 600w, https://linuxhandbook.com/content/images/2026/05/image-20.png 740w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">pulling phi3:mini model through ollama</span></figcaption></figure><p>To verify the model is installed and working, test it immediately:</p><pre><code class="language-bash">ollama run phi3:mini "Explain what the ITIM subject is all about."</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-21.png" class="kg-image" alt="model giving answer to the question." loading="lazy" width="793" height="599" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-21.png 600w, https://linuxhandbook.com/content/images/2026/05/image-21.png 793w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">model giving answer to the question</span></figcaption></figure><p>If you see a coherent response, the model is working. We can move on.</p><h2 id="part-2-setting-up-anythingllm-as-the-notes-interface">Part 2: Setting up AnythingLLM as the notes interface</h2><p><a href="https://anythingllm.com/?ref=linuxhandbook.com">AnythingLLM</a> is a self-hosted, open-source application that lets you upload documents, point it at a folder, and query them through a clean chat interface. It handles the chunking, embedding, and retrieval pipeline so you do not have to set up a vector database yourself.</p><h3 id="step-1-install-anythingllm-via-docker">Step 1: Install AnythingLLM via Docker</h3><pre><code class="language-bash">docker pull mintplexlabs/anythingllm</code></pre><p>Create a directory to store AnythingLLM's data (your note indexes will live here):</p><pre><code class="language-bash">mkdir -p ~/.anythingllm</code></pre><p>Now run it:</p><pre><code class="language-bash">docker run -d \
  --network=host \
  --cap-add SYS_ADMIN \
  -v $HOME/.anythingllm:/app/server/storage \
  -e STORAGE_DIR="/app/server/storage" \
  --name anythingllm \
  mintplexlabs/anythingllm</code></pre><p>Verify the container is running:</p><pre><code class="language-bash">docker ps | grep anythingllm</code></pre><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/05/image-25.png" class="kg-image" alt="" loading="lazy" width="822" height="246" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-25.png 600w, https://linuxhandbook.com/content/images/2026/05/image-25.png 822w" sizes="(min-width: 720px) 720px"></figure><p>Now open your browser and navigate to: <code>http://localhost:3001</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-23.png" class="kg-image" alt="AnythingLLM GUI interface" loading="lazy" width="1920" height="1080" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-23.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-23.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/05/image-23.png 1600w, https://linuxhandbook.com/content/images/2026/05/image-23.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">AnythingLLM GUI interface</span></figcaption></figure><p>You will see the AnythingLLM setup wizard.</p><h3 id="step-2-connecting-anythingllm-to-the-local-ollama-model">Step 2: Connecting AnythingLLM to the local Ollama model</h3><p>During setup, AnythingLLM will ask you to choose an LLM provider. Select <strong>Ollama</strong> from the list.</p><ul><li>Ollama Base URL: <a href="http://localhost:11434/?ref=linuxhandbook.com">http://localhost:11434</a></li><li>Model: Select <code>phi3:mini</code> from the dropdown (it will auto-detect your installed models)</li></ul><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-24.png" class="kg-image" alt="ollama setup for AnythingLLM" loading="lazy" width="1920" height="1080" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-24.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-24.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/05/image-24.png 1600w, https://linuxhandbook.com/content/images/2026/05/image-24.png 1920w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">ollama setup for AnythingLLM</span></figcaption></figure><p>For the embedding model, which converts your notes into searchable vectors, stay within Ollama and choose:</p><pre><code class="language-bash">ollama pull nomic-embed-text</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-26.png" class="kg-image" alt="Select the model from the ollama" loading="lazy" width="928" height="931" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-26.png 600w, https://linuxhandbook.com/content/images/2026/05/image-26.png 928w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Select the model from the ollama</span></figcaption></figure><p><code>nomic-embed-text</code> is tiny (274 MB), fast, and produces excellent embeddings for English-language text. It is purpose-built for document retrieval, exactly what we need.</p><h2 id="part-3-importing-the-notes">Part 3: Importing the notes</h2><p>Let's move to connect knowledgebase with AI.</p><p>In AnythingLLM, a <strong>workspace</strong> is a scoped knowledge base. Think of it like a project folder; you can have one workspace for your work notes, one for personal research, one for a specific book you are reading.</p><ol><li>Click <strong>New Workspace</strong> and give it a name (e.g., "My Notes")</li><li>Click the <strong>Upload Documents</strong> button</li><li>Drag and drop your Markdown files, PDFs, or text files into the upload area</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-27.png" class="kg-image" alt="Adding local notes to the workspace" loading="lazy" width="1860" height="968" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-27.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-27.png 1000w, https://linuxhandbook.com/content/images/size/w1600/2026/05/image-27.png 1600w, https://linuxhandbook.com/content/images/2026/05/image-27.png 1860w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Adding local notes to the workspace</span></figcaption></figure><p>AnythingLLM will split your notes into chunks (typically 500–1000 tokens each) then generate an embedding vector for each chunk using <code>nomic-embed-text</code>  and then store everything in a local vector database (LanceDB, stored in <code>~/.anythingllm</code>).</p><p>This process takes a minute or two, depending on how many notes you have. </p><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">AnythingLLM supports Markdown, PDF, plain text, DOCX, and even web page scraping. If your notes live in Obsidian, just point it at your vault folder. If they are in Notion, export them as Markdown first.</div></div><h2 id="part-4-querying-the-notes">Part 4: Querying the notes</h2><p>Now is the time to make the most of the notes by using AI to question it.</p><p>Now the satisfying part. Click on your workspace, type a question in the chat box, and press Enter. To truly see the power of local AI, ask something that ChatGPT could never possibly know. For example, if you uploaded your home server notes:</p><pre><code class="language- ">According to my server migration notes, why did I decide to switch from Nginx Proxy Manager to Traefik, and what IP address is my Pi-hole running on?</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-30.png" class="kg-image" alt="LLM answering form my personal notes" loading="lazy" width="1489" height="598" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-30.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-30.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-30.png 1489w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">LLM answering form my personal notes</span></figcaption></figure><p>Notice that AnythingLLM shows you <strong><em>which notes it used</em></strong> to generate the answer. This is the RAG process in action; ChatGPT can tell you what <a href="https://traefik.io/traefik?ref=linuxhandbook.com">Traefik</a> is, but only <strong><em>your</em></strong> local AI knows that you switched to it because you were tired of managing SSL certificates manually, and that your Pi-hole is at <code>192.168.1.100</code>.</p><p>Try a few more highly personalized queries:</p><pre><code class="language-bash">What is the Wi-Fi password for the guest network at my parents' house, and where is the router hidden?</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-33.png" class="kg-image" alt="LLM asnwering from my home-lab notes" loading="lazy" width="1142" height="374" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-33.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-33.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-33.png 1142w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">LLM asnwering from my home-lab notes</span></figcaption></figure><pre><code>When are my parents' birthdays this year, and what exactly did I decide to buy for my brother to fix his noisy keyboard?</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/image-32.png" class="kg-image" alt="LLM anwering from my family notes" loading="lazy" width="1270" height="673" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/image-32.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/image-32.png 1000w, https://linuxhandbook.com/content/images/2026/05/image-32.png 1270w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">LLM anwering from my family notes</span></figcaption></figure><p>Each answer is grounded in your notes. The model is not making things up from its training data; it is synthesizing from what <strong><em>you</em></strong> wrote, which means the answers are accurate to your actual knowledge and context.</p><h2 id="%F0%9F%92%A1-keeping-things-running-optional">💡 Keeping things running (optional)</h2><p>If you want AnythingLLM to start automatically with your system:</p><pre><code class="language-bash">docker update --restart unless-stopped anythingllm
</code></pre><p>And Ollama is already managed as a systemd service, so it will start on boot automatically.<br>To update the model later if a newer version is released:</p><pre><code class="language-bash">ollama pull phi3:mini
</code></pre><p>Ollama handles versioning for you.</p><h2 id="my-experience-so-far">My experience (so far)</h2><p>I have been using this setup for a few months now. Here is what changed for me:<br><br><strong>Before:</strong> I would search my notes, find five partial answers in different files, open each one, manually cross-reference them, and then write a synthesis myself.<br><strong>After:</strong> I ask a question. In 5–8 seconds, I get a synthesized answer with the source notes cited. I open the sources to verify. Done.</p><p>The model is not perfect - Phi3:mini will occasionally miss nuance or misread a technical term from a note. But for a free, offline, CPU-only setup, it is genuinely impressive.</p><p>What it is excellent at:</p><ul><li>Summarizing notes on a topic</li><li>Finding connections between notes you forgot existed</li><li>Drafting a starting point for new writing based on your existing research</li><li>Answering "what did I write about X" questions instantly</li></ul><p>What to watch out for:</p><ul><li>Very long PDFs (&gt;50 pages) may need to be split before uploading</li><li>Code blocks in Markdown sometimes confuse the chunking</li><li>Plain prose notes work best</li><li>The model will occasionally "hallucinate" if your notes are thin on a topic; always verify</li></ul><p>The entire stack is free, open-source, and runs completely offline. Once set up, it requires zero maintenance and adds nothing to your monthly cloud bill.</p><h2 id="conclusion">Conclusion</h2><p>The popular mental model of AI is "Cloud service that reads your data". This does not have to be the case and for personal notes, it arguably <strong><em>should not</em></strong> be.<br><br>A small, open model running locally on your laptop is good enough for synthesizing your own knowledge base. It will not beat GPT-4 at coding challenges or creative writing. But for the task of "help me navigate and synthesize the notes <strong><em>I</em></strong> already wrote", it does the job well.</p><p>Your notes are already doing half the work. A local AI just helps you finish the other half.</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[LHB Linux Digest #26.07: New ELK Stack Course, Linux in Browser, Best YouTube Channels for DevOps and More]]></title>
                    <description><![CDATA[ELK Stack course is here.]]></description>
                    <link>https://linuxhandbook.com/newsletter/26-07/</link>
                    <guid isPermaLink="false">69e7025b918745000127fa6a</guid>

                        <category><![CDATA[Newsletter]]></category>

                        <dc:creator><![CDATA[Abhishek Prakash]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 19:00:48 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/lhb-newsletter.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/lhb-newsletter.png" alt="LHB Linux Digest #26.07: New ELK Stack Course, Linux in Browser, Best YouTube Channels for DevOps and More"/> <p>Our 20th course is now available 🍾</p><p>This one is about log management with ELK stack. </p><p>Actually, it's not ELK. Instead of Elastic Search, we used OpenSearch. The course gives you the basics along with sample labs to follow.</p><p>This is available for Pro members only. Not a Pro member yet? <a href="https://linuxhandbook.com/#/portal/signup">Upgrade to Pro membership</a> and access all 20 courses, 6 eBooks and every other premium content.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://linuxhandbook.com/courses/opensearch/"><div class="kg-bookmark-content"><div class="kg-bookmark-title">Log Management Course (ELK Stack with OpenSearch)</div><div class="kg-bookmark-description">Stop SSH-ing into servers at 2 AM. Learn to centralize, search, and visualize logs across your entire infrastructure using fully open-source tools.</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://linuxhandbook.com/content/images/icon/Linux-Handbook-New-Logo-202.png" alt=""><span class="kg-bookmark-author">Linux Handbook</span><span class="kg-bookmark-publisher">Yash Kiran Patil</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://linuxhandbook.com/content/images/thumbnail/elk-stack-course.png" alt="" onerror="this.style.display = 'none'"></div></a></figure><p>The next course in our pipeline is GitOps video course. After that, we are also thinking of creating a course around using AI assistance in typical DevOps scenarios. I'll keep you posted.</p>

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">
        <div data-sx-content-cta-blur class="absolute w-full start-0 -top-0.5 -translate-y-full bg-linear-to-b to-70% from-black/0 to-background dark:to-background-dark pointer-events-none">
            &nbsp; <br> &nbsp; <br> &nbsp;
        </div>

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                        <span class="hidden first:inline">
                        This post is for subscribers only
                    </span>                

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[13 YouTube Channels I Recommend For Learning DevOps for Free]]></title>
                    <description><![CDATA[Learning is free if you just look for the right resources. From the noise, I have filtered the best YouTube channels that will help you learn DevOps for free.]]></description>
                    <link>https://linuxhandbook.com/blog/devops-learn-youtube-channels/</link>
                    <guid isPermaLink="false">69d72638df009b000198837d</guid>

                        <category><![CDATA[blog]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 18:35:29 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/youtube-channels-3d.webp" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/youtube-channels-3d.webp" alt="13 YouTube Channels I Recommend For Learning DevOps for Free"/> <p>I have been learning DevOps for a while now. The problem is not finding DevOps content on YouTube. There is plenty of it. The problem is knowing which channels are actually worth your time.</p><p>Some channels drop theory at you for 45 minutes without touching a terminal. Others teach outdated tooling. A few are genuinely excellent - structured, practical, updated, and respected by the community. I went through dozens of channels, cross-checked with what the DevOps community recommends and narrowed it down to 14 that hold up in real learning situations. </p><p>These are not ordered by subscriber count or popularity contests. They are ordered by how naturally they build on each other - from foundational to advanced, from broad to specialized.</p><p><strong>Short on time?</strong> See the quick overview table below, then jump to the channels that match your current level.</p><h2 id="at-a-glance-all-14-channels-compared">At a Glance: All 14 Channels Compared</h2><table>
<thead>
<tr>
<th>Channel</th>
<th>Best For</th>
<th>Content Style</th>
<th>Skill Level</th>
<th>Our Pick</th>
</tr>
</thead>
<tbody>
<tr>
<td>TechWorld with Nana</td>
<td>Full DevOps roadmap</td>
<td>Structured courses</td>
<td>Beginner → Mid</td>
<td>🏆 Top Pick</td>
</tr>
<tr>
<td>freeCodeCamp.org</td>
<td>Full-length free courses</td>
<td>Crash courses</td>
<td>All levels</td>
<td>Best for complete courses</td>
</tr>
<tr>
<td>NetworkChuck</td>
<td>Linux, Docker, Networking</td>
<td>Energetic explainers</td>
<td>Beginner</td>
<td>Best entry point</td>
</tr>
<tr>
<td>KodeKloud</td>
<td>Cert prep + labs</td>
<td>Hands-on lab-style</td>
<td>Beginner → Mid</td>
<td>Best for cert prep</td>
</tr>
<tr>
<td>Fireship</td>
<td>Fast concept explainers</td>
<td>100-second / short</td>
<td>All levels</td>
<td>Best quick reference</td>
</tr>
<tr>
<td>DevOps Directive</td>
<td>Docker, K8s, Terraform</td>
<td>Deep-dive tutorials</td>
<td>Mid → Advanced</td>
<td>Best for depth</td>
</tr>
<tr>
<td>Kunal Kushwaha</td>
<td>DevOps bootcamp + OSS</td>
<td>Full bootcamp series</td>
<td>Beginner → Mid</td>
<td>Best free bootcamp</td>
</tr>
<tr>
<td>TrainWithShubham</td>
<td>Real projects + roadmap</td>
<td>Project-driven</td>
<td>Beginner → Mid</td>
<td>🏆 Editor's Pick</td>
</tr>
<tr>
<td>That DevOps Guy</td>
<td>Real-world K8s + GitOps</td>
<td>Honest, production-style</td>
<td>Mid → Advanced</td>
<td>Best real-world K8s</td>
</tr>
<tr>
<td>KubeSimplify</td>
<td>Kubernetes deep dives</td>
<td>Practical demos</td>
<td>Mid → Advanced</td>
<td>Best K8s-focused</td>
</tr>
<tr>
<td>Bret Fisher</td>
<td>Docker + K8s Q&amp;A</td>
<td>Live sessions</td>
<td>Mid → Advanced</td>
<td>Best for live Q&amp;A</td>
</tr>
<tr>
<td>Anton Putra</td>
<td>AWS, Terraform, K8s</td>
<td>Production-grade</td>
<td>Advanced</td>
<td>Best production-level</td>
</tr>
<tr>
<td>Abhishek.Veeramalla</td>
<td>DevOps roadmap + interviews</td>
<td>Projects + roadmaps</td>
<td>Beginner → Mid</td>
<td>Best for interviews</td>
</tr>
<tr>
<td>Jeff Geerling</td>
<td>Ansible + homelab infra</td>
<td>Practical demos</td>
<td>Mid → Advanced</td>
<td>Best for Ansible</td>
</tr>
</tbody>
</table>
<h2 id="techworld-with-nanabest-for-a-complete-devops-learning-path">TechWorld with Nana - Best for a Complete DevOps Learning Path</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-16.png" class="kg-image" alt="" loading="lazy" width="1231" height="440" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-16.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-16.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-16.png 1231w" sizes="(min-width: 720px) 720px"></figure><p>TechWorld with Nana is the most recommended DevOps channel on communities and it earns that consistently. Nana covers the full DevOps stack - Docker, Kubernetes, CI/CD, Terraform, Ansible and monitoring - in a structured, course-style format that builds concepts before jumping into commands.</p><p>She starts with the basic concepts, builds the fundamentals and then moves towards the advanced concepts and practical approach of the concept. Especially <a href="https://youtube.com/playlist?list=PLy7NrYWoggjwPggqtFsI_zMAwvG0SqYCb&si=3JkeIMtKOMMDqMZ5&ref=linuxhandbook.com" rel="noreferrer"><strong><em>Docker and Kubernetes Tutorial for Beginners</em></strong></a> is one of the most popular and recommended playlists on YouTube.</p><p><strong>Who it's best for: </strong>Complete beginners who want a single channel that takes them from zero to job-ready on core DevOps tooling, without having to stitch together random videos.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>Covers the entire DevOps toolchain in a logical sequence. One of the clearest explainers of Kubernetes architecture you'll find anywhere. Videos stay current and playlists are regularly updated as tools evolve.</div></div><p><strong>Verdict:</strong> Think of this as your DevOps course library. When you need a full course on a specific tool - Terraform, AWS, Kubernetes, this is where you look first.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@TechWorldwithNana?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">Youtube | TechWorld with Nana</a></div><h2 id="freecodecamporgbest-for-full-length-free-courses-on-every-devops-topic">freeCodeCamp.org - Best for Full-Length Free Courses on Every DevOps Topic</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-15.png" class="kg-image" alt="" loading="lazy" width="1231" height="440" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-15.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-15.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-15.png 1231w" sizes="(min-width: 720px) 720px"></figure><p>freeCodeCamp's YouTube channel is not a DevOps-specific channel - it is a massive library of full-length, structured courses across every technical domain, and its DevOps coverage is exceptional. You will find complete, multi-hour courses on Docker, Kubernetes, Terraform, AWS, Linux, and more, all free, no sign-up required.</p><p>They usually have one-shot videos of multiple hours, which cover the whole topic in depth, like <a href="https://www.youtube.com/playlist?list=PLWKjhJtqVAbkzvvpY12KkfiIGso9A_Ixs&ref=linuxhandbook.com" rel="noreferrer">Docker Tutorial for Beginners, Kubernetes course - Full Beginner Tutorial, etc.</a> They cover a wide range of DevOps topics in full-length videos; you name it, and they have it on their channel.</p><p><strong>Who it's best for: </strong>Anyone who prefers structured, course-style learning, the kind where you sit down, follow along start to finish, and come out the other end having actually learned a tool completely.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>Hosts some of the best free full-length DevOps courses on the internet. Courses are taught by respected practitioners, not generalists. Covers tools that smaller channels skip: Jenkins, Ansible, GitHub Actions in depth. Trusted by millions, the quality bar for what gets published here is high</div></div><p><strong>Verdict:</strong> Think of this as your DevOps course library. When you need a full course on a specific tool - Terraform, AWS, Kubernetes, this is where you look first.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@freecodecamp?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">Youtube | freeCodeCamp.org</a></div><h2 id="networkchuckbest-entry-point-for-absolute-beginners">NetworkChuck - Best Entry Point for Absolute Beginners</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-17.png" class="kg-image" alt="" loading="lazy" width="1231" height="440" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-17.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-17.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-17.png 1231w" sizes="(min-width: 720px) 720px"></figure><p>NetworkChuck makes networking, Linux, Docker, and cloud concepts feel genuinely approachable. His style is upbeat, fast-paced, and deliberately beginner-friendly - built around the philosophy that the first goal is to make you comfortable enough to not quit.<br><br>He mainly makes videos related to cybersecurity, home labs, self-hosted tools and Linux, which is essential for building the prerequisites for DevOps. His storytelling abilities make you stick with the concept and follow all along.</p><p><strong>Who it's best for<em>: </em></strong>Complete beginners who feel intimidated by technical content and need a first channel that makes them feel like they can actually do this - before moving to more structured learning.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>Removes the intimidation factor better than almost any other channel. Linux, networking, and Docker explanations are some of the clearest for newcomers. High-energy style genuinely makes complex topics feel approachable. Great for building foundational context before diving into tools.</div></div><p><strong>Verdict:</strong> The best channel to remove the intimidation factor before starting a structured DevOps path. Watch a few videos here, then move to a sequenced learning track.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@NetworkChuck?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">Youtube | NetworkChuck</a></div><h2 id="kodekloudbest-channel-for-learning-by-doing-and-certification-prep">KodeKloud - Best Channel for Learning by Doing and Certification Prep</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-18.png" class="kg-image" alt="" loading="lazy" width="1231" height="440" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-18.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-18.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-18.png 1231w" sizes="(min-width: 720px) 720px"></figure><p>KodeKloud started as a training platform and its YouTube channel reflects that DNA: every video is designed around hands-on exercises with a clear learning objective. It is the most consistently recommended channel on Reddit when someone asks about CKA, CKAD, or CKS Kubernetes certification prep.</p><p>The channel focused on certification prep as well as concept videos on topics like Docker, Kubernetes, Nginx, AWS, etc. <a href="https://youtu.be/XuSQU5Grv1g?si=PWLwe6Eb-IqoPac3&ref=linuxhandbook.com" rel="noreferrer">Kubernetes Crash Course</a> is one of the most popular video which covers the Kubernetes concepts in the best possible way according to the viewers.</p><p><strong>Who it's best for: </strong>Learners who retain things by doing, not just watching - and anyone preparing for Kubernetes, Docker, or AWS certifications who wants structured prep content that matches the actual exam format.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>Community consistently names it as the top cert prep resource. Bridges the gap between "watching a tutorial" and "actually doing the thing". Covers CLF-CO2, CKA, CKAD, Docker DCA, AWS certifications reliably. </div></div><p><strong>Verdict:</strong> The best structured practice resource on YouTube for DevOps certifications. Watch KodeKloud when you are preparing for CKA, CKAD, or Docker certification - it was built for exactly that.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@KodeKloud?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">Youtube | KodeKloud</a></div><h2 id="fireshipbest-for-fast-accurate-concept-explainers">Fireship - Best for Fast, Accurate Concept Explainers</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-19.png" class="kg-image" alt="" loading="lazy" width="1231" height="440" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-19.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-19.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-19.png 1231w" sizes="(min-width: 720px) 720px"></figure><p>Fireship is not a DevOps channel - it is a technology explainer channel with a cult following, and its DevOps coverage is some of the best bite-sized technical content on the internet. The famous "X in 100 seconds" format delivers accurate, dense explanations of Docker, Kubernetes, CI/CD pipelines, Git, and cloud concepts faster than any other format.</p><p><strong>Who it's best for: </strong>Learners at any level who want a fast, accurate reference for a concept they have heard of but do not fully understand - before going deeper elsewhere. Also excellent for keeping up with new DevOps tooling without spending hours on each one.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>"Docker in 100 Seconds" and "Kubernetes in 100 Seconds" are legitimately among the best short explainers on the internet. The channel has a cult following for a reason; accuracy and density per minute are extremely high. Great for understanding what something <i><b><strong class="italic" style="white-space: pre-wrap;">is</strong></b></i> before committing time to learn it. Covers new tooling rapidly as it emerges in the ecosystem</div></div><p><strong>Verdict: </strong>The fastest way to understand what something does before committing to learning it. Use Fireship to decide what to learn next, then use a hands-on channel to actually learn it.</p><h2 id="devops-directivebest-for-deep-technically-accurate-tutorials">DevOps Directive - Best for Deep, Technically Accurate Tutorials</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-20.png" class="kg-image" alt="" loading="lazy" width="1231" height="440" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-20.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-20.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-20.png 1231w" sizes="(min-width: 720px) 720px"></figure><p>DevOps Directive is the channel community recommends when someone says, "I want to actually understand Docker and Kubernetes, not just copy commands." Every tutorial is longer than average, technically precise, and built around real use cases rather than simplified toy examples.</p><p>He covers the history, installation, demo, practical, deployment, clustering and CI/CD in a complete depth. His <a href="https://youtube.com/playlist?list=PLFzuOAehUPHFxhoawwYCh8ENUsR2sxdYm&si=hWX7dFTzSlnIxBVS&ref=linuxhandbook.com" rel="noreferrer"><strong>Best of DevOps Directive YouTube Videos</strong></a> is popular for in depth knowledge of DevOps. </p><p><strong>Who it's best for:<em>  </em></strong>Intermediate learners who already have the basics and want to go deep, understanding not just how to use Docker or Terraform, but why the design decisions exist and how things work under the hood.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br> Consistently praised in the community for correctness - the tutorials do not cut corners. The complete Docker course is one of the most thorough free Docker resources available. Covers Terraform, GitHub Actions, and CI/CD with real production context. Rare combination of depth and clarity in a single channel</div></div><p><strong>Verdict:</strong> When you are past the basics and want tutorials that respect your technical intelligence, DevOps Directive is where you go. Fewer videos, higher quality per video.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@DevOpsDirective?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | DevOps Directive</a></div><h2 id="kunal-kushwahabest-free-devops-bootcamp-on-youtube">Kunal Kushwaha - Best Free DevOps Bootcamp on YouTube</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-21.png" class="kg-image" alt="" loading="lazy" width="1131" height="424" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-21.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-21.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-21.png 1131w" sizes="(min-width: 720px) 720px"></figure><p>Kunal Kushwaha's DevOps bootcamp is one of the rare examples of a complete, free, structured DevOps curriculum published entirely on YouTube. The bootcamp covers Linux, Docker, Kubernetes, networking, Git, CI/CD, and cloud from scratch, in a sequence that actually makes sense as a learning path.</p><p><a href="https://youtube.com/playlist?list=PL9gnSGHSqcnoqBXdMwUTRod4Gi3eac2Ak&si=Q817s0gzF6BmeU1P&ref=linuxhandbook.com" rel="noreferrer">DevOps Bootcamp</a> is a popular series in which he has covered the DevOps topics in depth; the teaching style is more of a conversation where you don't feel it as a scripted story.</p><p><strong>Who it's best for: </strong>Beginners and intermediate learners who want a free, structured bootcamp they can follow from start to finish - without paying for a course platform or stitching together random videos.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>One of the few YouTube channels offering a genuinely comprehensive, sequenced DevOps bootcamp for free. Heavy emphasis on open source and community, with an active Discord community named WeMakeDevs. The bootcamp format means you always know what to watch next. Strong focus on building real-world projects, not toy examples.</div></div><p><strong>Verdict:</strong> If you want a free, complete, structured bootcamp that you can follow without paying anyone, Kunal Kushwaha's bootcamp series is the honest answer.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@KunalKushwaha?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | Kunal Kushwaha</a></div><h2 id="trainwithshubhambest-for-project-based-learning-and-roadmap-clarity">TrainWithShubham - Best for Project-Based Learning and Roadmap Clarity</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-22.png" class="kg-image" alt="" loading="lazy" width="1109" height="419" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-22.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-22.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-22.png 1109w" sizes="(min-width: 720px) 720px"></figure><p>TrainWithShubham is built around one idea: learning DevOps by building and deploying real projects. Shubham Londhe focuses on projects that you can put on a resume, CI/CD pipelines, containerized deployments and infrastructure automation and explains the roadmap clearly for learners unsure what to learn next.</p><p>The creator teaches in the native language Hindi, so it might be a con for other language users, but for users whose native language is Hindi it provides a clear understanding of the topic that he covers fully. Has one of the best one-shot videos, like <a href="https://youtu.be/e01GGTKmtpc?si=fx58pHCvEo5OJ83T&ref=linuxhandbook.com" rel="noreferrer">Linux One Shot</a>, <a href="https://youtu.be/W04brGNgxN4?si=ZF7_WIl1psAFj7AM&ref=linuxhandbook.com" rel="noreferrer">Kubernetes One Shot</a> and many more.</p><p><strong>Who it's best for: </strong>Beginners and intermediate learners who are actively job-hunting or building a portfolio, and want project-based tutorials that produce something real, not another to-do app deployed locally.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>A project-first approach means you always have something to show for your learning time. Roadmap content is some of the most practical advice available for DevOps job seekers in 2026. Active community with live sessions and challenges. Covers the full stack: Docker, Kubernetes, Jenkins, GitHub Actions, Terraform, AWS.</div></div><p><strong>Verdict:</strong> If building an actual DevOps portfolio is your goal, TrainWithShubham's project-based approach gives you real output for every hour you invest, especially if you are a Hindi audience.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@TrainWithShubham?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | TrainWithShubham</a></div><h2 id="that-devops-guybest-for-honest-real-world-kubernetes-content">That DevOps Guy - Best for Honest, Real-World Kubernetes Content</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-23.png" class="kg-image" alt="" loading="lazy" width="1109" height="419" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-23.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-23.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-23.png 1109w" sizes="(min-width: 720px) 720px"></figure><p>Marcel Dempers does not make content for clout. That DevOps Guy is built around real Kubernetes setups, actual production decisions, and content that tells you what actually happens when things go wrong, not just the happy path. The channel covers Kubernetes, Helm, GitOps, ArgoCD, and service mesh with a refreshing absence of marketing language.</p><p>What makes him truly unique is his distinctive teaching style combined with those nostalgic, retro-style animations that make even the most complex concepts feel simple and fun. His real, no-fluff talk in every video delivers deep, practical knowledge that actually sticks - turning technical topics into something you genuinely enjoy learning.</p><p><strong>Who it's best for: </strong>Intermediate to advanced learners who want Kubernetes content that reflects what real deployments actually look like - including the failure modes, tradeoffs, and operational realities that most tutorials skip.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel? </strong></b><br>Community consistently praises it for honesty, he says when things are hard, not just when they work. GitOps and ArgoCD content is among the best available on YouTube. Multi-cluster and production Kubernetes scenarios are covered in depth. No hype, the tone is a practical engineer talking to practical engineers.</div></div><p><strong>Verdict:</strong> One of the most trusted voices in the Kubernetes space, precisely because Marcel does not oversimplify. When you are ready for production-level content, this channel is a regular stop.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@MarcelDempers?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | That DevOps Guy</a></div><h2 id="kubesimplifybest-channel-focused-entirely-on-kubernetes">KubeSimplify - Best Channel Focused Entirely on Kubernetes</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-24.png" class="kg-image" alt="" loading="lazy" width="1109" height="419" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-24.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-24.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-24.png 1109w" sizes="(min-width: 720px) 720px"></figure><p>KubeSimplify does one thing: Kubernetes. Not Docker fundamentals, not cloud basics, Kubernetes concepts, tools, and ecosystem in depth. The channel covers Helm, Kustomize, GitOps, cluster management, networking, and Kubernetes tooling with a focus on making concepts clear through practical demos.</p><p><a href="https://youtu.be/EV47Oxwet6Y?si=68ghos_LQe7sbssA&ref=linuxhandbook.com" rel="noreferrer">The Kubernetes Course</a> by him is one of the suggested courses for gaining complete knowledge of Kubernetes.</p><p><strong>Who it's best for: </strong>Learners who have Docker and basic Kubernetes knowledge and want to go deep specifically into the Kubernetes ecosystem - Helm, GitOps, cluster operations, RBAC, networking policies, and more.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel? </strong></b><br>One of the few channels focused entirely on the Kubernetes ecosystem rather than splitting attention with other topics. Kustomize and Helm content is well-structured and goes beyond basic usage. Covers CNCF projects that most DevOps channels skip. Practical demo-first style that shows things working before explaining them.</div></div><p><strong>Verdict:</strong> The go-to channel when you are ready to move beyond <code>kubectl apply</code> and actually understand how Kubernetes production setups are built.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@kubesimplify?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | KubeSimplify</a></div><h2 id="bret-fisherbest-for-docker-and-kubernetes-live-qa">Bret Fisher - Best for Docker and Kubernetes Live Q&amp;A</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-25.png" class="kg-image" alt="" loading="lazy" width="1109" height="419" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-25.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-25.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-25.png 1109w" sizes="(min-width: 720px) 720px"></figure><p>Bret Fisher has been teaching Docker since before it was cool. His live sessions are a masterclass format that few channels match: real questions from real engineers, answered in real time with actual Docker and Kubernetes context - not scripted scenarios.</p><p><a href="https://youtube.com/playlist?list=PLX0bTycx8m-UhIXY2c4-7AXaEokaTdn6S&si=0dvEv9u-MDNKkjJd&ref=linuxhandbook.com" rel="noreferrer"><strong>Cloud Native DevOps and Docker Talk</strong></a> is a series popular for live shows with Q&amp;A and guests from the cloud native ecosystem.</p><p><strong>Who it's best for: </strong>Intermediate learners who have hit real-world problems they cannot find answers to in tutorials - Bret's live Q&amp;A sessions are specifically good for the gap between "tutorial worked" and "production is broken."</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>Docker live streams answer the questions that tutorials never cover. One of the most experienced Docker practitioners producing free content in 2026. Q&amp;A format surfaces real engineering problems, not artificial examples. Docker Swarm, Kubernetes networking, and production container issues are handled well.</div></div><p><strong>Verdict:</strong> Once you have real Docker and Kubernetes problems, not just tutorial exercises - Bret Fisher's Q&amp;A sessions are one of the most valuable resources available for free.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@BretFisher?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | Bret Fisher</a></div><h2 id="anton-putrabest-for-production-grade-aws-terraform-and-kubernetes-content">Anton Putra - Best for Production-Grade AWS, Terraform, and Kubernetes Content</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-26.png" class="kg-image" alt="" loading="lazy" width="856" height="236" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-26.png 600w, https://linuxhandbook.com/content/images/2026/04/image-26.png 856w" sizes="(min-width: 720px) 720px"></figure><p>Anton Putra is the channel community calls "underrated gem" on a regular basis, and the description is accurate. The content is production-grade: real AWS architectures, Terraform modules that reflect actual engineering decisions, Kubernetes setups built the way teams actually build them, not simplified for beginners.</p><p><a href="https://youtube.com/playlist?list=PLiMWaCMwGJXnKY6XmeifEpjIfkWRo9v2l&si=BcDQce0YH4TrGjAx&ref=linuxhandbook.com" rel="noreferrer">AWS EKS Kubernetes Tutorial</a> is one of the recommended playlists for learning production-grade kubernetes learning. </p><p><strong>Who it's best for: </strong>Advanced learners and working engineers who want content that reflects production reality - AWS infrastructure, Terraform state management, Kubernetes cluster operations, observability, and CI/CD at scale.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>One of the only free channels producing consistently production-accurate AWS + Terraform + K8s content. Terraform content goes beyond basics into module design and state management patterns. Real architectural decisions are explained, not just commands. Community repeatedly surfaces this channel as underappreciated relative to its quality.</div></div><p><strong>Verdict:</strong> If there is one underrated channel on this entire list, it is Anton Putra. The quality-to-subscriber-count ratio is remarkable. Subscribe before the rest of the internet catches up.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@AntonPutra?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | Anton Putra</a></div><h2 id="abhishekveeramallabest-for-devops-roadmap-real-projects-and-interview-preparation">Abhishek.Veeramalla - Best for DevOps Roadmap, Real Projects, and Interview Preparation</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-27.png" class="kg-image" alt="" loading="lazy" width="1051" height="424" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-27.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-27.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-27.png 1051w" sizes="(min-width: 720px) 720px"></figure><p>Abhishek Veeramalla has built one of the fastest-growing DevOps channels by doing something most channels avoid: being explicit about what you need to learn, in what order, and why - from the perspective of someone actively placing engineers into DevOps roles. The channel covers projects, roadmaps, and interview preparation with rare practical clarity.</p><p><a href="https://youtube.com/playlist?list=PLdpzxOOAlwvIc1TjTwopNSjRJkzES2ZXk&si=HGDf-igTTHuS_Wna&ref=linuxhandbook.com" rel="noreferrer">DevOps Engineer in 3 months</a> is the playlist many people follow to learn DevOps. He is also covering topics like AI assisted DevOps, Learning, DevSecOps and many more.</p><p><strong>Who it's best for: </strong>Beginners and intermediate learners who want a clear learning roadmap, hands-on project walkthroughs, and honest interview preparation content - especially those targeting their first or second DevOps role.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>One of the clearest DevOps roadmap explanations available on YouTube. Project walkthroughs produce resume-ready artifacts. Interview prep content reflects what teams actually ask in 2026 DevOps interviews. Very popular in the global DevOps learner community, active comment sections.</div></div><p><strong>Verdict:</strong> If you are building toward a DevOps role and want a channel that connects learning to employment outcomes, Abhishek Veeramalla is one of the most practically useful channels on this list.</p><h2 id="jeff-geerlingbest-for-ansible-homelab-infrastructure-and-automation">Jeff Geerling - Best for Ansible, Homelab Infrastructure and Automation</h2><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/04/image-28.png" class="kg-image" alt="" loading="lazy" width="1051" height="424" srcset="https://linuxhandbook.com/content/images/size/w600/2026/04/image-28.png 600w, https://linuxhandbook.com/content/images/size/w1000/2026/04/image-28.png 1000w, https://linuxhandbook.com/content/images/2026/04/image-28.png 1051w" sizes="(min-width: 720px) 720px"></figure><p>Special mention for Jeff Geerling, the internet's go-to resource for Ansible, not as a passing topic, but as a deep, ongoing practice. Beyond Ansible, his channel covers Raspberry Pi infrastructure, homelab automation, and systems topics that most DevOps channels do not touch, all with a level of technical depth that reflects decades of hands-on systems work.</p><p><a href="https://youtube.com/playlist?list=PL2_OBreMn7FrsiSW0VDZjdq0xqUKkZYHT&si=CLkJE6mRZKdmgi4m&ref=linuxhandbook.com" rel="noreferrer">Homelab</a> playlist is one of the most popular ones viewers recommend for actual technical depth. <a href="https://youtube.com/playlist?list=PL2_OBreMn7FplshFCWYlaN2uS8et9RjNG&si=9UkOmVs2-xqKuUXt&ref=linuxhandbook.com" rel="noreferrer">Ansible</a> playlist contains all the content about Ansible, your one-stop solution for Ansible concepts.</p><p><strong>Who it's best for: </strong>Engineers who want to master Ansible for real infrastructure automation, homelab enthusiasts who want to take their setup to a professional engineering level, and anyone who wants content that goes deep on systems topics.</p><div class="kg-card kg-callout-card kg-callout-card-purple"><div class="kg-callout-emoji">🤔</div><div class="kg-callout-text"><b><strong style="white-space: pre-wrap;">Why follow this channel?</strong></b><br>Books Ansible for DevOps and Ansible for Kubernetes are community standards; the channel extends that content. Homelab content bridges the gap between learning environments and production patterns. Honest, methodical approach, tests claims rigorously before publishing.</div></div><p><strong>Verdict: </strong>For Ansible specifically - Jeff Geerling is the answer, full stop. The channel is what trustworthy, technically serious free content looks like.</p><div class="kg-card kg-button-card kg-align-center"><a href="https://www.youtube.com/@JeffGeerling?ref=linuxhandbook.com" class="kg-btn kg-btn-accent">YouTube | Jeff Geerling</a></div><h2 id="faq">FAQ</h2><p>You will have some questions in mind, so let me answer some of those.<br><strong>Do I need to watch all these channels?</strong><br>No. Most people get structured value from 2-3 channels at a time. Start with one beginner-friendly channel (TechWorld with Nana, Kunal Kushwaha, or NetworkChuck), add a hands-on or cert-focused channel (KodeKloud), and a specialized one based on your current tool focus. Add the rest as your skill level grows.<br><br><strong>What is the recommended order for a complete beginner?</strong><br>A practical sequence: NetworkChuck (comfort with Linux and Docker basics) → TechWorld with Nana (structured DevOps roadmap) → KodeKloud (hands-on labs and cert prep) → DevOps Directive or That DevOps Guy (production depth). Use Fireship throughout as a quick reference when you encounter new concepts.<br><br><strong>Are these channels still actively updated in 2026?</strong><br>All channels on this list are actively publishing as of April 2026. Anton Putra and DevOps Directive publish less frequently but maintain consistent quality.<br><br><strong>Which channels are best specifically for Kubernetes?</strong><br>In rough order of depth: KubeSimplify (K8s-focused, breadth of ecosystem), That DevOps Guy (production realism),  KodeKloud (cert prep), Anton Putra (cluster operations, Terraform + K8s integration). TechWorld with Nana has solid K8s fundamentals for beginners.<br><br><strong>Are these channels useful for someone already working as a DevOps engineer?</strong><br>Yes - specifically That DevOps Guy, Anton Putra, Jeff Geerling, KubeSimplify, and Bret Fisher. These four channels produce content that reflects real production decisions rather than learner-facing introductions. The others are better suited to foundational or intermediate learning.<br><br><strong>Which channels cover cloud platforms (AWS, Azure, GCP) beyond just containers?</strong><br>Anton Putra (AWS + Terraform depth), TrainWithShubham and Abhishek.Veeramalla (AWS projects), freeCodeCamp (platform-agnostic full courses), TechWorld with Nana (all three major cloud providers covered). KodeKloud has certification prep for AWS, Azure, and GCP certifications.</p><h2 id="final-recommendation">Final recommendation</h2><p>If you are just starting out: <strong>TechWorld with Nana, trainwithshubham gives you the roadmap, KodeKloud gives you the practice.</strong> Those two together cover what most DevOps learners need through the intermediate stage.<br><br>If you are preparing for certifications: <strong>KodeKloud is the standard recommendation for a reason.</strong> The CKA and CKAD prep content is the best free version available.<br><br>If you want production-level depth: <strong>Anton Putra for infrastructure, That DevOps Guy for Kubernetes operations, Jeff Geerling for Ansible.</strong> These three channels give you what textbooks and tutorials usually skip.</p><p><strong>If you know of a channel that deserves to be on this list, don't wait and drop it in the comments below!</strong></p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Module 5 Practice Lab]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/elk-module5-practice-lab/</link>
                    <guid isPermaLink="false">69d4891cdf009b000197fd0f</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 17:07:56 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Module 4 Practice Lab]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/elk-module4-practice-lab/</link>
                    <guid isPermaLink="false">69cc958bdf009b000197f145</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 17:06:00 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Kibana for Debugging &amp; Exploration]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/kibana-debugging-exploration/</link>
                    <guid isPermaLink="false">69cb356adf009b000197ed31</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 17:05:13 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Security Basics]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/security-basics/</link>
                    <guid isPermaLink="false">69d33239df009b000197fbd9</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 17:00:04 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[ML Integration]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/ml-integration/</link>
                    <guid isPermaLink="false">69cf57b0df009b000197f961</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:55:10 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Scaling OpenSearch]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/scaling-opensearch/</link>
                    <guid isPermaLink="false">69cde496df009b000197f554</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:50:46 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Visualizations with Kibana]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/kibana-visualization/</link>
                    <guid isPermaLink="false">69c9dec8df009b000197e7af</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:42:47 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Kibana Basics]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/kibana-basics/</link>
                    <guid isPermaLink="false">69c60f40df009b000197df8d</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:39:51 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Module 3 Practice Lab]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/elk-module3-practice-lab/</link>
                    <guid isPermaLink="false">69c4ac0bdf009b000197db3e</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:27:23 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Searching &amp; Query DSL]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/searching-query-dsl/</link>
                    <guid isPermaLink="false">69c20e91df009b000197d589</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:25:44 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Indexing &amp; Mapping]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/indexing-mapping/</link>
                    <guid isPermaLink="false">69b3fde4df009b0001973ec6</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:24:24 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Why OpenSearch?]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/why-opensearch/</link>
                    <guid isPermaLink="false">69b3a377df009b0001973e33</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:21:29 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Module 2 Practice Lab]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/elk-module2-practice-lab/</link>
                    <guid isPermaLink="false">69b24adadf009b0001973be4</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:18:42 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Parsing &amp; Enriching Logs]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/parsing-enriching-logs/</link>
                    <guid isPermaLink="false">69b14d0cdf009b0001973a28</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:14:29 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Logstash Fundamentals]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/logstash-fundamentals/</link>
                    <guid isPermaLink="false">69b13975df009b00019739a5</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:05:51 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Module 1 Practice Lab]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/elk-module1-practice-lab/</link>
                    <guid isPermaLink="false">69b00f03df009b00019737de</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:04:37 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Your First OpenSearch Setup]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/opensearch-setup/</link>
                    <guid isPermaLink="false">699fccf0df009b0001971b14</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 16:02:49 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[ELK Stack Architecture]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/elk-stack-architecture/</link>
                    <guid isPermaLink="false">699f1d7bdf009b0001971988</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 15:52:16 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[Introduction to ELK Stack]]></title>
                    <description><![CDATA[]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/elk-stack-intro/</link>
                    <guid isPermaLink="false">699efc9adf009b0001971895</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 15:49:46 +0530</pubDate>


                    <content:encoded><![CDATA[

<aside data-sx-content-cta class="relative p-0.5 js-toc-ignore">

    <div class="relative flex flex-col items-center text-center w-full px-4 py-10 lg:px-10 text-base rounded-xl sm:rounded-2xl">
        <div class="dark:hidden absolute -inset-px -z-10 rounded-xl bg-white shadow-pretty-sm transition-shadow duration-200"></div>
        <span class="hidden dark:block absolute -z-10 -inset-px rounded-inherit bg-radial-[50%_100%_at_50%_0%] from-white/10"></span>        
        <div class="hidden dark:block absolute -inset-px -z-10 rounded-xl bg-white/1 transition-colors duration-500 inset-shadow-md inset-shadow-white/2"></div>
        
        <div class="hidden dark:block absolute -z-10 -inset-0.5 mask-to-b mask-position-to-70% mask-opacity-to-50%">
            <div class="hidden dark:block absolute -z-10 inset-px rounded-xl border border-gray-50/10"></div>
        </div>                                                
        <div class="hidden dark:block absolute -z-10 -inset-px rounded-xl border border-gray-50/5 opacity-0"></div>

        <div class="hidden dark:block absolute -top-px start-1/2 -translate-x-1/2 w-1/2 h-px bg-linear-to-r from-white/0 to-white/0 via-gray-400/50"></div>

        <h2 class="text-gray-900 dark:text-gray-100 text-pretty text-xl sm:text-2xl leading-snug tracking-tight">




                                                <span class="hidden first:inline">
                                This lesson is for paying subscribers only
                            </span>                           
                    <span class="hidden first:inline">
                        This post is for paying subscribers only
                    </span>  

        </h2>

            <button data-portal="signup" class="mt-7 px-4 py-2.5 font-semibold text-sm text-center text-accent-contrast bg-primary rounded-full shadow-primary dark:shadow-none dark:drop-shadow-primary-sm hover:opacity-90 transition-opacity duration-200">
                Subscribe now
            </button>
            <p class="mt-5 text-sm">
                Already have an account? <button data-portal="signin" class="block sm:inline mx-auto font-medium underline decoration-primary decoration-2 underline-offset-2 hover:text-primary transition-colors duration-200">Sign in</button>
            </p>
    </div>
</aside>
]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[The ELK Stack Handbook (With OpenSearch)]]></title>
                    <description><![CDATA[Stop SSH-ing into servers at 2 AM. Learn to centralize, search, and visualize logs across your entire infrastructure using fully open-source tools. ]]></description>
                    <link>https://linuxhandbook.com/courses/opensearch/</link>
                    <guid isPermaLink="false">6a0c328f0fd58500019fb02e</guid>

                        <category><![CDATA[OpenSearch]]></category>

                        <dc:creator><![CDATA[Yash Kiran Patil]]></dc:creator>

                    <pubDate>Tue, 19 May 2026 15:36:43 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/elk-stack-course.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/elk-stack-course.png" alt="The ELK Stack Handbook (With OpenSearch)"/> <p>You're debugging logs the hard way.</p><p>A single app on a single server is manageable. Ten servers? Fifty containers? Log files become a nightmare you can't grep your way out of.</p><p>Your current workflow at 2 AM:</p><pre><code>$ ssh prod-server-01
$ tail -f /var/log/app.log # nothing obvious
$ ssh prod-server-02
$ grep -r "error" /var/log/ | awk '{print $5}'
# 20 minutes later... still piecing it together</code></pre><p>The ELK Stack centralizes every log from every service into one searchable, visualizeable system. You go from <strong>reacting to incidents</strong> to <strong>proactively catching them before they happen.</strong></p><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">Why OpenSearch and not Elasticsearch?<br>In 2021, Elastic moved to a proprietary licence. OpenSearch, Amazon's Apache 2.0 fork, kept everything free: built-in TLS, SQL queries, anomaly detection, and alerting. We use OpenSearch throughout this course. The API is nearly identical to Elasticsearch, so everything you learn transfers directly.</div></div><h2 id="what-youll-learn">What you'll learn</h2><p>🏗️ <strong>ELK Architecture:</strong> How logs flow from your app through Logstash into OpenSearch and out to dashboards.</p><p>⚙️ <strong>Logstash Pipelines: </strong>Parse, filter, and enrich raw logs before they hit your index.</p><p>🔍 <strong>Query DSL &amp; Indexing:</strong>Search across millions of log events in milliseconds.</p><p>📊 <strong>Kibana Dashboards:</strong> Build visualisations that surface patterns raw log files never could.</p><p>🔒 <strong>Security &amp; Access Control:</strong> TLS, users, roles — features Elasticsearch charges for, free on OpenSearch.</p><p>🤖 <strong>ML-Powered Anomaly Detection: </strong>Let OpenSearch flag unusual patterns before your users notice them.</p><p>📈 <strong>Scaling OpenSearch:</strong> From a single node to a cluster that handles production traffic.</p><div class="kg-card kg-callout-card kg-callout-card-green"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">Each module has a practice lab. So you learn by doing it.</div></div><h2 id="who-this-course-is-for">Who this course is for?</h2><p>✅ <strong>Linux / DevOps Engineers: </strong>You manage servers and containers and want a proper observability stack without Elastic's licensing fees.</p><p>✅ <strong>Backend Developers: </strong>You deploy apps and want to understand what's actually happening in production when things break.</p><p>✅ <strong>SRE / Platform Engineers: </strong>You need centralised logging across microservices and want a self-hosted solution you fully control.</p><p>✅ <strong>Teams Migrating Off Elastic:</strong> You're moving away from paid tiers and want to get up to speed on OpenSearch fast.</p><h2 id="start-learning-today">Start learning today</h2><p>Stop reacting. Start observing.</p><p>Everything you need to build a production-grade observability stack. Free, open source, and ready to deploy.</p><p>Included with Linux Handbook Pro.</p>]]></content:encoded>
                </item>
                <item>
                    <title><![CDATA[I Stopped Using VMs for Demos, and I Run Linux in the Browser Now]]></title>
                    <description><![CDATA[Get a full Linux desktop experience inside a web browser, all thanks to containerization.]]></description>
                    <link>https://linuxhandbook.com/blog/webtop-instead-of-vms/</link>
                    <guid isPermaLink="false">699c3f7cdf009b0001969b13</guid>

                        <category><![CDATA[blog]]></category>

                        <dc:creator><![CDATA[Bhuwan Mishra]]></dc:creator>

                    <pubDate>Thu, 14 May 2026 12:55:19 +0530</pubDate>

                        <media:content url="https://linuxhandbook.com/content/images/2026/05/Reproducible-Linux-desktop-in-a-web-browser.png" medium="image"/>

                    <content:encoded><![CDATA[<img src="https://linuxhandbook.com/content/images/2026/05/Reproducible-Linux-desktop-in-a-web-browser.png" alt="I Stopped Using VMs for Demos, and I Run Linux in the Browser Now"/> <p>For years, my default setup for Linux demos was simple. Spin up a virtual machine, configure the environment, take a snapshot, and hope nothing breaks during the presentation.</p><p>In fact, my old demo setup was a collection of <a href="https://linuxhandbook.com/virtualization/" rel="noreferrer">virtual machines</a> I'd accumulated over the years. One for Docker demos, another for Kubernetes workshops, and a third one, a Debian box for shell scripting sessions. Each one sat on my SSD, consuming gigabytes of space and demanding occasional updates just to stay usable.</p><p>The breaking point came during a Kubernetes workshop I was running remotely. Screen sharing was already choppy because OBS, Chrome, and the VM were all fighting over the same CPU. Then the VM froze mid-demo during a kubectl walkthrough. The audience waited in silence. I got it working again, but the rhythm of the session never recovered.</p><p>That evening, I started looking for something better. I found Webtop, and it quietly replaced most of that VM setup.</p><h2 id="what-webtop-actually-is">What Webtop Actually Is</h2><p><a href="https://github.com/linuxserver/docker-webtop?ref=linuxhandbook.com">Webtop</a> is a Linux desktop environment packaged inside a Docker container and accessible entirely through a browser. You start the container, open a browser tab pointing to port 3000, and a full Linux desktop appears.</p><p><a href="https://www.linuxserver.io/?ref=linuxhandbook.com">LinuxServer.io</a> maintains this project. The same group provides container images for Jellyfin, Nextcloud, and dozens of other self-hosted tools.</p><p>What surprised me when I first launched it was how complete the experience felt. You get a real desktop environment, with the option to choose from XFCE, KDE, MATE, or others, depending on the image, with a terminal, file manager, and the ability to install packages normally through apt, dnf, or whatever the base distro uses. It behaves like a lightweight remote workstation that happens to live in your browser.</p><h2 id="getting-it-running">Getting It Running</h2><p>The quickest path is Docker Compose or <a href="https://linuxhandbook.com/courses/podman/podman-compose/" rel="noreferrer">Podman Compose</a>. Here's the configuration I started with:</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">Podman is an alternative to Docker. It's rootless by default and daemonless. We have a <a href="https://linuxhandbook.com/courses/podman/" rel="noreferrer">free course on Podman</a>.</div></div><figure class="kg-card kg-code-card"><pre><code>services:
  webtop:
    image: lscr.io/linuxserver/webtop:ubuntu-xfce
    container_name: webtop
    security_opt:
      - seccomp:unconfined
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Kolkata
    volumes:
      - ./config:/config
    ports:
      - 3000:3000
    shm_size: "1gb"
    restart: unless-stopped</code></pre><figcaption><p><span style="white-space: pre-wrap;">Install WebTop Using Docker Compose</span></p></figcaption></figure><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/05/Screenshot-showing-webtop-running-using-podman.webp" class="kg-image" alt="Screenshot showing Webtop running with Podman" loading="lazy" width="1020" height="746" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/Screenshot-showing-webtop-running-using-podman.webp 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/Screenshot-showing-webtop-running-using-podman.webp 1000w, https://linuxhandbook.com/content/images/2026/05/Screenshot-showing-webtop-running-using-podman.webp 1020w" sizes="(min-width: 720px) 720px"></figure><p>Running <code>docker compose up -d</code> and then navigating to <code>http://[SERVER-IP]:3000, or http://localhost:3000</code> genuinely all it takes. The first boot took maybe 10 seconds before the desktop was usable.</p><figure class="kg-card kg-image-card"><img src="https://linuxhandbook.com/content/images/2026/05/Ubuntu-XFCE-running-in-browser-with-WebTop.webp" class="kg-image" alt="Ubuntu XFCE running in web browser with Webtop" loading="lazy" width="1477" height="863" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/Ubuntu-XFCE-running-in-browser-with-WebTop.webp 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/Ubuntu-XFCE-running-in-browser-with-WebTop.webp 1000w, https://linuxhandbook.com/content/images/2026/05/Ubuntu-XFCE-running-in-browser-with-WebTop.webp 1477w" sizes="(min-width: 720px) 720px"></figure><h2 id="choosing-the-right-image">Choosing the Right Image</h2><p>Webtop supports multiple distributions and desktop environments. The available combinations include Ubuntu, Debian, Fedora, Alpine, and Arch, each paired with desktop options like XFCE, KDE, and MATE. You can find all related tags on the project's GitHub page.</p><p>From my practical experience, XFCE consistently performs best for demos and workshops. It's lighter on resources, and the responsiveness during screen sharing is noticeably better than KDE. KDE is visually polished and worth running if you have headroom, but when your machine is also running OBS, a browser, and a video call simultaneously, the extra weight shows. </p><p>Alpine is worth knowing about if you need something extremely minimal. Its image is tiny and starts almost instantly, but package availability is limited compared to Ubuntu or Debian. For most demo scenarios, <code>ubuntu-xfce</code> hits the right balance of familiarity, package ecosystem, and performance.</p><h2 id="why-this-works-better-for-demos-than-vms">Why This Works Better for Demos Than VMs</h2><p>Recovery feels dramatically simpler. If I break something during a session, and with live demos, this happens. Restoring a VM means hunting for the right snapshot, waiting for it to load, and hoping the snapshot captured the right state. With Webtop, recovery looks like this:</p><pre><code class="language-bash">docker rm -f webtop
docker compose up -d</code></pre><p>That's it. A fresh environment in seconds. </p><p>Resource usage is another area where the difference is noticeable. A traditional Ubuntu VM with 8 GB allocated holds that memory whether it's being used or not. Containers are far more cooperative with the host system. After moving most of my demo environments to Webtop, I noticed the laptop fan spinning less during presentations and screen sharing becoming smoother. </p><h2 id="building-reproducible-demo-environments">Building Reproducible Demo Environments</h2><p>One thing I missed initially about VMs was the snapshot workflow. It's the ability to freeze a perfectly configured state and return to it. Webtop doesn't work that way, but the Docker approach is actually cleaner once you adjust your thinking.</p><p>Instead of snapshots, I build custom images. Here's an example Dockerfile for a Kubernetes demo environment:</p><pre><code class="language-dockerfile">FROM lscr.io/linuxserver/webtop:ubuntu-xfce

RUN apt-get update &amp;&amp; apt-get install -y \
    docker.io \
    kubectl \
    helm \
    neovim \
    tmux \
    htop \
    git</code></pre><p>Building that with <code>docker build -t demo-webtop .</code> produces an image I can launch anywhere, including on my homelab server, a VPS, a colleague's machine, and get an identical environment every time. </p><p>There are no multi-gigabyte VM disk files to transfer. The image is versioned, shareable, and rebuildable from scratch if needed. For a Kubernetes workshop I ran recently, I published the image so participants could run their own copy locally, which would have been considerably more complicated to coordinate with traditional VM images.</p><h2 id="accessing-it-remotely">Accessing It Remotely</h2><p>Browser-based access turned out to be more valuable than I expected. I can reach my Webtop environments from any device with a browser. That portability genuinely changed how I work while traveling.</p><p>For remote access, I put Webtop behind a reverse proxy with HTTPS and authentication. Running it directly to the internet without any protection is a bad idea. You'd be serving an unauthenticated Linux desktop to the world. Here is an example configuration for Caddy:</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">Caddy is a web server written in Go. What separates it from Nginx or Apache is its automatic HTTPS behavior. The moment you point a domain at a server running Caddy and add it to the Caddyfile, Caddy contacts Let's Encrypt, obtains a certificate, and begins renewing it before it expires.</div></div><pre><code>webtop.lhb-tut.com {
    basicauth {
        bndev $2a$14$ebc7C6dlwFafmtZmfQ4vKe2ToQsTe6nWbV3k3ky6HAwLQr76u1l8m
    }

    reverse_proxy webtop:3000
}</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://linuxhandbook.com/content/images/2026/05/Securing-Webtop-with-Caddy-basic-authentication.webp" class="kg-image" alt="" loading="lazy" width="1139" height="620" srcset="https://linuxhandbook.com/content/images/size/w600/2026/05/Securing-Webtop-with-Caddy-basic-authentication.webp 600w, https://linuxhandbook.com/content/images/size/w1000/2026/05/Securing-Webtop-with-Caddy-basic-authentication.webp 1000w, https://linuxhandbook.com/content/images/2026/05/Securing-Webtop-with-Caddy-basic-authentication.webp 1139w" sizes="(min-width: 720px) 720px"><figcaption><span style="white-space: pre-wrap;">Securing Webtop with Caddy basic authentication</span></figcaption></figure><p>My current setup uses Tailscale for network-level access control and Caddy for HTTPS termination. </p><p>Traefik and Cloudflare Tunnels are both solid alternatives, depending on your existing infrastructure. The key principle is the same regardless of tooling: don't expose port 3000 publicly without something in front of it.</p><h2 id="what-it-doesnt-handle-well">What It Doesn't Handle Well</h2><p>Webtop isn't a universal replacement for VMs, and overselling it would be dishonest. There are categories of work where I still reach for a traditional hypervisor without hesitation.</p><p>Kernel development and anything requiring full <code>systemd</code> Support needs a real VM. Container isolation isn't equivalent to hardware virtualization, and some low-level work simply requires full-stack virtualization and nested virtualization.</p><div class="kg-card kg-callout-card kg-callout-card-blue"><div class="kg-callout-emoji">💡</div><div class="kg-callout-text">With nested virtualization, a guest VM itself acts as a hypervisor and runs additional VMs inside it.</div></div><p>Low-level networking labs where you need to demonstrate VLAN behavior, DHCP servers, or raw packet analysis at the hardware interface level are also better suited to VMs, because container networking abstracts away exactly the things you're trying to show. Similarly, malware analysis and security sandboxing, where strong isolation is the whole point, shouldn't be done in a container environment.</p><p>GPU-accelerated workloads, video editing, and anything that genuinely needs graphics hardware won't be served well by Webtop. The rendering pipeline is inherently software-based, and the limitations are obvious in GPU-heavy applications. For terminal work, admin demos, and development environments, this is rarely relevant, but it's worth knowing upfront.</p><h2 id="practical-situations-where-it-shines">Practical Situations Where It Shines</h2><p>Training sessions where participants need identical environments are where Webtop provides the most obvious value. Instead of distributing VM images and debugging hypervisor incompatibilities across fifteen different laptop configurations, participants open a browser tab. That's a meaningful reduction in setup overhead and the inevitable "it doesn't work on my machine" troubleshooting.</p><p>The disposable workstation use case is one I didn't anticipate valuing, but I use it regularly. Sometimes I need a clean Linux environment to test a script, verify a package installation, or try something I don't want running on my main machine. Spinning up a Webtop container, doing the work, and removing it takes a minute. The equivalent with VMs took considerably longer and left behind disk state to clean up.</p><h2 id="final-thoughts">Final Thoughts</h2><p>I went into Webtop expecting curiosity. What I found was something that genuinely improved a recurring frustration in my workflow. The demo environment problem, maintaining multiple VMs, managing snapshots, and dealing with hypervisor overhead, completely went away.</p><p>The tradeoff with VMs isn't that containers are strictly superior. The point is that for the specific problem of running Linux environments for demos, workshops, and quick testing, the browser-based container approach solves the actual pain points without introducing new ones.</p><p>If you're maintaining a collection of demo VMs and spending time managing snapshots and debugging hypervisor issues, it's worth an hour to spin up Webtop and see how it feels. The barrier to trying it is low enough that the experiment costs almost nothing.</p>]]></content:encoded>
                </item>
    </channel>
</rss>