<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>CodeVibr | Blog</title><description>Homelab tutorials, software docs, and practical notes.</description><link>https://codevibr.dev/</link><language>en</language><item><title>Automating Homelab Tasks with Cron</title><link>https://codevibr.dev/blog/automating-homelab-tasks-with-cron/</link><guid isPermaLink="true">https://codevibr.dev/blog/automating-homelab-tasks-with-cron/</guid><pubDate>Sat, 06 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;automating-homelab-tasks-with-cron&quot;&gt;Automating Homelab Tasks with Cron&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;In a homelab, there are many tasks that benefit from automation: backups, log rotation, system updates, or even just checking the status of services. &lt;code dir=&quot;auto&quot;&gt;cron&lt;/code&gt; is the classic Unix utility for scheduling commands to run periodically. This post will guide you through setting up and managing cron jobs.&lt;/p&gt;
&lt;aside aria-label=&quot;Tip&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Tip&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;cron&lt;/code&gt; is incredibly powerful but can be tricky. Always test your cron jobs thoroughly in a safe environment before deploying them to critical systems.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;understanding-cron-syntax&quot;&gt;Understanding Cron Syntax&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A cron job entry (a “crontab” entry) consists of five time fields followed by the command to be executed. The fields are:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;* * * * * command-to-be-executed&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;- - - - -&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| | | | |&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| | | ------- Month (1 - 12)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| | --------- Day of month (1 - 31)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;| ----------- Hour (0 - 23)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;------------- Minute (0 - 59)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;special-strings&quot;&gt;Special Strings&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;For common schedules, &lt;code dir=&quot;auto&quot;&gt;cron&lt;/code&gt; offers special strings:&lt;/p&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;String&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Equivalent&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@reboot&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Run once after reboot&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;N/A&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@yearly&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Run once a year&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;0 0 1 1 *&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@annually&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Same as &lt;code dir=&quot;auto&quot;&gt;@yearly&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;0 0 1 1 *&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@monthly&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Run once a month&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;0 0 1 * *&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@weekly&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Run once a week&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;0 0 * * 0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@daily&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Run once a day&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;0 0 * * *&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@midnight&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Same as &lt;code dir=&quot;auto&quot;&gt;@daily&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;0 0 * * *&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;@hourly&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Run once an hour&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;0 * * * *&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;managing-cron-jobs&quot;&gt;Managing Cron Jobs&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;editing-your-crontab&quot;&gt;Editing Your Crontab&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Each user has their own crontab. To edit it, use:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;crontab&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This will open your crontab in a text editor (usually &lt;code dir=&quot;auto&quot;&gt;nano&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;vim&lt;/code&gt;). Add your job entries at the end of the file.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;listing-cron-jobs&quot;&gt;Listing Cron Jobs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;To view your current cron jobs:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;crontab&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;removing-cron-jobs&quot;&gt;Removing Cron Jobs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;To remove all your cron jobs:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;crontab&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;crontab -r&lt;/code&gt; removes all jobs without confirmation. Use &lt;code dir=&quot;auto&quot;&gt;crontab -e&lt;/code&gt; to selectively delete entries.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;practical-examples&quot;&gt;Practical Examples&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;daily-backup-script&quot;&gt;Daily Backup Script&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Let’s say you have a backup script at &lt;code dir=&quot;auto&quot;&gt;/usr/local/bin/backup-homelab.sh&lt;/code&gt;. To run it every day at 2:00 AM:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0 2 * * * /usr/local/bin/backup-homelab.sh &gt;&gt; /var/log/homelab-backup.log 2&gt;&amp;#x26;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;0&lt;/code&gt;: Minute 0&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;2&lt;/code&gt;: Hour 2 (2 AM)&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;*&lt;/code&gt;: Every day of the month&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;*&lt;/code&gt;: Every month&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;*&lt;/code&gt;: Every day of the week&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;&gt;&gt; /var/log/homelab-backup.log 2&gt;&amp;#x26;1&lt;/code&gt;: Redirects both standard output and standard error to a log file.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;hourly-system-update-check&quot;&gt;Hourly System Update Check&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;To check for system updates every hour:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0 * * * * sudo apt update &gt; /dev/null 2&gt;&amp;#x26;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;0&lt;/code&gt;: Minute 0&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;*&lt;/code&gt;: Every hour&lt;/li&gt;
&lt;li&gt;&lt;code dir=&quot;auto&quot;&gt;&gt; /dev/null 2&gt;&amp;#x26;1&lt;/code&gt;: Discards all output to prevent excessive emails from cron.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h3 id=&quot;reboot-task&quot;&gt;Reboot Task&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Run a script once after every system reboot:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;@reboot /usr/local/bin/start-homelab-services.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;environment-variables-in-cron&quot;&gt;Environment Variables in Cron&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Cron jobs run with a minimal set of environment variables. If your script relies on specific &lt;code dir=&quot;auto&quot;&gt;PATH&lt;/code&gt; settings or other variables, you need to define them within the crontab or explicitly in your script.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;0 3 * * * /usr/local/bin/my-script.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Alternatively, specify the full path to all commands in your script.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;troubleshooting-cron-jobs&quot;&gt;Troubleshooting Cron Jobs&lt;/h2&gt;&lt;/div&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Issue&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Possible Cause&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Solution&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Job not running&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Incorrect time syntax, script path&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Check &lt;code dir=&quot;auto&quot;&gt;crontab -l&lt;/code&gt;, verify script path&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Job fails silently&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Environment variables, permissions&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redirect output to a log file, check script permissions (&lt;code dir=&quot;auto&quot;&gt;chmod +x&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;No output&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Output redirected to &lt;code dir=&quot;auto&quot;&gt;/dev/null&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Remove redirection temporarily to debug&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Email spam&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Job produces output&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Redirect output to &lt;code dir=&quot;auto&quot;&gt;/dev/null&lt;/code&gt; or a log file&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h3 id=&quot;checking-cron-logs&quot;&gt;Checking Cron Logs&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Cron activity is often logged in &lt;code dir=&quot;auto&quot;&gt;/var/log/syslog&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;/var/log/cron&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CRON&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/log/syslog&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;best-practices&quot;&gt;Best Practices&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Use full paths:&lt;/strong&gt; Always specify the full path to commands and scripts (e.g., &lt;code dir=&quot;auto&quot;&gt;/usr/bin/python3&lt;/code&gt; instead of &lt;code dir=&quot;auto&quot;&gt;python3&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Log output:&lt;/strong&gt; Redirect output to a log file (&lt;code dir=&quot;auto&quot;&gt;&gt;&gt; /path/to/log.log 2&gt;&amp;#x26;1&lt;/code&gt;) to capture errors and verify execution.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Test scripts:&lt;/strong&gt; Run your scripts manually from the command line before adding them to cron.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Minimal privileges:&lt;/strong&gt; Run cron jobs as the user with the least necessary privileges.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Comments:&lt;/strong&gt; Add comments to your crontab (&lt;code dir=&quot;auto&quot;&gt;# This is a comment&lt;/code&gt;) to explain complex entries.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;&lt;code dir=&quot;auto&quot;&gt;cron&lt;/code&gt; is a robust and reliable tool for automating tasks on your homelab. By understanding its syntax and following best practices, you can free yourself from repetitive manual work and ensure your systems are maintained efficiently.&lt;/p&gt;
&lt;p&gt;Automate responsibly!&lt;/p&gt;</content:encoded><category>homelab</category><category>linux</category><category>automation</category></item><item><title>Setting Up Your Software Development Environment</title><link>https://codevibr.dev/blog/setting-up-dev-environment/</link><guid isPermaLink="true">https://codevibr.dev/blog/setting-up-dev-environment/</guid><pubDate>Fri, 05 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;setting-up-your-software-development-environment&quot;&gt;Setting Up Your Software Development Environment&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;A well-configured development environment is crucial for productivity. This guide covers essential tools, configurations, and best practices for setting up a robust workspace, focusing on a Linux-based setup.&lt;/p&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;While this guide focuses on Linux, many principles apply to macOS and Windows (especially with WSL).&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;step-1-choose-your-operating-system&quot;&gt;Step 1: Choose Your Operating System&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;For development, Linux distributions (like Ubuntu, Fedora, Arch) are popular due to their flexibility, powerful command-line tools, and native support for many development technologies. macOS is also a strong contender, while Windows often benefits from &lt;a href=&quot;https://learn.microsoft.com/en-us/windows/wsl/&quot;&gt;WSL (Windows Subsystem for Linux)&lt;/a&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;step-2-install-essential-tools&quot;&gt;Step 2: Install Essential Tools&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;version-control-git&quot;&gt;Version Control: Git&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Git is non-negotiable for collaborative development and tracking changes.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user.name&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;Your Name&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user.email&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;your.email@example.com&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;code-editor-vs-code&quot;&gt;Code Editor: VS Code&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt; is a highly popular and extensible editor. Install it via &lt;code dir=&quot;auto&quot;&gt;snap&lt;/code&gt; or by downloading the &lt;code dir=&quot;auto&quot;&gt;.deb&lt;/code&gt; package.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;snap&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--classic&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;code&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;terminal-emulator-kitty-or-alacritty&quot;&gt;Terminal Emulator: Kitty or Alacritty&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Default terminals are fine, but modern alternatives like &lt;a href=&quot;https://sw.kovidgoyal.net/kitty/&quot;&gt;Kitty&lt;/a&gt; or &lt;a href=&quot;https://alacritty.org/&quot;&gt;Alacritty&lt;/a&gt; offer better performance and customization.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;kitty&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;package-manager-nodejs-npmyarnpnpm&quot;&gt;Package Manager: Node.js (npm/yarn/pnpm)&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;For web development, Node.js and its package managers are essential.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://deb.nodesource.com/setup_lts.x&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-E&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;nodejs&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install pnpm (optional, but recommended)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;step-3-configure-your-shell&quot;&gt;Step 3: Configure Your Shell&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Bash is the default, but &lt;code dir=&quot;auto&quot;&gt;zsh&lt;/code&gt; with &lt;a href=&quot;https://ohmyz.sh/&quot;&gt;Oh My Zsh&lt;/a&gt; or &lt;code dir=&quot;auto&quot;&gt;fish&lt;/code&gt; shell offer enhanced features.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;zsh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;chsh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-s&lt;/span&gt;&lt;span&gt; $(&lt;/span&gt;&lt;span&gt;which&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;zsh&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install Oh My Zsh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-c&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;$(&lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Customize your &lt;code dir=&quot;auto&quot;&gt;~/.zshrc&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;~/.bashrc&lt;/code&gt; for aliases, functions, and prompt.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# ZSH_THEME=&quot;robbyrussell&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ZSH_THEME=&quot;agnoster&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alias ll=&quot;ls -lah&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alias gs=&quot;git status&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alias gc=&quot;git commit -m&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;step-4-language-specific-setups&quot;&gt;Step 4: Language-Specific Setups&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;python&quot;&gt;Python&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Use &lt;code dir=&quot;auto&quot;&gt;pyenv&lt;/code&gt; or &lt;code dir=&quot;auto&quot;&gt;conda&lt;/code&gt; for managing Python versions and virtual environments.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://pyenv.run&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;|&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Add to .zshrc or .bashrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;export PYENV_ROOT=&quot;$HOME/.pyenv&quot;&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;command -v pyenv &gt;/dev/null || export PATH=&quot;$PYENV_ROOT/bin:$PATH&quot;&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;eval &quot;$(pyenv init -)&quot;&apos;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&gt;&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;source&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;~/.zshrc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pyenv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3.10.12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;pyenv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;global&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3.10.12&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h3 id=&quot;docker&quot;&gt;Docker&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Docker is indispensable for containerized development and deploying services.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install Docker (refer to official docs for latest instructions)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker.io&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;usermod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-aG&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$USER&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;newgrp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Install Docker Compose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;docker-compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-y&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;step-5-dotfiles-management&quot;&gt;Step 5: Dotfiles Management&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Store your shell configurations, editor settings, and other dotfiles in a Git repository. This makes it easy to sync your setup across machines.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--bare&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;git@github.com:your-username/dotfiles.git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$HOME&lt;/span&gt;&lt;span&gt;/.dotfiles&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;alias&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dotfiles&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;\&apos;&lt;/span&gt;&lt;span&gt;git &lt;/span&gt;&lt;span&gt;--git-dir&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;$HOME&lt;/span&gt;&lt;span&gt;/.dotfiles/&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--work-tree&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;$HOME&lt;/span&gt;&lt;span&gt;\&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;dotfiles&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;checkout&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;Be careful when checking out dotfiles for the first time, as it can overwrite existing files. Back up your current configurations first.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;step-6-productivity-enhancements&quot;&gt;Step 6: Productivity Enhancements&lt;/h2&gt;&lt;/div&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Tool&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Why Use It&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;tmux&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;screen&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Terminal multiplexer&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Manage multiple terminal sessions, persistent sessions&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;fzf&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Fuzzy finder&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Fast file/history search&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ripgrep&lt;/code&gt; (&lt;code dir=&quot;auto&quot;&gt;rg&lt;/code&gt;)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Fast code search&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Faster &lt;code dir=&quot;auto&quot;&gt;grep&lt;/code&gt; alternative&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;tldr&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Simplified man pages&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Quick command examples&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Building a development environment is an iterative process. Start with the basics, then gradually add tools and configurations that suit your workflow. The goal is to minimize friction and maximize your focus on coding.&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;</content:encoded><category>development</category><category>software</category><category>tools</category></item><item><title>Essential Linux Commands for Developers</title><link>https://codevibr.dev/blog/essential-linux-commands/</link><guid isPermaLink="true">https://codevibr.dev/blog/essential-linux-commands/</guid><pubDate>Thu, 04 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;essential-linux-commands-for-developers&quot;&gt;Essential Linux Commands for Developers&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Working in software development often means spending a lot of time in the terminal, especially on Linux systems. Mastering a few essential commands can significantly boost your productivity. Here’s a quick reference guide to some of the most useful ones.&lt;/p&gt;
&lt;aside aria-label=&quot;Tip&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Tip&lt;/p&gt;&lt;div&gt;&lt;p&gt;Practice these commands regularly. Muscle memory in the terminal is a huge time-saver!&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;file-system-navigation-and-manipulation&quot;&gt;File System Navigation and Manipulation&lt;/h2&gt;&lt;/div&gt;


















































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Command&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Example Usage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ls&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;List directory contents&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ls -la&lt;/code&gt; (long format, all files)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;cd&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Change directory&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;cd ../projects/my-app&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;pwd&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Print working directory&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;pwd&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;mkdir&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Create directory&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;mkdir new-feature&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;rm&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Remove files or directories&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;rm -rf old-logs/&lt;/code&gt; (force, recursive)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;cp&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Copy files or directories&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;cp -r src/ build/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;mv&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Move or rename files/directories&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;mv old-name.txt new-name.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;find&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Search for files in a directory hierarchy&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;find . -name &quot;*.js&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;viewing-and-editing-files&quot;&gt;Viewing and Editing Files&lt;/h2&gt;&lt;/div&gt;








































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Command&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Example Usage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;cat&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Concatenate and display file content&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;cat README.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;less&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;View file content page by page&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;less /var/log/syslog&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;head&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Display first N lines of a file&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;head -n 10 config.yaml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;tail&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Display last N lines of a file&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;tail -f access.log&lt;/code&gt; (follow changes)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;grep&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Search for patterns in files&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;grep -r &quot;error&quot; .&lt;/code&gt; (recursive search)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;nano&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;vim&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Text editors&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;nano script.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;process-management&quot;&gt;Process Management&lt;/h2&gt;&lt;/div&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Command&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Example Usage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ps&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Report a snapshot of current processes&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;`ps aux&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;top&lt;/code&gt; / &lt;code dir=&quot;auto&quot;&gt;htop&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Display Linux processes dynamically&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;htop&lt;/code&gt; (more user-friendly)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;kill&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Send a signal to processes&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;kill 12345&lt;/code&gt; (terminate process ID 12345)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;killall&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Kill processes by name&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;killall node&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;systemctl&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Control the systemd system and service manager&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;sudo systemctl status nginx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;system-information&quot;&gt;System Information&lt;/h2&gt;&lt;/div&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Command&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Example Usage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;df&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Report file system disk space usage&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;df -h&lt;/code&gt; (human-readable)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;du&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Estimate file space usage&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;du -sh my-project/&lt;/code&gt; (summary, human-readable)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;free&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Display amount of free and used memory&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;free -h&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;uname&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Print system information&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;uname -a&lt;/code&gt; (all information)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lscpu&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Display CPU architecture information&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;lscpu&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;networking&quot;&gt;Networking&lt;/h2&gt;&lt;/div&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Command&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Example Usage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ip addr&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Display IP addresses and network interfaces&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ip addr show eth0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ping&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Send ICMP ECHO_REQUEST to network hosts&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ping google.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;curl&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Transfer data from or to a server&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;curl -I https://codevibr.dev&lt;/code&gt; (show headers)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;wget&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Non-interactive network downloader&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;wget https://example.com/file.zip&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ssh&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;OpenSSH remote login client&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;ssh user@remote-host&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;permissions&quot;&gt;Permissions&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;Understanding file permissions is crucial for security and proper application function.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# View permissions&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-file.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Change permissions (read, write, execute for owner, group, others)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;755&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-file.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Change ownership&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;chown&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;user:group&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;my-file.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;package-management-debianubuntu&quot;&gt;Package Management (Debian/Ubuntu)&lt;/h2&gt;&lt;/div&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Command&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Example Usage&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;apt update&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Refresh package lists&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;sudo apt update&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;apt upgrade&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Upgrade installed packages&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;sudo apt upgrade -y&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;apt install&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Install new packages&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;sudo apt install git&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;apt remove&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Remove packages&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code dir=&quot;auto&quot;&gt;sudo apt remove htop&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;div&gt;&lt;h2 id=&quot;version-control-git&quot;&gt;Version Control (Git)&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;While not strictly a Linux command, Git is indispensable for developers.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Initialize a new repository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;init&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Clone a repository&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/user/repo.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Check status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Add changes to staging area&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;add&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Commit changes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;commit&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-m&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;feat: add new feature&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Push changes to remote&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;push&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;origin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;main&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;This is just a starting point. The Linux terminal is a powerful environment, and there’s always more to learn. The best way to get comfortable is to use it daily. Experiment, read man pages (&lt;code dir=&quot;auto&quot;&gt;man &amp;#x3C;command&gt;&lt;/code&gt;), and don’t be afraid to break things in a safe environment.&lt;/p&gt;
&lt;p&gt;Happy coding!&lt;/p&gt;</content:encoded><category>linux</category><category>development</category><category>terminal</category></item><item><title>Homelab Networking Basics</title><link>https://codevibr.dev/blog/homelab-networking-basics/</link><guid isPermaLink="true">https://codevibr.dev/blog/homelab-networking-basics/</guid><pubDate>Wed, 03 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;homelab-networking-basics&quot;&gt;Homelab Networking Basics&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Networking can seem daunting, but for a homelab, understanding a few core concepts will get you a long way. This post covers the essentials: IP addresses, subnets, and basic firewall rules.&lt;/p&gt;
&lt;aside aria-label=&quot;Tip&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Tip&lt;/p&gt;&lt;div&gt;&lt;p&gt;Even if you plan to use a managed router, knowing these basics helps you troubleshoot and configure your devices more effectively.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;ip-addresses-your-devices-identity&quot;&gt;IP Addresses: Your Device’s Identity&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;An IP address is like a street address for your device on a network. There are two main types you’ll encounter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IPv4:&lt;/strong&gt; The most common, looks like &lt;code dir=&quot;auto&quot;&gt;192.168.1.100&lt;/code&gt;. It’s a 32-bit number.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;IPv6:&lt;/strong&gt; The newer standard, looks like &lt;code dir=&quot;auto&quot;&gt;2001:0db8:85a3:0000:0000:8a2e:0370:7334&lt;/code&gt;. It’s a 128-bit number, designed to address the exhaustion of IPv4 addresses.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Most homelabs still primarily use IPv4, often with private IP address ranges (e.g., &lt;code dir=&quot;auto&quot;&gt;192.168.0.0/16&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;172.16.0.0/12&lt;/code&gt;, &lt;code dir=&quot;auto&quot;&gt;10.0.0.0/8&lt;/code&gt;) that are not routable on the public internet.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;checking-your-ip-address&quot;&gt;Checking Your IP Address&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;On a Linux machine, you can check your IP address with &lt;code dir=&quot;auto&quot;&gt;ip addr&lt;/code&gt;:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;addr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;show&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;eth0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Example output:&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;2: eth0: &amp;#x3C;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc mq state UP group default qlen 1000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic eth0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;valid_lft 86077sec preferred_lft 86077sec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;inet6 fe80::211:22ff:fe33:4455/64 scope link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span&gt;valid_lft forever preferred_lft forever&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;Here, &lt;code dir=&quot;auto&quot;&gt;192.168.1.100&lt;/code&gt; is the IPv4 address, and &lt;code dir=&quot;auto&quot;&gt;/24&lt;/code&gt; indicates the subnet mask.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;subnets-dividing-your-network&quot;&gt;Subnets: Dividing Your Network&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A subnet divides a larger network into smaller, more manageable segments. The subnet mask determines which part of an IP address identifies the network and which part identifies the host.&lt;/p&gt;























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;IP Address&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Subnet Mask&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Network Address&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Host Address&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;192.168.1.100&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;255.255.255.0&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;192.168.1.0&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;0.0.0.100&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;10.0.0.50&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;255.255.0.0&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;10.0.0.0&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;0.0.0.50&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In CIDR notation, &lt;code dir=&quot;auto&quot;&gt;/24&lt;/code&gt; means the first 24 bits are for the network, and the remaining 8 bits are for hosts. This allows for 254 usable IP addresses (&lt;code dir=&quot;auto&quot;&gt;2^8 - 2&lt;/code&gt;).&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;why-subnet&quot;&gt;Why Subnet?&lt;/h3&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Organization:&lt;/strong&gt; Group devices logically (e.g., servers, IoT, guests).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Security:&lt;/strong&gt; Isolate sensitive devices from less secure ones.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Performance:&lt;/strong&gt; Reduce broadcast traffic within segments.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;h2 id=&quot;firewalls-your-networks-gatekeeper&quot;&gt;Firewalls: Your Network’s Gatekeeper&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;A firewall controls incoming and outgoing network traffic based on predefined security rules. For Linux, &lt;code dir=&quot;auto&quot;&gt;ufw&lt;/code&gt; (Uncomplicated Firewall) is a user-friendly interface for &lt;code dir=&quot;auto&quot;&gt;iptables&lt;/code&gt;.&lt;/p&gt;
&lt;div&gt;&lt;h3 id=&quot;basic-ufw-commands&quot;&gt;Basic UFW Commands&lt;/h3&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Deny all incoming, allow all outgoing by default&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;deny&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;incoming&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;outgoing&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Allow SSH (port 22)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Allow HTTP (port 80) and HTTPS (port 443)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Enable UFW&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;# Check status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;verbose&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Caution&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Caution&lt;/p&gt;&lt;div&gt;&lt;p&gt;Always allow SSH before enabling UFW if you are connected remotely, otherwise you will lose access to your server!&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h3 id=&quot;example-scenario-web-server&quot;&gt;Example Scenario: Web Server&lt;/h3&gt;&lt;/div&gt;
&lt;p&gt;Let’s say you have a web server running on your homelab at &lt;code dir=&quot;auto&quot;&gt;192.168.1.10&lt;/code&gt; and you want to allow external access to it on ports 80 and 443.&lt;/p&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.10&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;80&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proto&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;allow&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;from&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;any&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;to&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.10&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;443&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;proto&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tcp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ufw&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;reload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This explicitly allows traffic to those ports on that specific IP address.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;next-steps&quot;&gt;Next Steps&lt;/h2&gt;&lt;/div&gt;
&lt;p&gt;With these basics, you can start planning your homelab network. Consider drawing a simple network diagram to visualize your devices and their IP addresses. As you grow, you might explore:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VLANs for advanced network segmentation&lt;/li&gt;
&lt;li&gt;VPNs for secure remote access&lt;/li&gt;
&lt;li&gt;DNS servers for local name resolution&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Happy homelabbing!&lt;/p&gt;</content:encoded><category>homelab</category><category>networking</category><category>linux</category></item><item><title>Welcome to the Site</title><link>https://codevibr.dev/blog/welcome-to-the-site/</link><guid isPermaLink="true">https://codevibr.dev/blog/welcome-to-the-site/</guid><description>A temporary welcome post for testing the blog index, featured state, tags, excerpts, and terminal-style examples.

</description><pubDate>Tue, 02 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;welcome-to-the-site&quot;&gt;Welcome to the Site&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;This is starter blog content for checking the blog list, post metadata, featured styling, spacing, and how short technical posts feel inside the current theme.&lt;/p&gt;
&lt;aside aria-label=&quot;Note&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Note&lt;/p&gt;&lt;div&gt;&lt;p&gt;Everything here is easy to replace. The point is to make the site feel occupied before the real posts are ready.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;what-this-blog-might-become&quot;&gt;What This Blog Might Become&lt;/h2&gt;&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Short notes from homelab maintenance.&lt;/li&gt;
&lt;li&gt;Software setup write-ups that are too informal for docs.&lt;/li&gt;
&lt;li&gt;Release notes for site changes.&lt;/li&gt;
&lt;li&gt;Small lessons from debugging sessions.&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--short&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;build&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;div&gt;&lt;h2 id=&quot;example-edit&quot;&gt;Example Edit&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;future-post.md&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;This is a temporary paragraph.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;This is the real story once the project has settled.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;For now, this post is mostly a layout sample with enough realistic structure to make the theme show its personality.&lt;/p&gt;</content:encoded><category>site-notes</category><category>meta</category></item><item><title>Hello World</title><link>https://codevibr.dev/blog/hello-world/</link><guid isPermaLink="true">https://codevibr.dev/blog/hello-world/</guid><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;hello-world&quot;&gt;Hello World&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;Testing Starlight Blog.&lt;/p&gt;</content:encoded></item><item><title>Homelab Notes Coming Soon</title><link>https://codevibr.dev/blog/homelab-notes-coming-soon/</link><guid isPermaLink="true">https://codevibr.dev/blog/homelab-notes-coming-soon/</guid><description>A short temporary post for testing tags, dates, code blocks, and the rhythm of casual technical writing.

</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;h1 id=&quot;homelab-notes-coming-soon&quot;&gt;Homelab Notes Coming Soon&lt;/h1&gt;&lt;/div&gt;
&lt;p&gt;This placeholder post stands in for future notes about servers, networking, containers, backups, and the small decisions that make a homelab easier to maintain.&lt;/p&gt;
&lt;div&gt;&lt;h2 id=&quot;draft-topics&quot;&gt;Draft Topics&lt;/h2&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Fresh Ubuntu Server setup notes.&lt;/li&gt;
&lt;li&gt;Docker Compose service conventions.&lt;/li&gt;
&lt;li&gt;Backup checks that do not require a whole afternoon.&lt;/li&gt;
&lt;li&gt;Troubleshooting logs without losing the thread.&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;ssh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;operator@server.local&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;uptime&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;df&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;aside aria-label=&quot;Tip&quot;&gt;&lt;p aria-hidden=&quot;true&quot;&gt;Tip&lt;/p&gt;&lt;div&gt;&lt;p&gt;Blog posts can stay lighter than docs. A good post can explain what changed, why it mattered, and what you would do differently next time.&lt;/p&gt;&lt;/div&gt;&lt;/aside&gt;
&lt;div&gt;&lt;h2 id=&quot;tiny-file-tree&quot;&gt;Tiny File Tree&lt;/h2&gt;&lt;/div&gt;
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;notes&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;notes/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── ideas.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;├── commands.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;└── screenshots/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;p&gt;This page is intentionally modest so the blog index has more than one post to arrange.&lt;/p&gt;</content:encoded><category>homelab</category><category>linux</category></item></channel></rss>