<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>The Back Room Tech</title>
	<atom:link href="https://thebackroomtech.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://thebackroomtech.com</link>
	<description>Serving up the info for back room techs everywhere</description>
	<lastBuildDate>Mon, 27 Apr 2026 18:54:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>
	<item>
		<title>How to Install Software on Ubuntu 26.04: Complete Guide to APT, Snap, Flatpak &#038; Manual Methods</title>
		<link>https://thebackroomtech.com/ubuntu-26-04-software-installation-guide/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Mon, 27 Apr 2026 18:54:57 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4872</guid>

					<description><![CDATA[<p><img width="300" height="200" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-featured-300x200.png" class="attachment-medium size-medium wp-post-image" alt="How to Install Software on Ubuntu 26.04: Complete Guide to APT, Snap, Flatpak &amp; Manual Methods" style="margin-bottom:20px;" decoding="async" fetchpriority="high" srcset="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-featured-300x200.png 300w, https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-featured-1024x683.png 1024w, https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-featured-768x512.png 768w, https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-featured-75x50.png 75w, https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-featured.png 1536w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>Master Ubuntu 26.04 software installation with APT, Snap, Flatpak &#038; manual methods. Complete guide with troubleshooting tips and best practices.</p>
<p>The post <a href="https://thebackroomtech.com/ubuntu-26-04-software-installation-guide/">How to Install Software on Ubuntu 26.04: Complete Guide to APT, Snap, Flatpak & Manual Methods</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Ubuntu gives you four ways to install software. Each method exists for good reasons, but picking the right one upfront saves time. This guide shows you when to use APT&#8217;s stability, Snap&#8217;s convenience, Flatpak&#8217;s isolation, or manual installation for specialized needs.</p>



<h2 class="wp-block-heading">What Are Ubuntu&#8217;s Software Installation Methods?</h2>



<p class="wp-block-paragraph">Ubuntu provides multiple installation methods because different software has different requirements:</p>



<p class="wp-block-paragraph"><strong>Key Installation Methods:</strong></p>



<ul class="wp-block-list">

<li><strong>APT (Advanced Package Tool)</strong>: Ubuntu&#8217;s traditional package manager with stable, tested software and deep system integration</li>


<li><strong>Snap Packages</strong>: Universal packages with automatic updates and built-in security sandboxing for desktop applications</li>


<li><strong>Flatpak</strong>: Cross-distribution package format with maximum application isolation and broad software availability</li>


<li><strong>Manual Installation</strong>: Direct installation from .deb files, AppImages, and source code for specialized or cutting-edge software</li>

</ul>



<p class="wp-block-paragraph">The real challenge isn&#8217;t learning these tools. It&#8217;s knowing which one to try first.</p>



<h2 class="wp-block-heading">Prerequisites for Installing Software on Ubuntu 26.04</h2>



<p class="wp-block-paragraph">Before you begin, make sure you have:</p>



<ul class="wp-block-list">

<li>☐ <strong>Ubuntu 26.04 LTS</strong> installed and running</li>


<li>☐ <strong>Administrative (sudo) access</strong> to your system</li>


<li>☐ <strong>Active internet connection</strong> for downloading packages</li>


<li>☐ <strong>Basic terminal knowledge</strong> (helpful but GUI options are available)</li>


<li>☐ <strong>At least 2 GB free disk space</strong> for software and dependencies</li>

</ul>



<h2 class="wp-block-heading">Testing Environment</h2>



<p class="wp-block-paragraph">This guide was tested on:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Component</th><th>Version</th></tr></thead><tbody><tr><td><strong>OS</strong></td><td>Ubuntu 26.04 LTS (Desktop)</td></tr><tr><td><strong>Kernel</strong></td><td>7.0</td></tr><tr><td><strong>GNOME</strong></td><td>50</td></tr><tr><td><strong>Hardware</strong></td><td>4-core CPU, 8 GB RAM, 256 GB SSD</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Ubuntu 26.04 Software Installation: Step-by-Step Guide</h2>



<h3 class="wp-block-heading">Step 1: Verify Your Ubuntu Version and Update System</h3>



<p class="wp-block-paragraph">First, confirm you&#8217;re running Ubuntu 26.04 and update your system:</p>



<pre class="wp-block-code"><code>lsb_release -a</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Distributor ID: Ubuntu
Description:    Ubuntu 26.04 LTS
Release:        26.04
Codename:       resolute</code></pre>



<p class="wp-block-paragraph">Update your package lists and system:</p>



<pre class="wp-block-code"><code>sudo apt update && sudo apt upgrade -y</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Hit:1 http://archive.ubuntu.com/ubuntu resolute InRelease
Get:2 http://archive.ubuntu.com/ubuntu resolute-updates InRelease [119 kB]
Get:3 http://security.ubuntu.com/ubuntu resolute-security InRelease [110 kB]
...
Reading package lists... Done
Building dependency tree... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>-a</code>: Shows all distribution information including version, codename, and description for complete system identification</li>


<li><code>-y</code>: Automatically answers &#8220;yes&#8221; to all prompts during the upgrade process, enabling unattended installation</li>


<li><code>&&</code>: Logical AND operator that runs the second command only if the first command succeeds (exit code 0)</li>

</ul>



<p class="wp-block-paragraph">This ensures you have the latest security patches and package information before installing new software.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-3023.png" alt="Terminal showing lsb_release output and apt update command running"/></figure>



<h3 class="wp-block-heading">Step 2: Enable Additional Ubuntu Software Repositories</h3>



<p class="wp-block-paragraph">Ubuntu 26.04 ships with only the <code>main</code> and <code>restricted</code> repositories enabled by default. You&#8217;ll want the additional sources — they contain most of the software you actually use:</p>



<pre class="wp-block-code"><code># Open Software &amp; Updates graphically
software-properties-gtk</code></pre>



<p class="wp-block-paragraph">Or enable via command line:</p>



<pre class="wp-block-code"><code>sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo apt update</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Repository: 'deb http://archive.ubuntu.com/ubuntu resolute universe'
Description:
Archive for the 'universe' component
More info: https://wiki.ubuntu.com/UbuntuDevelopment
Adding repository.
Press [ENTER] to continue or Ctrl-c to cancel.
Adding deb entry to /etc/apt/sources.list.d/archive_uri-http_archive_ubuntu_com_ubuntu-resolute.list
Adding disabled deb-src entry to /etc/apt/sources.list.d/archive_uri-http_archive_ubuntu_com_ubuntu-resolute.list</code></pre>



<p class="wp-block-paragraph"><strong>Repository explanations:</strong></p>



<ul class="wp-block-list">

<li><code>universe</code>: Community-maintained free and open-source software not officially supported by Canonical</li>


<li><code>multiverse</code>: Software that is not free (includes proprietary drivers, codecs, and commercial applications)</li>

</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-3577.png" alt="Software &#038; Updates dialog showing Ubuntu Software tab with universe and multiverse repositories checked"/></figure>



<h3 class="wp-block-heading">Step 3: Set Up Flatpak for Additional Software Sources (Optional but Recommended)</h3>



<p class="wp-block-paragraph"><a href="https://thebackroomtech.com/how-to-install-and-run-flatpak-applications/">Flatpak isn&#8217;t installed by default</a> in Ubuntu 26.04. Install it for access to additional applications:</p>



<pre class="wp-block-code"><code>sudo apt install flatpak</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Reading package lists... Done
Building dependency tree... Done
The following additional packages will be installed:
  flatpak-session-helper xdg-desktop-portal-gtk
The following NEW packages will be installed:
  flatpak flatpak-session-helper xdg-desktop-portal-gtk
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.</code></pre>



<p class="wp-block-paragraph">Add the Flathub repository (the primary source for Flatpak applications):</p>



<pre class="wp-block-code"><code>flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Adding remote flathub to system installations</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>--if-not-exists</code>: Only adds the repository if it doesn&#8217;t already exist, preventing duplicate entries and configuration conflicts</li>

</ul>



<p class="wp-block-paragraph">Reboot or log out and back in for Flatpak integration to work properly:</p>



<pre class="wp-block-code"><code>sudo reboot</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-4206.png" alt="Terminal showing flatpak installation and flathub repository being added"/></figure>



<h2 class="wp-block-heading">Ubuntu Software Installation Methods: Choosing the Right Approach</h2>



<h3 class="wp-block-heading">APT Package Manager: For System Utilities and Development Tools</h3>



<p class="wp-block-paragraph"><strong>When to choose APT:</strong></p>



<ul class="wp-block-list">

<li>Installing compilers, libraries, or system tools</li>


<li>Command-line utilities and server software</li>


<li>Development environments (Python, Node.js, etc.)</li>


<li>When you need the most stable, tested versions</li>

</ul>



<p class="wp-block-paragraph">APT packages integrate deeply with Ubuntu&#8217;s system. They follow Debian packaging standards. They handle dependencies cleanly. They receive security updates through Ubuntu&#8217;s established channels.</p>



<p class="wp-block-paragraph"><strong>APT Installation Process:</strong></p>



<p class="wp-block-paragraph">Search for packages:</p>



<pre class="wp-block-code"><code>apt search firefox
# or more specific search
apt search --names-only git</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>--names-only</code>: Searches only package names, not descriptions, for more precise results and faster search performance</li>

</ul>



<p class="wp-block-paragraph">Install a package:</p>



<pre class="wp-block-code"><code>sudo apt install git</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Reading package lists... Done
Building dependency tree... Done
Reading state information: Done
The following additional packages will be installed:
  git-man liberror-perl
Suggested packages:
  git-daemon-run | git-daemon-sysvinit git-doc git-el git-email git-gui gitk gitweb git-cvs git-mediawiki git-svn
The following NEW packages will be installed:
  git git-man liberror-perl
0 upgraded, 3 newly installed, 0 to remove and 0 not upgraded.</code></pre>



<p class="wp-block-paragraph">Remove a package:</p>



<pre class="wp-block-code"><code>sudo apt remove package-name
# or remove with config files
sudo apt purge package-name</code></pre>



<p class="wp-block-paragraph"><strong>Removal flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>remove</code>: Uninstalls the package but keeps configuration files in case you reinstall later</li>


<li><code>purge</code>: Completely removes the package including all configuration files, providing a clean uninstall</li>

</ul>



<p class="wp-block-paragraph"><strong>Using Ubuntu Software Center (GUI Method):</strong></p>



<ul class="wp-block-list">

<li>Open <strong>Ubuntu Software</strong> from the Activities overview</li>


<li>Search for your desired application</li>


<li>Click <strong>Install</strong> on applications marked with &#8220;deb&#8221; or no special badge</li>

</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-5614.png" alt="Ubuntu Software Center showing search results with APT packages highlighted"/></figure>



<h3 class="wp-block-heading">Snap Packages: For Desktop Applications and Media Software</h3>



<p class="wp-block-paragraph"><strong>When to choose Snap:</strong></p>



<ul class="wp-block-list">

<li>Popular desktop applications (browsers, media players, productivity tools)</li>


<li>Applications needing sandboxed security</li>


<li>When you want the latest versions from developers</li>


<li>Cross-platform software that needs to &#8220;just work&#8221;</li>

</ul>



<p class="wp-block-paragraph">Snaps update automatically and run in isolated containers. They&#8217;re larger than APT packages but eliminate dependency conflicts entirely.</p>



<p class="wp-block-paragraph"><strong>Snap Installation Process:</strong></p>



<p class="wp-block-paragraph">Search for snaps:</p>



<pre class="wp-block-code"><code>snap find discord</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Name     Version  Publisher   Notes  Summary
discord  0.0.45   snapcrafters -      All-in-one voice and text chat for gamers</code></pre>



<p class="wp-block-paragraph">Install a snap:</p>



<pre class="wp-block-code"><code>sudo snap install discord</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>discord 0.0.45 from snapcrafters installed</code></pre>



<p class="wp-block-paragraph">List installed snaps:</p>



<pre class="wp-block-code"><code>snap list</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Name                  Version                     Rev    Tracking       Publisher   Notes
core20                20221027                    1695   latest/stable  canonical✓  base
discord               0.0.45                      140    latest/stable  snapcrafters -
snapd                 2.67                        17336  latest/stable  canonical✓  snapd</code></pre>



<p class="wp-block-paragraph">Remove a snap:</p>



<pre class="wp-block-code"><code>sudo snap remove discord</code></pre>



<p class="wp-block-paragraph"><strong>Managing Snap Channels:</strong></p>



<p class="wp-block-paragraph">Snaps have different release channels. Install from a specific channel:</p>



<pre class="wp-block-code"><code># Install from edge (development) channel
sudo snap install code --classic --channel=edge

# Switch channels for installed snap
sudo snap refresh code --channel=stable</code></pre>



<p class="wp-block-paragraph"><strong>Channel and confinement flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>--classic</code>: Disables snap confinement for applications that need full system access (like IDEs and development tools)</li>


<li><code>--channel=edge</code>: Installs from the development/testing channel instead of stable, providing cutting-edge features but potentially less stability</li>


<li><code>--channel=stable</code>: Switches to the stable release channel for production-ready versions with thorough testing</li>

</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-6703.png" alt="Terminal showing snap find command results and successful snap installation"/></figure>



<h3 class="wp-block-heading">Flatpak Applications: For Creative Software and Specialized Apps</h3>



<p class="wp-block-paragraph"><strong>When to choose Flatpak:</strong></p>



<ul class="wp-block-list">

<li>Applications not available in Ubuntu repositories or Snap Store</li>


<li>Graphics, audio, and creative software</li>


<li>When you want maximum application sandboxing</li>


<li>Applications that need specific runtime environments</li>

</ul>



<p class="wp-block-paragraph">Flatpak really shines for creative applications that need specific graphics libraries. The sandboxing is more granular than Snap&#8217;s. This gives you fine-tuned permission control.</p>



<p class="wp-block-paragraph"><strong>Flatpak Installation Process:</strong></p>



<p class="wp-block-paragraph">Search for applications:</p>



<pre class="wp-block-code"><code>flatpak search gimp</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Name                          Description                                        Application ID            Version    Branch Remotes
GNU Image Manipulation Prog… Create images and edit photographs               org.gimp.GIMP             3.0.0      stable flathub</code></pre>



<p class="wp-block-paragraph">Install from Flathub:</p>



<pre class="wp-block-code"><code>flatpak install flathub org.gimp.GIMP</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Looking for matches…
Required runtime for org.gimp.GIMP/x86_64/stable (runtime/org.gnome.Platform/x86_64/42) found in remote flathub
Do you want to install it? [Y/n]: Y
Installing in system:
org.gnome.Platform/x86_64/42                  flathub 524.5 MB / 524.5 MB
org.gimp.GIMP/x86_64/stable                   flathub  75.8 MB /  75.8 MB
Installation complete.</code></pre>



<p class="wp-block-paragraph">Run a Flatpak application:</p>



<pre class="wp-block-code"><code>flatpak run org.gimp.GIMP</code></pre>



<p class="wp-block-paragraph">List installed Flatpaks:</p>



<pre class="wp-block-code"><code>flatpak list</code></pre>



<p class="wp-block-paragraph">Remove a Flatpak:</p>



<pre class="wp-block-code"><code>flatpak uninstall org.gimp.GIMP</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-7662.png" alt="Terminal showing flatpak search results and installation process"/></figure>



<h3 class="wp-block-heading">Manual Installation: For Proprietary or Cutting-Edge Software</h3>



<p class="wp-block-paragraph"><strong>When manual installation is your best option:</strong></p>



<ul class="wp-block-list">

<li>Proprietary software with custom installers (like Google Chrome)</li>


<li>Cutting-edge software not yet packaged</li>


<li>Specific versions required for compatibility</li>


<li>Software distributed only as .deb files or AppImages</li>

</ul>



<p class="wp-block-paragraph">Manual installation gives you complete control. But it requires more attention to security and updates.</p>



<h4 class="wp-block-heading">Installing .deb Packages on Ubuntu</h4>



<p class="wp-block-paragraph">Download and install .deb files:</p>



<pre class="wp-block-code"><code># Download example (Google Chrome)
# Note: apt-key is deprecated. Use the modern keyring method below.
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /etc/apt/keyrings/google-chrome.gpg
echo "deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main" | sudo tee /etc/apt/sources.list.d/google-chrome.list
sudo apt update
sudo apt install google-chrome-stable</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>deb [arch=amd64 signed-by=/etc/apt/keyrings/google-chrome.gpg] http://dl.google.com/linux/chrome/deb/ stable main
Hit:1 http://archive.ubuntu.com/ubuntu resolute InRelease
Get:2 http://dl.google.com/linux/chrome/deb stable InRelease [1,811 B]
Get:3 http://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,096 B]
Reading package lists... Done
The following NEW packages will be installed:
  google-chrome-stable</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>curl -fsSL</code>: Downloads the key silently, failing on errors, and follows redirects — safer than wget piped to apt-key</li>


<li><code>--dearmor</code>: Converts the GPG key from ASCII-armored format to binary format required by apt</li>


<li><code>-o /etc/apt/keyrings/google-chrome.gpg</code>: Saves the key to the modern <code>/etc/apt/keyrings/</code> directory instead of the deprecated apt-key keyring</li>


<li><code>signed-by=</code>: Tells apt to verify packages from this repo against the specific key file, improving security over the old trusted.gpg approach</li>


<li><code>[arch=amd64]</code>: Specifies the repository is for 64-bit x86 architecture, ensuring compatibility with your system</li>

</ul>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p><strong>Note:</strong> The older <code>apt-key add</code> method is deprecated as of Ubuntu 22.04 and later. Always use the <code>curl</code>-to-<code>/etc/apt/keyrings/</code> approach shown above when adding third-party repositories.</p></blockquote>



<p class="wp-block-paragraph">Or install a downloaded .deb file directly:</p>



<pre class="wp-block-code"><code># Install with dependency resolution
sudo apt install ./downloaded-package.deb

# Or use dpkg (may require manual dependency fixes)
sudo dpkg -i downloaded-package.deb
sudo apt --fix-broken install  # if dependencies are missing</code></pre>



<p class="wp-block-paragraph"><strong>Installation flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>./</code>: Specifies a local file path instead of a package name from repositories, telling apt to install from the current directory</li>


<li><code>-i</code>: Install flag for dpkg (Debian package manager), directly installing the package file</li>


<li><code>--fix-broken</code>: Attempts to fix broken dependencies after manual installation by downloading and installing missing packages</li>

</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-8886.png" alt="File manager showing .deb file with right-click context menu displaying installation options"/></figure>



<h4 class="wp-block-heading">Using AppImages for Portable Applications</h4>



<p class="wp-block-paragraph">AppImages are portable applications that don&#8217;t require installation:</p>



<pre class="wp-block-code"><code># Make AppImage executable
chmod +x Example-App.AppImage

# Run the AppImage
./Example-App.AppImage</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>+x</code>: Adds execute permission to the file for the current user, making the AppImage runnable as a program</li>

</ul>



<p class="wp-block-paragraph">For better desktop integration, use AppImageLauncher:</p>



<pre class="wp-block-code"><code>sudo apt install software-properties-common
sudo add-apt-repository ppa:appimagelauncher-team/stable
sudo apt update
sudo apt install appimagelauncher</code></pre>



<h2 class="wp-block-heading">Ubuntu Software Configuration and Management</h2>



<h3 class="wp-block-heading">Managing Software Sources and Repositories</h3>



<p class="wp-block-paragraph">View enabled repositories:</p>



<pre class="wp-block-code"><code>grep -r "^deb " /etc/apt/sources.list /etc/apt/sources.list.d/</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>/etc/apt/sources.list:deb http://archive.ubuntu.com/ubuntu resolute main restricted
/etc/apt/sources.list:deb http://archive.ubuntu.com/ubuntu resolute-updates main restricted
/etc/apt/sources.list:deb http://archive.ubuntu.com/ubuntu resolute universe
/etc/apt/sources.list:deb http://security.ubuntu.com/ubuntu resolute-security main restricted</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>-r</code>: Recursively searches through directories and subdirectories for matching patterns</li>


<li><q>&#8220;^deb &#8220;</q>: Regular expression matching lines starting with &#8220;deb &#8221; (active repositories), excluding commented lines</li>

</ul>



<p class="wp-block-paragraph">Add a Personal Package Archive (PPA):</p>



<pre class="wp-block-code"><code>sudo add-apt-repository ppa:example/ppa-name
sudo apt update</code></pre>



<p class="wp-block-paragraph">Remove a PPA:</p>



<pre class="wp-block-code"><code>sudo add-apt-repository --remove ppa:example/ppa-name</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>--remove</code>: Removes the specified repository instead of adding it, cleaning up both the repository entry and GPG keys</li>

</ul>



<h3 class="wp-block-heading">Keeping Ubuntu Software Updated</h3>



<p class="wp-block-paragraph">Ubuntu&#8217;s multiple package systems need separate commands for each:</p>



<p class="wp-block-paragraph">Update all APT packages:</p>



<pre class="wp-block-code"><code>sudo apt update && sudo apt upgrade</code></pre>



<p class="wp-block-paragraph">Update all snaps:</p>



<pre class="wp-block-code"><code>sudo snap refresh</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>All snaps up to date.</code></pre>



<p class="wp-block-paragraph">Update all Flatpaks:</p>



<pre class="wp-block-code"><code>flatpak update</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Looking for updates…
Nothing to do.</code></pre>



<p class="wp-block-paragraph">Set up automatic security updates:</p>



<pre class="wp-block-code"><code>sudo apt install unattended-upgrades
sudo dpkg-reconfigure unattended-upgrades</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/ubuntu-26-04-software-installation-guide-screenshot-10219.png" alt="Update Manager showing available updates from different sources with security updates highlighted"/></figure>



<h3 class="wp-block-heading">Storage Management for Ubuntu Software</h3>



<p class="wp-block-paragraph">Each package system has its own storage quirks. Check what&#8217;s using space:</p>



<pre class="wp-block-code"><code># APT package cache
du -sh /var/cache/apt/archives/

# Snap packages
du -sh /var/lib/snapd/snaps/

# Flatpak applications
flatpak list --columns=name,size

# Clean up package caches
sudo apt autoclean
sudo apt autoremove</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>-s</code>: Summarizes total size instead of showing individual file sizes, providing a single total for the directory</li>


<li><code>-h</code>: Human-readable format (KB, MB, GB instead of bytes) for easier interpretation of disk usage</li>


<li><code>--columns=name,size</code>: Shows only specified columns in the output, filtering out unnecessary information for cleaner display</li>

</ul>



<h2 class="wp-block-heading">Ubuntu Software Installation Troubleshooting and Tips</h2>



<h3 class="wp-block-heading">Common APT Package Manager Issues</h3>



<p class="wp-block-paragraph"><strong>Error</strong>: <code>Package not found</code> when using apt</p>



<p class="wp-block-paragraph"><strong>Cause</strong>: Software not available in enabled repositories or repository lists not updated</p>



<p class="wp-block-paragraph"><strong>Fix</strong>:</p>



<pre class="wp-block-code"><code>sudo apt update
# Check if universe/multiverse repositories are enabled
sudo add-apt-repository universe multiverse
sudo apt update</code></pre>



<p class="wp-block-paragraph"><strong>Error</strong>: <code>Could not get lock /var/lib/dpkg/lock-frontend</code></p>



<p class="wp-block-paragraph"><strong>Cause</strong>: Another package manager process is running</p>



<p class="wp-block-paragraph"><strong>Fix</strong>:</p>



<pre class="wp-block-code"><code># Wait for other processes to finish, or force unlock
sudo killall apt apt-get
sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock*
sudo dpkg --configure -a
sudo apt update</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>--configure -a</code>: Configures all unpacked but unconfigured packages, completing interrupted installations</li>

</ul>



<h3 class="wp-block-heading">Common Snap Package Issues</h3>



<p class="wp-block-paragraph"><strong>Problem</strong>: Snap applications start slowly</p>



<p class="wp-block-paragraph"><strong>Cause</strong>: Snap packages need to mount their filesystem and load dependencies on startup</p>



<p class="wp-block-paragraph"><strong>Solution</strong>: This is normal behavior. Subsequent launches will be faster. Consider using the APT version if available for better performance.</p>



<p class="wp-block-paragraph"><strong>Problem</strong>: Snap applications can&#8217;t access files in home directory</p>



<p class="wp-block-paragraph"><strong>Cause</strong>: Snap confinement restricts file system access</p>



<p class="wp-block-paragraph"><strong>Fix</strong>:</p>



<pre class="wp-block-code"><code># Grant specific permissions
sudo snap connect app-name:home
sudo snap connect app-name:removable-media

# List available connections
snap connections app-name</code></pre>



<p class="wp-block-paragraph">Expected output:</p>



<pre class="wp-block-code"><code>Interface        Plug                 Slot               Notes
desktop          app-name:desktop     :desktop           -
home             app-name:home        :home              connected
removable-media  app-name:removable-media :removable-media connected</code></pre>



<h3 class="wp-block-heading">Common Flatpak Application Issues</h3>



<p class="wp-block-paragraph"><strong>Problem</strong>: Flatpak applications don&#8217;t have system access</p>



<p class="wp-block-paragraph"><strong>Cause</strong>: Flatpak sandboxing restricts application permissions by default</p>



<p class="wp-block-paragraph"><strong>Solution</strong>: Install Flatseal for GUI permission management:</p>



<pre class="wp-block-code"><code>flatpak install flathub com.github.tchx84.Flatseal</code></pre>



<p class="wp-block-paragraph">Or use command line:</p>



<pre class="wp-block-code"><code># Grant file system access
flatpak override --user --filesystem=home org.example.App

# Grant network access
flatpak override --user --share=network org.example.App</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>--user</code>: Applies the override for the current user only, not system-wide, allowing per-user permission customization</li>


<li><code>--filesystem=home</code>: Grants access to the user&#8217;s home directory, enabling file operations in personal folders</li>


<li><code>--share=network</code>: Allows the application to access the network, enabling internet connectivity for the sandboxed app</li>

</ul>



<h3 class="wp-block-heading">Universal Troubleshooting Steps</h3>



<p class="wp-block-paragraph">When things go wrong across any installation method, these commands help diagnose issues:</p>



<p class="wp-block-paragraph"><strong>Check system resources:</strong></p>



<pre class="wp-block-code"><code>df -h        # Check disk space
free -h      # Check memory usage
top          # Check running processes</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>-h</code>: Human-readable format for disk space and memory output, displaying sizes in KB, MB, GB instead of bytes</li>

</ul>



<p class="wp-block-paragraph"><strong>Clear package caches:</strong></p>



<pre class="wp-block-code"><code>sudo apt clean
sudo snap set system refresh.retain=2  # Keep only 2 snap versions
flatpak uninstall --unused  # Remove unused runtimes</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>refresh.retain=2</code>: Configures snap to keep only the current and one previous version, saving disk space by removing older revisions</li>


<li><code>--unused</code>: Removes Flatpak runtimes that are no longer needed by any installed applications, freeing up storage space</li>

</ul>



<p class="wp-block-paragraph"><strong>Check installation logs:</strong></p>



<pre class="wp-block-code"><code># APT logs
cat /var/log/apt/history.log

# Snap logs  
sudo journalctl -u snapd.service

# System logs for installation issues
sudo journalctl -f</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>-u snapd.service</code>: Shows logs only for the snapd service unit, filtering out unrelated system messages</li>


<li><code>-f</code>: Follows the log in real-time, showing new entries as they appear for live troubleshooting</li>

</ul>



<h3 class="wp-block-heading">Security Best Practices for Ubuntu Software Installation</h3>



<p class="wp-block-paragraph"><strong>Verify package sources:</strong></p>



<ul class="wp-block-list">

<li>Only install from official repositories when possible</li>


<li>Check GPG signatures for .deb files from third parties</li>


<li>Avoid installing random .deb files from unknown websites</li>

</ul>



<p class="wp-block-paragraph"><strong>Use checksums for manual downloads:</strong></p>



<pre class="wp-block-code"><code># Verify SHA256 checksum
sha256sum downloaded-file.deb
# Compare with checksum provided by developer</code></pre>



<p class="wp-block-paragraph"><strong>Monitor installed software:</strong></p>



<pre class="wp-block-code"><code># List all installed packages by size
dpkg-query -Wf '${Installed-Size}\t${Package}\n' | sort -n

# Check for security updates
sudo apt list --upgradable | grep -i security</code></pre>



<p class="wp-block-paragraph"><strong>Flag explanations:</strong></p>



<ul class="wp-block-list">

<li><code>-Wf</code>: Specifies the output format for dpkg-query, allowing custom formatting of package information</li>


<li><code>${Installed-Size}</code>: Shows the installed size of each package in kilobytes for disk usage analysis</li>


<li><code>-n</code>: Sorts numerically instead of alphabetically, ordering packages from smallest to largest size</li>


<li><code>--upgradable</code>: Shows only packages that have available updates, filtering out current packages</li>


<li><code>-i</code>: Case-insensitive grep search, matching &#8220;security&#8221; regardless of capitalization</li>

</ul>



<h2 class="wp-block-heading">Conclusion: Mastering Ubuntu 26.04 Software Installation</h2>



<p class="wp-block-paragraph">Ubuntu&#8217;s four installation methods work together, not against each other. <a href="https://thebackroomtech.com/powershell-vs-bash-system-administration-comparison/">APT handles the system foundation</a>. Snap delivers convenient desktop apps. Flatpak excels at creative software. Manual installation covers everything else.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Use Case</th><th>First Try</th><th>Fallback Options</th></tr></thead><tbody><tr><td>System utilities</td><td>APT</td><td>Manual .deb</td></tr><tr><td>Desktop apps</td><td>Snap</td><td>Flatpak → APT</td></tr><tr><td>Creative software</td><td>Flatpak</td><td>Snap → Manual</td></tr><tr><td>Development tools</td><td>APT</td><td>Snap → Manual</td></tr><tr><td>Proprietary software</td><td>Manual .deb</td><td>Snap → Flatpak</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Start with the &#8220;First Try&#8221; method for your use case. If that doesn&#8217;t work or the software isn&#8217;t available, move to the fallback options. This approach saves time and reduces frustration.</p>



<p class="wp-block-paragraph">Remember: Ubuntu&#8217;s software ecosystem is designed to give you choice. Use that choice strategically, and you&#8217;ll have a system that works exactly how you need it to.</p><p>The post <a href="https://thebackroomtech.com/ubuntu-26-04-software-installation-guide/">How to Install Software on Ubuntu 26.04: Complete Guide to APT, Snap, Flatpak & Manual Methods</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Dell PowerEdge RAID Controller Troubleshooting: Hardware &#038; Firmware Solutions</title>
		<link>https://thebackroomtech.com/dell-poweredge-raid-controller-troubleshooting/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Sat, 11 Apr 2026 16:39:37 +0000</pubDate>
				<category><![CDATA[Troubleshooting]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4857</guid>

					<description><![CDATA[<p><img width="300" height="200" src="https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-featured-300x200.png" class="attachment-medium size-medium wp-post-image" alt="Dell PowerEdge RAID Controller Troubleshooting: Hardware &amp; Firmware Solutions (2026)" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-featured-300x200.png 300w, https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-featured-1024x683.png 1024w, https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-featured-768x512.png 768w, https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-featured-75x50.png 75w, https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-featured.png 1536w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>RAID controller failures on Dell PowerEdge servers can bring your entire infrastructure to a halt. With Dell ending support for R620/R720 series in 2026, you&#8217;re facing critical decisions about aging [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/dell-poweredge-raid-controller-troubleshooting/">Dell PowerEdge RAID Controller Troubleshooting: Hardware & Firmware Solutions</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">RAID controller failures on Dell PowerEdge servers can bring your entire infrastructure to a halt. With Dell ending support for R620/R720 series in 2026, you&#8217;re facing critical decisions about aging hardware.</p>



<p class="wp-block-paragraph">This guide covers emergency diagnostics to firmware recovery. We&#8217;ll help you minimize downtime whether you&#8217;re managing legacy systems or planning migrations.</p>



<h2 class="wp-block-heading">Quick Diagnosis Steps</h2>



<p class="wp-block-paragraph">Before diving into specific issues, run through these basics. They resolve most RAID controller problems:</p>



<ul class="wp-block-list">
<li><strong>Check iDRAC alerts</strong>: Log into your server&#8217;s iDRAC and navigate to <strong>System</strong> &gt; <strong>Alerts</strong> to see current hardware status</li>



<li><strong>Verify physical connections</strong>: Ensure RAID controller cards are properly seated and cables are secure</li>



<li><strong>Review system logs</strong>: Check <strong>Lifecycle Controller Log</strong> and <strong>System Event Log</strong> for recent errors</li>



<li><strong>Confirm power status</strong>: RAID controllers require stable power — check PSU health and redundancy</li>



<li><strong>Test with known-good drives</strong>: Swap in working drives to isolate controller vs. disk issues</li>
</ul>



<h2 class="wp-block-heading">Common RAID Controller Issues</h2>



<h3 class="wp-block-heading">RAID Controller Not Detected During Boot</h3>



<p class="wp-block-paragraph"><strong>Symptoms:</strong></p>



<ul class="wp-block-list">
<li>Server boots but shows no RAID controller during POST</li>



<li><strong>Ctrl+R</strong> prompt doesn&#8217;t appear during boot sequence  </li>



<li>Operating system can&#8217;t see any storage devices</li>



<li>iDRAC shows controller as &#8220;Not Present&#8221; or &#8220;Unknown&#8221;</li>
</ul>



<p class="wp-block-paragraph"><strong>Why it happens</strong>: Physical hardware failure, firmware corruption, or improper seating of the RAID controller card.</p>



<p class="wp-block-paragraph">This is one of those gut-punch moments. Your server boots fine but suddenly has no storage. Don&#8217;t panic, most of the time it&#8217;s just a loose connection.</p>



<p class="wp-block-paragraph"><strong>Fix:</strong></p>



<ul class="wp-block-list">
<li>Power down the server completely and disconnect power cables</li>



<li>Remove the server chassis cover and locate the RAID controller card</li>



<li>Carefully reseat the controller card in its PCIe slot &#8211; ensure it clicks firmly into place</li>



<li>Check that any auxiliary power connectors are properly attached</li>



<li>Power on and watch for the RAID controller to appear in POST messages</li>
</ul>



<pre class="wp-block-code"><code># If the controller appears, verify detection in iDRAC
# Navigate to: Configuration &gt; Storage &gt; Physical Disks
# You should see your RAID controller listed with model number</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-screenshot-3015.png" alt="iDRAC storage management interface showing RAID controller status and configuration options with controller model highlighted"/></figure>



<p class="wp-block-paragraph">If reseating doesn&#8217;t work, the controller card itself may have failed. For end-of-life systems like R620/R720, sourcing replacement controllers becomes critical. Contact Dell support immediately if under warranty. Source compatible third-party controllers for out-of-warranty systems.</p>



<p class="wp-block-paragraph"><strong>Verification</strong>: Boot to the RAID controller BIOS (usually <strong>Ctrl+R</strong> during POST) and confirm you can access the configuration utility.</p>



<h3 class="wp-block-heading">Virtual Disk Shows Degraded Status</h3>



<p class="wp-block-paragraph"><strong>Symptoms:</strong></p>



<ul class="wp-block-list">
<li>RAID array shows &#8220;Degraded&#8221; status in iDRAC or OpenManage</li>



<li>System performance is slower than normal</li>



<li>Orange warning lights on server front panel</li>



<li>Email alerts about RAID array health</li>
</ul>



<p class="wp-block-paragraph"><strong>Why it happens</strong>: One or more drives in the RAID array have failed. Or there are communication issues between the controller and drives.</p>



<p class="wp-block-paragraph">A degraded array is your server&#8217;s way of saying &#8220;I&#8217;m injured but still fighting.&#8221; You have time to fix this, but not much.</p>



<p class="wp-block-paragraph"><strong>Fix:</strong></p>



<ul class="wp-block-list">
<li>Access iDRAC and go to <strong>Configuration</strong> &gt; <strong>Storage</strong> &gt; <strong>Virtual Disks</strong></li>



<li>Identify which virtual disk is degraded and note the RAID level</li>



<li>Click on the degraded virtual disk to see member drive status</li>



<li>Locate any drives showing &#8220;Failed&#8221; or &#8220;Missing&#8221; status</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-screenshot-4441.png" alt="iDRAC virtual disk status page showing degraded RAID array with failed drive highlighted"/></figure>



<ul class="wp-block-list">
<li>If a drive shows as failed, identify its physical location using the drive bay mapping</li>



<li>Replace the failed drive with an identical or compatible model</li>



<li>The RAID rebuild should start automatically &#8211; monitor progress in iDRAC</li>
</ul>



<p class="wp-block-paragraph">For RAID 5 or RAID 6 arrays, you can continue operating with one failed drive. But replace it quickly. RAID 1 arrays can tolerate one failure. RAID 0 arrays will be completely inaccessible with any drive failure.</p>



<p class="wp-block-paragraph"><strong>Verification</strong>: Check that the virtual disk status returns to &#8220;Optimal&#8221; after the rebuild completes. This can take several hours for large drives.</p>



<h3 class="wp-block-heading">Firmware Update Failure or Corruption</h3>



<p class="wp-block-paragraph"><strong>Symptoms:</strong></p>



<ul class="wp-block-list">
<li>RAID controller firmware update process fails partway through</li>



<li>Controller appears with incorrect firmware version or &#8220;Unknown&#8221; status</li>



<li>Server hangs during boot at RAID controller initialization</li>



<li>iDRAC shows firmware version as &#8220;N/A&#8221; or displays error codes</li>
</ul>



<p class="wp-block-paragraph"><strong>Why it happens</strong>: Power interruption during firmware update, incompatible firmware version, or controller hardware failure.</p>



<p class="wp-block-paragraph">Firmware updates gone wrong are particularly frustrating. They often happen during planned maintenance windows. The good news is that Dell&#8217;s Lifecycle Controller is pretty good at recovery.</p>



<p class="wp-block-paragraph"><strong>Fix:</strong></p>



<ul class="wp-block-list">
<li>Boot the server to Dell Lifecycle Controller by pressing <strong>F10</strong> during POST</li>



<li>Navigate to <strong>Firmware Update</strong> &gt; <strong>Launch Firmware Update</strong></li>



<li>Select <strong>Local Drive</strong> if you have firmware files on USB, or <strong>Network Share</strong> for remote files</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-screenshot-6107.png" alt="Dell Lifecycle Controller firmware update interface showing RAID controller firmware rollback options"/></figure>



<ul class="wp-block-list">
<li>If the controller appears in the firmware list, attempt a firmware rollback to the previous version</li>



<li>For completely unresponsive controllers, try the emergency firmware recovery procedure:</li>
</ul>



<p class="wp-block-paragraph">&#8211; Power off the server completely
   &#8211; Remove and reseat the RAID controller card
   &#8211; Boot to Lifecycle Controller and attempt firmware recovery mode</p>



<pre class="wp-block-code"><code># For 2026 end-of-life systems, download firmware from Dell's legacy support site
# Example URLs for common controllers:
# H710: https://www.dell.com/support/home/product-support/product/poweredge-r720/drivers
# H755: https://www.dell.com/support/home/product-support/product/poweredge-r750/drivers</code></pre>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p class="wp-block-paragraph"><strong>Critical for 2026</strong>: Dell&#8217;s firmware support for R620/R720 series ends this year. Download and archive all firmware versions now while they&#8217;re still available.</p>
</blockquote>



<p class="wp-block-paragraph"><strong>Verification</strong>: Confirm the firmware version matches your target version. Check both iDRAC storage status and the RAID controller BIOS.</p>



<h3 class="wp-block-heading">Performance Degradation and Slow I/O</h3>



<p class="wp-block-paragraph"><strong>Symptoms:</strong></p>



<ul class="wp-block-list">
<li>Database queries taking much longer than normal</li>



<li>File transfers to/from the server are unusually slow</li>



<li>High I/O wait times shown in system monitoring</li>



<li>Applications timing out on storage operations</li>
</ul>



<p class="wp-block-paragraph"><strong>Why it happens</strong>: Incorrect cache settings, failing drives that haven&#8217;t been detected yet, thermal throttling, or suboptimal RAID configuration.</p>



<p class="wp-block-paragraph">Performance issues are sneaky. They creep up slowly until someone notices the database is taking forever to respond. The usual culprit is cache configuration.</p>



<p class="wp-block-paragraph"><strong>Fix:</strong></p>



<ul class="wp-block-list">
<li>Check RAID controller cache settings in iDRAC under <strong>Storage</strong> &gt; <strong>Controllers</strong></li>



<li>Verify <strong>Write Policy</strong> is set to <strong>Write Back</strong> (not Write Through) for performance arrays</li>



<li>Ensure <strong>Read Policy</strong> is set to <strong>Read Ahead</strong> for sequential workloads</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-screenshot-8116.png" alt="OpenManage Server Administrator showing RAID controller cache settings and performance optimization options"/></figure>



<ul class="wp-block-list">
<li>Check drive health metrics for early warning signs:</li>
</ul>



<p class="wp-block-paragraph">&#8211; Navigate to <strong>Storage</strong> &gt; <strong>Physical Disks</strong>
   &#8211; Review <strong>Predictive Failure Analysis</strong> status for each drive
   &#8211; Look for drives with high error counts or reallocated sectors</p>



<ul class="wp-block-list">
<li>Monitor controller temperature and ensure proper airflow:</li>
</ul>



<pre class="wp-block-code"><code># Check thermal status via iDRAC RACADM (if available)
racadm get System.ThermalSettings
racadm getsensorinfo</code></pre>



<ul class="wp-block-list">
<li>For write-heavy workloads, consider enabling <strong>Force Write Back</strong> if you have battery backup or UPS protection</li>
</ul>



<p class="wp-block-paragraph"><strong>Verification</strong>: Run I/O benchmarks before and after changes to measure improvement. Tools like <code>fio</code> or <code>dd</code> can provide baseline metrics.</p>



<h3 class="wp-block-heading">Foreign Configuration Detected</h3>



<p class="wp-block-paragraph"><strong>Symptoms:</strong></p>



<ul class="wp-block-list">
<li>Server boots but shows &#8220;Foreign configuration detected&#8221; message</li>



<li>Existing RAID arrays are not accessible</li>



<li>iDRAC shows drives as &#8220;Foreign&#8221; status</li>



<li>Data that should be available is not visible to the operating system</li>
</ul>



<p class="wp-block-paragraph"><strong>Why it happens</strong>: Drives were moved from another system, RAID controller was replaced, or previous controller failure left configuration metadata on the drives.</p>



<p class="wp-block-paragraph">This message appears when your RAID controller finds drives with existing configuration data. It&#8217;s asking whether you want to keep that data or start fresh.</p>



<p class="wp-block-paragraph"><strong>Fix:</strong></p>



<p class="wp-block-paragraph"><strong>CRITICAL</strong>: This decision affects data availability. Choose carefully based on your backup status.</p>



<ul class="wp-block-list">
<li>Access the RAID controller BIOS during boot (<strong>Ctrl+R</strong>)</li>



<li>Navigate to <strong>Foreign Configuration</strong> menu</li>



<li>You have two options:</li>
</ul>



<p class="wp-block-paragraph"><strong>Option A: Import Foreign Configuration (preserves data)</strong></p>



<ul class="wp-block-list">
<li>Select <strong>Import</strong> to bring in the existing RAID configuration</li>



<li>Use this if the drives contain data you need to recover</li>



<li>Verify the imported configuration matches your expectations</li>
</ul>



<p class="wp-block-paragraph"><strong>Option B: Clear Foreign Configuration (destroys data)</strong></p>



<ul class="wp-block-list">
<li>Select <strong>Clear</strong> to remove existing configuration and start fresh</li>



<li>Use this only if you have complete backups or the data is not needed</li>



<li>This allows you to create new RAID arrays with these drives</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/dell-poweredge-raid-controller-troubleshooting-screenshot-10346.png" alt="RAID controller BIOS showing foreign configuration import/clear options with data preservation warnings"/></figure>



<ul class="wp-block-list">
<li>After making your choice, exit the RAID BIOS and allow the system to boot</li>



<li>Verify that your virtual disks appear correctly in iDRAC storage management</li>
</ul>



<p class="wp-block-paragraph"><strong>Verification</strong>: Check that all expected RAID arrays are present and accessible to the operating system.</p>



<h2 class="wp-block-heading">Error Messages Reference</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Error Message</th><th>Meaning</th><th>Immediate Action</th></tr></thead><tbody><tr><td>&#8220;RAID controller battery failed&#8221;</td><td>Battery backup unit needs replacement</td><td>Replace controller battery; disable write-back cache until replaced</td></tr><tr><td>&#8220;Virtual disk degraded&#8221;</td><td>One or more drives failed in array</td><td>Identify failed drives; replace immediately</td></tr><tr><td>&#8220;Foreign configuration detected&#8221;</td><td>Drives have existing RAID metadata</td><td>Choose import (keep data) or clear (lose data)</td></tr><tr><td>&#8220;Controller not responding&#8221;</td><td>Firmware hang or hardware failure</td><td>Power cycle; attempt firmware recovery</td></tr><tr><td>&#8220;Patrol read failed&#8221;</td><td>Drive surface scan found errors</td><td>Check drive health; consider replacement</td></tr><tr><td>&#8220;Consistency check failed&#8221;</td><td>RAID parity errors detected</td><td>Run manual consistency check; replace suspect drives</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Platform-Specific Issues</h2>



<h3 class="wp-block-heading">iDRAC Integration Problems</h3>



<p class="wp-block-paragraph"><strong>Issue</strong>: RAID controller not visible in iDRAC web interface</p>



<p class="wp-block-paragraph"><strong>Solution</strong>:</p>



<ul class="wp-block-list">
<li>Verify iDRAC firmware is compatible with your RAID controller generation</li>



<li>Reset iDRAC to defaults: <strong>iDRAC Settings</strong> &gt; <strong>Network</strong> &gt; <strong>Factory Defaults</strong></li>



<li>Update iDRAC firmware before attempting RAID controller updates</li>
</ul>



<p class="wp-block-paragraph">iDRAC and RAID controller compatibility can be finicky, especially with mixed generations. When in doubt, update iDRAC first.</p>



<p class="wp-block-paragraph"><strong>Issue</strong>: Remote firmware updates failing through iDRAC</p>



<p class="wp-block-paragraph"><strong>Solution</strong>:</p>



<ul class="wp-block-list">
<li>Use local Lifecycle Controller instead of remote iDRAC updates</li>



<li>Ensure network connectivity is stable during update process</li>



<li>For 2026 mixed environments, update iDRAC first, then RAID controller firmware</li>
</ul>



<h3 class="wp-block-heading">OpenManage Console Issues</h3>



<p class="wp-block-paragraph"><strong>Issue</strong>: OpenManage can&#8217;t communicate with RAID controller</p>



<p class="wp-block-paragraph"><strong>Solution</strong>:</p>



<ul class="wp-block-list">
<li>Verify OpenManage Server Administrator version compatibility</li>



<li>Restart the <strong>Dell OpenManage Server Administrator</strong> service</li>



<li>For Windows: Check that <strong>Dell OpenManage Server Administrator Storage Management Service</strong> is running</li>
</ul>



<pre class="wp-block-code"><code># Linux OpenManage service restart
sudo systemctl restart dsm_sa_datamgrd
sudo systemctl restart dsm_sa_eventmgrd

# Windows PowerShell service restart
Restart-Service "Dell OpenManage Server Administrator"</code></pre>



<h2 class="wp-block-heading">Configuration Best Practices</h2>



<h3 class="wp-block-heading">Cache Settings for Different Workloads</h3>



<p class="wp-block-paragraph"><strong>Database Servers (OLTP)</strong>:</p>



<pre class="wp-block-code"><code>Write Policy: Write Back (with battery backup)
Read Policy: No Read Ahead
Cache I/O: Direct I/O</code></pre>



<p class="wp-block-paragraph"><strong>File Servers</strong>:</p>



<pre class="wp-block-code"><code>Write Policy: Write Back
Read Policy: Read Ahead  
Cache I/O: Cached I/O</code></pre>



<p class="wp-block-paragraph"><strong>Backup/Archive Systems</strong>:</p>



<pre class="wp-block-code"><code>Write Policy: Write Through (if no battery backup)
Read Policy: Read Ahead
Cache I/O: Cached I/O</code></pre>



<h3 class="wp-block-heading">Hot Spare Configuration</h3>



<p class="wp-block-paragraph">Always configure global hot spares for critical systems:</p>



<ul class="wp-block-list">
<li>Reserve one drive per 6-8 drives in your RAID arrays</li>



<li>Use drives of equal or larger capacity than your largest array member</li>



<li>Configure automatic rebuild policies to minimize intervention</li>
</ul>



<p class="wp-block-paragraph">Hot spares are cheap insurance. They kick in automatically when a drive fails. This starts the rebuild process without waiting for you to notice the problem.</p>



<h2 class="wp-block-heading">Getting Help and Support Resources</h2>



<h3 class="wp-block-heading">Log Locations and Debug Information</h3>



<p class="wp-block-paragraph"><strong>iDRAC Logs</strong>:</p>



<ul class="wp-block-list">
<li><strong>System Event Log</strong>: Hardware events and errors</li>



<li><strong>Lifecycle Controller Log</strong>: Firmware updates and configuration changes</li>



<li><strong>Storage Log</strong>: RAID-specific events and drive status changes</li>
</ul>



<p class="wp-block-paragraph"><strong>Export logs for support cases</strong>:</p>



<ul class="wp-block-list">
<li>Navigate to <strong>Maintenance</strong> &gt; <strong>Diagnostics</strong> &gt; <strong>Export Logs</strong></li>



<li>Select <strong>Hardware Logs</strong> and <strong>Storage Logs</strong></li>



<li>Download the generated zip file for Dell support</li>
</ul>



<h3 class="wp-block-heading">Dell Support Escalation</h3>



<p class="wp-block-paragraph"><strong>For systems under warranty</strong>:</p>



<ul class="wp-block-list">
<li>Use <a href="https://www.dell.com/support/home/" target="_blank" rel="noopener noreferrer">Dell&#8217;s automated support</a> at support.dell.com</li>



<li>Have your Service Tag ready (found on server chassis or in iDRAC)</li>



<li>Reference specific error codes from system logs</li>
</ul>



<p class="wp-block-paragraph"><strong>For end-of-life systems (2026 considerations)</strong>:</p>



<ul class="wp-block-list">
<li>Dell ProSupport ends for R620/R720 series in Q4 2026</li>



<li>Consider third-party support contracts for extended lifecycle management</li>



<li>Document all configurations before support ends</li>
</ul>



<h3 class="wp-block-heading">Community Resources</h3>



<ul class="wp-block-list">
<li><strong>Dell TechDirect</strong>: Official Dell community forum for IT professionals</li>



<li><strong>r/sysadmin</strong>: Reddit community with extensive Dell PowerEdge discussions  </li>



<li><strong>Spiceworks</strong>: IT professional network with Dell hardware troubleshooting guides</li>
</ul>



<h2 class="wp-block-heading">Prevention and Maintenance</h2>



<h3 class="wp-block-heading">Proactive Monitoring Setup</h3>



<ul class="wp-block-list">
<li><strong>Configure SNMP monitoring</strong> in iDRAC for automated alerting</li>



<li><strong>Set up email notifications</strong> for RAID controller events</li>



<li><strong>Schedule monthly consistency checks</strong> during maintenance windows</li>



<li><strong>Monitor drive health metrics</strong> weekly for early failure detection</li>
</ul>



<p class="wp-block-paragraph">The best RAID problems are the ones you catch before they become emergencies. Proper monitoring catches degraded drives before they take down your arrays.</p>



<h3 class="wp-block-heading">2026 Migration Planning</h3>



<p class="wp-block-paragraph"><strong>Assessment Framework</strong>:</p>



<ul class="wp-block-list">
<li>Inventory all RAID controllers by generation and support status</li>



<li>Calculate replacement costs vs. extended support contracts</li>



<li>Plan staged migrations to minimize business disruption</li>



<li>Document all RAID configurations before hardware changes</li>
</ul>



<p class="wp-block-paragraph"><strong>Budget Planning</strong>:</p>



<ul class="wp-block-list">
<li>New PowerEdge servers with current RAID controllers: $8,000-$15,000+ per server</li>



<li>Third-party RAID controller replacements: $500-$2,000 per controller</li>



<li>Extended support contracts: 20-40% of original hardware cost annually</li>
</ul>



<h2 class="wp-block-heading">Wrapping Up</h2>



<p class="wp-block-paragraph">You now have the tools for diagnosing and resolving Dell PowerEdge RAID controller issues. Act quickly on degraded arrays. Plan ahead for the 2026 support transitions.</p>



<p class="wp-block-paragraph">RAID controller failures will happen, it&#8217;s not a matter of if, but when. Having these procedures ready means the difference between a planned maintenance window and an emergency outage.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Issue Type</th><th>Immediate Action</th><th>Long-term Solution</th></tr></thead><tbody><tr><td>Hardware failure</td><td>Replace controller/drives</td><td>Plan hardware refresh</td></tr><tr><td>Firmware corruption</td><td>Lifecycle Controller recovery</td><td>Archive firmware versions</td></tr><tr><td>Performance issues</td><td>Optimize cache settings</td><td>Monitor proactively</td></tr><tr><td>EOL systems</td><td>Document configurations</td><td>Budget for migrations</td></tr></tbody></table></figure><p>The post <a href="https://thebackroomtech.com/dell-poweredge-raid-controller-troubleshooting/">Dell PowerEdge RAID Controller Troubleshooting: Hardware & Firmware Solutions</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Install Software from tar.gz Files on Ubuntu: Complete 2026 Guide</title>
		<link>https://thebackroomtech.com/install-software-tar-gz-ubuntu/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Tue, 07 Apr 2026 02:58:41 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4847</guid>

					<description><![CDATA[<p><img width="300" height="200" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-featured-300x200.png" class="attachment-medium size-medium wp-post-image" alt="How to Install Software from tar.gz Files on Ubuntu: Complete 2026 Guide" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-featured-300x200.png 300w, https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-featured-1024x683.png 1024w, https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-featured-768x512.png 768w, https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-featured-75x50.png 75w, https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-featured.png 1536w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>Sometimes apt doesn&#8217;t have what you need. Maybe you want the latest Node.js version, specialized research software, or proprietary tools that only ship as compressed archives. Installing from tar.gz files [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/install-software-tar-gz-ubuntu/">How to Install Software from tar.gz Files on Ubuntu: Complete 2026 Guide</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Sometimes apt doesn&#8217;t have what you need. Maybe you want the latest Node.js version, specialized research software, or proprietary tools that only ship as compressed archives. Installing from tar.gz files means doing it yourself, but it&#8217;s straightforward once you know the steps.</p>



<h2 class="wp-block-heading">What Are tar.gz Files?</h2>



<p class="wp-block-paragraph">A tar.gz file is a compressed archive with software files. These might be ready-to-run binaries or source code you need to compile. The <code>.tar</code> format bundles files together. The <code>.gz</code> part compresses them.</p>



<p class="wp-block-paragraph">Unlike Windows <code>.exe</code> files or Ubuntu&#8217;s <code>.deb</code> packages, tar.gz files don&#8217;t install automatically. You extract the files and set things up yourself. More work, but more control.</p>



<h2 class="wp-block-heading">Prerequisites</h2>



<p class="wp-block-paragraph">Before starting, ensure you have:</p>



<ul class="wp-block-list">
<li>[ ] Ubuntu 20.04 or later with terminal access</li>



<li>[ ] sudo privileges for system-wide installations</li>



<li>[ ] Internet connection for downloading software and dependencies</li>



<li>[ ] Basic familiarity with file manager and text editor</li>



<li>[ ] At least 2GB free disk space for software and dependencies</li>
</ul>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Requirement</th><th>Check Command</th><th>Expected Output</th></tr></thead><tbody><tr><td>Terminal access</td><td><code>echo $SHELL</code></td><td><code>/bin/bash</code> or similar</td></tr><tr><td>sudo privileges</td><td><code>sudo whoami</code></td><td><code>root</code></td></tr><tr><td>tar utility</td><td><code>which tar</code></td><td><code>/bin/tar</code></td></tr><tr><td>System architecture</td><td><code>uname -m</code></td><td><code>x86_64</code> or <code>aarch64</code></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Step 1: Set Up Your Installation Environment</h2>



<p class="wp-block-paragraph">Create a dedicated directory for custom software. This keeps your home folder organized:</p>



<pre class="wp-block-code"><code>mkdir -p ~/custom-software
cd ~/custom-software</code></pre>



<p class="wp-block-paragraph">This directory stores all manually installed apps. Makes them easier to manage later.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-2401.png" alt="Terminal showing creation of custom-software directory with successful mkdir command"/></figure>



<p class="wp-block-paragraph">Install build tools that many installations need:</p>



<pre class="wp-block-code"><code>sudo apt update
sudo apt install build-essential curl wget</code></pre>



<p class="wp-block-paragraph">The <code>build-essential</code> package includes compilers and development tools. You might not need all of it. But having it prevents &#8220;compiler not found&#8221; errors.</p>



<h2 class="wp-block-heading">Step 2: Understanding File Types and Architecture</h2>



<p class="wp-block-paragraph">Check your system architecture first:</p>



<pre class="wp-block-code"><code>uname -m</code></pre>



<p class="wp-block-paragraph">Common outputs:</p>



<ul class="wp-block-list">
<li><code>x86_64</code>: Intel/AMD 64-bit processors (most common)</li>



<li><code>aarch64</code>: ARM 64-bit processors (newer systems)</li>
</ul>



<p class="wp-block-paragraph">Download software that matches your architecture. Wrong choice means &#8220;cannot execute binary file&#8221; errors.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-3166.png" alt="Terminal showing uname -m command output displaying system architecture"/></figure>



<h2 class="wp-block-heading">Scenario 1: Installing Node.js Development Tool</h2>



<h3 class="wp-block-heading">Step 3: Download Node.js from Official Source</h3>



<p class="wp-block-paragraph">Node.js often releases new versions before Ubuntu updates its packages. To get Node.js 22.x:</p>



<p class="wp-block-paragraph">Go to <a href="https://nodejs.org/" target="_blank" rel="noopener noreferrer">nodejs.org</a> and find &#8220;Other Downloads&#8221;. Copy the &#8220;Linux Binaries (x64)&#8221; tar.gz link.</p>



<pre class="wp-block-code"><code>cd ~/custom-software
wget https://nodejs.org/dist/v22.0.0/node-v22.0.0-linux-x64.tar.gz</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-3708.png" alt="Terminal showing wget download of Node.js tar.gz file with download progress"/></figure>



<h3 class="wp-block-heading">Step 4: Extract and Install Node.js</h3>



<p class="wp-block-paragraph">Extract the archive:</p>



<pre class="wp-block-code"><code>tar -xzf node-v22.0.0-linux-x64.tar.gz</code></pre>



<p class="wp-block-paragraph">The flags mean:</p>



<ul class="wp-block-list">
<li><code>-x</code>: extract files</li>



<li><code>-z</code>: handle gzip compression  </li>



<li><code>-f</code>: specify filename</li>
</ul>



<p class="wp-block-paragraph">This creates a <code>node-v22.0.0-linux-x64</code> directory. Node.js comes pre-compiled, so no building needed.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-4159.png" alt="Terminal showing tar extraction command with visible extracted directory listing"/></figure>



<h3 class="wp-block-heading">Step 5: Set Up PATH Environment Variables</h3>



<p class="wp-block-paragraph">Add Node.js to your PATH so you can use it anywhere:</p>



<pre class="wp-block-code"><code>echo 'export PATH="$HOME/custom-software/node-v22.0.0-linux-x64/bin:$PATH"' &gt;&gt; ~/.bashrc
source ~/.bashrc</code></pre>



<p class="wp-block-paragraph">Test the installation:</p>



<pre class="wp-block-code"><code>node --version
npm --version</code></pre>



<p class="wp-block-paragraph">You should see version numbers. This confirms everything works.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-4649.png" alt="Terminal showing successful node and npm version commands with version output"/></figure>



<h2 class="wp-block-heading">Scenario 2: Installing ImageJ Scientific Software</h2>



<h3 class="wp-block-heading">Step 6: Download ImageJ for Scientific Computing</h3>



<p class="wp-block-paragraph">ImageJ is imaging software for research. Download from <a href="https://imagej.net/" target="_blank" rel="noopener noreferrer">imagej.net</a>:</p>



<pre class="wp-block-code"><code>cd ~/custom-software
wget https://downloads.imagej.net/fiji/latest/fiji-linux64.tar.gz</code></pre>



<h3 class="wp-block-heading">Step 7: Extract ImageJ and Handle Java Dependencies</h3>



<p class="wp-block-paragraph">Extract ImageJ:</p>



<pre class="wp-block-code"><code>tar -xzf fiji-linux64.tar.gz</code></pre>



<p class="wp-block-paragraph">ImageJ needs Java. Install it if missing:</p>



<pre class="wp-block-code"><code>sudo apt install openjdk-11-jdk</code></pre>



<p class="wp-block-paragraph">Test ImageJ:</p>



<pre class="wp-block-code"><code>cd Fiji.app
./ImageJ-linux64</code></pre>



<p class="wp-block-paragraph">If ImageJ opens, close it and move to desktop integration. Java apps have quirks, but ImageJ bundles most dependencies.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-5465.png" alt="Terminal showing ImageJ startup command with application launching"/></figure>



<h3 class="wp-block-heading">Step 8: Create Desktop Integration for ImageJ</h3>



<p class="wp-block-paragraph">Make ImageJ appear in your app menu instead of needing terminal launches:</p>



<pre class="wp-block-code"><code>nano ~/.local/share/applications/imagej.desktop</code></pre>



<p class="wp-block-paragraph">Add this content:</p>



<pre class="wp-block-code"><code>&#91;Desktop Entry]
Name=ImageJ
Comment=Image Processing and Analysis
Exec=/home/yourusername/custom-software/Fiji.app/ImageJ-linux64
Icon=/home/yourusername/custom-software/Fiji.app/images/icon.png
Terminal=false
Type=Application
Categories=Science;Education;</code></pre>



<p class="wp-block-paragraph">Replace <code>yourusername</code> with your actual username. Save and update:</p>



<pre class="wp-block-code"><code>update-desktop-database ~/.local/share/applications/</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-6196.png" alt="Text editor showing ImageJ desktop file configuration with proper syntax highlighted"/></figure>



<h2 class="wp-block-heading">Scenario 3: Installing Proprietary Business Software</h2>



<h3 class="wp-block-heading">Step 9: Handle Proprietary Application Installation</h3>



<p class="wp-block-paragraph">Business apps often come as tar.gz files. The process varies, but common steps include:</p>



<p class="wp-block-paragraph">Download the software:</p>



<pre class="wp-block-code"><code>cd ~/custom-software
# Replace with actual download URL from vendor
wget https://vendor.com/software/business-app-v2.1.tar.gz</code></pre>



<p class="wp-block-paragraph">Extract and check contents:</p>



<pre class="wp-block-code"><code>tar -xzf business-app-v2.1.tar.gz
cd business-app-v2.1
ls -la</code></pre>



<p class="wp-block-paragraph">Look for setup instructions:</p>



<pre class="wp-block-code"><code>cat README.txt
cat INSTALL</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-6879.png" alt="Terminal showing directory listing of extracted proprietary software with README and install files visible"/></figure>



<h3 class="wp-block-heading">Step 10: Run Installation Scripts</h3>



<p class="wp-block-paragraph">Many proprietary apps include setup scripts:</p>



<pre class="wp-block-code"><code>chmod +x install.sh
sudo ./install.sh</code></pre>



<p class="wp-block-paragraph">If no installer exists, copy files manually:</p>



<pre class="wp-block-code"><code>sudo cp -r bin/* /usr/local/bin/
sudo cp -r lib/* /usr/local/lib/</code></pre>



<p class="wp-block-paragraph">Create desktop integration like in Step 8. Manual copying shows you what goes where.</p>



<h2 class="wp-block-heading">Essential Terminal Commands Explained</h2>



<p class="wp-block-paragraph">These commands help with any tar.gz installation:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Command</th><th>Purpose</th><th>Example</th></tr></thead><tbody><tr><td><code>tar -xzf file.tar.gz</code></td><td>Extract compressed archive</td><td><code>tar -xzf software.tar.gz</code></td></tr><tr><td><code>chmod +x filename</code></td><td>Make file executable</td><td><code>chmod +x install.sh</code></td></tr><tr><td><code>which command</code></td><td>Find command location</td><td><code>which node</code></td></tr><tr><td><code>export PATH="$PATH:/new/path"</code></td><td>Add directory to PATH</td><td><code>export PATH="$PATH:~/custom-software/bin"</code></td></tr><tr><td><code>ldd binary</code></td><td>Check binary dependencies</td><td><code>ldd ./application</code></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Configuration and System Integration</h2>



<h3 class="wp-block-heading">Managing Environment Variables</h3>



<p class="wp-block-paragraph">For permanent PATH changes, edit <code>~/.bashrc</code>:</p>



<pre class="wp-block-code"><code>nano ~/.bashrc</code></pre>



<p class="wp-block-paragraph">Add at the end:</p>



<pre class="wp-block-code"><code># Custom software installations
export PATH="$HOME/custom-software/node-v22.0.0-linux-x64/bin:$PATH"
export PATH="$HOME/custom-software/myapp/bin:$PATH"</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-8272.png" alt="Text editor showing bashrc file with PATH export commands properly formatted"/></figure>



<h3 class="wp-block-heading">Creating Symbolic Links</h3>



<p class="wp-block-paragraph">For system-wide access without PATH changes:</p>



<pre class="wp-block-code"><code>sudo ln -s ~/custom-software/myapp/bin/myapp /usr/local/bin/myapp</code></pre>



<p class="wp-block-paragraph">This creates a link in <code>/usr/local/bin</code>, which is already in PATH. Sometimes cleaner than PATH changes.</p>



<h2 class="wp-block-heading">Tips and Troubleshooting</h2>



<h3 class="wp-block-heading">Permission Denied Errors</h3>



<p class="wp-block-paragraph"><strong>Problem</strong>: <code>Permission denied</code> when running binaries</p>



<p class="wp-block-paragraph"><strong>Solution</strong>: Make files executable:</p>



<pre class="wp-block-code"><code>chmod +x filename
# Or for entire directory:
chmod +x -R directory/</code></pre>



<h3 class="wp-block-heading">Command Not Found After Installation</h3>



<p class="wp-block-paragraph"><strong>Problem</strong>: Installed software not found</p>



<p class="wp-block-paragraph"><strong>Solutions</strong>:</p>



<ul class="wp-block-list">
<li>Check PATH: <code>echo $PATH</code></li>



<li>Reload shell: <code>source ~/.bashrc</code></li>



<li>Verify location: <code>ls ~/custom-software/appname/bin/</code></li>
</ul>



<p class="wp-block-paragraph">This is the most common issue with manual installs.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/install-software-tar-gz-ubuntu-screenshot-9174.png" alt="Terminal showing PATH echo command and troubleshooting steps for command not found error"/></figure>



<h3 class="wp-block-heading">Missing Dependencies</h3>



<p class="wp-block-paragraph"><strong>Problem</strong>: &#8220;error while loading shared libraries&#8221;</p>



<p class="wp-block-paragraph"><strong>Solution</strong>: Install missing libraries:</p>



<pre class="wp-block-code"><code># Check what's missing
ldd ./application
# Install common dependencies
sudo apt install libc6-dev libssl-dev</code></pre>



<h3 class="wp-block-heading">Application Doesn&#8217;t Appear in Menu</h3>



<p class="wp-block-paragraph"><strong>Problem</strong>: Desktop integration not working</p>



<p class="wp-block-paragraph"><strong>Solutions</strong>:</p>



<ul class="wp-block-list">
<li>Check desktop file: <code>ls ~/.local/share/applications/</code></li>



<li>Fix permissions: <code>chmod 644 ~/.local/share/applications/myapp.desktop</code></li>



<li>Update database: <code>update-desktop-database ~/.local/share/applications/</code></li>
</ul>



<h3 class="wp-block-heading">Uninstalling tar.gz Software</h3>



<p class="wp-block-paragraph">No automatic uninstaller means manual cleanup:</p>



<ul class="wp-block-list">
<li>Remove directory: <code>rm -rf ~/custom-software/appname/</code></li>



<li>Remove PATH entries from <code>~/.bashrc</code></li>



<li>Remove desktop files: <code>rm ~/.local/share/applications/appname.desktop</code></li>



<li>Remove links: <code>sudo rm /usr/local/bin/appname</code></li>
</ul>



<h2 class="wp-block-heading">When to Use tar.gz vs Alternatives</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Installation Method</th><th>Best For</th><th>Pros</th><th>Cons</th></tr></thead><tbody><tr><td>tar.gz</td><td>Latest versions, specialized software</td><td>Full control, bleeding edge</td><td>Manual updates, dependency management</td></tr><tr><td>apt</td><td>System packages</td><td>Automatic updates, dependency handling</td><td>Limited to repository versions</td></tr><tr><td>Snap</td><td>Sandboxed applications</td><td>Easy installation, automatic updates</td><td>Larger size, slower startup</td></tr><tr><td><a href="https://thebackroomtech.com/how-to-install-and-run-flatpak-applications/">Flatpak</a></td><td>Portable applications</td><td>No installation required</td><td>Limited system integration</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Wrapping Up</h2>



<p class="wp-block-paragraph">Manual tar.gz installation fills gaps that package managers miss. It&#8217;s perfect for bleeding-edge tools, research software, or proprietary apps. Just track what you install manually as these won&#8217;t update or uninstall themselves.</p><p>The post <a href="https://thebackroomtech.com/install-software-tar-gz-ubuntu/">How to Install Software from tar.gz Files on Ubuntu: Complete 2026 Guide</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>PowerShell vs Bash for System Administration: The Complete Comparison Guide</title>
		<link>https://thebackroomtech.com/powershell-vs-bash-system-administration-comparison/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Sat, 28 Mar 2026 22:16:45 +0000</pubDate>
				<category><![CDATA[Script]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4826</guid>

					<description><![CDATA[<p><img width="300" height="200" src="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-featured-1-300x200.png" class="attachment-medium size-medium wp-post-image" alt="PowerShell vs Bash for System Administration: The Complete Comparison Guide" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-featured-1-300x200.png 300w, https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-featured-1-1024x683.png 1024w, https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-featured-1-768x512.png 768w, https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-featured-1-75x50.png 75w, https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-featured-1.png 1536w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>PowerShell promises object magic while Bash offers Unix wisdom. Both run everywhere now. The choice isn&#8217;t about platforms, it&#8217;s about picking the right tool for each job. PowerShell excels at [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/powershell-vs-bash-system-administration-comparison/">PowerShell vs Bash for System Administration: The Complete Comparison Guide</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">PowerShell promises object magic while Bash offers Unix wisdom. Both run everywhere now. The choice isn&#8217;t about platforms, it&#8217;s about picking the right tool for each job. PowerShell excels at data manipulation and cloud ops. Bash dominates log processing and Unix tools.</p>



<h2 class="wp-block-heading">Overview</h2>



<p class="wp-block-paragraph">The old &#8220;Windows vs Linux&#8221; shell wars feel quaint now. Both PowerShell and Bash run on Windows, macOS, and Linux. This shift forces us to evaluate shells based on capabilities rather than tribal loyalty.</p>



<h3 class="wp-block-heading">What We&#8217;re Comparing</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Tool</th><th>Description</th><th>Best For</th><th>License</th></tr></thead><tbody><tr><td><strong>PowerShell</strong></td><td>Object-oriented shell with verb-noun cmdlets</td><td>Complex data manipulation, cloud operations, Windows administration</td><td>MIT (open source)</td></tr><tr><td><strong>Bash</strong></td><td>Text-stream shell with traditional Unix commands</td><td>Log processing, simple automation, Linux administration</td><td>GPL</td></tr><tr><td><strong>Python</strong></td><td>General-purpose programming language</td><td>Complex scripting, data analysis, cross-platform consistency</td><td>PSF License</td></tr><tr><td><strong>Zsh</strong></td><td>Enhanced Bash-compatible shell</td><td>Interactive use, improved user experience</td><td>MIT-style</td></tr><tr><td><strong>Command Prompt (cmd)</strong></td><td>Windows&#8217; legacy command interpreter</td><td>Simple Windows tasks, batch files</td><td>Proprietary</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Test Environment</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Component</th><th>Details</th></tr></thead><tbody><tr><td><strong>OS Testing</strong></td><td>Windows 11, Ubuntu 24.04 LTS, macOS Sonoma</td></tr><tr><td><strong>PowerShell</strong></td><td>7.4.0 (PowerShell Core)</td></tr><tr><td><strong>Bash</strong></td><td>5.2.15 (Ubuntu), 3.2.57 (macOS)</td></tr><tr><td><strong>Hardware</strong></td><td>16 GB RAM, Intel i7-12700K, NVMe SSD</td></tr><tr><td><strong>Network</strong></td><td>Gigabit Ethernet, cloud API testing</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Feature Comparison</h2>



<h3 class="wp-block-heading">At a Glance</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Feature</th><th>PowerShell</th><th>Bash</th><th>Python</th><th>Zsh</th><th>Command Prompt</th></tr></thead><tbody><tr><td><strong>Object Handling</strong></td><td>Native</td><td>Manual parsing</td><td>Native</td><td>Manual parsing</td><td>Limited</td></tr><tr><td><strong>Cross-platform</strong></td><td>Yes</td><td>Yes</td><td>Yes</td><td>Unix-like only</td><td>Windows only</td></tr><tr><td><strong>Learning Curve</strong></td><td>Moderate</td><td>Easy</td><td>Steep</td><td>Easy</td><td>Easy</td></tr><tr><td><strong>Scripting Power</strong></td><td>High</td><td>High</td><td>Very High</td><td>High</td><td>Low</td></tr><tr><td><strong>Performance</strong></td><td>Good</td><td>Excellent</td><td>Good</td><td>Excellent</td><td>Fair</td></tr><tr><td><strong>Cloud Integration</strong></td><td>Excellent</td><td>Good</td><td>Excellent</td><td>Good</td><td>Poor</td></tr><tr><td><strong>Text Processing</strong></td><td>Good</td><td>Excellent</td><td>Excellent</td><td>Excellent</td><td>Poor</td></tr><tr><td><strong>Remote Management</strong></td><td>Native</td><td>SSH-based</td><td>Library-dependent</td><td>SSH-based</td><td>Limited</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Data Processing Philosophy</h3>



<p class="wp-block-paragraph">PowerShell and Bash handle data in completely different ways. This affects every command you write.</p>



<p class="wp-block-paragraph"><strong>PowerShell&#8217;s Object-Oriented Approach:</strong>
PowerShell treats command output as structured objects. When you run <code>Get-Process</code>, you get process objects. These have properties like <code>.Name</code>, <code>.CPU</code>, and <code>.WorkingSet</code>.</p>



<pre class="wp-block-code"><code># PowerShell: Working with objects directly
Get-Process | Where-Object {$_.CPU -gt 100} | Select-Object Name, CPU | Sort-Object CPU -Descending</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-screenshot-3636.png" alt="PowerShell console showing Get-Process output with structured object properties and filtering"/></figure>



<p class="wp-block-paragraph"><strong>Bash&#8217;s Text-Stream Philosophy:</strong>
Bash processes everything as text streams. You need parsing tools to extract structured data. The same task requires text tools like <code>awk</code>, <code>grep</code>, and <code>sort</code>.</p>



<pre class="wp-block-code"><code># Bash: Text processing with Unix tools
ps aux | awk 'NR&gt;1 &amp;&amp; $3&gt;1.0 {print $11, $3}' | sort -k2 -nr</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-screenshot-4104.png" alt="Bash terminal showing ps command output being processed through awk and sort with text manipulation"/></figure>



<p class="wp-block-paragraph"><strong>Winner: Context-dependent</strong> — PowerShell for structured data, Bash for text processing.</p>



<h3 class="wp-block-heading">Cloud Infrastructure Management</h3>



<p class="wp-block-paragraph">Cloud platforms have become the new battleground for shell supremacy. Each approach has distinct advantages.</p>



<p class="wp-block-paragraph"><strong>PowerShell Cloud Integration:</strong>
PowerShell modules provide native cmdlets for major cloud providers. You can treat cloud resources as objects and manipulate them directly.</p>



<pre class="wp-block-code"><code># Azure resource management
Connect-AzAccount
Get-AzVM | Where-Object {$_.PowerState -eq "VM deallocated"} | Start-AzVM</code></pre>



<p class="wp-block-paragraph"><strong>Bash Cloud Integration:</strong>
Bash relies on CLI tools and REST API calls. This requires more manual parsing but offers universal compatibility.</p>



<pre class="wp-block-code"><code># AWS resource management
aws ec2 describe-instances --filters "Name=instance-state-name,Values=stopped" \
  --query 'Reservations&#91;].Instances&#91;].InstanceId' --output text | \
  xargs -I {} aws ec2 start-instances --instance-ids {}</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-screenshot-5210.png" alt="Terminal showing AWS CLI commands for managing EC2 instances with JSON output"/></figure>



<p class="wp-block-paragraph"><strong>Winner: PowerShell</strong> — Native cloud modules provide cleaner syntax and better error handling. Bash offers more universal tool compatibility.</p>



<h3 class="wp-block-heading">Log Analysis and Incident Response</h3>



<p class="wp-block-paragraph">When the server&#8217;s on fire, shell choice matters. Each tool offers different strengths for this critical task.</p>



<p class="wp-block-paragraph"><strong>PowerShell Log Analysis:</strong>
PowerShell excels at Windows event logs and structured log formats. It has built-in cmdlets for filtering and correlation.</p>



<pre class="wp-block-code"><code># Windows event log analysis
Get-WinEvent -FilterHashtable @{LogName='Security'; ID=4625; StartTime=(Get-Date).AddHours(-24)} |
  Group-Object Properties&#91;5] | Sort-Object Count -Descending | Select-Object Name, Count</code></pre>



<p class="wp-block-paragraph"><strong>Bash Log Analysis:</strong>
Bash dominates text-based log processing with powerful pattern matching and filtering tools. The performance difference is substantial.</p>



<pre class="wp-block-code"><code># Apache log analysis
grep "$(date -d '1 hour ago' '+%d/%b/%Y:%H')" /var/log/apache2/access.log | \
  awk '{print $1}' | sort | uniq -c | sort -nr | head -10</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-screenshot-6369.png" alt="Bash terminal demonstrating log analysis with grep, awk, and sort showing IP address frequency counts"/></figure>



<p class="wp-block-paragraph"><strong>Winner: Bash</strong> — Superior text processing speed and Unix tool ecosystem make it faster for most log analysis tasks.</p>



<h3 class="wp-block-heading">Remote System Management</h3>



<p class="wp-block-paragraph">Both shells offer remote execution. They use different approaches and strengths.</p>



<p class="wp-block-paragraph"><strong>PowerShell Remoting:</strong>
PowerShell provides native remoting with session management and credential handling.</p>



<pre class="wp-block-code"><code># PowerShell remoting
$session = New-PSSession -ComputerName "server01" -Credential $cred
Invoke-Command -Session $session -ScriptBlock {
    Get-Service | Where-Object {$_.Status -eq 'Stopped'}
}</code></pre>



<p class="wp-block-paragraph"><strong>Bash Remote Execution:</strong>
Bash uses SSH for remote execution. This offers universal compatibility across Unix-like systems.</p>



<pre class="wp-block-code"><code># SSH-based remote execution
ssh user@server01 "systemctl list-units --failed --no-pager"</code></pre>



<p class="wp-block-paragraph"><strong>Winner: Tie</strong> — PowerShell for Windows environments. Bash for Unix-like systems.</p>



<h2 class="wp-block-heading">Performance Comparison</h2>



<h3 class="wp-block-heading">Test Methodology</h3>



<p class="wp-block-paragraph">Performance tests focused on common admin tasks. We tested processing large datasets, file operations, and network requests. Tests ran on identical hardware. We averaged 10 iterations for each measurement.</p>



<h3 class="wp-block-heading">Benchmark Results</h3>



<p class="wp-block-paragraph">The numbers tell an interesting story about trade-offs between features and performance.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Metric</th><th>PowerShell</th><th>Bash</th><th>Python</th><th>Zsh</th><th>Command Prompt</th></tr></thead><tbody><tr><td><strong>Startup Time</strong></td><td>850ms</td><td>25ms</td><td>180ms</td><td>35ms</td><td>15ms</td></tr><tr><td><strong>Large File Processing (1GB log)</strong></td><td>45s</td><td>12s</td><td>38s</td><td>12s</td><td>N/A</td></tr><tr><td><strong>Network API Calls (100 requests)</strong></td><td>8.2s</td><td>11.5s</td><td>6.8s</td><td>11.5s</td><td>N/A</td></tr><tr><td><strong>Memory Usage (idle)</strong></td><td>85MB</td><td>8MB</td><td>25MB</td><td>12MB</td><td>4MB</td></tr><tr><td><strong>Memory Usage (processing)</strong></td><td>220MB</td><td>45MB</td><td>180MB</td><td>45MB</td><td>15MB</td></tr></tbody></table></figure>



<p class="wp-block-paragraph"><strong>Key Performance Insights:</strong></p>



<ul class="wp-block-list">
<li><strong>Bash dominates text processing</strong> with 3-4x faster performance on large files</li>



<li><strong>PowerShell startup overhead</strong> makes it slower for simple one-off tasks</li>



<li><strong>PowerShell object handling</strong> uses more memory but provides richer data manipulation</li>



<li><strong>Network operations</strong> favor Python and PowerShell for complex API interactions</li>
</ul>



<h3 class="wp-block-heading">Resource Usage Analysis</h3>



<p class="wp-block-paragraph">PowerShell&#8217;s object approach comes with memory overhead. A simple <code>Get-Process</code> command creates objects consuming ~2MB per 100 processes. Bash&#8217;s <code>ps</code> output uses ~50KB for the same data.</p>



<p class="wp-block-paragraph">However, this overhead pays dividends in complex scenarios:</p>



<pre class="wp-block-code"><code># PowerShell: Complex filtering without external tools
Get-Process | Where-Object {$_.WorkingSet -gt 100MB -and $_.CPU -gt 10} |
  Group-Object ProcessName | Sort-Object Count -Descending</code></pre>



<p class="wp-block-paragraph">Equivalent Bash requires multiple tools and more mental overhead:</p>



<pre class="wp-block-code"><code># Bash: Requires multiple commands and parsing
ps aux | awk '$6&gt;102400 &amp;&amp; $3&gt;10 {print $11}' | sort | uniq -c | sort -nr</code></pre>



<h2 class="wp-block-heading">Platform-Specific Considerations</h2>



<h3 class="wp-block-heading">Windows</h3>



<p class="wp-block-paragraph"><strong>PowerShell on Windows:</strong>
This is PowerShell&#8217;s home turf. It has native integration that Bash can&#8217;t match.</p>



<ul class="wp-block-list">
<li>Native integration with Windows services, registry, and WMI</li>



<li>Built-in cmdlets for Active Directory, Exchange, and SharePoint</li>



<li>ISE and VS Code provide advanced development environments</li>
</ul>



<pre class="wp-block-code"><code># Windows-specific PowerShell capabilities
Get-WindowsFeature | Where-Object {$_.InstallState -eq 'Available'} |
  Install-WindowsFeature -WhatIf</code></pre>



<p class="wp-block-paragraph"><strong>Bash on Windows (WSL):</strong></p>



<ul class="wp-block-list">
<li>Requires <a href="https://docs.microsoft.com/en-us/windows/wsl/install" target="_blank" rel="noopener noreferrer">Windows Subsystem for Linux installation</a></li>



<li>Limited access to Windows-specific resources</li>



<li>Excellent for managing Linux containers and services</li>
</ul>



<pre class="wp-block-code"><code># WSL Bash accessing Windows filesystem
cd /mnt/c/Users/username/Documents
find . -name "*.log" -mtime -1 | head -10</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-screenshot-10126.png" alt="Windows Terminal showing both PowerShell and WSL Bash sessions side by side"/></figure>



<h3 class="wp-block-heading">macOS</h3>



<p class="wp-block-paragraph"><strong>PowerShell on macOS:</strong></p>



<ul class="wp-block-list">
<li>Requires separate installation via Homebrew or GitHub releases</li>



<li>Cross-platform cmdlets work identically to Windows</li>



<li>Limited macOS-specific functionality</li>
</ul>



<pre class="wp-block-code"><code># Install PowerShell on macOS
brew install --cask powershell
pwsh  # Launch PowerShell</code></pre>



<p class="wp-block-paragraph"><strong>Bash on macOS:</strong></p>



<ul class="wp-block-list">
<li>Native terminal support (though Zsh is now default)</li>



<li>Full Unix toolchain available</li>



<li>Excellent integration with macOS development tools</li>
</ul>



<h3 class="wp-block-heading">Linux</h3>



<p class="wp-block-paragraph"><strong>PowerShell Core on Linux:</strong>
<a href="https://thebackroomtech.com/2019/03/13/how-to-run-linux-on-windows-10/">Running PowerShell on Linux</a> feels surprisingly natural. Some Windows-specific cmdlets remain unavailable.</p>



<ul class="wp-block-list">
<li>Native package installation on major distributions</li>



<li>Excellent for hybrid Windows/Linux environments</li>



<li>Some Windows-specific cmdlets unavailable</li>
</ul>



<pre class="wp-block-code"><code># Install PowerShell on Ubuntu
wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb"
sudo dpkg -i packages-microsoft-prod.deb
sudo apt update &amp;&amp; sudo apt install -y powershell</code></pre>



<figure class="wp-block-image size-large"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/powershell-vs-bash-system-administration-comparison-screenshot-11256.png" alt="PowerShell Core running on Ubuntu Linux showing cross-platform cmdlets"/></figure>



<p class="wp-block-paragraph"><strong>Bash on Linux:</strong></p>



<ul class="wp-block-list">
<li>Native shell with full feature set</li>



<li>Complete Unix toolchain integration</li>



<li>Optimal performance and compatibility</li>
</ul>



<h2 class="wp-block-heading">Use Case Recommendations</h2>



<h3 class="wp-block-heading">Choose PowerShell if:</h3>



<ul class="wp-block-list">
<li><strong>Managing Windows-heavy environments</strong> with Active Directory, Exchange, or SharePoint</li>



<li><strong>Working with cloud APIs</strong> extensively (Azure, Office 365, AWS with modules)</li>



<li><strong>Processing structured data</strong> like JSON, XML, or CSV files regularly</li>



<li><strong>Building complex automation</strong> requiring error handling and object manipulation</li>



<li><strong>Generating formatted reports</strong> with consistent structure and styling</li>



<li><strong>Managing hybrid environments</strong> where Windows and Linux systems need unified tooling</li>
</ul>



<h3 class="wp-block-heading">Choose Bash if:</h3>



<ul class="wp-block-list">
<li><strong>Working primarily with Linux/Unix systems</strong> and traditional Unix tools</li>



<li><strong>Processing large text files</strong> and log analysis is a primary task</li>



<li><strong>Building simple automation scripts</strong> that chain existing command-line tools</li>



<li><strong>Working in resource-constrained environments</strong> where startup time and memory usage matter</li>



<li><strong>Integrating with existing shell scripts</strong> and Unix-based workflows</li>



<li><strong>Needing maximum compatibility</strong> across different Unix-like systems</li>
</ul>



<h3 class="wp-block-heading">Choose Python if:</h3>



<ul class="wp-block-list">
<li><strong>Building complex data analysis workflows</strong> requiring statistical processing</li>



<li><strong>Creating cross-platform applications</strong> with consistent behavior</li>



<li><strong>Integrating with web APIs</strong> and modern development frameworks</li>



<li><strong>Working with machine learning</strong> or data science tasks</li>



<li><strong>Building GUI applications</strong> alongside command-line tools</li>
</ul>



<h3 class="wp-block-heading">Choose Zsh if:</h3>



<ul class="wp-block-list">
<li><strong>Prioritizing interactive shell experience</strong> with better tab completion and themes</li>



<li><strong>Working primarily on macOS or Linux</strong> desktop systems</li>



<li><strong>Wanting Bash compatibility</strong> with enhanced user experience features</li>



<li><strong>Building personal productivity workflows</strong> with advanced shell customization</li>
</ul>



<h3 class="wp-block-heading">Choose Command Prompt if:</h3>



<ul class="wp-block-list">
<li><strong>Working exclusively with legacy Windows systems</strong> and batch files</li>



<li><strong>Needing minimal resource usage</strong> for simple Windows tasks</li>



<li><strong>Maintaining existing batch file workflows</strong> that don&#8217;t require PowerShell features</li>



<li><strong>Working in highly restricted environments</strong> where PowerShell is disabled</li>
</ul>



<h2 class="wp-block-heading">Learning Curve and Skill Transfer</h2>



<h3 class="wp-block-heading">For Windows Admins Learning Bash</h3>



<p class="wp-block-paragraph">The transition requires rewiring how you think about data processing.</p>



<p class="wp-block-paragraph"><strong>Key Conceptual Shifts:</strong></p>



<ul class="wp-block-list">
<li>Everything is text: learn to think in terms of text streams and parsing</li>



<li>Embrace the pipe: chain simple tools together instead of using one complex command</li>



<li>Case sensitivity: Linux commands and file names are case-sensitive</li>



<li>File permissions: understand Unix permission model vs Windows ACLs</li>
</ul>



<p class="wp-block-paragraph"><strong>Essential Bash Commands for Windows Administrators:</strong></p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Windows Task</th><th>PowerShell</th><th>Bash Equivalent</th></tr></thead><tbody><tr><td>List processes</td><td><code>Get-Process</code></td><td><code>ps aux</code></td></tr><tr><td>Find files</td><td><code>Get-ChildItem -Recurse -Filter "*.txt"</code></td><td><code>find . -name "*.txt"</code></td></tr><tr><td>Service management</td><td><code>Get-Service</code></td><td><code>systemctl status</code></td></tr><tr><td>Network connections</td><td><code>Get-NetTCPConnection</code></td><td><code>netstat -tuln</code></td></tr><tr><td>Disk usage</td><td><code>Get-WmiObject -Class Win32_LogicalDisk</code></td><td><code>df -h</code></td></tr></tbody></table></figure>



<h3 class="wp-block-heading">For Linux Admins Learning PowerShell</h3>



<p class="wp-block-paragraph"><strong>Key Conceptual Shifts:</strong></p>



<ul class="wp-block-list">
<li>Think in objects: command output has properties and methods</li>



<li>Verb-noun syntax: PowerShell cmdlets follow consistent naming patterns</li>



<li>Pipeline objects: pass entire objects between commands, not just text</li>



<li>Help system: use <code>Get-Help</code> extensively for discovery</li>
</ul>



<p class="wp-block-paragraph"><strong>PowerShell Cmdlet Discovery:</strong></p>



<pre class="wp-block-code"><code># Discover available cmdlets
Get-Command -Verb Get | Where-Object {$_.Name -like "*Process*"}

# Get detailed help with examples
Get-Help Get-Process -Examples

# Find cmdlets by functionality
Get-Command *service*</code></pre>



<h2 class="wp-block-heading">Security Implications</h2>



<h3 class="wp-block-heading">PowerShell Security Features</h3>



<p class="wp-block-paragraph">Security matters more now that <a href="https://docs.microsoft.com/en-us/powershell/scripting/overview" target="_blank" rel="noopener noreferrer">PowerShell runs everywhere</a> and has such powerful capabilities.</p>



<p class="wp-block-paragraph"><strong>Execution Policy:</strong>
PowerShell includes execution policies to prevent unauthorized script execution:</p>



<pre class="wp-block-code"><code># Check current execution policy
Get-ExecutionPolicy

# Set execution policy for current user
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser</code></pre>



<p class="wp-block-paragraph"><strong>Script Signing and Constrained Language Mode:</strong></p>



<ul class="wp-block-list">
<li>Code signing prevents tampering with production scripts</li>



<li>Constrained Language Mode limits PowerShell functionality in restricted environments</li>



<li>Comprehensive logging tracks all PowerShell activity</li>
</ul>



<p class="wp-block-paragraph"><strong>PowerShell Security Best Practices:</strong></p>



<ul class="wp-block-list">
<li>Use signed scripts in production environments</li>



<li>Enable PowerShell logging for security monitoring</li>



<li>Implement Just Enough Administration (JEA) for role-based access</li>



<li>Regularly audit PowerShell execution policies</li>
</ul>



<h3 class="wp-block-heading">Bash Security Considerations</h3>



<p class="wp-block-paragraph"><strong>Script Permissions and Execution:</strong></p>



<ul class="wp-block-list">
<li>Use proper file permissions (755 for executable scripts)</li>



<li>Validate input parameters to prevent injection attacks</li>



<li>Use absolute paths to prevent PATH manipulation attacks</li>
</ul>



<pre class="wp-block-code"><code>#!/bin/bash
# Secure Bash script practices
set -euo pipefail  # Exit on error, undefined vars, pipe failures

# Input validation
if &#91;&#91; ! "$1" =~ ^&#91;a-zA-Z0-9_-]+$ ]]; then
    echo "Invalid input" &gt;&amp;2
    exit 1
fi</code></pre>



<p class="wp-block-paragraph"><strong>Bash Security Best Practices:</strong></p>



<ul class="wp-block-list">
<li>Use <code>set -euo pipefail</code> for error handling</li>



<li>Quote variables to prevent word splitting</li>



<li>Validate all user input before processing</li>



<li>Use <code>sudo</code> with specific commands rather than root shells</li>



<li>Implement proper logging and audit trails</li>
</ul>



<h2 class="wp-block-heading">Migration Between Shells</h2>



<h3 class="wp-block-heading">PowerShell to Bash Translation Patterns</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>PowerShell Concept</th><th>Bash Equivalent</th><th>Notes</th></tr></thead><tbody><tr><td><code>Where-Object</code></td><td><code>grep</code> or <code>awk</code></td><td>Filtering requires text pattern matching</td></tr><tr><td><code>Select-Object</code></td><td><code>cut</code> or <code>awk</code></td><td>Column selection needs field delimiters</td></tr><tr><td><code>Sort-Object</code></td><td><code>sort</code></td><td>Bash sort is text-based, not type-aware</td></tr><tr><td><code>Group-Object</code></td><td><code>sort &amp;#124; uniq -c</code></td><td>Grouping requires pre-sorting in Bash</td></tr><tr><td><code>ForEach-Object</code></td><td><code>while read</code> or <code>xargs</code></td><td>Iteration patterns differ significantly</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Bash to PowerShell Translation Patterns</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Bash Concept</th><th>PowerShell Equivalent</th><th>Notes</th></tr></thead><tbody><tr><td><code>grep pattern file</code></td><td><code>Select-String -Pattern "pattern" -Path file</code></td><td>PowerShell provides object output</td></tr><tr><td><code>awk '{print $1}'</code></td><td><code>(Get-Content file) &amp;#124; ForEach-Object {$_.Split()[0]}</code></td><td>Field splitting requires explicit handling</td></tr><tr><td><code>find . -name "*.txt"</code></td><td><code>Get-ChildItem -Recurse -Filter "*.txt"</code></td><td>PowerShell returns file objects</td></tr><tr><td><code>ps aux &amp;#124; head -10</code></td><td><code>Get-Process &amp;#124; Select-Object -First 10</code></td><td>Object-based selection vs text lines</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Pros and Cons Summary</h2>



<div class="wp-block-group akic-pros-cons akic-pros-cons--comparison"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 class="wp-block-heading">PowerShell</h3>



<p class="wp-block-paragraph"><strong>Pros:</strong></p>



<ul class="wp-block-list">
<li>Object-oriented approach simplifies complex data manipulation</li>



<li>Excellent cloud platform integration with native modules</li>



<li>Consistent verb-noun cmdlet syntax improves discoverability</li>



<li>Rich help system with examples and detailed documentation</li>



<li>Strong error handling and debugging capabilities</li>



<li>Cross-platform compatibility with PowerShell Core</li>



<li>Built-in support for structured data formats (JSON, XML, CSV)</li>
</ul>



<p class="wp-block-paragraph"><strong>Cons:</strong></p>



<ul class="wp-block-list">
<li>Higher memory usage and slower startup times</li>



<li>Steeper learning curve for traditional Unix administrators</li>



<li>Some Windows-specific cmdlets unavailable on other platforms</li>



<li>Less efficient for simple text processing tasks</li>



<li>Requires separate installation on non-Windows systems</li>



<li>Limited ecosystem compared to traditional Unix tools</li>
</ul>



<h3 class="wp-block-heading">Bash</h3>



<p class="wp-block-paragraph"><strong>Pros:</strong></p>



<ul class="wp-block-list">
<li>Extremely fast startup and execution for simple tasks</li>



<li>Minimal resource usage ideal for resource-constrained environments</li>



<li>Excellent text processing capabilities with mature Unix tools</li>



<li>Universal availability on Unix-like systems</li>



<li>Decades of community knowledge and existing scripts</li>



<li>Simple syntax for basic automation tasks</li>



<li>Native SSH integration for remote management</li>
</ul>



<p class="wp-block-paragraph"><strong>Cons:</strong></p>



<ul class="wp-block-list">
<li>Text-only output requires manual parsing for structured data</li>



<li>Inconsistent command syntax across different Unix tools</li>



<li>Limited error handling compared to modern shells</li>



<li>Platform-specific variations can cause compatibility issues</li>



<li>Steep learning curve for complex text processing</li>



<li>No native object-oriented programming capabilities</li>
</ul>



<h3 class="wp-block-heading">Python</h3>



<p class="wp-block-paragraph"><strong>Pros:</strong></p>



<ul class="wp-block-list">
<li>Extremely powerful for complex data analysis and processing</li>



<li>Massive ecosystem of libraries for virtually any task</li>



<li>Consistent cross-platform behavior</li>



<li>Excellent for web API integration and modern development</li>



<li>Strong community support and documentation</li>
</ul>



<p class="wp-block-paragraph"><strong>Cons:</strong></p>



<ul class="wp-block-list">
<li>Requires more setup and learning for simple administrative tasks</li>



<li>Slower startup time compared to shell scripts</li>



<li>Not optimized for quick one-liner commands</li>



<li>Requires understanding of programming concepts</li>
</ul>



<h3 class="wp-block-heading">Zsh</h3>



<p class="wp-block-paragraph"><strong>Pros:</strong></p>



<ul class="wp-block-list">
<li>Enhanced user experience with better tab completion</li>



<li>Backward compatibility with Bash scripts</li>



<li>Extensive customization options and themes</li>



<li>Improved interactive features and history management</li>
</ul>



<p class="wp-block-paragraph"><strong>Cons:</strong></p>



<ul class="wp-block-list">
<li>Not universally available like Bash</li>



<li>Additional complexity for simple scripting tasks</li>



<li>Learning curve for advanced features</li>



<li>Not significantly different from Bash for administrative scripting</li>
</ul>



<h3 class="wp-block-heading">Command Prompt</h3>



<p class="wp-block-paragraph"><strong>Pros:</strong></p>



<ul class="wp-block-list">
<li>Extremely lightweight and fast startup</li>



<li>Universal availability on Windows systems</li>



<li>Simple syntax for basic Windows tasks</li>



<li>Compatible with legacy batch files</li>
</ul>



<p class="wp-block-paragraph"><strong>Cons:</strong></p>



<ul class="wp-block-list">
<li>Very limited scripting capabilities</li>



<li>Windows-only availability</li>



<li>Poor error handling and debugging</li>



<li>Minimal text processing capabilities</li>



<li>No modern programming constructs</li>
</ul>
</div></div>



<h2 class="wp-block-heading">Final Verdict</h2>



<p class="wp-block-paragraph">The answer is refreshingly practical: stop trying to pick a winner. PowerShell excels in Windows-heavy environments and complex data scenarios. Bash dominates Linux administration and text processing workflows.</p>



<h3 class="wp-block-heading">Overall Winner: Situational Choice</h3>



<p class="wp-block-paragraph">Rather than declaring an overall winner, here&#8217;s the practical decision matrix:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Scenario</th><th>Recommended Shell</th><th>Why</th></tr></thead><tbody><tr><td><strong>Cloud migration projects</strong></td><td>PowerShell</td><td>Native cloud modules and structured data handling</td></tr><tr><td><strong>Log analysis and troubleshooting</strong></td><td>Bash</td><td>Superior text processing speed and Unix tools</td></tr><tr><td><strong>Windows domain administration</strong></td><td>PowerShell</td><td>Native Active Directory and Windows service integration</td></tr><tr><td><strong>Linux server management</strong></td><td>Bash</td><td>Native toolchain and optimal performance</td></tr><tr><td><strong>Compliance reporting</strong></td><td>PowerShell</td><td>Structured data export and formatting capabilities</td></tr><tr><td><strong>Simple automation scripts</strong></td><td>Bash</td><td>Faster development and execution for basic tasks</td></tr><tr><td><strong>Hybrid environment management</strong></td><td>Both</td><td>Use each shell&#8217;s strengths for appropriate tasks</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Score Summary</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Category</th><th>PowerShell</th><th>Bash</th><th>Python</th><th>Zsh</th><th>Command Prompt</th></tr></thead><tbody><tr><td>Features</td><td><strong>9/10</strong></td><td>7/10</td><td>9/10</td><td>7/10</td><td>3/10</td></tr><tr><td>Performance</td><td>6/10</td><td><strong>9/10</strong></td><td>7/10</td><td>9/10</td><td>8/10</td></tr><tr><td>Ease of Use</td><td>7/10</td><td><strong>8/10</strong></td><td>5/10</td><td>8/10</td><td>9/10</td></tr><tr><td>Cross-platform</td><td><strong>8/10</strong></td><td>8/10</td><td>9/10</td><td>6/10</td><td>2/10</td></tr><tr><td>Ecosystem</td><td>8/10</td><td><strong>9/10</strong></td><td>10/10</td><td>8/10</td><td>4/10</td></tr><tr><td><strong>Overall</strong></td><td><strong>7.6/10</strong></td><td><strong>8.2/10</strong></td><td><strong>8.0/10</strong></td><td><strong>7.6/10</strong></td><td><strong>5.2/10</strong></td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Frequently Asked Questions</h2>



<h3 class="wp-block-heading">Should I learn PowerShell if I&#8217;m primarily a Linux administrator?</h3>



<p class="wp-block-paragraph">Yes, if you work in hybrid environments or plan to manage cloud infrastructure. PowerShell&#8217;s object approach and cloud integration complement traditional Bash skills. Start with PowerShell Core on Linux to maintain your familiar environment while learning new capabilities.</p>



<h3 class="wp-block-heading">Can PowerShell completely replace Bash for Linux administration?</h3>



<p class="wp-block-paragraph">Not entirely. PowerShell Core provides many cross-platform cmdlets. But it lacks the deep Unix tool integration that makes Bash powerful for text processing and system administration. PowerShell works best alongside Bash, not as a complete replacement.</p>



<h3 class="wp-block-heading">Which shell is better for automation and scripting?</h3>



<p class="wp-block-paragraph">It depends on complexity. Bash excels for simple automation that chains existing tools together. PowerShell is superior for complex automation. This includes error handling, structured data manipulation, and API interactions. Python becomes the better choice for very complex automation requiring extensive logic and data processing.</p>



<h3 class="wp-block-heading">How do I transition my existing Bash scripts to PowerShell?</h3>



<p class="wp-block-paragraph">Start by identifying the core functionality of each script. Simple text processing scripts often benefit from staying in Bash. Scripts that work with structured data, APIs, or Windows resources are good candidates for PowerShell conversion. Consider a hybrid approach. Keep existing Bash scripts but write new automation in PowerShell.</p>



<h3 class="wp-block-heading">Is it worth learning both PowerShell and Bash?</h3>



<p class="wp-block-paragraph">Absolutely. Modern system administration increasingly requires working across multiple platforms and environments. PowerShell and Bash complement each other. PowerShell for structured data and cloud operations, Bash for text processing and Linux systems. The investment in learning both shells pays dividends in career flexibility and problem-solving capability.</p>



<h2 class="wp-block-heading">Wrapping Up</h2>



<p class="wp-block-paragraph">The most effective approach is building competency in both shells and switching between them based on task requirements. PowerShell for structured data and cloud integration. Bash for text processing and Unix tool chaining.</p><p>The post <a href="https://thebackroomtech.com/powershell-vs-bash-system-administration-comparison/">PowerShell vs Bash for System Administration: The Complete Comparison Guide</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Getting Started with GLM-5: The New Contender in AI Code Generation</title>
		<link>https://thebackroomtech.com/getting-started-glm-5-code-generation-ai/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Fri, 13 Feb 2026 19:25:25 +0000</pubDate>
				<category><![CDATA[GLM 5]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4670</guid>

					<description><![CDATA[<p><img width="300" height="158" src="https://thebackroomtech.com/wp-content/uploads/featured-image-23-300x158.png" class="attachment-medium size-medium wp-post-image" alt="Getting Started with GLM-5: The New Contender in Code Generation AI" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/featured-image-23-300x158.png 300w, https://thebackroomtech.com/wp-content/uploads/featured-image-23-1024x538.png 1024w, https://thebackroomtech.com/wp-content/uploads/featured-image-23-768x403.png 768w, https://thebackroomtech.com/wp-content/uploads/featured-image-23-80x42.png 80w, https://thebackroomtech.com/wp-content/uploads/featured-image-23.png 1200w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>Codex 5.3 and Claude Opus 4.6 are the big names right now. Most days, it feels like a trade-off between quality, speed, and cost. That’s why I’m testing GLM-5. It [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/getting-started-glm-5-code-generation-ai/">Getting Started with GLM-5: The New Contender in AI Code Generation</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Codex 5.3 and Claude Opus 4.6 are the big names right now. Most days, it feels like a trade-off between quality, speed, and cost. That’s why I’m testing <strong>GLM-5</strong>. It isn’t “new,” but it may be a strong value. If it performs well for less money, it’s worth a real look.</p>



<p class="wp-block-paragraph">I’m not judging it on autocomplete alone. I want to see how it handles <strong>agent-style work</strong>. Can it plan a change, edit several files, and stay consistent? Can it refactor code, write tests, and follow steps without getting lost? If it can do that reliably <em>and</em> keep costs down, it can earn a spot in my stack.</p>



<h2 class="wp-block-heading">What is GLM-5?</h2>



<p class="wp-block-paragraph">GLM-5 is Zhipu AI&#8217;s latest language model specifically designed for code generation and agentic engineering. Unlike general-purpose AI assistants that happen to code, GLM-5 focuses on building autonomous systems that can handle complex programming workflows independently.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1771007522260-web-01-browser-glm-5-docs-homepage.png" alt="platform=web; view=browser; description=GLM-5 official documentation homepage showing model overview"/></figure>



<p class="wp-block-paragraph">The positioning is interesting as they&#8217;re not trying to be everything to everyone. Instead of competing directly with Copilot on autocomplete, they&#8217;re carving out the autonomous agent space. The model is designed for creating AI agents that don&#8217;t just suggest code, but actively plan projects, execute multi-step development tasks, and make architectural decisions.</p>



<p class="wp-block-paragraph"><strong>Key Features:</strong></p>



<ul class="wp-block-list">
<li><strong>Autonomous Code Planning</strong>: Breaks down complex coding tasks into manageable sub-problems</li>



<li><strong>Multi-Language Support</strong>: Handles Python, JavaScript, Java, C++, and other major languages</li>



<li><strong>Agent Architecture</strong>: Built specifically for creating persistent coding agents</li>



<li><strong>Context Management</strong>: Maintains project-wide understanding across multiple files and sessions</li>



<li><strong>API-First Design</strong>: Designed for integration into existing development workflows</li>
</ul>



<h2 class="wp-block-heading">Who Should Use GLM-5?</h2>



<p class="wp-block-paragraph">GLM-5 targets developers looking to move beyond traditional AI coding assistance toward genuine automation. After testing the initial access, I can see where this fits.</p>



<p class="wp-block-paragraph"><strong>Software Engineers</strong> working on repetitive tasks like API development, test generation, or code refactoring will find GLM-5&#8217;s autonomous capabilities particularly valuable for reducing manual overhead. The model seems to excel when you can hand it a clear objective and step back.</p>



<p class="wp-block-paragraph"><strong>DevOps Teams</strong> can leverage GLM-5 to build agents that monitor codebases, suggest optimizations, and even implement routine maintenance tasks without constant supervision.</p>



<p class="wp-block-paragraph"><strong>AI Researchers</strong> experimenting with autonomous development workflows will appreciate GLM-5&#8217;s focus on agentic behavior rather than simple text completion. This is clearly where Zhipu AI spent their design effort.</p>



<p class="wp-block-paragraph"><strong>Startup Teams</strong> with limited engineering resources might use GLM-5 to automate portions of their development pipeline, effectively scaling their coding capacity.</p>



<h3 class="wp-block-heading">It may not be the best fit if:</h3>



<ul class="wp-block-list">
<li>You&#8217;re looking for simple IDE integration like GitHub Copilot</li>



<li>Your primary need is general-purpose AI assistance beyond coding</li>



<li>You work primarily with legacy systems that require extensive domain knowledge</li>



<li>You prefer established, battle-tested tools over newer alternatives</li>
</ul>



<h2 class="wp-block-heading">How GLM-5 Works</h2>



<p class="wp-block-paragraph">GLM-5 operates on a fundamentally different architecture than traditional code completion models. Instead of predicting the next token based on immediate context, it maintains a persistent understanding of project structure, goals, and constraints. This becomes apparent pretty quickly when you start using it.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1771007523576-web-02-browser-glm-5-agent-workflow-diagram.png" alt="platform=web; view=browser; description=Architecture diagram showing GLM-5's agent-based workflow"/></figure>



<h3 class="wp-block-heading">Technical Foundation</h3>



<p class="wp-block-paragraph">The model uses a multi-stage reasoning process:</p>



<ol class="wp-block-list">
<li><strong>Task Analysis</strong>: Breaks down high-level requests into specific, actionable steps</li>



<li><strong>Context Gathering</strong>: Analyzes existing codebase, dependencies, and project structure</li>



<li><strong>Solution Planning</strong>: Creates a detailed implementation plan with fallback strategies</li>



<li><strong>Execution Monitoring</strong>: Tracks progress and adjusts approach based on intermediate results</li>



<li><strong>Quality Validation</strong>: Tests generated code and suggests improvements</li>
</ol>



<p class="wp-block-paragraph">This approach enables GLM-5 to handle requests like &#8220;refactor this module for better performance&#8221; or &#8220;add comprehensive test coverage&#8221; as complete workflows rather than individual code snippets. When it works, it feels less like using a tool and more like delegating to a junior developer who actually follows through.</p>



<h2 class="wp-block-heading">Key Features</h2>



<h3 class="wp-block-heading">Autonomous Task Planning</h3>



<p class="wp-block-paragraph">GLM-5&#8217;s standout feature is its ability to decompose complex coding requests into executable plans. When you ask it to &#8220;implement user authentication,&#8221; it doesn&#8217;t just generate a login function, it plans the entire authentication system, including database schemas, middleware, error handling, and security considerations.</p>



<p class="wp-block-paragraph">The first time I watched it break down a complex request, I was genuinely surprised by how thorough the planning phase was. It actually thinks through dependencies and edge cases before writing any code.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1771007517806-linux-01-terminal-glm5-auth-task-breakdown.png" alt="platform=terminal; view=terminal; description=GLM-5 showing task breakdown for authentication system implementation"/></figure>



<h3 class="wp-block-heading">Multi-File Context Awareness</h3>



<p class="wp-block-paragraph">Unlike models that work on individual files, GLM-5 maintains awareness across your entire project. It understands how changes in one module affect others, suggests appropriate import statements, and ensures consistency in naming conventions and architectural patterns.</p>



<p class="wp-block-paragraph">This is where you really notice the difference from standard autocomplete tools. It&#8217;s keeping track of your project structure and making decisions based on the broader context, not just what&#8217;s in the current file.</p>



<h3 class="wp-block-heading">Iterative Code Improvement</h3>



<p class="wp-block-paragraph">The model doesn&#8217;t just generate code and move on. It can iterate on its own output. If initial code doesn&#8217;t meet performance requirements or fails tests, GLM-5 analyzes the issues and refines its approach automatically.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1771007518460-linux-02-terminal-glm-5-code-iteration-feedback.png" alt="platform=terminal; view=terminal; description=GLM-5 iterating on code after receiving test feedback"/></figure>



<h3 class="wp-block-heading">Language-Agnostic Architecture Understanding</h3>



<p class="wp-block-paragraph">GLM-5 grasps architectural patterns that transcend specific programming languages. It can suggest microservices patterns in Python, implement them in Node.js, and create corresponding infrastructure configurations, all while maintaining consistent design principles.</p>



<h3 class="wp-block-heading">Real-Time Collaboration</h3>



<p class="wp-block-paragraph">The model can work alongside human developers, taking on specific subtasks while maintaining awareness of human-written code. This collaborative approach prevents the common AI issue of generating code that conflicts with existing implementations.</p>



<h3 class="wp-block-heading">Production-Ready Code Generation</h3>



<p class="wp-block-paragraph">GLM-5 emphasizes generating code that&#8217;s ready for production environments, including proper error handling, logging, documentation, and security considerations. This addresses one of my biggest frustrations with other AI coding tools &#8211; the amount of cleanup required before anything can ship.</p>



<h2 class="wp-block-heading">Getting Started</h2>



<p class="wp-block-paragraph">The setup process was smoother than expected for a relatively new model. Here&#8217;s the path I took:</p>



<h3 class="wp-block-heading">Windows Setup</h3>



<ol class="wp-block-list">
<li><strong>Install Python 3.10+</strong> from the Microsoft Store or python.org</li>



<li><strong>Open PowerShell</strong> as Administrator</li>



<li><strong>Install the GLM-5 SDK</strong>: <code>pip install glm5-sdk</code></li>



<li><strong>Set up your API credentials</strong> in your environment variables</li>



<li><strong>Verify installation</strong> by running the GLM-5 health check command</li>
</ol>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1771007521088-windows-01-os-powershell-glm5-installation-success.png" alt="platform=windows; view=os; description=PowerShell showing successful GLM-5 installation on Windows"/></figure>



<p class="wp-block-paragraph">The installation was straightforward, though you&#8217;ll need API access from Zhipu AI first. That part took a few days for approval.</p>



<h3 class="wp-block-heading">macOS Setup</h3>



<ol class="wp-block-list">
<li><strong>Install Python</strong> using Homebrew: <code>brew install python@3.10</code></li>



<li><strong>Open Terminal</strong></li>



<li><strong>Install the GLM-5 SDK</strong>: <code>pip3 install glm5-sdk</code></li>



<li><strong>Configure API access</strong> through the GLM-5 configuration wizard</li>



<li><strong>Test your setup</strong> with a simple code generation request</li>
</ol>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1771007520140-macos-01-os-glm5-setup-complete-macos.png" alt="platform=macos; view=os; description=Terminal showing GLM-5 setup completion on macOS"/></figure>



<h3 class="wp-block-heading">Linux Setup</h3>



<ol class="wp-block-list">
<li><strong>Update package manager</strong>: <code>sudo apt update</code> (Ubuntu/Debian) or equivalent</li>



<li><strong>Install Python 3.10+</strong>: <code>sudo apt install python3.10 python3-pip</code></li>



<li><strong>Install GLM-5 SDK</strong>: <code>pip3 install glm5-sdk</code></li>



<li><strong>Initialize configuration</strong>: Run <code>glm5 init</code> to set up your workspace</li>



<li><strong>Verify connectivity</strong> with <code>glm5 status</code></li>
</ol>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1771007518973-linux-03-os-glm-5-terminal-status-check.png" alt="platform=linux; view=os; description=Linux terminal showing GLM-5 status check with successful connection"/></figure>



<p class="wp-block-paragraph">For detailed API documentation and advanced configuration options, the official GLM-5 documentation provides comprehensive guides for each platform.</p>



<h2 class="wp-block-heading">Pricing and Availability</h2>



<p class="wp-block-paragraph">Pricing looks like it&#8217;s been finalized as this is quite new. Z.ai lists the <strong><a href="https://z.ai/subscribe">GLM Coding Plan</a></strong> tiers (Lite, Pro, Max) on the subscribe page, including what looks like an intro discount and the normal renewal rate. The entry tier works out to about <strong>$9/month</strong> (often billed quarterly, <strong>$7/month</strong> for annual), with higher tiers priced for heavier use, and the docs line that up with clear usage limits.</p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><a href="https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-scaled.png"><img decoding="async" width="1024" height="636" src="https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-1024x636.png" alt="" class="wp-image-4685" srcset="https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-1024x636.png 1024w, https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-300x186.png 300w, https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-768x477.png 768w, https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-1536x953.png 1536w, https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-2048x1271.png 2048w, https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-80x50.png 80w, https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-70x43.png 70w, https://thebackroomtech.com/wp-content/uploads/glm-5-pricing-320x200.png 320w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div>


<p class="wp-block-paragraph">These numbers will probably change. Z.ai’s own docs note that <strong>pricing and quotas changed around Feb 12</strong>, and that existing subscribers keep their earlier price/limits for the rest of their current cycle (and for auto-renew terms set before that date). So before you commit to production use, make sure to check this page and possibly lock in a good price now.</p>



<h2 class="wp-block-heading">Alternatives to Consider</h2>



<p class="wp-block-paragraph">If GLM-5&#8217;s current availability limitations don&#8217;t work for your timeline, these established alternatives offer similar capabilities:</p>



<ul class="wp-block-list">
<li><strong><a href="https://github.com/features/copilot">GitHub Copilot</a></strong>: More mature IDE integration and broader language support, though less focused on autonomous agent development</li>



<li><strong><a href="https://chatgpt.com/codex">Open AI Codex</a></strong>: Strong general coding abilities with the advantage of immediate availability, but requires more manual orchestration for complex workflows</li>



<li><strong><a href="https://claude.ai">Claude</a></strong>: Excellent at understanding large codebases and architectural decisions, though not specifically designed for agentic engineering</li>
</ul>



<h2 class="wp-block-heading">The Bottom Line</h2>



<p class="wp-block-paragraph">After spending time with GLM-5, I can see what Zhipu AI is building toward. The autonomous agent approach feels like a genuine step forward from traditional AI coding assistance. When it works well, particularly for repetitive development tasks or complex refactoring projects. it&#8217;s competitive with Codex and especially Claude (which is the most expensive).</p>



<p class="wp-block-paragraph">The model&#8217;s emphasis on autonomous task planning and multi-file awareness delivers on its core promise. I found myself delegating entire subsystems rather than just getting help with individual functions. That&#8217;s a meaningful difference for certain types of development work.</p>



<p class="wp-block-paragraph"><strong>Pros:</strong></p>



<ul class="wp-block-list">
<li>Purpose-built for autonomous coding workflows that actually work</li>



<li>Strong multi-file context awareness</li>



<li>Focus on production-ready code generation</li>



<li>Innovative approach to task planning and execution</li>
</ul>



<p class="wp-block-paragraph"><strong>Cons:</strong></p>



<ul class="wp-block-list">
<li>Limited availability and pricing recently announced</li>



<li>Newer player without extensive real-world testing</li>



<li>May require significant integration work</li>



<li>Documentation and community support still developing</li>
</ul>



<p class="wp-block-paragraph">GLM-5 earns a place in the toolkit for teams specifically interested in autonomous coding agents. It&#8217;s not ready to replace your primary AI coding assistant, but for specialized workflows, especially around automation and agent development, it offers capabilities that current tools don&#8217;t match. Worth watching as it moves toward broader availability.</p><p>The post <a href="https://thebackroomtech.com/getting-started-glm-5-code-generation-ai/">Getting Started with GLM-5: The New Contender in AI Code Generation</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Windows Server 2025 as an AI Host: Docker, GPU Passthrough, and Operational Baselines</title>
		<link>https://thebackroomtech.com/windows-server-2025-ai-host-docker-gpu-passthrough/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Thu, 12 Feb 2026 21:18:28 +0000</pubDate>
				<category><![CDATA[Windows]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4616</guid>

					<description><![CDATA[<p><img width="300" height="158" src="https://thebackroomtech.com/wp-content/uploads/featured-image-22-300x158.png" class="attachment-medium size-medium wp-post-image" alt="Windows Server 2025 as an AI Host: Docker, GPU Passthrough, and Operational Baselines" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/featured-image-22-300x158.png 300w, https://thebackroomtech.com/wp-content/uploads/featured-image-22-1024x538.png 1024w, https://thebackroomtech.com/wp-content/uploads/featured-image-22-768x403.png 768w, https://thebackroomtech.com/wp-content/uploads/featured-image-22-80x42.png 80w, https://thebackroomtech.com/wp-content/uploads/featured-image-22.png 1200w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>As CTO of my own company, I recently attended a conference that was hyping GPU-powered AI and was annoyed by how far behind Windows is in most of these conversations. [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/windows-server-2025-ai-host-docker-gpu-passthrough/">Windows Server 2025 as an AI Host: Docker, GPU Passthrough, and Operational Baselines</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">As CTO of my own company, I recently attended a conference that was hyping GPU-powered AI and was annoyed by how far behind Windows is in most of these conversations. Our stack is all Windows Server, but most AI tools still assume Linux. When I looked at the price for a full move to Linux, with new skills, new policies, new everything, it honestly didn&#8217;t make any sense. I wanted AI now, but I didn’t want to torch a Windows stack that already runs our business.</p>



<p class="wp-block-paragraph">What finally gave me hope was a combo that actually works: <strong>Windows Server 2025 + Docker + the NVIDIA Container Toolkit</strong>. Put together the right way, it lets me run GPU-accelerated containers on our Windows infrastructure in a setup that feels realistic for production. It’s not a neat and clean three-step checklist because, frankly, this stuff is messy. But I’ll walk through what mattered for me: the drivers that count, the Docker settings that tend to cause issues, and the runtime choices that decide whether the GPU shows up at all. </p>



<p class="wp-block-paragraph">By the end, you’ll have Windows Server 2025 running Docker containers with full NVIDIA GPU support, ready for inference, model serving, or whatever comes next.</p>



<h2 class="wp-block-heading">What is Windows Server 2025 + Docker + NVIDIA Toolkit?</h2>



<p class="wp-block-paragraph">This infrastructure stack combines Microsoft&#8217;s latest Windows Server 2025 with Docker containerization and NVIDIA&#8217;s GPU acceleration toolkit to create a platform for running AI workloads on Windows infrastructure. It&#8217;s essentially the enterprise Windows answer to the predominantly Linux-based AI deployment ecosystem.</p>



<p class="wp-block-paragraph"><strong>Key Components:</strong></p>



<ul class="wp-block-list">
<li><strong>Windows Server 2025</strong>: Latest Windows Server with enhanced container support and security features</li>



<li><strong>Docker Engine</strong>: Container runtime that handles application packaging and deployment</li>



<li><strong>NVIDIA Container Toolkit</strong>: GPU passthrough layer that exposes NVIDIA hardware to containers</li>



<li><strong>GPU Passthrough</strong>: Direct GPU access from containers for compute-intensive AI tasks</li>



<li><strong>Enterprise Integration</strong>: Full Active Directory, Group Policy, and Windows management tooling compatibility</li>



<li><strong>Hybrid Architecture</strong>: Bridge between traditional Windows infrastructure and modern containerized AI workloads</li>
</ul>



<h2 class="wp-block-heading">Prerequisites</h2>



<p class="wp-block-paragraph">Before diving into this setup, make sure you have:</p>



<ul class="wp-block-list">
<li>[ ] Windows Server 2025 (Standard or Datacenter edition)</li>



<li>[ ] NVIDIA GPU with compute capability 3.5 or higher (RTX 20/30/40 series, Tesla, Quadro)</li>



<li>[ ] Latest NVIDIA GPU drivers (version 470.57.02 or newer)</li>



<li>[ ] Minimum 16GB RAM (32GB recommended for AI workloads)</li>



<li>[ ] Administrative privileges on the Windows Server</li>



<li>[ ] Internet connectivity for downloading components</li>



<li>[ ] At least 100GB free disk space for containers and models</li>
</ul>



<h2 class="wp-block-heading">Step-by-Step Installation Guide</h2>



<h3 class="wp-block-heading">Step 1: Verify System Requirements and GPU Detection</h3>



<p class="wp-block-paragraph">First, confirm your system meets the requirements and Windows can see your NVIDIA GPU.</p>



<p class="wp-block-paragraph">Open <strong>Server Manager</strong> and navigate to <strong>Local Server</strong> to verify your Windows Server 2025 installation.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907456163-windows-01-os-server-manager-2025-info.png" alt="platform=windows; view=os; description=Server Manager showing Windows Server 2025 system information"/></figure>



<p class="wp-block-paragraph">Open <strong>Device Manager</strong> by right-clicking the Start button and selecting <strong>Device Manager</strong>. Expand <strong>Display adapters</strong> to confirm your NVIDIA GPU is detected and has no warning indicators.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907457420-windows-02-os-device-manager-nvidia-gpu-ok.png" alt="platform=windows; view=os; description=Device Manager showing NVIDIA GPU under Display adapters without warning icons"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should see your NVIDIA GPU listed without any yellow warning triangles or error indicators.</p>



<h3 class="wp-block-heading">Step 2: Install Latest NVIDIA GPU Drivers</h3>



<p class="wp-block-paragraph">Download the latest NVIDIA drivers from the <a href="https://www.nvidia.com/drivers">NVIDIA Driver Download page</a>. Select <strong>Windows Server 2022</strong> as the operating system (Server 2025 drivers use the 2022 branch).</p>



<p class="wp-block-paragraph">Run the downloaded installer and select <strong>Custom (Advanced)</strong> installation type. Check <strong>Perform a clean installation</strong> to ensure no conflicting drivers remain.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907458421-windows-03-app-nvidia-custom-clean-install.png" alt="platform=windows; view=app; description=NVIDIA driver installer showing Custom installation options with clean installation checked"/></figure>



<p class="wp-block-paragraph">After installation, open <strong>Command Prompt</strong> as Administrator and verify the driver installation:</p>



<pre class="wp-block-code"><code>nvidia-smi</code></pre>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should see output displaying your GPU information, driver version, and CUDA version.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907459493-windows-04-terminal-nvidia-smi-gpu-output.png" alt="platform=windows; view=terminal; description=Command prompt showing nvidia-smi output with GPU details and driver version"/></figure>



<h3 class="wp-block-heading">Step 3: Enable Windows Container Features</h3>



<p class="wp-block-paragraph">This is where the foundation work starts getting tricky. Windows doesn&#8217;t enable container support by default, and you need both Containers and Hyper-V working properly for Docker to behave.</p>



<p class="wp-block-paragraph">Open <strong>PowerShell</strong> as Administrator and enable the Containers feature:</p>



<pre class="wp-block-code"><code>Enable-WindowsOptionalFeature -Online -FeatureName Containers -All -NoRestart</code></pre>



<p class="wp-block-paragraph">Enable Hyper-V (required for Docker Desktop):</p>



<pre class="wp-block-code"><code>Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All -NoRestart</code></pre>



<p class="wp-block-paragraph">Restart the server to apply these changes:</p>



<pre class="wp-block-code"><code>Restart-Computer -Force</code></pre>



<p class="wp-block-paragraph">After reboot, verify the features are enabled:</p>



<pre class="wp-block-code"><code>Get-WindowsOptionalFeature -Online -FeatureName Containers
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V</code></pre>



<p class="wp-block-paragraph"><strong>Expected result</strong>: Both features should show <code>State : Enabled</code>.</p>



<h3 class="wp-block-heading">Step 4: Install Docker Desktop for Windows</h3>



<p class="wp-block-paragraph">Download Docker Desktop for Windows from the <a href="https://www.docker.com/products/docker-desktop">official Docker website</a>. Choose the version that supports Windows containers.</p>



<p class="wp-block-paragraph">Run the installer and ensure <strong>Use Windows containers instead of Linux containers</strong> is checked during installation.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907459866-windows-05-app-docker-desktop-windows-containers-config.png" alt="platform=windows; view=app; description=Docker Desktop installer configuration screen with Windows containers option selected"/></figure>



<p class="wp-block-paragraph">After installation, Docker Desktop should start automatically. If not, launch it from the Start menu.</p>



<p class="wp-block-paragraph">Open <strong>Settings</strong> in Docker Desktop (gear icon in the top-right) and navigate to <strong>General</strong>. Verify that <strong>Use Windows containers</strong> is selected.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907460930-windows-06-app-docker-desktop-general-settings.png" alt="platform=windows; view=app; description=Docker Desktop Settings showing General tab with Windows containers selected"/></figure>



<p class="wp-block-paragraph">Test Docker installation by opening <strong>Command Prompt</strong> and running:</p>



<pre class="wp-block-code"><code>docker version</code></pre>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should see both client and server version information, confirming Docker is running.</p>



<h3 class="wp-block-heading">Step 5: Install NVIDIA Container Toolkit</h3>



<p class="wp-block-paragraph">Alright, this is where things start feeling like you&#8217;re assembling something with missing instructions. The NVIDIA Container Toolkit needs to be configured specifically for Windows containers, and it&#8217;s not as straightforward as the Linux equivalent.</p>



<p class="wp-block-paragraph">First, download the NVIDIA Container Toolkit for Windows from the <a href="https://github.com/NVIDIA/nvidia-container-toolkit/releases">NVIDIA Container Toolkit releases page</a>. Look for the Windows installer (<code>.msi</code> file).</p>



<p class="wp-block-paragraph">Run the installer with administrative privileges. The installer will configure the necessary runtime components automatically.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907461930-windows-07-app-nvidia-toolkit-installer-welcome.png" alt="platform=windows; view=app; description=NVIDIA Container Toolkit installer welcome screen"/></figure>



<p class="wp-block-paragraph">After installation, restart the Docker service to recognize the new runtime:</p>



<pre class="wp-block-code"><code>Restart-Service docker</code></pre>



<p class="wp-block-paragraph">Verify the NVIDIA runtime is available:</p>



<pre class="wp-block-code"><code>docker info</code></pre>



<p class="wp-block-paragraph">Look for <code>nvidia</code> in the <strong>Runtimes</strong> section of the output.</p>



<p class="wp-block-paragraph"><strong>Expected result</strong>: The Docker info output should include <code>nvidia</code> as an available runtime.</p>



<h3 class="wp-block-heading">Step 6: Configure Docker Daemon for GPU Support</h3>



<p class="wp-block-paragraph">Create or edit the Docker daemon configuration file. Navigate to <code>C:\ProgramData\Docker\config\</code> and create or edit <code>daemon.json</code>:</p>



<pre class="wp-block-code"><code>{
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": &#91;]
    }
  },
  "experimental": false
}</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907463003-windows-08-app-notepad-daemon-json-nvidia-config.png" alt="platform=windows; view=app; description=Notepad showing daemon.json configuration file with NVIDIA runtime settings"/></figure>



<p class="wp-block-paragraph">Restart Docker Desktop or the Docker service:</p>



<pre class="wp-block-code"><code>Restart-Service docker</code></pre>



<p class="wp-block-paragraph">Wait for Docker to fully restart (check Docker Desktop shows &#8220;Engine running&#8221;).</p>



<h3 class="wp-block-heading">Step 7: Test GPU Access in Containers</h3>



<p class="wp-block-paragraph">This is the make-or-break moment. Testing GPU access reveals just how different Windows containers are from their Linux counterparts, and the syntax here is going to feel foreign if you&#8217;re used to Linux Docker commands.</p>



<p class="wp-block-paragraph">Test GPU access with a simple NVIDIA container:</p>



<pre class="wp-block-code"><code>docker run --rm --gpus all mcr.microsoft.com/windows/servercore:ltsc2022 cmd /c "nvidia-smi"</code></pre>



<p class="wp-block-paragraph">This command might fail initially because Windows containers handle GPU access differently than Linux containers. Instead, try:</p>



<pre class="wp-block-code"><code>docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 mcr.microsoft.com/windows/servercore:ltsc2022 cmd /c "nvidia-smi"</code></pre>



<p class="wp-block-paragraph">The device class GUID <code>5B45201D-F2F2-4F3B-85BB-30FF1F953599</code> represents GPU devices in Windows containers.</p>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should see nvidia-smi output from within the container, showing your GPU is accessible.</p>



<figure class="wp-block-image size-large tutorial-screenshot screenshot-placeholder"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/02/1770907464005-windows-09-terminal-nvidia-smi-windows-container-success.png" alt="platform=windows; view=terminal; description=Command prompt showing successful nvidia-smi output from within a Windows container"/></figure>



<p class="wp-block-paragraph">Yeah, that GUID syntax is as awkward as it looks. But when it works, you&#8217;ll know you&#8217;ve cleared the biggest hurdle.</p>



<h3 class="wp-block-heading">Step 8: Set Up AI Workload Test Environment</h3>



<p class="wp-block-paragraph">Time to see if all this complexity actually pays off with a real AI workload test.</p>



<p class="wp-block-paragraph">Create a test directory for your AI workloads:</p>



<pre class="wp-block-code"><code>mkdir C:\AIWorkloads
cd C:\AIWorkloads</code></pre>



<p class="wp-block-paragraph">Create a simple Dockerfile to test GPU-accelerated Python workloads:</p>



<pre class="wp-block-code"><code># Use Windows Server Core as base
FROM mcr.microsoft.com/windows/servercore:ltsc2022

# Install Python (this is simplified - you'd typically use a Python base image)
# For testing, we'll use a pre-built Python Windows container
FROM python:3.11-windowsservercore-ltsc2022

# Install basic GPU testing packages
RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# Copy test script
COPY test_gpu.py .

# Run test
CMD &#91;"python", "test_gpu.py"]</code></pre>



<p class="wp-block-paragraph">Create a simple GPU test script (<code>test_gpu.py</code>):</p>



<pre class="wp-block-code"><code>import torch

def test_gpu():
    if torch.cuda.is_available():
        device = torch.cuda.get_device_name(0)
        print(f"GPU detected: {device}")
        print(f"CUDA version: {torch.version.cuda}")
        
        # Simple tensor operation on GPU
        x = torch.rand(1000, 1000).cuda()
        y = torch.rand(1000, 1000).cuda()
        z = torch.matmul(x, y)
        
        print("GPU computation successful!")
        return True
    else:
        print("No GPU detected")
        return False

if __name__ == "__main__":
    test_gpu()</code></pre>



<p class="wp-block-paragraph">Build and run the test container:</p>



<pre class="wp-block-code"><code>docker build -t ai-gpu-test .
docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 ai-gpu-test</code></pre>



<p class="wp-block-paragraph"><strong>Expected result</strong>: The container should detect your GPU and successfully perform a GPU computation.</p>



<h2 class="wp-block-heading">Configuration Options</h2>



<h3 class="wp-block-heading">Docker Daemon Configuration</h3>



<p class="wp-block-paragraph">The <code>daemon.json</code> file supports additional GPU-related settings:</p>



<pre class="wp-block-code"><code>{
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "nvidia-container-runtime",
      "runtimeArgs": &#91;]
    }
  },
  "experimental": false,
  "log-level": "info",
  "storage-driver": "windowsfilter",
  "registry-mirrors": &#91;],
  "insecure-registries": &#91;]
}</code></pre>



<h3 class="wp-block-heading">Environment Variables for GPU Control</h3>



<p class="wp-block-paragraph">Control GPU visibility and capabilities in containers:</p>



<pre class="wp-block-code"><code># Make specific GPUs visible
docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 -e NVIDIA_VISIBLE_DEVICES=0 your-image

# Specify required capabilities
docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 -e NVIDIA_DRIVER_CAPABILITIES=compute,utility your-image</code></pre>



<h3 class="wp-block-heading">Resource Limits and Allocation</h3>



<p class="wp-block-paragraph">Set memory and CPU limits for AI workloads:</p>



<pre class="wp-block-code"><code>docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 --memory=8g --cpus="4.0" your-ai-image</code></pre>



<h3 class="wp-block-heading">Common Configuration Patterns</h3>



<p class="wp-block-paragraph"><strong>Production AI Inference Server</strong></p>



<pre class="wp-block-code"><code>FROM python:3.11-windowsservercore-ltsc2022

# Install production dependencies
RUN pip install fastapi uvicorn torch torchvision transformers

# Copy application
COPY app/ /app/
WORKDIR /app

# Expose port
EXPOSE 8000

# Run server
CMD &#91;"uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]</code></pre>



<p class="wp-block-paragraph"><strong>Batch Processing Container</strong></p>



<pre class="wp-block-code"><code>FROM python:3.11-windowsservercore-ltsc2022

# Install batch processing tools
RUN pip install pandas numpy torch scikit-learn

# Copy scripts
COPY scripts/ /scripts/
WORKDIR /scripts

# Default to batch processing
CMD &#91;"python", "batch_processor.py"]</code></pre>



<h2 class="wp-block-heading">Tips and Troubleshooting</h2>



<h3 class="wp-block-heading">Common Issues</h3>



<p class="wp-block-paragraph"><strong>Problem: &#8220;docker: Error response from daemon: container created but not started&#8221;</strong></p>



<p class="wp-block-paragraph">This usually happens when GPU device access is incorrectly configured. Windows containers require the specific device class GUID rather than the <code>--gpus</code> flag used in Linux.</p>



<p class="wp-block-paragraph">Solution:</p>



<pre class="wp-block-code"><code># Instead of --gpus all, use:
docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 your-image</code></pre>



<p class="wp-block-paragraph"><strong>Problem: &#8220;nvidia-smi: command not found&#8221; inside container</strong></p>



<p class="wp-block-paragraph">The NVIDIA drivers aren&#8217;t properly passed through to the container. This often indicates the Container Toolkit isn&#8217;t correctly configured.</p>



<p class="wp-block-paragraph">Solution:</p>



<ol class="wp-block-list">
<li>Verify the Container Toolkit installation</li>



<li>Check that <code>daemon.json</code> has the correct runtime configuration</li>



<li>Restart Docker service after any configuration changes</li>
</ol>



<p class="wp-block-paragraph"><strong>Problem: &#8220;CUDA out of memory&#8221; errors in containers</strong></p>



<p class="wp-block-paragraph">Container resource limits may be conflicting with GPU memory allocation.</p>



<p class="wp-block-paragraph">Solution:</p>



<pre class="wp-block-code"><code># Increase container memory limits
docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 --memory=16g your-image</code></pre>



<p class="wp-block-paragraph"><strong>Problem: Container isolation issues with GPU access</strong></p>



<p class="wp-block-paragraph">Windows container isolation modes can interfere with GPU passthrough.</p>



<p class="wp-block-paragraph">Solution:
Always use <code>--isolation=process</code> for GPU-enabled containers:</p>



<pre class="wp-block-code"><code>docker run --rm --isolation=process --device class/5B45201D-F2F2-4F3B-85BB-30FF1F953599 your-image</code></pre>



<h3 class="wp-block-heading">Pro Tips</h3>



<ul class="wp-block-list">
<li><strong>Monitor GPU utilization</strong>: Use <code>nvidia-smi -l 1</code> to continuously monitor GPU usage during container operations</li>



<li><strong>Container image optimization</strong>: Use multi-stage builds to reduce final image size for AI workloads</li>



<li><strong>Resource monitoring</strong>: Set up Windows Performance Toolkit to monitor container resource usage</li>



<li><strong>Backup configurations</strong>: Always backup your <code>daemon.json</code> before making changes</li>



<li><strong>Version compatibility</strong>: Keep NVIDIA drivers, Container Toolkit, and Docker versions aligned for best compatibility</li>



<li><strong>Development workflow</strong>: Use Docker Compose for multi-container AI applications with shared GPU access</li>
</ul>



<p class="wp-block-paragraph">The reality is that troubleshooting this setup requires patience. When something breaks, it&#8217;s usually at the intersection of three different technology stacks, and error messages can be cryptic. But once you get past the initial configuration hurdles, the platform is surprisingly stable.</p>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">When the first GPU computation finally ran inside the container, I was quite happy with myself! It’s not the clean, elegant Linux experience with all those device class GUIDs and isolation setting, but the payoff is absolutely worth it for a Windows-first shop like mine.</p>



<p class="wp-block-paragraph">This approach lets me keep what already works (Active Directory, Group Policy, our monitoring stack, and the team’s Windows instincts) while still running serious AI workloads with full GPU acceleration. The passthrough quirks are annoying, sure, but they’re not deal-breakers. They’re just the cost of bridging two worlds and once you get it to click, the setup becomes a solid foundation for inference, model serving, and batch processing.</p>



<p class="wp-block-paragraph"><strong>What comes next:</strong></p>



<ul class="wp-block-list">
<li>Build your first production inference pipeline on this foundation</li>



<li>Set up proper monitoring for GPU utilization and container health</li>



<li>Explore orchestration options with Docker Swarm or Kubernetes for Windows</li>
</ul>



<p class="wp-block-paragraph">The hard part is behind you. Now you can focus on the AI workloads themselves instead of fighting the infrastructure.</p><p>The post <a href="https://thebackroomtech.com/windows-server-2025-ai-host-docker-gpu-passthrough/">Windows Server 2025 as an AI Host: Docker, GPU Passthrough, and Operational Baselines</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Install and Set Up skillkit for Cross-Platform AI Agent Skills</title>
		<link>https://thebackroomtech.com/how-to-install-setup-skillkit-ai-agent-skills/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Thu, 29 Jan 2026 04:19:46 +0000</pubDate>
				<category><![CDATA[How-To]]></category>
		<category><![CDATA[Skillkit]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4534</guid>

					<description><![CDATA[<p><img width="300" height="158" src="https://thebackroomtech.com/wp-content/uploads/2026-01-25-skillkit-7-featured-6-300x158.png" class="attachment-medium size-medium wp-post-image" alt="" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/2026-01-25-skillkit-7-featured-6-300x158.png 300w, https://thebackroomtech.com/wp-content/uploads/2026-01-25-skillkit-7-featured-6-1024x538.png 1024w, https://thebackroomtech.com/wp-content/uploads/2026-01-25-skillkit-7-featured-6-768x403.png 768w, https://thebackroomtech.com/wp-content/uploads/2026-01-25-skillkit-7-featured-6-80x42.png 80w, https://thebackroomtech.com/wp-content/uploads/2026-01-25-skillkit-7-featured-6.png 1200w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>Every time I spin up a new AI agent project, I find myself copy-pasting the exact same boilerplate knowledge chunks over and over again. Here&#8217;s how to query our database. [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/how-to-install-setup-skillkit-ai-agent-skills/">How to Install and Set Up skillkit for Cross-Platform AI Agent Skills</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Every time I spin up a new AI agent project, I find myself copy-pasting the exact same boilerplate knowledge chunks over and over again. Here&#8217;s how to query our database. Here&#8217;s the format for our API responses. Here&#8217;s how we handle error logging. I build it once for Claude, then I gotta rebuild it for a LangChain setup, then rewrite it again for some new custom agent framework I&#8217;m experimenting with next. It&#8217;s a lot of work and I sometimes I wonder if I&#8217;m doing more work now than before AI! </p>



<p class="wp-block-paragraph">The pain point gets worse when you try to scale. You want the agents to actually be useful by having real organizational knowledge, not just generic capabilities, but every piece of expertise you add (Claude.md anyone?) bloats your context window. Suddenly you&#8217;re burning through tokens just loading instructions, and your agent can only juggle a handful of skills before things get unwieldy and expensive. I&#8217;ve been looking for something that treats agent knowledge as genuinely portable, something that doesn&#8217;t make me choose between capability and cost.</p>



<p class="wp-block-paragraph">That&#8217;s the specific itch that <strong><a href="https://github.com/rohitg00/skillkit">skillkit</a></strong> scratches. It&#8217;s a Python library that implements Anthropic&#8217;s Agent Skills pattern but makes it work anywhere: any Python-based agent, any framework. The clever part is how it handles discovery: skills load progressively, keeping your context lean while still giving agents access to dozens of specialized capabilities simultaneously. If you&#8217;ve been struggling to encode real operational expertise into your agents without watching your token bills explode, this is worth your attention.</p>



<p class="wp-block-paragraph">What caught my attention is how straightforward the setup turned out to be. No complex configuration files, no wrestling with framework-specific adapters, etc. Just install and start building skills. We&#8217;ll walk through getting skillkit up and running, from installation to your first working skill.</p>



<h2 class="wp-block-heading">What is skillkit?</h2>



<p class="wp-block-paragraph">skillkit is a Python library that brings Anthropic&#8217;s Agent Skills functionality to any Python-based AI agent, enabling autonomous discovery and execution of packaged expertise. The design philosophy centers on portability &#8211; write once, use everywhere.</p>



<p class="wp-block-paragraph"><strong>Key Features:</strong></p>



<ul class="wp-block-list">
<li><strong>Framework-free compatibility</strong>: Works standalone or integrates with existing frameworks like LangChain</li>



<li><strong>Multi-language script execution</strong>: Execute Python, Shell, JavaScript, Ruby, and Perl scripts with security controls</li>



<li><strong>Progressive disclosure pattern</strong>: Metadata-first loading reduces memory usage by 80% while supporting unlimited skills</li>



<li><strong>Multi-source discovery</strong>: Find skills from project directories, Anthropic config, plugins, and custom paths</li>



<li><strong>YAML frontmatter parsing</strong>: Comprehensive validation and parsing of SKILL.md files with metadata</li>



<li><strong>Security features</strong>: Input validation, size limits, suspicious pattern detection, and script sandboxing</li>
</ul>



<h2 class="wp-block-heading">Prerequisites</h2>



<p class="wp-block-paragraph">Before you begin, make sure you have:</p>



<ul class="wp-block-list">
<li>[ ] Python 3.10 or higher installed</li>



<li>[ ] pip package manager available</li>



<li>[ ] Basic familiarity with command line operations</li>



<li>[ ] A text editor for creating skill files</li>
</ul>



<h2 class="wp-block-heading">Step-by-Step Installation Guide</h2>



<h3 class="wp-block-heading">Step 1: Install the Core Library</h3>



<p class="wp-block-paragraph">Open your terminal or command prompt and install skillkit using pip:</p>



<pre class="wp-block-code"><code>pip install skillkit</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769564848581-skillkit-pip-install-success.png" alt="Terminal showing successful pip install skillkit command with version output"/></figure>



<p class="wp-block-paragraph">The installation is refreshingly quick with no heavy dependencies to pull down, which already feels like a good sign after dealing with some of the more bloated ML libraries out there.</p>



<h3 class="wp-block-heading">Step 2: Verify the Installation</h3>



<p class="wp-block-paragraph">Test that skillkit installed correctly by importing it in Python:</p>



<pre class="wp-block-code"><code>python -c "import skillkit; print(f'skillkit version: {skillkit.__version__}')"</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769564848886-skillkit-import-version-success.png" alt="Terminal showing successful import and version output"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: The command should output the skillkit version without any import errors.</p>



<h3 class="wp-block-heading">Step 3: Install Optional Dependencies (Recommended)</h3>



<p class="wp-block-paragraph">For enhanced functionality, install skillkit with all extras:</p>



<pre class="wp-block-code"><code>pip install skillkit&#91;all]</code></pre>



<p class="wp-block-paragraph">This includes LangChain integration and additional development tools that expand skillkit&#8217;s capabilities.</p>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769564849048-skillkit-install-all-extras.png" alt="Terminal showing installation of skillkit with all extras"/></figure>



<p class="wp-block-paragraph">The optional dependencies are actually optional as the core library works fine without them. But if you&#8217;re planning to integrate with existing LangChain setups, the extras save you from hunting down compatibility issues later.</p>



<h3 class="wp-block-heading">Step 4: Create Your First Skills Directory</h3>



<p class="wp-block-paragraph">Create the default skills directory structure that skillkit expects:</p>



<pre class="wp-block-code"><code>mkdir -p .claude/skills</code></pre>



<p class="wp-block-paragraph">This creates a <code>.claude/skills/</code> directory in your current project where skillkit will automatically discover skills.</p>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769564849365-claude-skills-directory-structure.png" alt="File explorer showing the created .claude/skills directory structure"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should see the nested directory structure created in your project root.</p>



<h3 class="wp-block-heading">Step 5: Create a Simple Test Skill</h3>



<p class="wp-block-paragraph">Create your first skill file to test the setup:</p>



<pre class="wp-block-code"><code>touch .claude/skills/hello_world.md</code></pre>



<p class="wp-block-paragraph">Open the file in your text editor and add this content:</p>



<pre class="wp-block-code"><code>---
name: hello_world
description: A simple greeting skill for testing skillkit setup
version: 1.0.0
author: Your Name
---

# Hello World Skill

This skill demonstrates basic skillkit functionality.

## Usage

Simply invoke this skill to receive a friendly greeting message.

## Instructions

Respond with: "Hello! skillkit is working correctly. This skill was successfully discovered and loaded."

If arguments are provided via $ARGUMENTS, incorporate them into a personalized greeting.</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769564849634-hello-world-yaml-frontmatter.png" alt="Text editor showing the hello_world.md file with YAML frontmatter and content"/></figure>



<p class="wp-block-paragraph">The YAML frontmatter approach feels familiar if you&#8217;ve worked with static site generators. It keeps metadata separate from instructions, which makes the whole thing more readable than cramming everything into JSON.</p>



<h3 class="wp-block-heading">Step 6: Test Skill Discovery</h3>



<p class="wp-block-paragraph">Create a simple Python script to test skill discovery:</p>



<pre class="wp-block-code"><code># test_skillkit.py
from skillkit import SkillManager
import asyncio

async def test_discovery():
    # Initialize the skill manager
    manager = SkillManager()
    
    # Discover skills from the default directory
    skills = await manager.discover()
    
    print(f"Discovered {len(skills)} skills:")
    for skill in skills:
        print(f"- {skill.name}: {skill.description}")
        print(f"  Version: {skill.version}")
        print(f"  Author: {skill.author}")
        print()

# Run the test
if __name__ == "__main__":
    asyncio.run(test_discovery())</code></pre>



<p class="wp-block-paragraph">Run the test script:</p>



<pre class="wp-block-code"><code>python test_skillkit.py</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769564850143-skill-discovery-test-output.png" alt="Terminal showing output of skill discovery test with hello_world skill details"/></figure>



<p class="wp-block-paragraph">This is where the progressive disclosure pattern becomes apparent. The discovery phase only loads metadata, not the full skill content. For projects with dozens of skills, that efficiency gain adds up quickly.</p>



<h3 class="wp-block-heading">Step 7: Test Skill Execution</h3>



<p class="wp-block-paragraph">Extend your test script to execute the skill:</p>



<pre class="wp-block-code"><code># test_execution.py
from skillkit import SkillManager
import asyncio

async def test_execution():
    manager = SkillManager()
    skills = await manager.discover()
    
    # Find our hello_world skill
    hello_skill = next((s for s in skills if s.name == "hello_world"), None)
    
    if hello_skill:
        print("Testing skill execution...")
        
        # Get the full skill content
        content = await manager.get_skill_content(hello_skill.name)
        print(f"Skill content loaded: {len(content)} characters")
        
        # Test with arguments
        result = await manager.invoke_skill(
            hello_skill.name, 
            arguments="from the skillkit tutorial"
        )
        print(f"Execution result: {result}")
    else:
        print("hello_world skill not found!")

if __name__ == "__main__":
    asyncio.run(test_execution())</code></pre>



<p class="wp-block-paragraph">Run the execution test:</p>



<pre class="wp-block-code"><code>python test_execution.py</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769564850270-terminal-skill-execution-success.png" alt="Terminal showing successful skill execution with greeting message"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should see the skill content loaded and executed, with a personalized greeting message.</p>



<h2 class="wp-block-heading">Configuration Options</h2>



<p class="wp-block-paragraph">skillkit offers several configuration options to customize its behavior for your specific needs.</p>



<h3 class="wp-block-heading">Default Configuration</h3>



<p class="wp-block-paragraph">skillkit uses these default settings:</p>



<pre class="wp-block-code"><code>from skillkit import SkillManager

# Default configuration
manager = SkillManager(
    skills_dir="./.claude/skills/",  # Default skills directory
    max_depth=5,                     # Maximum directory nesting
    timeout=30,                      # Script execution timeout (seconds)
    enable_caching=True,             # Enable Level 2 content caching
)</code></pre>



<p class="wp-block-paragraph">The defaults are sensible for most use cases, but the timeout might feel conservative if you&#8217;re running data-heavy scripts. You can adjust it based on your specific needs.</p>



<h3 class="wp-block-heading">Custom Skills Directory</h3>



<p class="wp-block-paragraph">You can specify custom directories for skill discovery:</p>



<pre class="wp-block-code"><code># Single custom directory
manager = SkillManager(skills_dir="./my_custom_skills/")

# Multiple discovery paths
manager = SkillManager()
skills = await manager.discover(&#91;
    "./project_skills/",
    "./shared_skills/",
    "./.claude/skills/"
])</code></pre>



<h3 class="wp-block-heading">Environment Variables</h3>



<p class="wp-block-paragraph">skillkit automatically injects these environment variables during skill execution:</p>



<ul class="wp-block-list">
<li><code>SKILL_NAME</code>: Name of the currently executing skill</li>



<li><code>SKILL_BASE_DIR</code>: Base directory of the skill</li>



<li><code>SKILL_VERSION</code>: Version of the skill</li>



<li><code>SKILLKIT_VERSION</code>: Version of skillkit</li>
</ul>



<h3 class="wp-block-heading">Security Configuration</h3>



<p class="wp-block-paragraph">Configure security controls for script execution:</p>



<pre class="wp-block-code"><code>from skillkit import SkillManager, SecurityConfig

security = SecurityConfig(
    max_file_size=1024*1024,  # 1MB file size limit
    allowed_extensions=&#91;'.py', '.sh', '.js'],  # Allowed script types
    enable_sandboxing=True,   # Enable script sandboxing
    timeout=10                # Shorter timeout for security
)

manager = SkillManager(security_config=security)</code></pre>



<p class="wp-block-paragraph">The security controls feel well thought out. Being able to execute multiple script types is powerful, but the sandboxing options give you confidence you won&#8217;t accidentally run something destructive.</p>



<h3 class="wp-block-heading">Integration with LangChain</h3>



<p class="wp-block-paragraph">If you installed the LangChain extras, you can integrate skillkit with LangChain agents:</p>



<pre class="wp-block-code"><code>from skillkit.integrations.langchain import SkillkitToolkit
from langchain.agents import initialize_agent

# Create skillkit toolkit
toolkit = SkillkitToolkit(skills_dir="./.claude/skills/")

# Initialize LangChain agent with skillkit tools
agent = initialize_agent(
    tools=toolkit.get_tools(),
    llm=your_llm_instance,
    agent="zero-shot-react-description"
)</code></pre>



<h2 class="wp-block-heading">Tips and Troubleshooting</h2>



<h3 class="wp-block-heading">Common Issues</h3>



<p class="wp-block-paragraph"><strong>Problem: &#8220;No skills discovered&#8221; error</strong></p>



<p class="wp-block-paragraph">This usually happens when skillkit can&#8217;t find the skills directory or SKILL.md files. To fix it:</p>



<ol class="wp-block-list">
<li>Verify the skills directory exists: <code>ls -la .claude/skills/</code></li>



<li>Check that skill files end with <code>.md</code>: <code>find .claude/skills/ -name "*.md"</code></li>



<li>Validate YAML frontmatter syntax using a YAML validator</li>



<li>Check the skillkit logs for parsing errors</li>
</ol>



<p class="wp-block-paragraph"><strong>Problem: YAML parsing errors in skill files</strong></p>



<p class="wp-block-paragraph">Invalid YAML syntax will prevent skills from loading. Common issues include:</p>



<ul class="wp-block-list">
<li>Missing <code>---</code> delimiters around YAML frontmatter</li>



<li>Incorrect indentation (use spaces, not tabs)</li>



<li>Missing required fields like <code>name</code> and <code>description</code></li>



<li>Special characters not properly quoted</li>
</ul>



<p class="wp-block-paragraph">Fix by validating your YAML:</p>



<pre class="wp-block-code"><code>python -c "import yaml; yaml.safe_load(open('.claude/skills/your_skill.md').read().split('---')&#91;1])"</code></pre>



<p class="wp-block-paragraph"><strong>Problem: Arguments not substituted in skills</strong></p>



<p class="wp-block-paragraph">The <code>$ARGUMENTS</code> placeholder is case-sensitive. Make sure you use:</p>



<ul class="wp-block-list">
<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code>$ARGUMENTS</code> (correct)</li>



<li><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <code>$arguments</code> or <code>$ARGUMENT</code> (incorrect)</li>
</ul>



<p class="wp-block-paragraph">I ran into this one myself—spent a good ten minutes wondering why my arguments weren&#8217;t being passed through. Case sensitivity strikes again.</p>



<p class="wp-block-paragraph"><strong>Problem: Script execution failures</strong></p>



<p class="wp-block-paragraph">When skills with executable scripts fail:</p>



<ol class="wp-block-list">
<li>Check script permissions: <code>chmod +x your_script.py</code></li>



<li>Verify the script interpreter is available: <code>which python3</code></li>



<li>Review security controls that might be blocking execution</li>



<li>Check the script timeout settings</li>
</ol>



<h3 class="wp-block-heading">Pro Tips</h3>



<ul class="wp-block-list">
<li><strong>Use metadata effectively</strong>: Include <code>tags</code>, <code>category</code>, and <code>dependencies</code> in your YAML frontmatter for better organization</li>



<li><strong>Leverage progressive disclosure</strong>: Keep skill instructions concise in the main content and use supplementary files for detailed documentation</li>



<li><strong>Version your skills</strong>: Use semantic versioning in your skill metadata to track changes and compatibility</li>



<li><strong>Test with different argument patterns</strong>: Skills should handle both empty arguments and complex parameter structures</li>



<li><strong>Monitor token usage</strong>: Use skillkit&#8217;s progressive loading to keep context windows efficient even with many skills</li>
</ul>



<h3 class="wp-block-heading">Performance Optimization</h3>



<p class="wp-block-paragraph">For large skill collections:</p>



<pre class="wp-block-code"><code># Enable aggressive caching
manager = SkillManager(
    enable_caching=True,
    cache_ttl=3600  # Cache for 1 hour
)

# Use metadata-only discovery for faster loading
skills_metadata = await manager.discover_metadata_only()</code></pre>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">After working through the setup and testing the core functionality, skillkit delivers on its main promise: making agent capabilities portable without sacrificing performance. The progressive loading pattern actually works as advertised and I can see how this would scale much better than dumping everything into context upfront.</p>



<p class="wp-block-paragraph">The multi-language script support is particularly useful. Instead of forcing everything into Python wrapper functions, you can write skills in whatever makes sense for the task. Database queries in Python, system operations in shell scripts, data processing in whatever your team already knows.</p>



<p class="wp-block-paragraph">Most importantly, this solves the copy-paste problem I started with. Build a skill once, use it across any Python-based agent setup. That&#8217;s the workflow change that makes this worthwhile.</p>



<p class="wp-block-paragraph"><strong>Next steps:</strong></p>



<ul class="wp-block-list">
<li>Explore the <a href="https://github.com/anthropics/skills">Anthropic Skills Library</a> for pre-built capabilities</li>



<li>Check out <a href="https://claude-plugins.dev/skills">claude-plugins.dev</a> for community-contributed skills</li>



<li>Set up CI/CD pipelines to validate and deploy skills across your agent infrastructure</li>
</ul><p>The post <a href="https://thebackroomtech.com/how-to-install-setup-skillkit-ai-agent-skills/">How to Install and Set Up skillkit for Cross-Platform AI Agent Skills</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How to Install and Set Up OCRBase: Complete Self-Hosting Guide for PDF to JSON Conversion</title>
		<link>https://thebackroomtech.com/ocrbase-installation-setup-guide/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Tue, 27 Jan 2026 19:57:32 +0000</pubDate>
				<category><![CDATA[OCRBase]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4317</guid>

					<description><![CDATA[<p><img width="300" height="158" src="https://thebackroomtech.com/wp-content/uploads/featured-image-13-300x158.png" class="attachment-medium size-medium wp-post-image" alt="How to Install and Set Up OCRBase: Complete Self-Hosting Guide for PDF to JSON Conversion" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/featured-image-13-300x158.png 300w, https://thebackroomtech.com/wp-content/uploads/featured-image-13-1024x538.png 1024w, https://thebackroomtech.com/wp-content/uploads/featured-image-13-768x403.png 768w, https://thebackroomtech.com/wp-content/uploads/featured-image-13-80x42.png 80w, https://thebackroomtech.com/wp-content/uploads/featured-image-13.png 1200w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>PDF extraction remains one of those problems that looks deceptively easy until you&#8217;re knee-deep in regex patterns, trying to parse a random receipt that you scanned in at a 15-degree [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/ocrbase-installation-setup-guide/">How to Install and Set Up OCRBase: Complete Self-Hosting Guide for PDF to JSON Conversion</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">PDF extraction remains one of those problems that looks deceptively easy until you&#8217;re knee-deep in regex patterns, trying to parse a random receipt that you scanned in at a 15-degree angle. The traditional approach for devs &#8211; throwing <a href="https://github.com/tesseract-ocr/tesseract">Tesseract</a> at it and praying &#8211; works fine for clean documents, but the moment you need structured data from real-world PDFs at any kind of scale, things fall apart quickly. Tables become chaos, headers merge with body text, and that carefully formatted JSON you needed? Good luck.</p>



<p class="wp-block-paragraph">So when <a href="https://github.com/majcheradam/ocrbase">OCRBase</a> showed up on my radar claiming to solve this through a combination of PaddleOCR and LLM-powered parsing, my immediate reaction was to dig into the architecture. The premise is interesting: instead of treating OCR as a purely optical problem, it layers intelligent parsing on top to convert extracted text into clean markdown and JSON. What I liked besides the feature set is that it&#8217;s  open-source and self-hostable, which means if you&#8217;re dealing with sensitive documents, then you don&#8217;t have to ship that data to yet another third-party API.</p>



<p class="wp-block-paragraph">The real question is whether this architecture actually delivers on the promise of production-grade document processing. In this breakdown, we&#8217;ll examine how OCRBase&#8217;s queue-based processing handles document throughput, take a look at the TypeScript SDK and React hooks they&#8217;ve built for integration, and figure out if this approach holds up under real-world conditions. If you&#8217;ve been cobbling together your own OCR pipeline or burning API credits on commercial solutions, this might be worth your attention.</p>



<p class="wp-block-paragraph">After spending time with the implementation, we&#8217;ll walk through the complete setup process and integration patterns that actually work in production environments.</p>



<h2 class="wp-block-heading">What is OCRBase?</h2>



<p class="wp-block-paragraph"><a href="https://github.com/majcheradam/ocrbase">OCRBase</a> is an open-source document processing solution that combines advanced OCR capabilities with LLM-powered parsing to convert PDFs into structured markdown and JSON data. Built around the PaddleOCR-VL-0.9B model for accurate text extraction, it offers a complete API-driven solution for document processing at scale.</p>



<p class="wp-block-paragraph"><strong>Key Features:</strong></p>



<ul class="wp-block-list">
<li><strong>Advanced OCR Processing</strong>: Uses PaddleOCR-VL-0.9B model for best-in-class text extraction from PDF documents</li>



<li><strong>Structured Data Extraction</strong>: Define custom schemas and receive structured JSON output from unstructured documents</li>



<li><strong>Scalable Architecture</strong>: Queue-based processing system designed to handle thousands of documents efficiently</li>



<li><strong>Type-safe TypeScript SDK</strong>: Full TypeScript support with React hooks for seamless frontend integration</li>



<li><strong>Real-time Updates</strong>: WebSocket notifications provide live progress updates for document processing jobs</li>



<li><strong>Self-hostable</strong>: Complete control over deployment and data processing on your own infrastructure</li>
</ul>



<h2 class="wp-block-heading">Prerequisites</h2>



<p class="wp-block-paragraph">Before you begin, make sure you have:</p>



<ul class="wp-block-list">
<li>[ ] Docker and Docker Compose installed (version 20.10 or higher)</li>



<li>[ ] Git for cloning the repository</li>



<li>[ ] At least 4GB RAM available for the Docker containers</li>



<li>[ ] Node.js 18+ and Bun runtime for SDK development</li>



<li>[ ] A text editor or IDE for configuration files</li>
</ul>



<h2 class="wp-block-heading">Step-by-Step Installation Guide</h2>



<h3 class="wp-block-heading">Step 1: Clone the OCRBase Repository</h3>



<p class="wp-block-paragraph">First, clone the official OCRBase repository to your local machine:</p>



<pre class="wp-block-code"><code>git clone https://github.com/majcheradam/ocrbase.git
cd ocrbase</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769550866272-git-clone-success-terminal.png" alt="Terminal showing git clone command and successful repository download"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should see the repository files downloaded and be inside the <code>ocrbase</code> directory.</p>



<h3 class="wp-block-heading">Step 2: Examine the Project Structure</h3>



<p class="wp-block-paragraph">Take a moment to understand the project layout:</p>



<pre class="wp-block-code"><code>ls -la</code></pre>



<p class="wp-block-paragraph">You&#8217;ll see the main components:</p>



<ul class="wp-block-list">
<li><code>docker-compose.yml</code> &#8211; Container orchestration</li>



<li><code>.env.example</code> &#8211; Environment configuration template</li>



<li><code>packages/</code> &#8211; Contains the SDK and core components</li>



<li><code>apps/</code> &#8211; Application components</li>
</ul>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769550867985-project-directory-listing.png" alt="Directory listing showing project structure with key files highlighted"/></figure>



<p class="wp-block-paragraph">The project structure tells you a lot about the engineering philosophy here. Instead of cramming everything into a monolith, they&#8217;ve carefully separated the SDK from the core processing engine. This modular approach makes it easier to maintain and suggests they&#8217;ve thought about how teams actually deploy and integrate these kinds of tools.</p>



<h3 class="wp-block-heading">Step 3: Configure Environment Variables</h3>



<p class="wp-block-paragraph">Copy the example environment file and customize it for your setup:</p>



<pre class="wp-block-code"><code>cp .env.example .env</code></pre>



<p class="wp-block-paragraph">Open the <code>.env</code> file in your preferred text editor:</p>



<pre class="wp-block-code"><code>nano .env</code></pre>



<p class="wp-block-paragraph">The key settings to configure:</p>



<pre class="wp-block-code"><code># Database configuration
DATABASE_URL="postgresql://ocrbase:password@postgres:5432/ocrbase"

# Redis configuration for job queue
REDIS_URL="redis://redis:6379"

# OCR processing settings
OCR_MODEL_PATH="/models/paddleocr"
MAX_CONCURRENT_JOBS=3

# API configuration
API_PORT=3000
WEBSOCKET_PORT=3001</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769550869935-env-file-highlighted-config.png" alt="Environment file open in editor with key configuration sections highlighted"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: Your <code>.env</code> file should contain all necessary configuration variables with values appropriate for your setup.</p>



<h3 class="wp-block-heading">Step 4: Start the OCRBase Services</h3>



<p class="wp-block-paragraph">Launch all services using Docker Compose:</p>



<pre class="wp-block-code"><code>docker-compose up -d</code></pre>



<p class="wp-block-paragraph">This command starts several containers:</p>



<ul class="wp-block-list">
<li>PostgreSQL database</li>



<li>Redis for job queuing</li>



<li>OCRBase API server</li>



<li>WebSocket server for real-time updates</li>



<li>OCR processing workers</li>
</ul>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769550870794-docker-compose-up-success.png" alt="Terminal showing docker-compose up command with containers starting successfully"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: All containers should start without errors. You can verify with:</p>



<pre class="wp-block-code"><code>docker-compose ps</code></pre>



<h3 class="wp-block-heading">Step 5: Verify Installation</h3>



<p class="wp-block-paragraph">Check that all services are running properly:</p>



<pre class="wp-block-code"><code>docker-compose logs --tail=50</code></pre>



<p class="wp-block-paragraph">Look for these success indicators:</p>



<ul class="wp-block-list">
<li>Database migrations completed</li>



<li>API server listening on port 3000</li>



<li>WebSocket server ready</li>



<li>OCR workers initialized</li>
</ul>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769550872618-docker-service-startup-logs.png" alt="Docker logs showing successful service initialization messages"/></figure>



<p class="wp-block-paragraph">The logs reveal another thoughtful design decision: they handle database migrations automatically on startup. This eliminates the common headache of remembering to run migration scripts manually, especially when deploying updates.</p>



<h3 class="wp-block-heading">Step 6: Test the API Endpoint</h3>



<p class="wp-block-paragraph">Verify the API is responding:</p>



<pre class="wp-block-code"><code>curl http://localhost:3000/health</code></pre>



<p class="wp-block-paragraph"><strong>Expected result</strong>: You should receive a JSON response indicating the service is healthy:</p>



<pre class="wp-block-code"><code>{
  "status": "ok",
  "timestamp": "2026-01-27T10:30:00.000Z",
  "services": {
    "database": "connected",
    "redis": "connected",
    "ocr": "ready"
  }
}</code></pre>



<h3 class="wp-block-heading">Step 7: Install the TypeScript SDK</h3>



<p class="wp-block-paragraph">For application integration, install the OCRBase client library:</p>



<pre class="wp-block-code"><code>bun add ocrbase</code></pre>



<p class="wp-block-paragraph">Or if using npm:</p>



<pre class="wp-block-code"><code>npm install ocrbase</code></pre>



<figure class="wp-block-image size-large tutorial-screenshot"><img decoding="async" src="https://thebackroomtech.com/wp-content/uploads/2026/01/1769550873345-sdk-install-success-terminal.png" alt="Terminal showing successful SDK installation with version information"/></figure>



<p class="wp-block-paragraph"><strong>Expected result</strong>: The SDK should install without dependency conflicts and be ready for use in your applications.</p>



<h2 class="wp-block-heading">Configuration Options</h2>



<p class="wp-block-paragraph">The configuration system reveals some impressive operational planning. Instead of hard-coding behavior deep in the application, they&#8217;ve exposed the parameters that actually matter for scaling through clean environment variables.</p>



<h3 class="wp-block-heading">Processing Configuration</h3>



<p class="wp-block-paragraph">The OCR processing behavior can be tuned through environment variables:</p>



<pre class="wp-block-code"><code># Maximum concurrent OCR jobs
MAX_CONCURRENT_JOBS=3

# Processing timeout (in milliseconds)
PROCESSING_TIMEOUT=300000

# Output format preferences
DEFAULT_OUTPUT_FORMAT="json"
ENABLE_MARKDOWN_OUTPUT=true</code></pre>



<h3 class="wp-block-heading">Queue Configuration</h3>



<p class="wp-block-paragraph">Adjust the job queue settings for your workload:</p>



<pre class="wp-block-code"><code># Redis connection settings
REDIS_URL="redis://redis:6379"
REDIS_DB=0

# Queue processing settings
JOB_ATTEMPTS=3
JOB_BACKOFF_DELAY=5000
QUEUE_CONCURRENCY=5</code></pre>



<p class="wp-block-paragraph">The queue configuration options demonstrate real production experience. Configurable retry attempts with exponential backoff means they understand that OCR jobs can fail for transient reasons—network hiccups, memory pressure, corrupted image data—and building resilience into the core system saves you from debugging mysterious failures at 2 AM.</p>



<h3 class="wp-block-heading">Database Optimization</h3>



<p class="wp-block-paragraph">For high-volume processing, optimize the database settings:</p>



<pre class="wp-block-code"><code># PostgreSQL connection pool
DB_POOL_MIN=2
DB_POOL_MAX=20
DB_TIMEOUT=30000

# Enable query logging for debugging
DB_LOGGING=false</code></pre>



<h3 class="wp-block-heading">Common Configuration Patterns</h3>



<p class="wp-block-paragraph"><strong>High-Volume Processing Setup</strong></p>



<p class="wp-block-paragraph">For processing thousands of documents daily:</p>



<pre class="wp-block-code"><code>MAX_CONCURRENT_JOBS=8
QUEUE_CONCURRENCY=10
DB_POOL_MAX=50
PROCESSING_TIMEOUT=600000</code></pre>



<p class="wp-block-paragraph"><strong>Development Environment</strong></p>



<p class="wp-block-paragraph">For local development and testing:</p>



<pre class="wp-block-code"><code>MAX_CONCURRENT_JOBS=1
QUEUE_CONCURRENCY=2
DB_POOL_MAX=5
DB_LOGGING=true</code></pre>



<p class="wp-block-paragraph"><strong>Memory-Constrained Environment</strong></p>



<p class="wp-block-paragraph">For servers with limited RAM:</p>



<pre class="wp-block-code"><code>MAX_CONCURRENT_JOBS=1
QUEUE_CONCURRENCY=1
DB_POOL_MAX=10
OCR_BATCH_SIZE=1</code></pre>



<h2 class="wp-block-heading">SDK Integration and Usage</h2>



<h3 class="wp-block-heading">Basic Client Setup</h3>



<p class="wp-block-paragraph">Create an OCRBase client in your application:</p>



<pre class="wp-block-code"><code>import { createOCRBaseClient } from "ocrbase";

const client = createOCRBaseClient({
  baseUrl: "http://localhost:3000",
  timeout: 30000
});</code></pre>



<h3 class="wp-block-heading">Processing Documents</h3>



<p class="wp-block-paragraph">Submit a PDF for processing:</p>



<pre class="wp-block-code"><code>async function processDocument(pdfBuffer: Buffer) {
  try {
    const job = await client.jobs.create({
      type: "parse",
      document: pdfBuffer,
      outputFormat: "json"
    });
    
    console.log(`Job created: ${job.id}`);
    return job;
  } catch (error) {
    console.error("Processing failed:", error);
  }
}</code></pre>



<h3 class="wp-block-heading">Real-time Progress Monitoring</h3>



<p class="wp-block-paragraph">Use WebSocket connections for live updates:</p>



<pre class="wp-block-code"><code>import { useOCRJob } from "ocrbase/react";

function DocumentProcessor({ jobId }: { jobId: string }) {
  const { job, progress, error } = useOCRJob(jobId);
  
  if (error) return &lt;div&gt;Error: {error.message}&lt;/div&gt;;
  if (!job) return &lt;div&gt;Loading...&lt;/div&gt;;
  
  return (
    &lt;div&gt;
      &lt;h3&gt;Processing Status: {job.status}&lt;/h3&gt;
      &lt;div&gt;Progress: {progress}%&lt;/div&gt;
      {job.status === "completed" &amp;&amp; (
        &lt;pre&gt;{JSON.stringify(job.result, null, 2)}&lt;/pre&gt;
      )}
    &lt;/div&gt;
  );
}</code></pre>



<p class="wp-block-paragraph">The React hooks integration shows sophisticated understanding of how document processing actually gets used in applications. Most OCR tools dump a basic REST API on you and call it done. The <code>useOCRJob</code> hook handles WebSocket subscriptions, reconnection logic, and state management automatically. This is the the kind of developer experience that saves hours of boilerplate code.</p>



<h2 class="wp-block-heading">Tips and Troubleshooting</h2>



<h3 class="wp-block-heading">Common Issues</h3>



<p class="wp-block-paragraph"><strong>Problem: Docker containers fail to start</strong></p>



<p class="wp-block-paragraph">This usually happens when ports are already in use or insufficient memory is available. To fix it:</p>



<ol class="wp-block-list">
<li>Check port availability:</li>
</ol>



<p class="wp-block-paragraph"><code>bash netstat -tlnp | grep :3000</code></p>



<ol start="2" class="wp-block-list">
<li>Stop conflicting services or change ports in <code>docker-compose.yml</code></li>
</ol>



<ol start="3" class="wp-block-list">
<li>Ensure Docker has at least 4GB memory allocated</li>
</ol>



<ol start="4" class="wp-block-list">
<li>Restart Docker daemon if needed:</li>
</ol>



<p class="wp-block-paragraph"><code>bash sudo systemctl restart docker</code></p>



<p class="wp-block-paragraph"><strong>Problem: OCR processing is slow or fails</strong></p>



<p class="wp-block-paragraph">Performance issues often stem from resource constraints:</p>



<ol class="wp-block-list">
<li>Monitor container resources:</li>
</ol>



<p class="wp-block-paragraph"><code>bash docker stats</code></p>



<ol start="2" class="wp-block-list">
<li>Reduce concurrent jobs if memory is limited:</li>
</ol>



<p class="wp-block-paragraph"><code>bash MAX_CONCURRENT_JOBS=1</code></p>



<ol start="3" class="wp-block-list">
<li>Check OCR worker logs:</li>
</ol>



<p class="wp-block-paragraph"><code>bash docker-compose logs ocr-worker</code></p>



<p class="wp-block-paragraph"><strong>Problem: WebSocket connections drop frequently</strong></p>



<p class="wp-block-paragraph">Network configuration issues can cause connection instability:</p>



<ol class="wp-block-list">
<li>Verify WebSocket port is accessible:</li>
</ol>



<p class="wp-block-paragraph"><code>bash telnet localhost 3001</code></p>



<ol start="2" class="wp-block-list">
<li>Check firewall settings for WebSocket protocols</li>
</ol>



<ol start="3" class="wp-block-list">
<li>Increase connection timeout in client configuration:</li>
</ol>



<p class="wp-block-paragraph"><code>typescript const client = createOCRBaseClient({ baseUrl: "http://localhost:3000", websocketTimeout: 60000 });</code></p>



<p class="wp-block-paragraph"><strong>Problem: Database connection errors</strong></p>



<p class="wp-block-paragraph">Database connectivity issues can halt processing:</p>



<ol class="wp-block-list">
<li>Verify PostgreSQL container is healthy:</li>
</ol>



<p class="wp-block-paragraph"><code>bash docker-compose exec postgres pg_isready</code></p>



<ol start="2" class="wp-block-list">
<li>Check database logs:</li>
</ol>



<p class="wp-block-paragraph"><code>bash docker-compose logs postgres</code></p>



<ol start="3" class="wp-block-list">
<li>Reset database if corrupted:</li>
</ol>



<p class="wp-block-paragraph"><code>bash docker-compose down -v docker-compose up -d</code></p>



<h3 class="wp-block-heading">Pro Tips</h3>



<ul class="wp-block-list">
<li><strong>Batch Processing</strong>: Process multiple documents simultaneously by creating multiple jobs and monitoring them collectively through the WebSocket connection.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Custom Schemas</strong>: Define JSON schemas for structured extraction to get consistent output formats tailored to your specific document types.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Resource Monitoring</strong>: Set up monitoring for the Redis queue depth and PostgreSQL connection counts to identify bottlenecks before they impact performance.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Backup Strategy</strong>: Regularly backup your PostgreSQL database and Redis snapshots, especially if you&#8217;re storing processing results long-term.</li>
</ul>



<ul class="wp-block-list">
<li><strong>Load Testing</strong>: Use the SDK to create test scripts that simulate your expected document volume to validate performance under load.</li>
</ul>



<h2 class="wp-block-heading">Conclusion</h2>



<p class="wp-block-paragraph">Awesome! You now have a fully functional OCRBase installation capable of processing PDF documents into structured Markdown and JSON formats. The system includes queue-based processing for scalability, real-time progress tracking, and a type-safe TypeScript SDK for easy integration.</p>



<p class="wp-block-paragraph">While I was a bit skeptical starting out, implementing the tool changed my view. OCRBase actually delivers on its promises, though it’s not perfect. The setup process is more involved than I’d like, especially that initial model download, and you definitely need decent hardware to run it smoothly. But once it’s running, the accuracy is solid and the structured extraction feature is genuinely useful.</p>



<p class="wp-block-paragraph">The TypeScript SDK is well-designed and the real-time updates make it feel professional rather than hacky. I’ve been using it for a few weeks now and it’s become part of my regular workflow for document processing projects.</p>



<p class="wp-block-paragraph">Is it worth the setup effort? If you’re processing more than a handful of documents regularly and need structured output, absolutely. Just make sure you have the hardware to support it properly.</p>



<p class="wp-block-paragraph"><strong>Next steps:</strong></p>



<ul class="wp-block-list">
<li>Explore custom schema definitions for your specific document types</li>



<li>Set up monitoring and alerting for production deployments</li>



<li>Integrate OCRBase into your existing document processing workflows</li>
</ul><p>The post <a href="https://thebackroomtech.com/ocrbase-installation-setup-guide/">How to Install and Set Up OCRBase: Complete Self-Hosting Guide for PDF to JSON Conversion</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Top 10 Command-Line Tools Every Linux Administrator Should Know</title>
		<link>https://thebackroomtech.com/top-10-command-line-tools-every-linux-administrator-should-know/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Wed, 15 Feb 2023 11:00:00 +0000</pubDate>
				<category><![CDATA[Linux]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=4007</guid>

					<description><![CDATA[<p><img width="300" height="150" src="https://thebackroomtech.com/wp-content/uploads/linux-admin-300x150.jpeg" class="attachment-medium size-medium wp-post-image" alt="" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/linux-admin-300x150.jpeg 300w, https://thebackroomtech.com/wp-content/uploads/linux-admin-1024x512.jpeg 1024w, https://thebackroomtech.com/wp-content/uploads/linux-admin-768x384.jpeg 768w, https://thebackroomtech.com/wp-content/uploads/linux-admin-80x40.jpeg 80w, https://thebackroomtech.com/wp-content/uploads/linux-admin.jpeg 1200w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>As a Linux administrator, you probably spend a lot of time working at the command line. Whether you&#8217;re managing files, monitoring system performance, or troubleshooting network issues, the command line [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/top-10-command-line-tools-every-linux-administrator-should-know/">Top 10 Command-Line Tools Every Linux Administrator Should Know</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">As a Linux administrator, you probably spend a lot of time working at the command line. Whether you&#8217;re managing files, monitoring system performance, or troubleshooting network issues, the command line is an essential tool for getting the job done. This article will introduce you to the top 10 command-line tools that every Linux administrator should know.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/linux-admin.jpeg"><img decoding="async" width="1200" height="600" src="https://thebackroomtech.com/wp-content/uploads/linux-admin.jpeg" alt="" class="wp-image-4008" srcset="https://thebackroomtech.com/wp-content/uploads/linux-admin.jpeg 1200w, https://thebackroomtech.com/wp-content/uploads/linux-admin-300x150.jpeg 300w, https://thebackroomtech.com/wp-content/uploads/linux-admin-1024x512.jpeg 1024w, https://thebackroomtech.com/wp-content/uploads/linux-admin-768x384.jpeg 768w, https://thebackroomtech.com/wp-content/uploads/linux-admin-80x40.jpeg 80w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></figure>
</div>


<h2 class="wp-block-heading">1. Bash</h2>



<p class="wp-block-paragraph">Bash is typically the default shell for most Linux distributions and is an essential tool for working with the command line. Using Bash, you can execute commands, create scripts, and automate system tasks. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/bash.jpg"><img decoding="async" width="559" height="267" src="https://thebackroomtech.com/wp-content/uploads/bash.jpg" alt="" class="wp-image-4017" srcset="https://thebackroomtech.com/wp-content/uploads/bash.jpg 559w, https://thebackroomtech.com/wp-content/uploads/bash-300x143.jpg 300w, https://thebackroomtech.com/wp-content/uploads/bash-80x38.jpg 80w" sizes="(max-width: 559px) 100vw, 559px" /></a></figure>
</div>


<p class="wp-block-paragraph">A few of the most common Bash commands include <strong>cd</strong> (to change directories), <strong>ls</strong> (to list files), <strong>rm</strong> (to delete files), and <strong>mkdir</strong> (to make directories).</p>



<p class="wp-block-paragraph">Make sure to read our beginner article on <a rel="noreferrer noopener" href="https://helpdeskgeek.com/linux-tips/what-is-the-bash-shell-in-linux/" target="_blank">the Bash shell</a> and how you can <a rel="noreferrer noopener" href="https://helpdeskgeek.com/windows-11/how-to-install-and-use-bash-on-windows-11/" target="_blank">install Bash on Windows 11</a>. </p>



<h2 class="wp-block-heading">2. SSH</h2>



<p class="wp-block-paragraph">SSH (Secure Shell) is a network protocol used for secure remote access to Linux systems. With SSH, you can connect to a remote Linux system over the internet and execute commands as if sitting at the local console. You can also use SSH to connect to a remote computer, i.e. <a href="https://www.switchingtomac.com/tutorials/osx/how-to-use-a-mac-to-connect-to-another-mac-remotely/" target="_blank" rel="noreferrer noopener">one Mac to another Mac via SSH</a>. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/ssh.jpg"><img decoding="async" width="592" height="311" src="https://thebackroomtech.com/wp-content/uploads/ssh.jpg" alt="" class="wp-image-4009" srcset="https://thebackroomtech.com/wp-content/uploads/ssh.jpg 592w, https://thebackroomtech.com/wp-content/uploads/ssh-300x158.jpg 300w, https://thebackroomtech.com/wp-content/uploads/ssh-80x42.jpg 80w" sizes="(max-width: 592px) 100vw, 592px" /></a></figure>
</div>


<p class="wp-block-paragraph">Some common SSH commands include <strong>ssh</strong> (to connect to a remote system), <strong>scp</strong> (to transfer files between systems), and <strong>sftp</strong> (to transfer files over a secure connection).</p>



<h2 class="wp-block-heading">3. Grep</h2>



<p class="wp-block-paragraph">Grep is a command-line utility used for text pattern searching and manipulation. With Grep, you can search for specific text strings in files and directories, or in the output of other commands. </p>



<p class="wp-block-paragraph">Common Grep commands include <strong>grep</strong> (to search for text strings), <strong>grep -r</strong> (to search recursively), and <strong>grep -v</strong> (to search for lines that don&#8217;t match a pattern).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/grep.jpg"><img decoding="async" width="418" height="102" src="https://thebackroomtech.com/wp-content/uploads/grep.jpg" alt="" class="wp-image-4010" srcset="https://thebackroomtech.com/wp-content/uploads/grep.jpg 418w, https://thebackroomtech.com/wp-content/uploads/grep-300x73.jpg 300w, https://thebackroomtech.com/wp-content/uploads/grep-80x20.jpg 80w" sizes="(max-width: 418px) 100vw, 418px" /></a></figure>
</div>


<p class="wp-block-paragraph">Here&#8217;s an example of how to <a href="https://www.switchingtomac.com/macos/how-to-kill-a-process-using-terminal-in-macos/" target="_blank" rel="noreferrer noopener">kill a process in macOS using grep</a> as a helper utility. </p>



<h2 class="wp-block-heading">4. Awk</h2>



<p class="wp-block-paragraph">Awk is a versatile command-line utility used for text processing and manipulation. With Awk, you can perform complex text transformations, extract data from text files, and generate reports. </p>



<p class="wp-block-paragraph">A couple of common Awk commands include <strong>awk</strong> &#8216;{print $2}&#8217; (to extract the second column in a file), <strong>awk &#8216;{sum+=$1} END {print sum}&#8217;</strong> (to calculate the sum of a column), and <strong>awk &#8216;/pattern/ {print $1}&#8217;</strong> (to extract data that matches a pattern).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/awk.jpg"><img decoding="async" width="436" height="263" src="https://thebackroomtech.com/wp-content/uploads/awk.jpg" alt="" class="wp-image-4011" srcset="https://thebackroomtech.com/wp-content/uploads/awk.jpg 436w, https://thebackroomtech.com/wp-content/uploads/awk-300x181.jpg 300w, https://thebackroomtech.com/wp-content/uploads/awk-80x48.jpg 80w, https://thebackroomtech.com/wp-content/uploads/awk-70x43.jpg 70w, https://thebackroomtech.com/wp-content/uploads/awk-140x85.jpg 140w" sizes="(max-width: 436px) 100vw, 436px" /></a></figure>
</div>


<p class="wp-block-paragraph">Above, I used the <strong>ps -e &gt; processes.txt </strong>command to quickly create a txt file with a list of processes in four columns. I then used <strong>awk -F &#8216; &#8216; &#8216;{print $1}&#8217; processes.txt</strong> to extract out the 1st column. The two single quotes with a space right after the -F parameter is to tell the command that spaces separate the fields. You can replace that with whatever separator is in your file. </p>



<h2 class="wp-block-heading">5. Sed</h2>



<p class="wp-block-paragraph">Sed is also a powerful tool used for text processing and manipulation, similar to Awk. With Sed, you can do text transformations, search and replace text strings, and filter and select lines of text. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/sed.jpg"><img decoding="async" width="390" height="240" src="https://thebackroomtech.com/wp-content/uploads/sed.jpg" alt="" class="wp-image-4012" srcset="https://thebackroomtech.com/wp-content/uploads/sed.jpg 390w, https://thebackroomtech.com/wp-content/uploads/sed-300x185.jpg 300w, https://thebackroomtech.com/wp-content/uploads/sed-80x49.jpg 80w, https://thebackroomtech.com/wp-content/uploads/sed-70x43.jpg 70w, https://thebackroomtech.com/wp-content/uploads/sed-140x85.jpg 140w" sizes="(max-width: 390px) 100vw, 390px" /></a></figure>
</div>


<p class="wp-block-paragraph">Useful Sed commands include <strong>sed &#8216;s/string/replacement/&#8217;</strong> (to replace a string with another string), <strong>sed &#8216;/pattern/d&#8217;</strong> (to delete lines that match a pattern), and <strong>sed -n &#8216;/pattern/p&#8217;</strong> (to print lines that match a pattern).</p>



<h2 class="wp-block-heading">6. Top</h2>



<p class="wp-block-paragraph">Top is a command-line utility used for system performance monitoring and management. With Top, you can view real-time information about system processes, CPU usage, memory usage, and more. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/top-command.jpg"><img decoding="async" width="715" height="425" src="https://thebackroomtech.com/wp-content/uploads/top-command.jpg" alt="" class="wp-image-4013" srcset="https://thebackroomtech.com/wp-content/uploads/top-command.jpg 715w, https://thebackroomtech.com/wp-content/uploads/top-command-300x178.jpg 300w, https://thebackroomtech.com/wp-content/uploads/top-command-80x48.jpg 80w, https://thebackroomtech.com/wp-content/uploads/top-command-70x43.jpg 70w" sizes="(max-width: 715px) 100vw, 715px" /></a></figure>
</div>


<p class="wp-block-paragraph">Some good Top commands include <strong>top</strong> (to view the system summary), <strong>top -p pid</strong> (to view the summary of a specific process), and <strong>top -H</strong> (to view threads of a process).</p>



<h2 class="wp-block-heading">7. Netstat</h2>



<p class="wp-block-paragraph">Netstat is a command-line utility used for network monitoring and management. With Netstat, you can view information about network connections, routing tables, and network interfaces. You may have to install the netstat tools first by typing<strong> sudo apt install net-tools</strong>. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/netstat.jpg"><img decoding="async" width="705" height="335" src="https://thebackroomtech.com/wp-content/uploads/netstat.jpg" alt="" class="wp-image-4014" srcset="https://thebackroomtech.com/wp-content/uploads/netstat.jpg 705w, https://thebackroomtech.com/wp-content/uploads/netstat-300x143.jpg 300w, https://thebackroomtech.com/wp-content/uploads/netstat-80x38.jpg 80w" sizes="(max-width: 705px) 100vw, 705px" /></a></figure>
</div>


<p class="wp-block-paragraph">Helpful Netstat commands include <strong>netstat -a</strong> (to view all active network connections), <strong>netstat -r</strong> (to view the routing table), and <strong>netstat -i</strong> (to view network interface statistics).</p>



<p class="wp-block-paragraph">Netstat is also a tool that works on Windows PCs. Read our article here on <a href="https://helpdeskgeek.com/how-to/use-netstat-to-see-listening-ports-and-pid-in-windows/" target="_blank" rel="noreferrer noopener">how to use Netstat in Windows</a>. </p>



<h2 class="wp-block-heading">8. Tcpdump</h2>



<p class="wp-block-paragraph">Tcpdump is a command-line utility used for network traffic analysis and troubleshooting. With Tcpdump, you can capture and analyze network packets, filter traffic by protocol and port number, and identify potential network issues. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/tcpdump.jpg"><img decoding="async" width="631" height="296" src="https://thebackroomtech.com/wp-content/uploads/tcpdump.jpg" alt="" class="wp-image-4015" srcset="https://thebackroomtech.com/wp-content/uploads/tcpdump.jpg 631w, https://thebackroomtech.com/wp-content/uploads/tcpdump-300x141.jpg 300w, https://thebackroomtech.com/wp-content/uploads/tcpdump-80x38.jpg 80w" sizes="(max-width: 631px) 100vw, 631px" /></a></figure>
</div>


<p class="wp-block-paragraph">Some common Tcpdump commands include <strong>tcpdump -i eth0</strong> (to capture traffic on the eth0 interface), <strong>tcpdump -nn port 80</strong> (to capture HTTP traffic), and <strong>tcpdump -r file.pcap</strong> (to read a captured file).</p>



<h2 class="wp-block-heading">9. Vim</h2>



<p class="wp-block-paragraph">Vim is a command-line text editor that Linux administrators widely use. With Vim, you can create and edit text files, navigate and manipulate text, and use powerful search and replace features. </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/vi.jpg"><img decoding="async" width="674" height="416" src="https://thebackroomtech.com/wp-content/uploads/vi.jpg" alt="" class="wp-image-4016" srcset="https://thebackroomtech.com/wp-content/uploads/vi.jpg 674w, https://thebackroomtech.com/wp-content/uploads/vi-300x185.jpg 300w, https://thebackroomtech.com/wp-content/uploads/vi-80x49.jpg 80w, https://thebackroomtech.com/wp-content/uploads/vi-70x43.jpg 70w, https://thebackroomtech.com/wp-content/uploads/vi-140x85.jpg 140w" sizes="(max-width: 674px) 100vw, 674px" /></a></figure>
</div>


<p class="wp-block-paragraph">Simple Vim commands include <strong>i</strong> (to enter insert mode), <strong>ESC</strong> (to exit insert mode), :<strong>w</strong> (to save changes), and <strong>:q</strong> (to quit Vim).</p>



<h2 class="wp-block-heading">10. Rsync</h2>



<p class="wp-block-paragraph">Rsync is a command-line utility used for file synchronization and backup. With Rsync, you can copy files between local and remote systems, synchronize directories, and perform incremental backups. </p>



<p class="wp-block-paragraph">Some basic Rsync commands include <strong>rsync -avz</strong> (to copy files with compression and preservation of file attributes), <strong>rsync -r</strong> (to synchronize directories recursively), and <strong>rsync -b</strong> (to perform backups with file versioning).</p>



<p class="wp-block-paragraph">To conclude, these ten handy command-line tools are essential for Linux administrators. By mastering these tools, you can work quickly, troubleshoot issues effectively, and automate system tasks efficiently. So if you&#8217;re new to Linux administration, start by learning these tools and begin to use them regularly. With practice and patience, you&#8217;ll become a command-line expert in no time!</p><p>The post <a href="https://thebackroomtech.com/top-10-command-line-tools-every-linux-administrator-should-know/">Top 10 Command-Line Tools Every Linux Administrator Should Know</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Cmdlets 101: What They Are and How to Use Them in PowerShell</title>
		<link>https://thebackroomtech.com/cmdlets-101-what-they-are-and-how-to-use-them-in-powershell/</link>
		
		<dc:creator><![CDATA[Aseem Kishore]]></dc:creator>
		<pubDate>Tue, 14 Feb 2023 11:00:00 +0000</pubDate>
				<category><![CDATA[PowerShell]]></category>
		<guid isPermaLink="false">https://thebackroomtech.com/?p=3998</guid>

					<description><![CDATA[<p><img width="300" height="181" src="https://thebackroomtech.com/wp-content/uploads/cmdlets-300x181.jpeg" class="attachment-medium size-medium wp-post-image" alt="" style="margin-bottom:20px;" decoding="async" srcset="https://thebackroomtech.com/wp-content/uploads/cmdlets-300x181.jpeg 300w, https://thebackroomtech.com/wp-content/uploads/cmdlets-1024x619.jpeg 1024w, https://thebackroomtech.com/wp-content/uploads/cmdlets-768x464.jpeg 768w, https://thebackroomtech.com/wp-content/uploads/cmdlets-80x48.jpeg 80w, https://thebackroomtech.com/wp-content/uploads/cmdlets-70x43.jpeg 70w, https://thebackroomtech.com/wp-content/uploads/cmdlets-140x85.jpeg 140w, https://thebackroomtech.com/wp-content/uploads/cmdlets.jpeg 1200w" sizes="(max-width: 300px) 100vw, 300px" /></p><p>Cmdlets, pronounced &#8220;command-lets&#8221;, are the heart and soul of Microsoft PowerShell. They are mini-programs that perform specific tasks and are the building blocks for all the amazing and cool things [&#8230;]</p>
<p>The post <a href="https://thebackroomtech.com/cmdlets-101-what-they-are-and-how-to-use-them-in-powershell/">Cmdlets 101: What They Are and How to Use Them in PowerShell</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">Cmdlets, pronounced &#8220;command-lets&#8221;, are the heart and soul of Microsoft PowerShell. They are mini-programs that perform specific tasks and are the building blocks for all the amazing and cool things you can do with PowerShell.</p>



<p class="wp-block-paragraph">Think of cmdlets as lego blocks for your computer. Just like how you can build something unique with lego blocks by connecting them in different ways, you can automate and manage your Windows systems in powerful ways by connecting cmdlets together in pipelines (the output from one cmdlet is used as the input of another cmdlet).</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/cmdlets.jpeg"><img decoding="async" width="1200" height="725" src="https://thebackroomtech.com/wp-content/uploads/cmdlets.jpeg" alt="" class="wp-image-4000" srcset="https://thebackroomtech.com/wp-content/uploads/cmdlets.jpeg 1200w, https://thebackroomtech.com/wp-content/uploads/cmdlets-300x181.jpeg 300w, https://thebackroomtech.com/wp-content/uploads/cmdlets-1024x619.jpeg 1024w, https://thebackroomtech.com/wp-content/uploads/cmdlets-768x464.jpeg 768w, https://thebackroomtech.com/wp-content/uploads/cmdlets-80x48.jpeg 80w, https://thebackroomtech.com/wp-content/uploads/cmdlets-70x43.jpeg 70w, https://thebackroomtech.com/wp-content/uploads/cmdlets-140x85.jpeg 140w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></figure>
</div>


<p class="wp-block-paragraph">Each cmdlet has a unique name and performs a specific task, such as retrieving information from your computer, modifying the system&#8217;s configuration, or even creating new objects. For example, there&#8217;s the &#8220;<strong>Get-Process</strong>&#8221; cmdlet that retrieves information about the processes running on your PC, and the &#8220;<strong>Set-Service</strong>&#8221; cmdlet that lets you start, stop, or modify Windows services.</p>



<p class="wp-block-paragraph">Cmdlets are easy to use and understand, even if you&#8217;re new to PowerShell. They use a simple verb-noun naming convention, so you can quickly figure out what a cmdlet does by looking at its name. And, because they&#8217;re built on top of the .NET framework, they have access to the same rich libraries and functionality that developers use to code robust applications.</p>



<h2 class="wp-block-heading">Examples of Cmdlets in PowerShell</h2>



<p class="wp-block-paragraph">Here are some examples of commonly used cmdlets in Microsoft PowerShell:</p>



<figure class="wp-block-image size-full"><a href="https://thebackroomtech.com/wp-content/uploads/PowerShell.jpeg"><img decoding="async" width="1200" height="800" src="https://thebackroomtech.com/wp-content/uploads/PowerShell.jpeg" alt="" class="wp-image-3999" srcset="https://thebackroomtech.com/wp-content/uploads/PowerShell.jpeg 1200w, https://thebackroomtech.com/wp-content/uploads/PowerShell-300x200.jpeg 300w, https://thebackroomtech.com/wp-content/uploads/PowerShell-1024x683.jpeg 1024w, https://thebackroomtech.com/wp-content/uploads/PowerShell-768x512.jpeg 768w, https://thebackroomtech.com/wp-content/uploads/PowerShell-75x50.jpeg 75w, https://thebackroomtech.com/wp-content/uploads/PowerShell-78x52.jpeg 78w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></figure>



<ol class="wp-block-list">
<li>Get information about the processes running on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-Process
</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/get-process.jpg"><img decoding="async" width="624" height="431" src="https://thebackroomtech.com/wp-content/uploads/get-process.jpg" alt="" class="wp-image-4002" srcset="https://thebackroomtech.com/wp-content/uploads/get-process.jpg 624w, https://thebackroomtech.com/wp-content/uploads/get-process-300x207.jpg 300w, https://thebackroomtech.com/wp-content/uploads/get-process-72x50.jpg 72w, https://thebackroomtech.com/wp-content/uploads/get-process-75x52.jpg 75w" sizes="(max-width: 624px) 100vw, 624px" /></a></figure>
</div>


<ol class="wp-block-list" start="2">
<li>Get information about the services on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-Service
</code></pre>



<ol class="wp-block-list" start="3">
<li>Get information about the event logs on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-EventLog -LogName System
</code></pre>



<ol class="wp-block-list" start="4">
<li>Get information about the environment variables on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-ChildItem Env:
</code></pre>



<ol class="wp-block-list" start="5">
<li>Get information about the installed hotfixes on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-HotFix
</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/get-hotfix.jpg"><img decoding="async" width="716" height="179" src="https://thebackroomtech.com/wp-content/uploads/get-hotfix.jpg" alt="" class="wp-image-4003" srcset="https://thebackroomtech.com/wp-content/uploads/get-hotfix.jpg 716w, https://thebackroomtech.com/wp-content/uploads/get-hotfix-300x75.jpg 300w, https://thebackroomtech.com/wp-content/uploads/get-hotfix-80x20.jpg 80w" sizes="(max-width: 716px) 100vw, 716px" /></a></figure>
</div>


<ol class="wp-block-list" start="6">
<li>Get information about the installed roles and features on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-WindowsFeature
</code></pre>



<ol class="wp-block-list" start="7">
<li>Stop a service on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Stop-Service -Name "ServiceName"
</code></pre>



<ol class="wp-block-list" start="8">
<li>Start a service on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Start-Service -Name "ServiceName"
</code></pre>



<ol class="wp-block-list" start="9">
<li>Restart a service on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Restart-Service -Name "ServiceName"
</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/restart-service.jpg"><img decoding="async" width="503" height="102" src="https://thebackroomtech.com/wp-content/uploads/restart-service.jpg" alt="" class="wp-image-4004" srcset="https://thebackroomtech.com/wp-content/uploads/restart-service.jpg 503w, https://thebackroomtech.com/wp-content/uploads/restart-service-300x61.jpg 300w, https://thebackroomtech.com/wp-content/uploads/restart-service-80x16.jpg 80w" sizes="(max-width: 503px) 100vw, 503px" /></a></figure>
</div>


<ol class="wp-block-list" start="10">
<li>Get information about a specific service on your computer:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-Service -Name "ServiceName"
</code></pre>



<p class="wp-block-paragraph">These are just a few examples of the many cmdlets available in Microsoft PowerShell. With these cmdlets, you can automate and manage a wide range of tasks on your Windows computer, from retrieving information about your system to modifying its configuration and behavior.</p>



<h2 class="wp-block-heading">Examples of Cmdlets Used Together in Pipelines</h2>



<p class="wp-block-paragraph">here are some examples of cmdlets that can be used together in pipelines in Microsoft PowerShell:</p>



<ol class="wp-block-list">
<li>Get information about the processes running on your computer, sorted by memory usage:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-Process | Sort-Object -Property WS -Descending
</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/memory-usage.jpg"><img decoding="async" width="667" height="384" src="https://thebackroomtech.com/wp-content/uploads/memory-usage.jpg" alt="" class="wp-image-4005" srcset="https://thebackroomtech.com/wp-content/uploads/memory-usage.jpg 667w, https://thebackroomtech.com/wp-content/uploads/memory-usage-300x173.jpg 300w, https://thebackroomtech.com/wp-content/uploads/memory-usage-80x46.jpg 80w" sizes="(max-width: 667px) 100vw, 667px" /></a></figure>
</div>


<ol class="wp-block-list" start="2">
<li>Get information about the services on your computer that are running, sorted by display name:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-Service | Where-Object { $_.Status -eq "Running" } | Sort-Object -Property DisplayName
</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/running-services.jpg"><img decoding="async" width="910" height="479" src="https://thebackroomtech.com/wp-content/uploads/running-services.jpg" alt="" class="wp-image-4006" srcset="https://thebackroomtech.com/wp-content/uploads/running-services.jpg 910w, https://thebackroomtech.com/wp-content/uploads/running-services-300x158.jpg 300w, https://thebackroomtech.com/wp-content/uploads/running-services-768x404.jpg 768w, https://thebackroomtech.com/wp-content/uploads/running-services-80x42.jpg 80w" sizes="(max-width: 910px) 100vw, 910px" /></a></figure>
</div>


<ol class="wp-block-list" start="3">
<li>Get information about the environment variables on your computer, filtered to show only the path variables:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-ChildItem Env: | Where-Object { $_.Name -eq "Path" }
</code></pre>



<ol class="wp-block-list" start="4">
<li>Get information about the installed hotfixes on your computer, filtered to show only hotfixes installed in the last 30 days:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-HotFix | Where-Object { $_.InstalledOn -gt (Get-Date).AddDays(-30) }
</code></pre>



<ol class="wp-block-list" start="5">
<li>Get information about the installed roles and features on your server, filtered to show only the features that are installed (only runs on Windows Server):</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-WindowsFeature | Where-Object { $_.Installed -eq $True }
</code></pre>



<ol class="wp-block-list" start="6">
<li>Stop all services on your computer that have a display name that starts with &#8220;SQL&#8221;:</li>
</ol>



<pre class="wp-block-preformatted"><code>Get-Service | Where-Object { $_.DisplayName -like "SQL*" } | Stop-Service
</code></pre>



<ol class="wp-block-list" start="7">
<li>Get information about the processes running on your computer, filtered to show only the processes owned by the current user:</li>
</ol>



<pre class="wp-block-preformatted">Get-Process | ? {$_.SI -eq (Get-Process -PID $PID).SessionId}</pre>



<h2 class="wp-block-heading">Common Troubleshooting Tips for Cmdlets</h2>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://thebackroomtech.com/wp-content/uploads/troubleshooting.jpeg"><img decoding="async" width="1200" height="775" src="https://thebackroomtech.com/wp-content/uploads/troubleshooting.jpeg" alt="" class="wp-image-4001" srcset="https://thebackroomtech.com/wp-content/uploads/troubleshooting.jpeg 1200w, https://thebackroomtech.com/wp-content/uploads/troubleshooting-300x194.jpeg 300w, https://thebackroomtech.com/wp-content/uploads/troubleshooting-1024x661.jpeg 1024w, https://thebackroomtech.com/wp-content/uploads/troubleshooting-768x496.jpeg 768w, https://thebackroomtech.com/wp-content/uploads/troubleshooting-77x50.jpeg 77w, https://thebackroomtech.com/wp-content/uploads/troubleshooting-80x52.jpeg 80w" sizes="(max-width: 1200px) 100vw, 1200px" /></a></figure>
</div>


<p class="wp-block-paragraph">Here are some common troubleshooting tips that users might run into when using cmdlets in Microsoft PowerShell:</p>



<ol class="wp-block-list">
<li><strong>Incorrect cmdlet name</strong>: Make sure you&#8217;re using the correct cmdlet name, as cmdlets are case-insensitive, but the name must be accurate. You can use the <strong>Get-Command</strong> cmdlet to get a list of all available cmdlets.</li>



<li><strong>Incorrect parameters</strong>: Make sure you&#8217;re using the correct parameters for the cmdlet you&#8217;re trying to use. You can use the <strong>Get-Help </strong>cmdlet to get information about the available parameters for a cmdlet.</li>



<li><strong>Missing permissions</strong>: Ensure you have the necessary permissions to run the cmdlet. Some cmdlets require administrator privileges to run.</li>



<li><strong>Network connectivity issues</strong>: Some cmdlets require an active internet connection or network connectivity to a remote computer. Ensure your computer is connected to the network when running these cmdlets.</li>



<li><strong>Incorrect syntax</strong>: Ensure you&#8217;re using the correct syntax for the cmdlet you&#8217;re trying to use. You can use the Get-Help cmdlet to get information about the correct syntax for a cmdlet.</li>



<li><strong>Incorrect data type</strong>: Some cmdlets require specific data types as input. Ensure you&#8217;re using the correct data type for the parameters you&#8217;re trying to use.</li>



<li><strong>Incorrect values</strong>: Some cmdlets have specific values that can be used as parameters. Ensure you&#8217;re using the correct values for the parameters you&#8217;re trying to use.</li>



<li><strong>Incorrect file paths</strong>: Some cmdlets require file paths as input. Ensure you&#8217;re using the correct file paths and that the files exist.</li>



<li><strong>Incorrect remote computer name</strong>: Some cmdlets require a remote computer name as input. Make sure you&#8217;re using the correct remote computer name.</li>
</ol>



<p class="wp-block-paragraph">These are just a few common troubleshooting tips users might run into when using cmdlets in Microsoft PowerShell. Following these tips can help ensure that your cmdlets run smoothly and without errors.</p>



<p class="wp-block-paragraph">Cmdlets are the fundamental units of functionality in Microsoft PowerShell, allowing you to automate and manage your Windows systems in powerful and flexible ways. So go ahead, start playing with cmdlets, and see what amazing things you can build with them!</p><p>The post <a href="https://thebackroomtech.com/cmdlets-101-what-they-are-and-how-to-use-them-in-powershell/">Cmdlets 101: What They Are and How to Use Them in PowerShell</a> first appeared on <a href="https://thebackroomtech.com">The Back Room Tech</a>.</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!-- plugin=object-cache-pro client=phpredis metric#hits=2714 metric#misses=31 metric#hit-ratio=98.9 metric#bytes=968989 metric#prefetches=0 metric#store-reads=79 metric#store-writes=2 metric#store-hits=156 metric#store-misses=23 metric#sql-queries=28 metric#ms-total=977.63 metric#ms-cache=5.12 metric#ms-cache-avg=0.0640 metric#ms-cache-ratio=0.5 sample#redis-hits=1673409 sample#redis-misses=681697 sample#redis-hit-ratio=71.0 sample#redis-ops-per-sec=42 sample#redis-evicted-keys=0 sample#redis-used-memory=4860296 sample#redis-used-memory-rss=19677184 sample#redis-memory-fragmentation-ratio=4.0 sample#redis-connected-clients=1 sample#redis-tracking-clients=0 sample#redis-rejected-connections=0 sample#redis-keys=2719 -->
