<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arthur</title>
    <description>The latest articles on DEV Community by Arthur (@arthur_luca).</description>
    <link>https://dev.to/arthur_luca</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4078497%2F225fdf23-256f-428a-a8c0-1b538e08c1ef.png</url>
      <title>DEV Community: Arthur</title>
      <link>https://dev.to/arthur_luca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arthur_luca"/>
    <language>en</language>
    <item>
      <title>How to Set Up a Private VPS Server for Your Website</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Wed, 02 Sep 2026 16:56:07 +0000</pubDate>
      <link>https://dev.to/arthur_luca/how-to-set-up-a-private-vps-server-for-your-website-1if5</link>
      <guid>https://dev.to/arthur_luca/how-to-set-up-a-private-vps-server-for-your-website-1if5</guid>
      <description>&lt;p&gt;I’m Henry, the author of this blog, and I want to show you how I’d actually set up a private VPS server for a website.&lt;/p&gt;

&lt;p&gt;Not the “click three buttons and everything magically works” version.&lt;/p&gt;

&lt;p&gt;I mean the real setup: SSH, users, Nginx, DNS, SSL, firewall rules, updates, backups, and a few things that are easy to forget until something breaks at 2 AM.&lt;/p&gt;

&lt;p&gt;If you’re comfortable with the command line, this is a useful project to build. And honestly, managing your own server is one of those things where you learn a lot very quickly.&lt;/p&gt;

&lt;p&gt;Sometimes the server teaches you.&lt;/p&gt;

&lt;p&gt;Sometimes it teaches you with an error message that makes absolutely no sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We’re Building
&lt;/h2&gt;

&lt;p&gt;By the end, the setup will look roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain
   |
   v
DNS
   |
   v
VPS Public IP
   |
   v
Nginx
   |
   +---- HTTPS
   |
   +---- Website
   |
   +---- Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I’ll use &lt;strong&gt;Ubuntu Server&lt;/strong&gt; in the examples, but the same ideas apply to most Linux VPS environments.&lt;/p&gt;

&lt;p&gt;You’ll need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A VPS with root access&lt;/li&gt;
&lt;li&gt;Ubuntu Server&lt;/li&gt;
&lt;li&gt;A domain name&lt;/li&gt;
&lt;li&gt;SSH access&lt;/li&gt;
&lt;li&gt;A website or web application&lt;/li&gt;
&lt;li&gt;A little patience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is optional, but highly recommended.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Connect to the VPS
&lt;/h2&gt;

&lt;p&gt;After creating the VPS, you’ll normally receive its public IP address.&lt;/p&gt;

&lt;p&gt;Connect through SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh root@YOUR_SERVER_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first thing I’d do is create a normal user instead of doing everything as root.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;adduser henry
usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;henry
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test the new account:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;su - henry
&lt;span class="nb"&gt;sudo whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the output is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you’re good.&lt;/p&gt;

&lt;p&gt;Running everything as root because it’s “faster” is one of those shortcuts that feels clever right up until you accidentally delete something important.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Update the Server
&lt;/h2&gt;

&lt;p&gt;Before installing anything, update the package lists and existing packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also like checking whether the server needs a reboot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /var/run/reboot-required &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Reboot required"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If necessary:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Reconnect after the server comes back.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Set Up SSH Properly
&lt;/h2&gt;

&lt;p&gt;SSH is going to be one of your main doors into the server, so don’t leave it wide open.&lt;/p&gt;

&lt;p&gt;Ideally, use SSH keys instead of password authentication.&lt;/p&gt;

&lt;p&gt;From your local machine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the public key to the VPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh-copy-id henry@YOUR_SERVER_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh henry@YOUR_SERVER_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once key authentication is working, you can disable password authentication in the SSH configuration.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/ssh/sshd_config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PasswordAuthentication yes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change it to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PasswordAuthentication no
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then validate and restart SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;sshd &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart ssh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Always test another SSH session &lt;strong&gt;before closing your current one&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That little habit can save you from locking yourself out of your own server.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Configure the Firewall
&lt;/h2&gt;

&lt;p&gt;Ubuntu commonly uses UFW for basic firewall management.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default deny incoming
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw default allow outgoing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Allow SSH:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow OpenSSH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then allow web traffic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 80/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 443/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check the rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status verbose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You generally don't want random application ports exposed to the internet.&lt;/p&gt;

&lt;p&gt;For example, if your application listens internally on port &lt;code&gt;3000&lt;/code&gt;, there’s usually no reason to expose &lt;code&gt;3000&lt;/code&gt; publicly when Nginx can proxy requests to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Install Nginx
&lt;/h2&gt;

&lt;p&gt;Now we need something to actually serve the website.&lt;/p&gt;

&lt;p&gt;Install Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check whether it is running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also enable it at boot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the VPS IP in a browser.&lt;/p&gt;

&lt;p&gt;If you see the Nginx welcome page, congratulations.&lt;/p&gt;

&lt;p&gt;Your server is officially doing something useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Point Your Domain to the VPS
&lt;/h2&gt;

&lt;p&gt;Now go to your DNS provider and create an &lt;code&gt;A&lt;/code&gt; record.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: A
Name: @
Value: YOUR_SERVER_IP
TTL: 300
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For &lt;code&gt;www&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Type: A
Name: www
Value: YOUR_SERVER_IP
TTL: 300
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;DNS changes aren't always instant, so give it some time.&lt;/p&gt;

&lt;p&gt;You can check the record with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nslookup example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want the domain to resolve to the VPS IP.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Create an Nginx Server Block
&lt;/h2&gt;

&lt;p&gt;Let's assume the domain is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a directory for the site:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /var/www/example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give your user access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; henry:henry /var/www/example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a simple page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /var/www/example.com/index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My VPS Website&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello from my VPS!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;The server is alive. Nobody panic.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create an Nginx configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/nginx/sites-available/example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt; &lt;span class="s"&gt;www.example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;root&lt;/span&gt; &lt;span class="n"&gt;/var/www/example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;index&lt;/span&gt; &lt;span class="s"&gt;index.html&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;try_files&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt; &lt;span class="nv"&gt;$uri&lt;/span&gt;&lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;404&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; /etc/nginx/sites-available/example.com &lt;span class="se"&gt;\&lt;/span&gt;
/etc/nginx/sites-enabled/example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test the configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If everything looks good:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now visit your domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Add HTTPS
&lt;/h2&gt;

&lt;p&gt;Running a website over plain HTTP isn't something I’d recommend.&lt;/p&gt;

&lt;p&gt;Install Certbot:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;certbot python3-certbot-nginx &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then request a certificate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; example.com &lt;span class="nt"&gt;-d&lt;/span&gt; www.example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Certbot can configure the Nginx HTTPS settings for you.&lt;/p&gt;

&lt;p&gt;After that, check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now be able to access:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The browser lock icon isn't decoration. It means the connection is encrypted.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. If You’re Hosting an Application
&lt;/h2&gt;

&lt;p&gt;Static HTML is easy.&lt;/p&gt;

&lt;p&gt;Real applications are where things get interesting.&lt;/p&gt;

&lt;p&gt;Suppose your Node.js application listens on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;127.0.0.1:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You don't necessarily need to expose port &lt;code&gt;3000&lt;/code&gt; publicly.&lt;/p&gt;

&lt;p&gt;Instead, Nginx can sit in front of it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:3000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the public traffic goes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet
   |
 HTTPS
   |
 Nginx
   |
 localhost:3000
   |
 Node.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a much cleaner setup than exposing every service directly to the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Keep the Application Running
&lt;/h2&gt;

&lt;p&gt;If your application crashes, you probably don't want your website disappearing until you manually restart it.&lt;/p&gt;

&lt;p&gt;For Node.js applications, a process manager such as &lt;code&gt;systemd&lt;/code&gt; or another appropriate service manager can handle this.&lt;/p&gt;

&lt;p&gt;A simple &lt;code&gt;systemd&lt;/code&gt; service might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;My Website&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;henry&lt;/span&gt;
&lt;span class="py"&gt;WorkingDirectory&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/var/www/myapp&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/bin/node /var/www/myapp/server.js&lt;/span&gt;
&lt;span class="py"&gt;Restart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;always&lt;/span&gt;
&lt;span class="py"&gt;Environment&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;NODE_ENV=production&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save it as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/systemd/system/myapp.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;myapp
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status myapp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you something much closer to a proper production service instead of keeping a terminal window open and praying nobody closes it.&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Don't Forget Backups
&lt;/h2&gt;

&lt;p&gt;A VPS is not a backup.&lt;/p&gt;

&lt;p&gt;This is worth repeating.&lt;/p&gt;

&lt;p&gt;If the server disappears and your only copy of the database was sitting on that server, the backup plan was basically:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hopefully nothing happens.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That isn't a backup strategy.&lt;/p&gt;

&lt;p&gt;At minimum, think about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website files&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Environment/configuration files&lt;/li&gt;
&lt;li&gt;SSL configuration&lt;/li&gt;
&lt;li&gt;Application data&lt;/li&gt;
&lt;li&gt;Server configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For MySQL, for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mysqldump &lt;span class="nt"&gt;-u&lt;/span&gt; root &lt;span class="nt"&gt;-p&lt;/span&gt; database_name &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; database_backup.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But don't just create backups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test restoring them.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A backup you've never successfully restored is an assumption, not proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Watch the Server
&lt;/h2&gt;

&lt;p&gt;Once the website is online, the job isn't finished.&lt;/p&gt;

&lt;p&gt;I usually keep an eye on:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for memory,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;for disk usage,&lt;/p&gt;

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

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

&lt;/div&gt;



&lt;p&gt;for basic system load information.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;journalctl &lt;span class="nt"&gt;-u&lt;/span&gt; nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use more advanced monitoring stacks when the server grows, such as metrics collection, centralized logging, alerting, and external uptime checks.&lt;/p&gt;

&lt;p&gt;That's where VPS management starts becoming real infrastructure work rather than simply “I installed a website.”&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Choose the Right VPS
&lt;/h2&gt;

&lt;p&gt;You don't always need a huge server.&lt;/p&gt;

&lt;p&gt;A small website might work perfectly well with a modest VPS. A busy application, database-heavy platform, or API service may need more CPU, memory, storage performance, or network capacity.&lt;/p&gt;

&lt;p&gt;When comparing VPS hosting, I’d pay attention to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dedicated or guaranteed resources&lt;/li&gt;
&lt;li&gt;NVMe storage&lt;/li&gt;
&lt;li&gt;Network capacity&lt;/li&gt;
&lt;li&gt;Backup options&lt;/li&gt;
&lt;li&gt;Snapshot support&lt;/li&gt;
&lt;li&gt;DDoS protection&lt;/li&gt;
&lt;li&gt;Data-center location&lt;/li&gt;
&lt;li&gt;IPv4/IPv6 availability&lt;/li&gt;
&lt;li&gt;Root access&lt;/li&gt;
&lt;li&gt;Upgrade options&lt;/li&gt;
&lt;li&gt;Monitoring and support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're comparing VPS hosting providers, &lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;HelloServer&lt;/a&gt; is one option worth checking, especially if you want control over the server environment rather than being locked into a shared hosting setup.&lt;/p&gt;

&lt;p&gt;The important part isn't choosing the biggest plan.&lt;/p&gt;

&lt;p&gt;It's choosing a setup that gives your website enough headroom without paying for resources you'll never use.&lt;/p&gt;

&lt;h2&gt;
  
  
  14. A Few Production Checks
&lt;/h2&gt;

&lt;p&gt;Before calling the server “finished,” I'd check a few things.&lt;/p&gt;

&lt;p&gt;Test Nginx:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nginx &lt;span class="nt"&gt;-t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check listening ports:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ss &lt;span class="nt"&gt;-tulpn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check firewall rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check disk space:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check failed services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--failed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And make sure your website actually works over HTTPS.&lt;/p&gt;

&lt;p&gt;Not just the homepage.&lt;/p&gt;

&lt;p&gt;Test forms, login, uploads, APIs, database connections, redirects, and anything else your application depends on.&lt;/p&gt;

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

&lt;p&gt;Setting up a private VPS for a website isn't particularly difficult once you understand what each layer is doing.&lt;/p&gt;

&lt;p&gt;The important thing is not memorizing commands.&lt;/p&gt;

&lt;p&gt;It's understanding the architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain
  ↓
DNS
  ↓
Firewall
  ↓
Nginx
  ↓
Application
  ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then add the things that keep it reliable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Backups
Monitoring
Updates
Logging
Security
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the difference between simply getting a website online and actually running your own server properly.&lt;/p&gt;

&lt;p&gt;And yes, you'll probably break something while learning.&lt;/p&gt;

&lt;p&gt;That's normal.&lt;/p&gt;

&lt;p&gt;Just make sure you have a backup before you break it.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>vps</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title># Best VPS Hosting for Developers: What to Check Before Deploying</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Mon, 31 Aug 2026 16:37:09 +0000</pubDate>
      <link>https://dev.to/arthur_luca/-best-vps-hosting-for-developers-what-to-check-before-deploying-2k5c</link>
      <guid>https://dev.to/arthur_luca/-best-vps-hosting-for-developers-what-to-check-before-deploying-2k5c</guid>
      <description>&lt;p&gt;If you're deploying a Node.js app, Python API, Docker container, database, or small SaaS project, choosing the &lt;strong&gt;best VPS hosting&lt;/strong&gt; is less about finding the cheapest monthly price and more about getting predictable resources.&lt;/p&gt;

&lt;p&gt;A VPS gives you much more control than shared hosting. You can choose your operating system, install the packages you need, configure the firewall, run background services, and manage the server environment yourself.&lt;/p&gt;

&lt;p&gt;But not every VPS performs the same way.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Makes a VPS Good for Development?
&lt;/h2&gt;

&lt;p&gt;When I'm choosing a VPS for a development or production workload, I normally check these things first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU allocation&lt;/li&gt;
&lt;li&gt;RAM&lt;/li&gt;
&lt;li&gt;NVMe storage&lt;/li&gt;
&lt;li&gt;Network speed&lt;/li&gt;
&lt;li&gt;Virtualization technology&lt;/li&gt;
&lt;li&gt;Data center location&lt;/li&gt;
&lt;li&gt;Backup options&lt;/li&gt;
&lt;li&gt;Root access&lt;/li&gt;
&lt;li&gt;Upgrade options&lt;/li&gt;
&lt;li&gt;Renewal pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The advertised CPU and RAM are only the starting point.&lt;/p&gt;

&lt;p&gt;For example, two VPS plans may both offer 4 vCPUs and 8GB RAM, but their real performance can be different because of the underlying hardware and resource allocation.&lt;/p&gt;

&lt;h2&gt;
  
  
  CPU: Don't Just Count vCPUs
&lt;/h2&gt;

&lt;p&gt;A common mistake is assuming that more vCPUs automatically means better performance.&lt;/p&gt;

&lt;p&gt;For applications that regularly use CPU resources, it's important to know whether the CPU is dedicated, shared, or burstable.&lt;/p&gt;

&lt;p&gt;A small API with occasional traffic might run perfectly well on 2 vCPUs. A build server, database workload, or application processing background jobs may need considerably more.&lt;/p&gt;

&lt;p&gt;I prefer predictable CPU performance over a large specification that looks impressive on a pricing page.&lt;/p&gt;

&lt;h2&gt;
  
  
  RAM Depends on Your Application
&lt;/h2&gt;

&lt;p&gt;RAM requirements vary a lot between workloads.&lt;/p&gt;

&lt;p&gt;A basic web server might be comfortable with 2–4GB, while a stack running Docker containers, a database, Redis, and application workers can quickly need 8GB or more.&lt;/p&gt;

&lt;p&gt;For example, a simple Docker setup might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--name&lt;/span&gt; myapp &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 3000:3000 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--restart&lt;/span&gt; unless-stopped &lt;span class="se"&gt;\&lt;/span&gt;
  myapp:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you start adding a database, reverse proxy, monitoring, and background workers, memory usage becomes much more important.&lt;/p&gt;

&lt;p&gt;Don't buy 32GB of RAM just because it's available. Start with what your workload actually needs and monitor it.&lt;/p&gt;

&lt;h2&gt;
  
  
  NVMe Storage Is Worth Considering
&lt;/h2&gt;

&lt;p&gt;Storage performance can become a bottleneck surprisingly quickly.&lt;/p&gt;

&lt;p&gt;This matters particularly for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;WordPress&lt;/li&gt;
&lt;li&gt;WooCommerce&lt;/li&gt;
&lt;li&gt;Docker workloads&lt;/li&gt;
&lt;li&gt;Build servers&lt;/li&gt;
&lt;li&gt;Applications with frequent file operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An &lt;strong&gt;NVMe VPS&lt;/strong&gt; can provide considerably better I/O performance than older storage technologies.&lt;/p&gt;

&lt;p&gt;But the word "NVMe" alone isn't enough. I/O limits and the provider's underlying storage infrastructure can still affect performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  KVM vs Other Virtualization
&lt;/h2&gt;

&lt;p&gt;For many developers, KVM is a good choice because it provides a more complete virtualized environment and gives you greater control over the operating system.&lt;/p&gt;

&lt;p&gt;This becomes useful when you're running custom kernels, Docker, different Linux distributions, or software that requires more control over the environment.&lt;/p&gt;

&lt;p&gt;It's one of the specifications I check when comparing VPS providers.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple VPS Setup for a Web Application
&lt;/h2&gt;

&lt;p&gt;A typical small application might use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Internet
   |
   v
Nginx
   |
   v
Node.js / Python App
   |
   +---- PostgreSQL
   |
   +---- Redis
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The VPS doesn't need to be enormous for this architecture.&lt;/p&gt;

&lt;p&gt;A small production application could start around:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2–4 vCPU
4–8GB RAM
50–100GB NVMe
1Gbps network
Linux + KVM
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The correct size depends on traffic and application behavior, but this is a reasonable starting point for many smaller projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monitor Before You Upgrade
&lt;/h2&gt;

&lt;p&gt;Instead of guessing when your VPS needs more resources, monitor it.&lt;/p&gt;

&lt;p&gt;On Linux, commands such as these are useful:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;top
free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;uptime&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For disk usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for memory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If CPU, RAM, or disk I/O is consistently close to its limits, then upgrading makes sense.&lt;/p&gt;

&lt;p&gt;A temporary spike doesn't necessarily mean you need a bigger server.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't Forget Server Security
&lt;/h2&gt;

&lt;p&gt;Once you have root access, you're responsible for a lot more than application code.&lt;/p&gt;

&lt;p&gt;At minimum, I'd recommend:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a non-root administrative user, use SSH keys, configure a firewall, close unused ports, and keep your software updated.&lt;/p&gt;

&lt;p&gt;For Ubuntu, UFW provides a simple starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow OpenSSH
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 80/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 443/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only expose services that actually need to be reachable from the internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Much Does the VPS Really Cost?
&lt;/h2&gt;

&lt;p&gt;The advertised price isn't always the final price.&lt;/p&gt;

&lt;p&gt;Before choosing a provider, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Renewal pricing&lt;/li&gt;
&lt;li&gt;Backup charges&lt;/li&gt;
&lt;li&gt;Control panel fees&lt;/li&gt;
&lt;li&gt;Additional IP costs&lt;/li&gt;
&lt;li&gt;Windows licensing, if required&lt;/li&gt;
&lt;li&gt;Managed support fees&lt;/li&gt;
&lt;li&gt;Storage upgrades&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A VPS that costs slightly more per month can sometimes be cheaper over a longer period if it includes features you'd otherwise pay for separately.&lt;/p&gt;

&lt;p&gt;If you're comparing &lt;strong&gt;best VPS hosting&lt;/strong&gt; options, you can also check &lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;HelloServer VPS hosting&lt;/a&gt; and compare its available configurations with your application's actual requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Best VPS Hosting: A Practical Checklist
&lt;/h2&gt;

&lt;p&gt;Before deploying, I'd use this checklist:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ ] KVM virtualization
[ ] Predictable CPU resources
[ ] Enough RAM for the application
[ ] NVMe storage
[ ] Suitable network capacity
[ ] Data center close to users
[ ] Root access
[ ] Backup solution
[ ] Clear renewal pricing
[ ] Easy resource upgrades
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "best" VPS isn't necessarily the one with the highest CPU count or the lowest price.&lt;/p&gt;

&lt;p&gt;It's the one that gives your application the resources it actually needs without paying for capacity that will sit unused.&lt;/p&gt;

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

&lt;p&gt;A VPS is a good middle ground for developers who have outgrown shared hosting but don't need an entire physical server.&lt;/p&gt;

&lt;p&gt;For a small application, start with a sensible configuration, monitor CPU, memory, storage, and network usage, and scale when the workload actually requires it.&lt;/p&gt;

&lt;p&gt;That approach usually makes more sense than buying an oversized VPS from day one.&lt;/p&gt;

</description>
      <category>vps</category>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Why Is Your VPS Running Slow? 6 Hidden Problems You Should Check</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Sun, 30 Aug 2026 04:43:02 +0000</pubDate>
      <link>https://dev.to/arthur_luca/why-is-your-vps-running-slow-6-hidden-problems-you-should-check-505b</link>
      <guid>https://dev.to/arthur_luca/why-is-your-vps-running-slow-6-hidden-problems-you-should-check-505b</guid>
      <description>&lt;p&gt;Have you ever opened your website and thought:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Why is my server suddenly so slow?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Your internet connection is fine, but the website takes several seconds to load.&lt;/p&gt;

&lt;p&gt;SSH feels slow.&lt;/p&gt;

&lt;p&gt;Your application takes longer to respond.&lt;/p&gt;

&lt;p&gt;Sometimes, everything works perfectly in the morning and becomes painfully slow when traffic increases.&lt;/p&gt;

&lt;p&gt;If this sounds familiar, the problem may not be your website itself.&lt;/p&gt;

&lt;p&gt;It could be your &lt;strong&gt;VPS configuration, server resources, background processes, storage, or network performance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before moving to a completely different server, there are several things you should check.&lt;/p&gt;

&lt;p&gt;In this article, we'll look at six common reasons why a VPS becomes slow and what you can do about them.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Your VPS May Not Have Enough CPU
&lt;/h2&gt;

&lt;p&gt;CPU is responsible for processing the tasks running on your server.&lt;/p&gt;

&lt;p&gt;If your application receives more traffic or performs more complicated operations, CPU usage can increase quickly.&lt;/p&gt;

&lt;p&gt;You can check CPU activity using:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Or install &lt;code&gt;htop&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;htop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;/div&gt;



&lt;p&gt;Look for processes that continuously consume a large percentage of CPU.&lt;/p&gt;

&lt;p&gt;For example, you might find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PHP processes&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Node.js applications&lt;/li&gt;
&lt;li&gt;Docker containers&lt;/li&gt;
&lt;li&gt;Background scripts&lt;/li&gt;
&lt;li&gt;Web server processes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If one application is constantly using most of your CPU, investigate the application before simply upgrading your VPS.&lt;/p&gt;

&lt;p&gt;However, if your workload genuinely requires more processing power, choosing a VPS with additional CPU resources can make a significant difference.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. Low RAM Can Cause Performance Problems
&lt;/h1&gt;

&lt;p&gt;Another common issue is insufficient RAM.&lt;/p&gt;

&lt;p&gt;RAM is used by your operating system and applications while they are running.&lt;/p&gt;

&lt;p&gt;A small VPS can work perfectly for a lightweight website but struggle when you start running multiple services.&lt;/p&gt;

&lt;p&gt;For example, you might have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;PHP&lt;/li&gt;
&lt;li&gt;WordPress&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Monitoring software&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all running on the same server.&lt;/p&gt;

&lt;p&gt;Check memory usage with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also use:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;to see which applications are consuming memory.&lt;/p&gt;

&lt;p&gt;If the system frequently runs out of RAM, Linux may start relying more heavily on swap.&lt;/p&gt;

&lt;p&gt;Swap is useful, but it is much slower than physical RAM.&lt;/p&gt;

&lt;p&gt;This can result in noticeable performance problems.&lt;/p&gt;

&lt;h3&gt;
  
  
  The solution?
&lt;/h3&gt;

&lt;p&gt;First identify which applications are consuming memory.&lt;/p&gt;

&lt;p&gt;Then optimize them.&lt;/p&gt;

&lt;p&gt;If your workload genuinely needs more memory, moving to a VPS with additional RAM may be the better solution.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Your Storage Could Be the Bottleneck
&lt;/h1&gt;

&lt;p&gt;Many people check CPU and RAM but completely forget about storage performance.&lt;/p&gt;

&lt;p&gt;Your VPS constantly reads and writes data.&lt;/p&gt;

&lt;p&gt;Databases, websites, logs, backups, and applications can all generate disk activity.&lt;/p&gt;

&lt;p&gt;Check available storage with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If your disk is almost full, investigate which directories are using the most space.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /var/&lt;span class="k"&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also investigate large log files, backups, databases, and application files.&lt;/p&gt;

&lt;p&gt;But available space isn't the only thing that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disk I/O performance matters too.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A database-heavy application can become slow if storage operations are taking too long.&lt;/p&gt;

&lt;p&gt;That's why VPS performance isn't simply about having more CPU.&lt;/p&gt;

&lt;p&gt;Your CPU, RAM, storage, and network all work together.&lt;/p&gt;

&lt;h1&gt;
  
  
  4. Too Many Background Tasks
&lt;/h1&gt;

&lt;p&gt;Sometimes your website isn't causing the slowdown at all.&lt;/p&gt;

&lt;p&gt;A scheduled task might be running in the background.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Automated backups&lt;/li&gt;
&lt;li&gt;Cron jobs&lt;/li&gt;
&lt;li&gt;Database maintenance&lt;/li&gt;
&lt;li&gt;Security scans&lt;/li&gt;
&lt;li&gt;Software updates&lt;/li&gt;
&lt;li&gt;Large file transfers&lt;/li&gt;
&lt;li&gt;Docker tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can check scheduled cron jobs with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crontab &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also inspect running processes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%cpu | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For memory usage:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%mem | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you notice that a backup starts exactly when your website becomes slow, you may have found the problem.&lt;/p&gt;

&lt;p&gt;Try scheduling resource-intensive tasks during periods of lower traffic.&lt;/p&gt;

&lt;h1&gt;
  
  
  5. Network Latency Can Affect Your Website
&lt;/h1&gt;

&lt;p&gt;A VPS can have plenty of CPU and RAM and still feel slow.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because the network can also become a bottleneck.&lt;/p&gt;

&lt;p&gt;This is especially important if your application communicates with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;External APIs&lt;/li&gt;
&lt;li&gt;Remote databases&lt;/li&gt;
&lt;li&gt;Cloud storage&lt;/li&gt;
&lt;li&gt;Payment services&lt;/li&gt;
&lt;li&gt;Other servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can perform a basic connectivity test with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ping example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also check DNS resolution with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nslookup example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dig example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the problem only affects users in a particular geographical region, network location and latency may deserve closer attention.&lt;/p&gt;

&lt;h1&gt;
  
  
  6. Your VPS Plan May Simply Be Too Small
&lt;/h1&gt;

&lt;p&gt;Sometimes there is nothing technically wrong with your server.&lt;/p&gt;

&lt;p&gt;Your workload has simply grown.&lt;/p&gt;

&lt;p&gt;Maybe your website started receiving more visitors.&lt;/p&gt;

&lt;p&gt;Maybe you launched a new application.&lt;/p&gt;

&lt;p&gt;Maybe you're running a database alongside your website.&lt;/p&gt;

&lt;p&gt;Maybe you're hosting multiple websites on the same VPS.&lt;/p&gt;

&lt;p&gt;A configuration that worked six months ago may no longer be enough today.&lt;/p&gt;

&lt;p&gt;This is one reason why choosing VPS hosting based on your actual workload is important.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“What is the cheapest VPS?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;a better question is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“What resources does my application actually need?”&lt;/strong&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  How to Choose the Right VPS
&lt;/h1&gt;

&lt;p&gt;When choosing a VPS, don't focus only on the price.&lt;/p&gt;

&lt;p&gt;Look at the complete configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  CPU
&lt;/h3&gt;

&lt;p&gt;Consider how many processing resources your applications need.&lt;/p&gt;

&lt;h3&gt;
  
  
  RAM
&lt;/h3&gt;

&lt;p&gt;Make sure your server has enough memory for the operating system, database, applications, and expected traffic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage
&lt;/h3&gt;

&lt;p&gt;Check both storage capacity and storage performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bandwidth
&lt;/h3&gt;

&lt;p&gt;If your website serves large files, images, videos, or receives significant traffic, bandwidth can become important.&lt;/p&gt;

&lt;h3&gt;
  
  
  Server Location
&lt;/h3&gt;

&lt;p&gt;Choose a location that makes sense for your target audience.&lt;/p&gt;

&lt;p&gt;Lower network latency can improve the experience for users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scalability
&lt;/h3&gt;

&lt;p&gt;Your hosting environment should allow you to increase resources when your project grows.&lt;/p&gt;

&lt;h1&gt;
  
  
  Why VPS Hosting Can Be Useful for Growing Projects
&lt;/h1&gt;

&lt;p&gt;A VPS provides a more controlled hosting environment than basic shared hosting.&lt;/p&gt;

&lt;p&gt;You can configure your server according to your application's requirements and install the software you need.&lt;/p&gt;

&lt;p&gt;This can be useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Business websites&lt;/li&gt;
&lt;li&gt;WordPress websites&lt;/li&gt;
&lt;li&gt;Web applications&lt;/li&gt;
&lt;li&gt;Development environments&lt;/li&gt;
&lt;li&gt;E-commerce projects&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Docker applications&lt;/li&gt;
&lt;li&gt;Developer projects&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, VPS hosting also requires some server management knowledge.&lt;/p&gt;

&lt;p&gt;You may need to monitor resources, update software, configure security, manage backups, and troubleshoot performance problems.&lt;/p&gt;

&lt;p&gt;That's why choosing a reliable VPS provider is important.&lt;/p&gt;

&lt;h1&gt;
  
  
  About HelloServer VPS Hosting
&lt;/h1&gt;

&lt;p&gt;If you're looking for a VPS hosting environment for websites, applications, development projects, or other server workloads, &lt;strong&gt;HelloServer&lt;/strong&gt; offers VPS hosting plans designed around different resource requirements.&lt;/p&gt;

&lt;p&gt;The important thing is to select a plan based on your actual project.&lt;/p&gt;

&lt;p&gt;For a lightweight website, you may not need a large configuration.&lt;/p&gt;

&lt;p&gt;For a database-heavy application, development environment, or high-traffic website, you may need additional CPU, RAM, storage, or bandwidth.&lt;/p&gt;

&lt;p&gt;Instead of paying for resources you don't need, start with a configuration that matches your workload and scale when your project grows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HelloServer VPS Hosting&lt;/strong&gt; can be considered when you're looking for a dedicated virtual server environment with configurable resources.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Quick VPS Performance Checklist
&lt;/h1&gt;

&lt;p&gt;If your VPS suddenly becomes slow, check these things first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ CPU usage
✓ RAM usage
✓ Swap usage
✓ Disk space
✓ Disk I/O
✓ Network latency
✓ Background processes
✓ Cron jobs
✓ Database performance
✓ Website traffic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can start with a few simple commands:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;free &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





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

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux &lt;span class="nt"&gt;--sort&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;-%cpu | &lt;span class="nb"&gt;head&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands can give you a basic picture of what is happening inside your server.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;A slow VPS doesn't always mean that you need to replace your hosting provider.&lt;/p&gt;

&lt;p&gt;Sometimes the problem is simply a CPU-heavy process.&lt;/p&gt;

&lt;p&gt;Sometimes you don't have enough RAM.&lt;/p&gt;

&lt;p&gt;Sometimes storage is nearly full.&lt;/p&gt;

&lt;p&gt;Sometimes a backup or cron job is running at the wrong time.&lt;/p&gt;

&lt;p&gt;And sometimes your project has simply grown beyond the resources of your current VPS.&lt;/p&gt;

&lt;p&gt;The best approach is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Measure first. Diagnose the problem. Then upgrade or optimize.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you understand your workload, choosing the right VPS becomes much easier.&lt;/p&gt;

&lt;p&gt;Whether you're running a small website, a business application, a development project, or a growing online service, the right VPS configuration can provide the resources and control you need to keep your project running smoothly.&lt;/p&gt;

&lt;p&gt;If you're exploring VPS options, you can also take a look at &lt;strong&gt;&lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;HelloServer &lt;/a&gt;VPS Hosting&lt;/strong&gt; and compare the available resources with the requirements of your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't choose a server just because it is cheap. Choose one that is right for what you're building.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>vps</category>
      <category>webdev</category>
      <category>linux</category>
      <category>devops</category>
    </item>
    <item>
      <title>9 Advanced SEO Skills Developers Should Know Beyond the Basics</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Sat, 29 Aug 2026 07:43:22 +0000</pubDate>
      <link>https://dev.to/arthur_luca/9-advanced-seo-skills-developers-should-know-beyond-the-basics-3d42</link>
      <guid>https://dev.to/arthur_luca/9-advanced-seo-skills-developers-should-know-beyond-the-basics-3d42</guid>
      <description>&lt;p&gt;I have seen many technically strong websites struggle with organic visibility. The problem is not always the content.&lt;/p&gt;

&lt;p&gt;Sometimes the problem is hidden inside the architecture.&lt;/p&gt;

&lt;p&gt;A JavaScript application renders important content too late.&lt;br&gt;
A routing change creates thousands of unwanted URLs.&lt;br&gt;
A deployment introduces unexpected 404s.&lt;br&gt;
A CDN serves an outdated version of a page.&lt;br&gt;
A server becomes slow under load.&lt;/p&gt;

&lt;p&gt;These problems rarely look like traditional SEO problems.&lt;/p&gt;

&lt;p&gt;They are engineering problems with SEO consequences.&lt;/p&gt;

&lt;p&gt;That is why developers should learn SEO beyond keywords and meta tags.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Rendering Diagnostics
&lt;/h2&gt;

&lt;p&gt;One of the most valuable developer SEO skills is understanding what happens between the initial server response and the final rendered page.&lt;/p&gt;

&lt;p&gt;Do not only look at what appears in the browser.&lt;/p&gt;

&lt;p&gt;Compare the initial HTML with the rendered content.&lt;/p&gt;

&lt;p&gt;Check whether important content depends on JavaScript.&lt;/p&gt;

&lt;p&gt;Check whether API requests fail.&lt;/p&gt;

&lt;p&gt;Check whether critical links exist after rendering.&lt;/p&gt;

&lt;p&gt;Check whether metadata and structured data are present in the final page.&lt;/p&gt;

&lt;p&gt;This becomes especially important for JavaScript-heavy applications.&lt;/p&gt;

&lt;p&gt;A page can look perfect to a visitor and still create problems for search engines.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. URL Architecture and Crawl Waste
&lt;/h2&gt;

&lt;p&gt;Developers usually design URLs around application routes.&lt;/p&gt;

&lt;p&gt;Large websites need another layer of thinking.&lt;/p&gt;

&lt;p&gt;How many URLs can the application generate?&lt;/p&gt;

&lt;p&gt;Filters can multiply URLs.&lt;/p&gt;

&lt;p&gt;Sorting can multiply URLs.&lt;/p&gt;

&lt;p&gt;Search parameters can multiply URLs.&lt;/p&gt;

&lt;p&gt;Tracking parameters can multiply URLs.&lt;/p&gt;

&lt;p&gt;Localization can multiply URLs again.&lt;/p&gt;

&lt;p&gt;A small routing decision can eventually create thousands or millions of URL variations.&lt;/p&gt;

&lt;p&gt;The important skill is not simply knowing robots.txt.&lt;/p&gt;

&lt;p&gt;It is understanding how URL generation, internal links, canonical signals, and crawl controls work together.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Server Log Analysis
&lt;/h2&gt;

&lt;p&gt;Server logs are one of the most useful sources for technical SEO debugging.&lt;/p&gt;

&lt;p&gt;Search tools can show you what is happening.&lt;/p&gt;

&lt;p&gt;Logs can help explain why.&lt;/p&gt;

&lt;p&gt;Look for unusual crawler activity.&lt;/p&gt;

&lt;p&gt;Look for repeated requests to parameter URLs.&lt;/p&gt;

&lt;p&gt;Look for large groups of 404 responses.&lt;/p&gt;

&lt;p&gt;Look for 5xx errors.&lt;/p&gt;

&lt;p&gt;Look for redirect chains.&lt;/p&gt;

&lt;p&gt;Look for changes in response time.&lt;/p&gt;

&lt;p&gt;This can reveal problems that are difficult to identify from a normal SEO audit.&lt;/p&gt;

&lt;p&gt;For developers, this is a major advantage.&lt;/p&gt;

&lt;p&gt;You already understand what the server is doing.&lt;/p&gt;

&lt;p&gt;You just need to connect those signals with search behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Canonical Signal Auditing
&lt;/h2&gt;

&lt;p&gt;Adding a canonical URL is easy.&lt;/p&gt;

&lt;p&gt;Maintaining consistent canonical signals across a large application is much harder.&lt;/p&gt;

&lt;p&gt;A page can have one canonical URL while internal links point to another.&lt;/p&gt;

&lt;p&gt;The sitemap can contain a third version.&lt;/p&gt;

&lt;p&gt;Redirects can introduce another destination.&lt;/p&gt;

&lt;p&gt;Parameters can create even more variations.&lt;/p&gt;

&lt;p&gt;Now the search engine has multiple signals to interpret.&lt;/p&gt;

&lt;p&gt;The advanced skill is auditing the complete URL signal chain.&lt;/p&gt;

&lt;p&gt;Do not check the canonical tag alone.&lt;/p&gt;

&lt;p&gt;Check the canonical.&lt;/p&gt;

&lt;p&gt;Check internal links.&lt;/p&gt;

&lt;p&gt;Check redirects.&lt;/p&gt;

&lt;p&gt;Check the sitemap.&lt;/p&gt;

&lt;p&gt;Check URL variants.&lt;/p&gt;

&lt;p&gt;The goal is consistency.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. SEO-Aware Deployment Monitoring
&lt;/h2&gt;

&lt;p&gt;A deployment can change more than application behavior.&lt;/p&gt;

&lt;p&gt;It can change search visibility.&lt;/p&gt;

&lt;p&gt;A routing update can alter URLs.&lt;/p&gt;

&lt;p&gt;A framework update can change rendered HTML.&lt;/p&gt;

&lt;p&gt;A redesign can remove internal links.&lt;/p&gt;

&lt;p&gt;A security rule can affect crawlers.&lt;/p&gt;

&lt;p&gt;A CDN change can alter cached responses.&lt;/p&gt;

&lt;p&gt;A database change can increase response times.&lt;/p&gt;

&lt;p&gt;Developers should therefore treat major deployments as potential SEO events.&lt;/p&gt;

&lt;p&gt;After a release, monitor important URLs.&lt;/p&gt;

&lt;p&gt;Check response codes.&lt;/p&gt;

&lt;p&gt;Check rendering.&lt;/p&gt;

&lt;p&gt;Check metadata.&lt;/p&gt;

&lt;p&gt;Check internal links.&lt;/p&gt;

&lt;p&gt;Check performance.&lt;/p&gt;

&lt;p&gt;This is much better than discovering an SEO problem weeks after production traffic has already changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Cache Invalidation and Search Visibility
&lt;/h2&gt;

&lt;p&gt;Caching is normally discussed as a performance optimization.&lt;/p&gt;

&lt;p&gt;But stale cache content can also create SEO problems.&lt;/p&gt;

&lt;p&gt;Imagine the origin server has new metadata and updated canonical signals.&lt;/p&gt;

&lt;p&gt;The edge still serves an older response.&lt;/p&gt;

&lt;p&gt;Now different requests can receive different versions of the page.&lt;/p&gt;

&lt;p&gt;Developers working with CDNs and caching layers should understand cache keys, TTLs, purge behavior, stale responses, and cache-control policies.&lt;/p&gt;

&lt;p&gt;Performance is not simply about making pages faster.&lt;/p&gt;

&lt;p&gt;It is also about making sure the right version of the page reaches the right request.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Infrastructure-Level SEO Performance
&lt;/h2&gt;

&lt;p&gt;This is where developers can go much deeper than a typical SEO checklist.&lt;/p&gt;

&lt;p&gt;If a page is slow, find the bottleneck.&lt;/p&gt;

&lt;p&gt;Is the application waiting for the database?&lt;/p&gt;

&lt;p&gt;Is CPU usage too high?&lt;/p&gt;

&lt;p&gt;Is memory pressure affecting performance?&lt;/p&gt;

&lt;p&gt;Is storage latency increasing?&lt;/p&gt;

&lt;p&gt;Is an API response slow?&lt;/p&gt;

&lt;p&gt;Is the cache missing?&lt;/p&gt;

&lt;p&gt;Is the server generating expensive HTML for every request?&lt;/p&gt;

&lt;p&gt;The frontend may only be showing the symptom.&lt;/p&gt;

&lt;p&gt;The actual problem can exist several layers below it.&lt;/p&gt;

&lt;p&gt;For applications that need more control over compute, storage, networking, and server configuration, a VPS can become part of the performance strategy. &lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;HelloServer &lt;/a&gt;provides VPS infrastructure for developers and businesses, making it relevant when server-level control is part of the performance discussion.&lt;/p&gt;

&lt;p&gt;The point is not to change hosting blindly.&lt;/p&gt;

&lt;p&gt;The point is to identify the infrastructure layer responsible for the bottleneck.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. SEO Observability
&lt;/h2&gt;

&lt;p&gt;Most applications monitor uptime.&lt;/p&gt;

&lt;p&gt;More mature systems monitor application performance.&lt;/p&gt;

&lt;p&gt;SEO-aware systems can monitor technical signals that may affect organic visibility.&lt;/p&gt;

&lt;p&gt;Useful signals include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;404 rate&lt;/li&gt;
&lt;li&gt;5xx rate&lt;/li&gt;
&lt;li&gt;Redirect volume&lt;/li&gt;
&lt;li&gt;Response time&lt;/li&gt;
&lt;li&gt;TTFB&lt;/li&gt;
&lt;li&gt;Cache hit ratio&lt;/li&gt;
&lt;li&gt;Render failures&lt;/li&gt;
&lt;li&gt;API failures&lt;/li&gt;
&lt;li&gt;URL generation anomalies&lt;/li&gt;
&lt;li&gt;Deployment-related changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine a release suddenly generates thousands of 404 responses.&lt;/p&gt;

&lt;p&gt;You should see the anomaly immediately.&lt;/p&gt;

&lt;p&gt;You should not wait for an organic traffic report to tell you something went wrong.&lt;/p&gt;

&lt;p&gt;That is the difference between reactive SEO and SEO observability.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Think of SEO as a Distributed-System Problem
&lt;/h2&gt;

&lt;p&gt;Modern websites are rarely just a frontend and a server.&lt;/p&gt;

&lt;p&gt;They can involve:&lt;/p&gt;

&lt;p&gt;Browser → CDN → Load Balancer → Web Server → Application → API → Database → Cache → Third-Party Services&lt;/p&gt;

&lt;p&gt;Search engines interact with that entire environment.&lt;/p&gt;

&lt;p&gt;A problem at any layer can affect what gets discovered, rendered, indexed, or served.&lt;/p&gt;

&lt;p&gt;This is why developers should stop treating SEO as something added after development.&lt;/p&gt;

&lt;p&gt;Some SEO problems are architectural problems.&lt;/p&gt;

&lt;p&gt;Some are infrastructure problems.&lt;/p&gt;

&lt;p&gt;Some are deployment problems.&lt;/p&gt;

&lt;p&gt;Some are observability problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer SEO Workflow I Prefer
&lt;/h2&gt;

&lt;p&gt;When organic visibility changes, do not immediately start changing keywords.&lt;/p&gt;

&lt;p&gt;Trace the system.&lt;/p&gt;

&lt;p&gt;Start with the URL.&lt;/p&gt;

&lt;p&gt;Then inspect the HTTP response.&lt;/p&gt;

&lt;p&gt;Then inspect rendered content.&lt;/p&gt;

&lt;p&gt;Then check internal links and canonical signals.&lt;/p&gt;

&lt;p&gt;Then investigate crawling.&lt;/p&gt;

&lt;p&gt;Then inspect server logs.&lt;/p&gt;

&lt;p&gt;Then check infrastructure performance.&lt;/p&gt;

&lt;p&gt;Finally, compare the technical changes with the indexing outcome.&lt;/p&gt;

&lt;p&gt;This approach helps separate symptoms from causes.&lt;/p&gt;

&lt;p&gt;A traffic drop is a symptom.&lt;/p&gt;

&lt;p&gt;A 500 response can be a cause.&lt;/p&gt;

&lt;p&gt;A rendering failure can be a cause.&lt;/p&gt;

&lt;p&gt;A crawl trap can be an architectural cause.&lt;/p&gt;

&lt;p&gt;A slow database query can become a performance cause.&lt;/p&gt;

&lt;p&gt;That distinction makes technical SEO much easier to debug.&lt;/p&gt;

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

&lt;p&gt;Developers do not need to become traditional SEO specialists.&lt;/p&gt;

&lt;p&gt;They need to understand the technical layer that search visibility depends on.&lt;/p&gt;

&lt;p&gt;Rendering.&lt;/p&gt;

&lt;p&gt;URL architecture.&lt;/p&gt;

&lt;p&gt;Server logs.&lt;/p&gt;

&lt;p&gt;Canonical signals.&lt;/p&gt;

&lt;p&gt;Deployment changes.&lt;/p&gt;

&lt;p&gt;Caching.&lt;/p&gt;

&lt;p&gt;Infrastructure performance.&lt;/p&gt;

&lt;p&gt;Observability.&lt;/p&gt;

&lt;p&gt;Distributed systems.&lt;/p&gt;

&lt;p&gt;These skills go far beyond adding keywords to a page.&lt;/p&gt;

&lt;p&gt;Once you understand how a URL travels through the application and infrastructure before becoming a search result, SEO starts looking less like marketing and more like engineering.&lt;/p&gt;

&lt;p&gt;And that is where developers have a real advantage.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Build Your First MCP Tool in 2026: A Developer Skill Worth Learning</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Fri, 28 Aug 2026 15:51:19 +0000</pubDate>
      <link>https://dev.to/arthur_luca/build-your-first-mcp-tool-in-2026-a-developer-skill-worth-learning-m47</link>
      <guid>https://dev.to/arthur_luca/build-your-first-mcp-tool-in-2026-a-developer-skill-worth-learning-m47</guid>
      <description>&lt;p&gt;I am an Arthur, and in this blog I want to talk about a developer skill that I think will become more useful in 2026: &lt;strong&gt;building tools for AI agents with Model Context Protocol (MCP).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are a developer, you have probably noticed that AI coding tools are changing the way we write software.&lt;/p&gt;

&lt;p&gt;AI can already generate functions, fix bugs, explain code, write tests, and work with large codebases. But there is one important step beyond simply asking AI to write code.&lt;/p&gt;

&lt;p&gt;That step is giving AI access to &lt;strong&gt;your own tools, APIs, databases, files, and workflows&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is where MCP becomes interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is MCP?
&lt;/h2&gt;

&lt;p&gt;MCP stands for &lt;strong&gt;Model Context Protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In simple words, MCP gives AI applications a standard way to communicate with external tools and data.&lt;/p&gt;

&lt;p&gt;Think about it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Assistant
     |
     v
   MCP
     |
     +------ Database
     |
     +------ API
     |
     +------ File System
     |
     +------ Internal Tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without a standard protocol, every AI application may need a different integration.&lt;/p&gt;

&lt;p&gt;With MCP, a developer can create a tool that exposes a specific capability in a structured way.&lt;/p&gt;

&lt;p&gt;For example, you could create an MCP tool that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;searches your database&lt;/li&gt;
&lt;li&gt;checks server status&lt;/li&gt;
&lt;li&gt;reads project documentation&lt;/li&gt;
&lt;li&gt;creates a GitHub issue&lt;/li&gt;
&lt;li&gt;checks website uptime&lt;/li&gt;
&lt;li&gt;searches company data&lt;/li&gt;
&lt;li&gt;runs a controlled internal operation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The official MCP project has continued to expand in 2026, including a new specification with a stateless protocol core, Tasks, improved authorization, and other changes aimed at production use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should Developers Learn MCP in 2026?
&lt;/h2&gt;

&lt;p&gt;AI coding agents are becoming a normal part of software development.&lt;/p&gt;

&lt;p&gt;A 2026 JetBrains developer survey found that 90% of professional developers surveyed were using AI coding agents at work at least weekly, while 68% were using them daily.&lt;/p&gt;

&lt;p&gt;This does not mean developers will stop coding.&lt;/p&gt;

&lt;p&gt;It means the job is slowly changing.&lt;/p&gt;

&lt;p&gt;Instead of only writing code manually, developers increasingly need to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how AI agents work&lt;/li&gt;
&lt;li&gt;how tools are exposed to agents&lt;/li&gt;
&lt;li&gt;how APIs connect to AI&lt;/li&gt;
&lt;li&gt;how to validate AI-generated actions&lt;/li&gt;
&lt;li&gt;how to secure agent access&lt;/li&gt;
&lt;li&gt;how to build reliable developer workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why &lt;strong&gt;MCP development&lt;/strong&gt; is a useful skill to explore.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP Is Not Just Another AI Prompt
&lt;/h2&gt;

&lt;p&gt;One mistake I see developers make is thinking that AI development is mainly about writing better prompts.&lt;/p&gt;

&lt;p&gt;Prompts are useful, but production systems need more.&lt;/p&gt;

&lt;p&gt;Imagine you have an internal API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_server_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A normal application can call this function.&lt;/p&gt;

&lt;p&gt;But what if an AI agent could safely discover and use this capability when needed?&lt;/p&gt;

&lt;p&gt;That is where a tool-based architecture becomes useful.&lt;/p&gt;

&lt;p&gt;The AI does not need to magically know your server information.&lt;/p&gt;

&lt;p&gt;You give it a controlled tool.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
 |
 | "Is server-102 healthy?"
 v
AI Agent
 |
 | calls tool
 v
get_server_status()
 |
 v
Your API / Database
 |
 v
Result
 |
 v
AI Agent
 |
 v
Human-readable answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much more useful than simply putting everything inside a prompt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your First MCP Tool
&lt;/h2&gt;

&lt;p&gt;Let's look at a small example.&lt;/p&gt;

&lt;p&gt;Python is a good language for learning this because the syntax is simple.&lt;/p&gt;

&lt;p&gt;A basic MCP server can expose a tool that returns information.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server.fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Developer Tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_server_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Return the current status of a server.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# Example data
&lt;/span&gt;    &lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server-101&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server-102&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stopped&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server-103&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maintenance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;servers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;unknown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The interesting part is this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_server_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;server_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are telling the MCP server that this function is a tool.&lt;/p&gt;

&lt;p&gt;Now an MCP-compatible client can discover the tool and potentially call it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add a Database Tool
&lt;/h2&gt;

&lt;p&gt;Let's make the example a little more realistic.&lt;/p&gt;

&lt;p&gt;Suppose you have a SQLite database containing users.&lt;/p&gt;

&lt;p&gt;A simple database function could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;users.db&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;cursor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELECT id, name, email FROM users WHERE email = ?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can expose a safe version of this operation as an MCP tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find_user_by_email&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;find_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;User not found&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user_email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;

    &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Name: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Email: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user_email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Developers can also use MCP with existing APIs and infrastructure services such as &lt;a href="https://www.seimaxim.com/" rel="noopener noreferrer"&gt;seimaxim &lt;/a&gt;when building AI-powered developer workflows.&lt;br&gt;
Now the AI agent has access to a specific database operation.&lt;/p&gt;

&lt;p&gt;Notice something important here.&lt;/p&gt;

&lt;p&gt;We are &lt;strong&gt;not giving the AI unlimited access to the database&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We are exposing one controlled function.&lt;/p&gt;

&lt;p&gt;That difference matters.&lt;/p&gt;
&lt;h2&gt;
  
  
  Read-Only Tools Are a Good Starting Point
&lt;/h2&gt;

&lt;p&gt;If you are learning MCP development, I recommend starting with read-only tools.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_project_version&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Project version: 2.4.1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_website_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Website is online&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_documentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Searching documentation for: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These tools are easier to understand and safer to test.&lt;/p&gt;

&lt;p&gt;After that, you can move toward tools that perform actions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Important Part: Tool Design
&lt;/h2&gt;

&lt;p&gt;Creating an MCP tool is easy.&lt;/p&gt;

&lt;p&gt;Creating a &lt;strong&gt;good MCP tool&lt;/strong&gt; is harder.&lt;/p&gt;

&lt;p&gt;A good tool should have:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A clear name&lt;/li&gt;
&lt;li&gt;A simple description&lt;/li&gt;
&lt;li&gt;Well-defined parameters&lt;/li&gt;
&lt;li&gt;Predictable output&lt;/li&gt;
&lt;li&gt;Proper error handling&lt;/li&gt;
&lt;li&gt;Security checks&lt;/li&gt;
&lt;li&gt;Limited permissions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example, avoid a vague tool like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;do_everything&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, create focused tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;check_payment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Small tools are easier for both developers and AI agents to understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tool Descriptions Matter
&lt;/h2&gt;

&lt;p&gt;A tool description works almost like documentation for the AI.&lt;/p&gt;

&lt;p&gt;Compare these:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_documentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Search internal developer documentation.

    Use this tool when the user asks about
    project configuration, APIs, or internal guides.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second version gives the agent much better information.&lt;/p&gt;

&lt;p&gt;This is one of the skills developers should learn: &lt;strong&gt;designing tools that are easy for AI agents to understand.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Should Come Before Automation
&lt;/h2&gt;

&lt;p&gt;This is probably the most important part of the whole article.&lt;/p&gt;

&lt;p&gt;Giving an AI agent access to tools also means giving it the ability to perform actions.&lt;/p&gt;

&lt;p&gt;A read-only tool may be relatively low risk.&lt;/p&gt;

&lt;p&gt;A tool like this is different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should not automatically allow an AI agent to perform destructive operations.&lt;/p&gt;

&lt;p&gt;Use authentication, authorization, validation, logging, and human approval where necessary.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;delete_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;current_user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_admin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;PermissionError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Admin access required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Delete only after authorization
&lt;/span&gt;    &lt;span class="bp"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The MCP ecosystem is also putting more attention on authorization and tool risk as these systems move toward production.&lt;/p&gt;

&lt;h2&gt;
  
  
  MCP + APIs Can Be Very Powerful
&lt;/h2&gt;

&lt;p&gt;One of my favorite use cases is connecting MCP tools to existing APIs.&lt;/p&gt;

&lt;p&gt;You don't need to rebuild your entire application.&lt;/p&gt;

&lt;p&gt;Imagine your company already has:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;REST API
   |
   +--- Users
   +--- Orders
   +--- Billing
   +--- Servers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can build an MCP layer on top:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Agent
    |
    v
MCP Server
    |
    +--- Users API
    +--- Orders API
    +--- Billing API
    +--- Server API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the AI agent can work with existing systems through controlled tools.&lt;/p&gt;

&lt;p&gt;This is especially interesting for internal developer tools and automation.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Project You Can Build
&lt;/h2&gt;

&lt;p&gt;If you want to practice MCP, don't start with a huge AI project.&lt;/p&gt;

&lt;p&gt;Build something small.&lt;/p&gt;

&lt;p&gt;Here is one idea:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Developer Server Monitor&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create an MCP server with these tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_server_status()
get_cpu_usage()
get_memory_usage()
get_disk_usage()
get_server_logs()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then connect it to your own test environment.&lt;/p&gt;

&lt;p&gt;You could ask an AI client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Check server-101."

"How much memory is being used?"

"Show me the latest error."

"Is the server healthy?"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The AI can use the tools and turn their results into normal language.&lt;/p&gt;

&lt;p&gt;This small project teaches several useful skills at once:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;MCP&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;error handling&lt;/li&gt;
&lt;li&gt;logging&lt;/li&gt;
&lt;li&gt;AI agents&lt;/li&gt;
&lt;li&gt;tool design&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  MCP Is Also Useful for Developer Workflows
&lt;/h2&gt;

&lt;p&gt;MCP is not limited to servers.&lt;/p&gt;

&lt;p&gt;You can build tools around your development workflow.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub
   |
   v
MCP Tool
   |
   +--- Search issues
   +--- Read pull requests
   +--- Find repositories
   +--- Check CI status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Documentation
      |
      v
   MCP Tool
      |
      v
   AI Agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This allows developers to build AI-assisted workflows around systems they already use.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Skill Should Developers Learn Along With MCP?
&lt;/h2&gt;

&lt;p&gt;MCP itself is only one part of the picture.&lt;/p&gt;

&lt;p&gt;If you want to become good at building AI-enabled developer tools, focus on these skills:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. API Design
&lt;/h3&gt;

&lt;p&gt;Learn how REST APIs work.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET
POST
PUT
PATCH
DELETE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also learn authentication, status codes, JSON, rate limits, and error handling.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Python or TypeScript
&lt;/h3&gt;

&lt;p&gt;You don't need ten programming languages.&lt;/p&gt;

&lt;p&gt;Be very comfortable with one.&lt;/p&gt;

&lt;p&gt;Python is a great starting point.&lt;/p&gt;

&lt;p&gt;TypeScript is also useful if your projects are heavily JavaScript-based.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Git
&lt;/h3&gt;

&lt;p&gt;AI agents can generate code quickly, but you still need to understand:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff
git status
git add
git commit
git checkout
git revert
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A developer who cannot review changes is going to have problems with AI-generated code.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Testing
&lt;/h3&gt;

&lt;p&gt;Don't trust generated code just because it looks correct.&lt;/p&gt;

&lt;p&gt;Write tests.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_server_status&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_server_status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;server-101&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;running&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Testing becomes even more important when AI agents are allowed to perform actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Security
&lt;/h3&gt;

&lt;p&gt;Learn the basics of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;authorization&lt;/li&gt;
&lt;li&gt;secrets management&lt;/li&gt;
&lt;li&gt;input validation&lt;/li&gt;
&lt;li&gt;SQL injection&lt;/li&gt;
&lt;li&gt;API security&lt;/li&gt;
&lt;li&gt;least-privilege access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AI makes development faster.&lt;/p&gt;

&lt;p&gt;Security mistakes can also become faster.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Developer's Role Is Changing
&lt;/h2&gt;

&lt;p&gt;In my opinion, the biggest change is not that AI writes code.&lt;/p&gt;

&lt;p&gt;The bigger change is that developers are becoming &lt;strong&gt;system designers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of thinking only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I write this function?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You may increasingly think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What should the agent be allowed to do?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which tools should I expose?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I verify the result?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What happens if the agent makes a wrong decision?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a different type of engineering.&lt;/p&gt;

&lt;p&gt;Gartner's 2026 research on emerging skills for agentic coding also points toward deeper systems-engineering skills as AI coding agents move from assistants toward collaborators.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Learning Roadmap
&lt;/h2&gt;

&lt;p&gt;If MCP is completely new to you, follow this order.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 1 — Learn APIs
&lt;/h3&gt;

&lt;p&gt;Build a small REST API.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HTTP
JSON
GET
POST
Authentication
Errors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Week 2 — Build Python Tools
&lt;/h3&gt;

&lt;p&gt;Create simple functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;get_user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;search_database&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nf"&gt;check_server&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Week 3 — Learn MCP
&lt;/h3&gt;

&lt;p&gt;Turn your functions into MCP tools.&lt;/p&gt;

&lt;p&gt;Start with read-only operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Week 4 — Build One Real Project
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MCP Developer Assistant
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;with tools for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Search documentation
Check server status
Read logs
Search GitHub issues
Check API health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives you something practical to show in your GitHub portfolio.&lt;/p&gt;

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

&lt;p&gt;I don't think developers need to become AI researchers to work with AI in 2026.&lt;/p&gt;

&lt;p&gt;But developers should understand how modern AI systems connect to real software.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP is one useful piece of that puzzle.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The important skill is not just knowing how to create an MCP server.&lt;/p&gt;

&lt;p&gt;It is knowing how to design useful tools, connect them to existing systems, protect them with proper permissions, test their output, and build workflows that developers can actually trust.&lt;/p&gt;

&lt;p&gt;AI can write a lot of code.&lt;/p&gt;

&lt;p&gt;But someone still needs to decide &lt;strong&gt;what the system should be allowed to do&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is where good developers still matter.&lt;/p&gt;

&lt;p&gt;If you are looking for a practical developer skill to learn in 2026, I would put &lt;strong&gt;MCP, AI agent integration, API design, testing, and security&lt;/strong&gt; on the list.&lt;/p&gt;

&lt;p&gt;Start with one small tool.&lt;/p&gt;

&lt;p&gt;Make it work.&lt;/p&gt;

&lt;p&gt;Then make it safe.&lt;/p&gt;

&lt;p&gt;Then build something useful with it.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>webdev</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Building Practical AI Skills with a VPS: A Beginner-Friendly Guide</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Thu, 27 Aug 2026 15:24:48 +0000</pubDate>
      <link>https://dev.to/arthur_luca/building-practical-ai-skills-with-a-vps-a-beginner-friendly-guide-261i</link>
      <guid>https://dev.to/arthur_luca/building-practical-ai-skills-with-a-vps-a-beginner-friendly-guide-261i</guid>
      <description>&lt;p&gt;I am the Arthur of this blog, and I want to tell you about something I have been exploring recently: &lt;strong&gt;how a VPS can become more than just a place to host a website&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;When people hear the word VPS, they usually think about web hosting, servers, domains, or websites. But a VPS can actually be a useful environment for developers who want to learn &lt;strong&gt;Python, automation, AI tools, Linux, APIs, and practical server management&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You don't need to start with a huge cloud infrastructure or an expensive dedicated server. Sometimes, a simple VPS with Linux, Python, and a few useful tools is enough to start learning by building real projects.&lt;/p&gt;

&lt;p&gt;In this article, I will show you how these pieces fit together and how you can create a small practical project on a VPS.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a VPS?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;VPS (Virtual Private Server)&lt;/strong&gt; is a virtual server that gives you your own allocated environment inside a physical server.&lt;/p&gt;

&lt;p&gt;Compared with traditional shared hosting, a VPS gives you much more control.&lt;/p&gt;

&lt;p&gt;You can usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install your own software&lt;/li&gt;
&lt;li&gt;Run Python applications&lt;/li&gt;
&lt;li&gt;Configure Linux packages&lt;/li&gt;
&lt;li&gt;Create databases&lt;/li&gt;
&lt;li&gt;Run background scripts&lt;/li&gt;
&lt;li&gt;Host APIs&lt;/li&gt;
&lt;li&gt;Deploy websites&lt;/li&gt;
&lt;li&gt;Manage services with SSH&lt;/li&gt;
&lt;li&gt;Automate repetitive tasks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For developers, this control is one of the biggest advantages of VPS hosting.&lt;/p&gt;

&lt;p&gt;Instead of only uploading website files, you can actually use the server as a small development and deployment environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why VPS Is Useful for Learning New Skills
&lt;/h2&gt;

&lt;p&gt;One thing I have learned while working with technology is that reading about a skill is very different from actually using it.&lt;/p&gt;

&lt;p&gt;For example, you can read ten tutorials about Python automation, but running your own Python script on a Linux server teaches you something completely different.&lt;/p&gt;

&lt;p&gt;You start understanding:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python
   ↓
Application
   ↓
Linux Server
   ↓
VPS
   ↓
Internet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where a VPS becomes interesting.&lt;/p&gt;

&lt;p&gt;You can build a small application locally, move it to the VPS, configure the environment, and make it available online.&lt;/p&gt;

&lt;p&gt;That single process teaches several skills at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Simple Python Project on a VPS
&lt;/h2&gt;

&lt;p&gt;Let's start with something simple.&lt;/p&gt;

&lt;p&gt;Suppose we want a Python script that checks whether a website is online.&lt;/p&gt;

&lt;p&gt;First, install Python on an Ubuntu-based VPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3 python3-pip &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create a project directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;website-monitor
&lt;span class="nb"&gt;cd &lt;/span&gt;website-monitor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a Python file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano monitor.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Website is online&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Website returned status code: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RequestException&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Website could not be reached&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the required package:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Then run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 monitor.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You now have a very small monitoring tool.&lt;/p&gt;

&lt;p&gt;It isn't a huge AI project, but that's not the point.&lt;/p&gt;

&lt;p&gt;The point is that you have started connecting &lt;strong&gt;Python + Linux + VPS + automation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turning a Script Into a Useful Skill
&lt;/h2&gt;

&lt;p&gt;This is where things become more interesting.&lt;/p&gt;

&lt;p&gt;Instead of manually running the script, we can schedule it.&lt;/p&gt;

&lt;p&gt;Linux provides a tool called &lt;code&gt;cron&lt;/code&gt; that can run commands automatically.&lt;/p&gt;

&lt;p&gt;Open your cron configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crontab &lt;span class="nt"&gt;-e&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You could run the script every five minutes with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;*&lt;/span&gt;/5 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/bin/python3 /home/user/website-monitor/monitor.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your VPS can check the website automatically.&lt;/p&gt;

&lt;p&gt;This small example introduces another important development skill:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;automation&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You are no longer doing everything manually.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where AI Skills Come Into the Picture
&lt;/h2&gt;

&lt;p&gt;AI can be added on top of this kind of infrastructure.&lt;/p&gt;

&lt;p&gt;For example, imagine that your monitoring script collects information such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;response_time&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;4.8&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of only displaying the information, an AI-powered application could analyze it and generate a human-readable explanation.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;The website is currently returning HTTP 500 errors.
The response time is also higher than normal.
You should check the application logs and server resources.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the kind of project where learning &lt;strong&gt;Python, APIs, VPS hosting, Linux, and AI&lt;/strong&gt; together becomes useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  You Don't Need a Complicated AI Agent
&lt;/h2&gt;

&lt;p&gt;When people hear "AI agent", they sometimes imagine a very complicated system.&lt;/p&gt;

&lt;p&gt;But an agent can start with a simple workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Input
    ↓
Python Application
    ↓
Tool / API
    ↓
AI Model
    ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, a simple Python application might receive a question and then send it to an AI API.&lt;/p&gt;

&lt;p&gt;A simplified structure could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;collect_information&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;analyze_with_ai&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important thing is not making the first project huge.&lt;/p&gt;

&lt;p&gt;The important thing is understanding each component.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Useful Skill: Writing Reusable Instructions
&lt;/h2&gt;

&lt;p&gt;Another skill developers can learn is creating reusable instructions for AI tools.&lt;/p&gt;

&lt;p&gt;Instead of writing the same instructions repeatedly, you can keep them inside a structured file.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-project/
├── skills/
│   └── blog-writer/
│       └── SKILL.md
├── scripts/
│   └── generate_blog.py
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simple &lt;code&gt;SKILL.md&lt;/code&gt; file might contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Blog Writer Skill&lt;/span&gt;

&lt;span class="gu"&gt;## Purpose&lt;/span&gt;

Help create useful technical blog posts for developers.

&lt;span class="gu"&gt;## Writing Style&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use clear language
&lt;span class="p"&gt;-&lt;/span&gt; Avoid unnecessary jargon
&lt;span class="p"&gt;-&lt;/span&gt; Explain technical concepts with examples
&lt;span class="p"&gt;-&lt;/span&gt; Include practical code
&lt;span class="p"&gt;-&lt;/span&gt; Use headings and bullet points
&lt;span class="p"&gt;-&lt;/span&gt; Keep the writing natural

&lt;span class="gu"&gt;## Workflow&lt;/span&gt;
&lt;span class="p"&gt;
1.&lt;/span&gt; Understand the topic.
&lt;span class="p"&gt;2.&lt;/span&gt; Identify the target audience.
&lt;span class="p"&gt;3.&lt;/span&gt; Create an outline.
&lt;span class="p"&gt;4.&lt;/span&gt; Write an introduction.
&lt;span class="p"&gt;5.&lt;/span&gt; Add practical examples.
&lt;span class="p"&gt;6.&lt;/span&gt; Review the article.
&lt;span class="p"&gt;7.&lt;/span&gt; Improve readability.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach makes your instructions reusable.&lt;/p&gt;

&lt;p&gt;Instead of starting from zero every time, you have a small skill that can guide your workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why &lt;code&gt;SKILL.md&lt;/code&gt; Can Be Useful
&lt;/h2&gt;

&lt;p&gt;A structured skill file can help you organize instructions for repeated tasks.&lt;/p&gt;

&lt;p&gt;For example, you could create different skills for:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;skills/
├── blog-writer/
│   └── SKILL.md
├── seo-content/
│   └── SKILL.md
├── python-helper/
│   └── SKILL.md
└── server-monitor/
    └── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now your project is becoming more organized.&lt;/p&gt;

&lt;p&gt;You aren't just learning one programming language.&lt;/p&gt;

&lt;p&gt;You are learning how to build reusable workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combining SEO With Technical Content
&lt;/h2&gt;

&lt;p&gt;If you publish technical content, SEO should not mean stuffing the same keyword into every paragraph.&lt;/p&gt;

&lt;p&gt;A better approach is to write for the reader first.&lt;/p&gt;

&lt;p&gt;For example, if the main topic is &lt;strong&gt;VPS hosting&lt;/strong&gt;, related terms can naturally appear where they make sense:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VPS hosting&lt;/li&gt;
&lt;li&gt;VPS server&lt;/li&gt;
&lt;li&gt;Linux VPS&lt;/li&gt;
&lt;li&gt;VPS deployment&lt;/li&gt;
&lt;li&gt;Python on VPS&lt;/li&gt;
&lt;li&gt;server management&lt;/li&gt;
&lt;li&gt;cloud hosting&lt;/li&gt;
&lt;li&gt;virtual private server&lt;/li&gt;
&lt;li&gt;root access&lt;/li&gt;
&lt;li&gt;website hosting&lt;/li&gt;
&lt;li&gt;AI development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice that these keywords can appear naturally because they are actually related to the topic.&lt;/p&gt;

&lt;p&gt;The goal is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;VPS VPS VPS VPS VPS&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The goal is to answer the reader's question while naturally covering the vocabulary around the subject.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Small Developer Environment
&lt;/h2&gt;

&lt;p&gt;A basic VPS can also become your personal learning environment.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;git &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3 &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;python3-pip &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you can clone a project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/example/project.git
&lt;span class="nb"&gt;cd &lt;/span&gt;project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a virtual environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simple workflow introduces you to tools that are commonly used in real development environments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Still Matters
&lt;/h2&gt;

&lt;p&gt;Having more server control also means having more responsibility.&lt;/p&gt;

&lt;p&gt;If you are using a VPS, don't treat security as an optional feature.&lt;/p&gt;

&lt;p&gt;At minimum, learn about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH keys&lt;/li&gt;
&lt;li&gt;Strong authentication&lt;/li&gt;
&lt;li&gt;Firewall configuration&lt;/li&gt;
&lt;li&gt;Software updates&lt;/li&gt;
&lt;li&gt;User permissions&lt;/li&gt;
&lt;li&gt;Backups&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Log management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, you can check your firewall status with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And enable it when properly configured:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Never blindly copy security commands from the internet without understanding what they do.&lt;/p&gt;

&lt;h2&gt;
  
  
  VPS Is a Learning Environment, Not Just Hosting
&lt;/h2&gt;

&lt;p&gt;This is probably the biggest reason I find VPS interesting.&lt;/p&gt;

&lt;p&gt;A VPS can help you move from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I read about programming."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I built something."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then from:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I built something."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"I deployed something."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That progression is valuable.&lt;/p&gt;

&lt;p&gt;You start learning how applications actually behave outside your local computer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can You Build Next?
&lt;/h2&gt;

&lt;p&gt;Once you understand the basics, you can experiment with projects such as:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Website Monitoring Tool
&lt;/h3&gt;

&lt;p&gt;Monitor uptime, response time, and HTTP status codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Python Automation Bot
&lt;/h3&gt;

&lt;p&gt;Automate repetitive tasks using Python scripts and APIs.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. AI Content Assistant
&lt;/h3&gt;

&lt;p&gt;Build a small application that helps organize or draft technical content.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Server Monitoring Dashboard
&lt;/h3&gt;

&lt;p&gt;Collect CPU, RAM, disk, and network information and display it through a web interface.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. API-Based AI Application
&lt;/h3&gt;

&lt;p&gt;Connect a Python backend to an AI model and create a simple assistant.&lt;/p&gt;

&lt;p&gt;The projects don't need to be perfect.&lt;/p&gt;

&lt;p&gt;Every project gives you another opportunity to learn.&lt;/p&gt;

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

&lt;p&gt;I think one of the best ways to learn modern technology is to connect different skills through a real project.&lt;/p&gt;

&lt;p&gt;You can start with something as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python
+
Linux
+
VPS
+
Git
+
APIs
+
Automation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then gradually add AI, databases, monitoring, and deployment.&lt;/p&gt;

&lt;p&gt;You don't need to understand everything on day one.&lt;/p&gt;

&lt;p&gt;Start small, make something work, break it, fix it, and learn from the process.&lt;/p&gt;

&lt;p&gt;That is how technical skills become practical skills.&lt;/p&gt;

&lt;p&gt;And if you're exploring VPS infrastructure for development, hosting, or server-based projects, you can also take a look at &lt;strong&gt;&lt;a href="https://www.seimaxim.com/vps-hosting" rel="noopener noreferrer"&gt;seimaxim VPS solutions&lt;/a&gt;&lt;/strong&gt; and compare the available options for your own use case.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>linux</category>
      <category>ai</category>
      <category>python</category>
    </item>
    <item>
      <title>Build a Simple Developer Environment Checker with Python</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Wed, 26 Aug 2026 08:42:36 +0000</pubDate>
      <link>https://dev.to/arthur_luca/build-a-simple-developer-environment-checker-with-python-542e</link>
      <guid>https://dev.to/arthur_luca/build-a-simple-developer-environment-checker-with-python-542e</guid>
      <description>&lt;p&gt;I am a Arthur, and in this article I want to share a small Python project that can be surprisingly useful when working on a new server, VPS, or development machine.&lt;/p&gt;

&lt;p&gt;When I start working on a new environment, one of the first things I want to know is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which operating system am I using?&lt;/li&gt;
&lt;li&gt;How much RAM is available?&lt;/li&gt;
&lt;li&gt;How many CPU cores are available?&lt;/li&gt;
&lt;li&gt;How much disk space is left?&lt;/li&gt;
&lt;li&gt;Is Python installed correctly?&lt;/li&gt;
&lt;li&gt;What is the machine's IP address?&lt;/li&gt;
&lt;li&gt;Is the system running normally?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can check all of these manually with different commands, but writing a small script can save time.&lt;/p&gt;

&lt;p&gt;So in this tutorial, we are going to build a &lt;strong&gt;Developer Environment Checker&lt;/strong&gt; using Python.&lt;/p&gt;

&lt;p&gt;The project is beginner-friendly, but it also demonstrates concepts that are useful for real development and server administration.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We Are Going to Build
&lt;/h2&gt;

&lt;p&gt;Our Python script will display information such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;========================================
     Developer Environment Checker
========================================

Operating System : Linux
Machine          : my-server
CPU Cores        : 4
RAM              : 7.8 GB
Disk Total       : 80.0 GB
Disk Used        : 31.4 GB
Disk Free        : 48.6 GB
Python Version   : 3.12.2
Local IP         : 192.168.1.20

System check completed!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The nice thing is that we don't need a complicated framework.&lt;/p&gt;

&lt;p&gt;We can build the entire tool with Python and a small external package.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. Create the Project
&lt;/h1&gt;

&lt;p&gt;First, create a directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;environment-checker
&lt;span class="nb"&gt;cd &lt;/span&gt;environment-checker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a Python file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;checker.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows, you can simply create a file called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;checker.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  2. Install psutil
&lt;/h1&gt;

&lt;p&gt;We will use the &lt;code&gt;psutil&lt;/code&gt; package to retrieve system information.&lt;/p&gt;

&lt;p&gt;Install it with:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If your system uses &lt;code&gt;pip3&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You can verify the installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import psutil; print(psutil.__version__)"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you get a version number, everything is ready.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Import the Required Modules
&lt;/h1&gt;

&lt;p&gt;Let's start with our Python file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each module has a different job.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;platform&lt;/code&gt; helps us get information about the operating system.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;socket&lt;/code&gt; helps us retrieve network information.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;shutil&lt;/code&gt; can be used to check disk usage.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;psutil&lt;/code&gt; gives us CPU, memory, and other system information.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sys&lt;/code&gt; gives us information about the Python installation.&lt;/p&gt;




&lt;h1&gt;
  
  
  4. Get Operating System Information
&lt;/h1&gt;

&lt;p&gt;Let's create our first function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_system_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;release&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;machine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;machine&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostname&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can test it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;info&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_system_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Operating System:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OS Release:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;release&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Machine:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;machine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hostname:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Operating System: Linux
OS Release: 6.8.0
Machine: x86_64
Hostname: development-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is useful when your application may run on different operating systems.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Check CPU Information
&lt;/h1&gt;

&lt;p&gt;Next, let's check how many CPU cores are available.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_cpu_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;physical_cores&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logical&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;logical_cores&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logical&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_percent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cpu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_cpu_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Physical CPU Cores:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;physical_cores&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Logical CPU Cores:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;logical_cores&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Current CPU Usage:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Physical CPU Cores: 2
Logical CPU Cores: 4
Current CPU Usage: 17.3 %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The distinction between physical and logical cores is useful when you're checking whether a machine has enough resources for your workload.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Check RAM
&lt;/h1&gt;

&lt;p&gt;Now let's inspect memory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_memory_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The values returned by &lt;code&gt;psutil&lt;/code&gt; are in bytes, so let's create a helper function.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we can display the result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_memory_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Total RAM:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Available RAM:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RAM Usage:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Example output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Total RAM: 7.8 GB
Available RAM: 4.2 GB
RAM Usage: 46.1 %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  7. Check Disk Space
&lt;/h1&gt;

&lt;p&gt;Disk space is another important thing to monitor.&lt;/p&gt;

&lt;p&gt;A server can appear healthy while an application suddenly stops working because the disk is full.&lt;/p&gt;

&lt;p&gt;Let's add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_disk_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disk_usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_disk_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk Total:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk Used:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk Free:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Disk Total: 80.0 GB
Disk Used: 31.4 GB
Disk Free: 48.6 GB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're running this on Linux, &lt;code&gt;/&lt;/code&gt; represents the root filesystem.&lt;/p&gt;




&lt;h1&gt;
  
  
  8. Check Python Version
&lt;/h1&gt;

&lt;p&gt;Now let's check the Python version running the script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_python_version&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Python Version:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;get_python_version&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Python Version: 3.12.2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can be particularly helpful when debugging dependency problems.&lt;/p&gt;

&lt;p&gt;For example, one application might require Python 3.11 while another requires Python 3.12.&lt;/p&gt;




&lt;h1&gt;
  
  
  9. Find the Local IP Address
&lt;/h1&gt;

&lt;p&gt;Let's add a simple function for the local IP address.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_local_ip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostname&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostbyname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unable to detect&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Local IP:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;get_local_ip&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Local IP: 192.168.1.20
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Keep in mind that this is normally a local/private address when you're running the script inside a home or office network.&lt;/p&gt;




&lt;h1&gt;
  
  
  10. Add a Simple Health Check
&lt;/h1&gt;

&lt;p&gt;Now let's make the script a little smarter.&lt;/p&gt;

&lt;p&gt;We can warn the user when CPU, memory, or disk usage becomes high.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;health_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpu_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;disk_usage&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;warnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cpu_usage&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CPU usage is high.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;memory_usage&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Memory usage is high.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;disk_usage&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk usage is high.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we need the disk percentage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_disk_usage_percent&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disk_usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can now run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cpu_usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_percent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;memory_usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;
&lt;span class="n"&gt;disk_usage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_disk_usage_percent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;warnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;health_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;cpu_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;memory_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;disk_usage&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Warnings:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;System looks healthy.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where our small script starts becoming more useful than simply printing system information.&lt;/p&gt;




&lt;h1&gt;
  
  
  11. Put Everything Together
&lt;/h1&gt;

&lt;p&gt;Now let's combine everything into one complete program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_system_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;system&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;release&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;release&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;machine&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;platform&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;machine&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostname&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_cpu_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;physical_cores&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logical&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;logical_cores&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logical&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_percent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_memory_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_disk_info&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disk_usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;free&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_python_version&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_local_ip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostname&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gethostbyname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Unable to detect&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;health_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpu_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;memory_usage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;disk_usage&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="n"&gt;warnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cpu_usage&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CPU usage is high.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;memory_usage&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Memory usage is high.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;disk_usage&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk usage is high.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_system_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cpu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_cpu_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_memory_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_disk_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;      Developer Environment Checker&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Operating System : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OS Release      : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;release&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Machine         : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;machine&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hostname        : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Physical Cores  : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;physical_cores&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Logical Cores   : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;logical_cores&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CPU Usage       : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Total RAM       : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Available RAM   : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RAM Usage       : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Disk Total      : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk Used       : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk Free       : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;free&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; GB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Disk Usage      : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;%&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Python Version  : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;get_python_version&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Local IP        : &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;get_local_ip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;warnings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;health_check&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;System Warnings:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;warning&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;- &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;warning&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;System looks healthy.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Save the file and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python checker.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  12. Understanding the Main Function
&lt;/h1&gt;

&lt;p&gt;The &lt;code&gt;main()&lt;/code&gt; function is responsible for putting the pieces together.&lt;/p&gt;

&lt;p&gt;Instead of writing one huge block of code, we separated the project into smaller functions.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_system_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;gets operating system information.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cpu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_cpu_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;gets CPU information.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_memory_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;gets RAM information.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_disk_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;gets disk information.&lt;/p&gt;

&lt;p&gt;This approach makes the code easier to read and easier to modify later.&lt;/p&gt;




&lt;h1&gt;
  
  
  13. Add JSON Output
&lt;/h1&gt;

&lt;p&gt;Here's another useful improvement.&lt;/p&gt;

&lt;p&gt;Developers often need machine-readable output instead of terminal output.&lt;/p&gt;

&lt;p&gt;Let's add JSON support.&lt;/p&gt;

&lt;p&gt;First import:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then create:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_report&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_system_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cpu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_cpu_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;memory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_memory_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;disk&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_disk_info&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_gb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available_gb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;available&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage_percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;memory&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total_gb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;total&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;used_gb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;used&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;free_gb&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;bytes_to_gb&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;free&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;usage_percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;disk&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python_version&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;get_python_version&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;local_ip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;get_local_ip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;report&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now save it to a file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_report&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="n"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_report&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;system-report.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Report saved to system-report.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;save_report&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you'll have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;system-report.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The JSON might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Linux"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"release"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"6.8.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"machine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x86_64"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"hostname"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"development-server"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cpu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"physical_cores"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"logical_cores"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"usage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18.2&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"total_gb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;7.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"available_gb"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"usage_percent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;46.1&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"python_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3.12.2"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now another application could consume this information automatically.&lt;/p&gt;




&lt;h1&gt;
  
  
  14. Why This Small Project Is Useful
&lt;/h1&gt;

&lt;p&gt;At first glance, this might look like a simple Python exercise.&lt;/p&gt;

&lt;p&gt;But the same idea can be extended into much larger tools.&lt;/p&gt;

&lt;p&gt;For example, you could turn it into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server Monitoring Tool
        |
        +-- CPU monitoring
        |
        +-- RAM monitoring
        |
        +-- Disk monitoring
        |
        +-- Network monitoring
        |
        +-- Process monitoring
        |
        +-- JSON reports
        |
        +-- Email alerts
        |
        +-- API endpoint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You could even run the script periodically with a Linux cron job.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;*&lt;/span&gt;/10 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /usr/bin/python3 /home/user/checker.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This would execute the script every 10 minutes.&lt;/p&gt;




&lt;h1&gt;
  
  
  15. Running It on a VPS
&lt;/h1&gt;

&lt;p&gt;A small project like this is also a good way to learn how applications behave outside your local computer.&lt;/p&gt;

&lt;p&gt;Instead of running it only on your laptop, you can deploy the project to a Linux VPS and test the environment remotely.&lt;/p&gt;

&lt;p&gt;For developers who need a server for development, testing, deployment, or other workloads, &lt;a href="https://www.seimaxim.com/vps-hosting" rel="noopener noreferrer"&gt;SeiMaxim&lt;/a&gt; provides VPS and dedicated server options.&lt;/p&gt;

&lt;p&gt;The important part is not which server you choose, but understanding the environment your application is actually running in.&lt;/p&gt;

&lt;p&gt;Once you have SSH access to a Linux server, the workflow is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh username@server-ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/yourusername/environment-checker.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Move into the project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;environment-checker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a virtual environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Activate it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install the dependency:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python checker.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;p&gt;You now have a simple way to inspect the actual server environment from the command line.&lt;/p&gt;




&lt;h1&gt;
  
  
  16. A Few Ideas to Take This Further
&lt;/h1&gt;

&lt;p&gt;If you want to turn this beginner project into something more advanced, there are several directions you can take.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Network Monitoring
&lt;/h3&gt;

&lt;p&gt;You could use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;net_io_counters&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to monitor uploaded and downloaded bytes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitor Running Processes
&lt;/h3&gt;

&lt;p&gt;You could inspect running processes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;process&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process_iter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory_percent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Alerts
&lt;/h3&gt;

&lt;p&gt;You could send an alert whenever:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU &amp;gt; 90%
RAM &amp;gt; 90%
Disk &amp;gt; 90%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Build a Web Dashboard
&lt;/h3&gt;

&lt;p&gt;The Python script could become a small API using Flask or FastAPI.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastapi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="nd"&gt;@app.get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/health&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;health&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cpu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_percent&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;memory&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;disk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;disk_usage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then a monitoring dashboard could request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"cpu"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;23.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"memory"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;51.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"disk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;42.8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is already starting to look like a real monitoring service.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;I like projects like this because they start small but teach several useful concepts at the same time.&lt;/p&gt;

&lt;p&gt;We worked with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python functions&lt;/li&gt;
&lt;li&gt;System information&lt;/li&gt;
&lt;li&gt;CPU monitoring&lt;/li&gt;
&lt;li&gt;RAM monitoring&lt;/li&gt;
&lt;li&gt;Disk monitoring&lt;/li&gt;
&lt;li&gt;Network information&lt;/li&gt;
&lt;li&gt;JSON&lt;/li&gt;
&lt;li&gt;Virtual environments&lt;/li&gt;
&lt;li&gt;Linux commands&lt;/li&gt;
&lt;li&gt;SSH&lt;/li&gt;
&lt;li&gt;VPS environments&lt;/li&gt;
&lt;li&gt;Basic server health checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need a huge project to learn something useful.&lt;/p&gt;

&lt;p&gt;Sometimes a 100-line script can teach you more about how a server actually works than a long theoretical tutorial.&lt;/p&gt;

&lt;p&gt;And once this basic version works, the next step is to turn it into something bigger — perhaps a REST API, a web dashboard, or a lightweight monitoring service.&lt;/p&gt;

&lt;p&gt;That's where the fun really begins.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>webdev</category>
      <category>python</category>
      <category>coding</category>
    </item>
    <item>
      <title>7 Advanced Coding Skills Developers Should Learn in 2026</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Tue, 25 Aug 2026 19:13:23 +0000</pubDate>
      <link>https://dev.to/arthur_luca/7-advanced-coding-skills-developers-should-learn-in-2026-l7n</link>
      <guid>https://dev.to/arthur_luca/7-advanced-coding-skills-developers-should-learn-in-2026-l7n</guid>
      <description>&lt;p&gt;I'm Arthur, everyone.If you are a developer, you have probably seen hundreds of articles telling you to learn Python, JavaScript, AI, Docker, or Git.&lt;/p&gt;

&lt;p&gt;Those skills are useful.But they are no longer enough to make you stand out.&lt;/p&gt;

&lt;p&gt;In 2026, I think developers should spend more time learning &lt;strong&gt;how software works underneath the code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How does a program find a problem before it runs?&lt;/p&gt;

&lt;p&gt;How can you change thousands of lines of code without editing every file?&lt;/p&gt;

&lt;p&gt;How can an application handle many tasks without creating a mess of threads?&lt;/p&gt;

&lt;p&gt;How can you make an API safer without trusting the data coming into it?&lt;/p&gt;

&lt;p&gt;These are the kinds of skills I want to talk about here.&lt;/p&gt;

&lt;p&gt;They are not beginner tricks.&lt;/p&gt;

&lt;p&gt;They are practical coding techniques that can help you write better production software.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Learn AST-Based Code Transformation
&lt;/h2&gt;

&lt;p&gt;Most developers edit code as text.&lt;/p&gt;

&lt;p&gt;But your compiler does not really understand your code as plain text.&lt;/p&gt;

&lt;p&gt;It builds a structure called an &lt;strong&gt;Abstract Syntax Tree (AST)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Once you understand ASTs, you can do something very interesting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can write code that changes other code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, imagine you have hundreds of JavaScript files and you want to replace an old function with a new one.&lt;/p&gt;

&lt;p&gt;Doing it manually is risky.&lt;/p&gt;

&lt;p&gt;With an AST tool, you can find the exact function call and change it safely.&lt;/p&gt;

&lt;p&gt;A simplified example in TypeScript might look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;name&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;findFunctionCalls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Node&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CallExpression&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;arguments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;child&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(...&lt;/span&gt;&lt;span class="nf"&gt;findFunctionCalls&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;child&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;matches&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The real AST libraries are much more powerful, but the idea is important.&lt;/p&gt;

&lt;p&gt;You can build tools that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Find unsafe code&lt;/li&gt;
&lt;li&gt;Rename APIs&lt;/li&gt;
&lt;li&gt;Upgrade old code&lt;/li&gt;
&lt;li&gt;Detect patterns&lt;/li&gt;
&lt;li&gt;Create code automatically&lt;/li&gt;
&lt;li&gt;Enforce coding rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful when working on large codebases.&lt;/p&gt;

&lt;p&gt;Search-and-replace changes text.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AST transformation changes the structure of the program.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is a much more powerful idea.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Learn Runtime Type Validation
&lt;/h2&gt;

&lt;p&gt;TypeScript types are great.&lt;/p&gt;

&lt;p&gt;But there is one problem.&lt;/p&gt;

&lt;p&gt;They disappear when your program is running.&lt;/p&gt;

&lt;p&gt;Imagine your API expects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;User&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;number&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may think the incoming request contains that structure.&lt;/p&gt;

&lt;p&gt;But someone can send:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your TypeScript type cannot stop that by itself.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;runtime validation&lt;/strong&gt; becomes important.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;UserSchema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;number&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;email&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;UserSchema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;safeParse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;success&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Invalid user data&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the application checks the data before using it.&lt;/p&gt;

&lt;p&gt;This is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API requests&lt;/li&gt;
&lt;li&gt;Webhooks&lt;/li&gt;
&lt;li&gt;Configuration files&lt;/li&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;Database results&lt;/li&gt;
&lt;li&gt;Third-party APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good rule is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Never trust data just because your type system says it is correct.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The type system protects your code.&lt;/p&gt;

&lt;p&gt;Runtime validation protects your application from the outside world.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Learn Structured Concurrency
&lt;/h2&gt;

&lt;p&gt;Many developers know &lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Fewer understand what happens when an application starts many asynchronous tasks at the same time.&lt;/p&gt;

&lt;p&gt;Consider this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
  &lt;span class="nf"&gt;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nf"&gt;fetchOrders&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
  &lt;span class="nf"&gt;fetchProducts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It looks simple.&lt;/p&gt;

&lt;p&gt;But what happens if &lt;code&gt;fetchOrders()&lt;/code&gt; fails?&lt;/p&gt;

&lt;p&gt;What happens to the other tasks?&lt;/p&gt;

&lt;p&gt;What if one task takes 30 seconds?&lt;/p&gt;

&lt;p&gt;What if the user cancels the request?&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;structured concurrency&lt;/strong&gt; becomes interesting.&lt;/p&gt;

&lt;p&gt;The idea is that related tasks should have a clear lifetime.&lt;/p&gt;

&lt;p&gt;In modern JavaScript, you can use &lt;code&gt;AbortController&lt;/code&gt; to give async work a shared cancellation signal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;controller&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;AbortController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="nf"&gt;fetchUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;fetchOrders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="nf"&gt;fetchProducts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;controller&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abort&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you can stop work that is no longer needed.&lt;/p&gt;

&lt;p&gt;This matters in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;Background workers&lt;/li&gt;
&lt;li&gt;AI applications&lt;/li&gt;
&lt;li&gt;Network services&lt;/li&gt;
&lt;li&gt;Data processing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Writing asynchronous code is easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Managing its lifetime correctly is the harder skill.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Learn Zero-Copy Data Handling
&lt;/h2&gt;

&lt;p&gt;Here is a performance skill that many application developers never study.&lt;/p&gt;

&lt;p&gt;When software moves data from one place to another, it may copy that data several times.&lt;/p&gt;

&lt;p&gt;For a small object, you will never notice.&lt;/p&gt;

&lt;p&gt;For a large file, video stream, database result, or network buffer, those copies can become expensive.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;zero-copy techniques&lt;/strong&gt; become useful.&lt;/p&gt;

&lt;p&gt;Instead of repeatedly copying data, you try to reuse the same memory region or pass references to existing data.&lt;/p&gt;

&lt;p&gt;For example, in languages such as Rust, slices can reference existing data without creating another copy:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;get_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The function returns a view into the original data.&lt;/p&gt;

&lt;p&gt;It does not create another 16-byte buffer.&lt;/p&gt;

&lt;p&gt;This idea becomes important when building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-speed APIs&lt;/li&gt;
&lt;li&gt;Network services&lt;/li&gt;
&lt;li&gt;File processors&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Streaming systems&lt;/li&gt;
&lt;li&gt;Large data pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need to use zero-copy everywhere.&lt;/p&gt;

&lt;p&gt;But understanding &lt;strong&gt;where memory is being copied&lt;/strong&gt; can completely change how you debug performance problems.&lt;/p&gt;

&lt;p&gt;Sometimes the slow part is not the algorithm.&lt;/p&gt;

&lt;p&gt;It is the data movement.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Learn Event-Driven Design
&lt;/h2&gt;

&lt;p&gt;Many applications are built around direct function calls.&lt;/p&gt;

&lt;p&gt;One service calls another.&lt;/p&gt;

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

&lt;p&gt;As the system grows, this can become difficult to maintain.&lt;/p&gt;

&lt;p&gt;Event-driven design offers another approach.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create order
→ Send email
→ Update inventory
→ Create invoice
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can publish an event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OrderCreated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Other services can react to it.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="nx"&gt;OrderCreated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleOrderCreated&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;OrderCreated&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;updateInventory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createInvoice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can make large systems easier to expand.&lt;/p&gt;

&lt;p&gt;You can later add another listener:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;OrderCreated&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;createAnalyticsRecord&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;without changing the original order service.&lt;/p&gt;

&lt;p&gt;But event-driven systems also introduce new problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duplicate events&lt;/li&gt;
&lt;li&gt;Missing events&lt;/li&gt;
&lt;li&gt;Ordering&lt;/li&gt;
&lt;li&gt;Retries&lt;/li&gt;
&lt;li&gt;Idempotency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is especially important.&lt;/p&gt;

&lt;p&gt;If the same event arrives twice, your code should not charge the customer twice.&lt;/p&gt;

&lt;p&gt;That is why &lt;strong&gt;idempotency&lt;/strong&gt; is a skill worth learning.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. Learn Property-Based Testing
&lt;/h2&gt;

&lt;p&gt;Most developers write tests like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;toBe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is useful.&lt;/p&gt;

&lt;p&gt;But what if you want to test thousands of possible inputs?&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;property-based testing&lt;/strong&gt; becomes powerful.&lt;/p&gt;

&lt;p&gt;Instead of saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This exact input should produce this exact output.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You describe a rule that should always be true.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Sorting a list should never change the number of items.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A property-based test can generate many random lists and check that rule.&lt;/p&gt;

&lt;p&gt;In TypeScript, a library such as &lt;code&gt;fast-check&lt;/code&gt; can be used:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;fc&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;fast-check&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;property&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[...&lt;/span&gt;&lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of testing one list, the test can run against many generated inputs.&lt;/p&gt;

&lt;p&gt;This is especially useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parsers&lt;/li&gt;
&lt;li&gt;Validators&lt;/li&gt;
&lt;li&gt;Data converters&lt;/li&gt;
&lt;li&gt;Sorting logic&lt;/li&gt;
&lt;li&gt;Serialization&lt;/li&gt;
&lt;li&gt;Mathematical code&lt;/li&gt;
&lt;li&gt;Security-sensitive code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It can find edge cases that developers simply did not think to write manually.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. Learn Program Profiling Instead of Guessing
&lt;/h2&gt;

&lt;p&gt;When an application is slow, many developers immediately start changing code.&lt;/p&gt;

&lt;p&gt;That can make things worse.&lt;/p&gt;

&lt;p&gt;A better skill is &lt;strong&gt;profiling&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Profiling helps you see where the program actually spends its time.&lt;/p&gt;

&lt;p&gt;For example, imagine this code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;processLargeDataset&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="s2"&gt;`Time: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;start&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;ms`&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is basic timing.&lt;/p&gt;

&lt;p&gt;A real profiler can go much deeper.&lt;/p&gt;

&lt;p&gt;It can show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which functions use CPU&lt;/li&gt;
&lt;li&gt;Where memory is allocated&lt;/li&gt;
&lt;li&gt;Which code runs most often&lt;/li&gt;
&lt;li&gt;Where the event loop is blocked&lt;/li&gt;
&lt;li&gt;Which functions create expensive work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once you know where the time is going, you can fix the real problem.&lt;/p&gt;

&lt;p&gt;Maybe the database query is slow.&lt;/p&gt;

&lt;p&gt;Maybe the application is creating thousands of objects.&lt;/p&gt;

&lt;p&gt;Maybe a function is running inside a loop.&lt;/p&gt;

&lt;p&gt;Maybe the code is waiting on network calls.&lt;/p&gt;

&lt;p&gt;Without profiling, you are guessing.&lt;/p&gt;

&lt;p&gt;With profiling, you have evidence.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Skills That Actually Connect
&lt;/h1&gt;

&lt;p&gt;The interesting part is not learning these techniques separately.&lt;/p&gt;

&lt;p&gt;It is combining them.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;AST + Runtime Validation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;can help you build tools that automatically find unsafe API patterns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Async Programming + Profiling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;can help you find slow network and concurrency problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Event-Driven Design + Idempotency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;can help you build safer distributed systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-Copy + Profiling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;can help you find performance problems caused by memory movement.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Coding + Property-Based Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;can help you use AI to write code while automatically checking whether that code behaves correctly.&lt;/p&gt;

&lt;p&gt;This is where advanced development becomes interesting.&lt;/p&gt;

&lt;p&gt;You stop thinking only about writing functions.&lt;/p&gt;

&lt;p&gt;You start thinking about &lt;strong&gt;how the entire program behaves&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;If you're testing these skills on a real VPS, &lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;HelloServer &lt;/a&gt;is also worth checking for a simple development and server setup.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Should You Build?
&lt;/h1&gt;

&lt;p&gt;If you want to practice these skills, don't build another basic todo app.&lt;/p&gt;

&lt;p&gt;Build something that forces you to solve a real problem.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Project 1: Build a Code Migration Tool
&lt;/h3&gt;

&lt;p&gt;Create a small CLI that scans a TypeScript project and automatically changes an old API pattern to a new one using an AST.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 2: Build a Safe Webhook Service
&lt;/h3&gt;

&lt;p&gt;Create an API that validates incoming webhook data, prevents duplicate events, and records failed requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 3: Build a High-Speed File Processor
&lt;/h3&gt;

&lt;p&gt;Use streaming and zero-copy techniques to process large files without loading everything into memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 4: Build a Property-Based Test Suite
&lt;/h3&gt;

&lt;p&gt;Take an existing library and write properties that should always remain true.&lt;/p&gt;

&lt;h3&gt;
  
  
  Project 5: Build an Event-Driven Order System
&lt;/h3&gt;

&lt;p&gt;Create &lt;code&gt;OrderCreated&lt;/code&gt;, &lt;code&gt;PaymentCompleted&lt;/code&gt;, and &lt;code&gt;OrderShipped&lt;/code&gt; events and make every event safe to retry.&lt;/p&gt;

&lt;p&gt;These projects will teach you much more than copying another beginner tutorial.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thought
&lt;/h1&gt;

&lt;p&gt;I think the best developers in 2026 will not simply be the people who know the most programming languages.&lt;/p&gt;

&lt;p&gt;They will be the people who understand &lt;strong&gt;what happens underneath the code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;How memory moves.&lt;/p&gt;

&lt;p&gt;How async work is controlled.&lt;/p&gt;

&lt;p&gt;How data is validated.&lt;/p&gt;

&lt;p&gt;How events can fail.&lt;/p&gt;

&lt;p&gt;How code can transform other code.&lt;/p&gt;

&lt;p&gt;How tests can find problems developers never thought about.&lt;/p&gt;

&lt;p&gt;And most importantly, how to measure a problem before trying to fix it.&lt;/p&gt;

&lt;p&gt;You don't need to learn all of this at once.&lt;/p&gt;

&lt;p&gt;Pick one topic that feels slightly uncomfortable.&lt;/p&gt;

&lt;p&gt;Build something with it.&lt;/p&gt;

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

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

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

&lt;p&gt;Then move to the next one.&lt;/p&gt;

&lt;p&gt;That is how you move from &lt;strong&gt;writing code&lt;/strong&gt; to actually &lt;strong&gt;understanding software&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>coding</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>5 VPS Mistakes Developers Make That Quietly Slow Down Their Applications</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Sun, 23 Aug 2026 06:41:15 +0000</pubDate>
      <link>https://dev.to/arthur_luca/5-vps-mistakes-developers-make-that-quietly-slow-down-their-applications-4icd</link>
      <guid>https://dev.to/arthur_luca/5-vps-mistakes-developers-make-that-quietly-slow-down-their-applications-4icd</guid>
      <description>&lt;p&gt;I am Arthur, and in this blog I want to talk about something many developers learn only after running a real application on a &lt;strong&gt;VPS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Buying a VPS is easy.&lt;/p&gt;

&lt;p&gt;Making it run well is a different story.&lt;/p&gt;

&lt;p&gt;A server can have enough RAM, good CPU, and fast NVMe storage and still feel slow because of a few simple configuration mistakes.&lt;/p&gt;

&lt;p&gt;In this article, I want to share some VPS problems that are easy to miss, even if you already know Linux and server management.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Giving Every Process Too Much RAM
&lt;/h2&gt;

&lt;p&gt;More RAM does not always mean better performance.&lt;/p&gt;

&lt;p&gt;This is something I learned after working with servers where the applications looked fine at first, but the server became unstable under load.&lt;/p&gt;

&lt;p&gt;For example, you may run:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx&lt;/li&gt;
&lt;li&gt;Node.js&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;Redis&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Background workers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each service needs memory.&lt;/p&gt;

&lt;p&gt;If you give a database too much memory while another application also needs RAM, the server can start using swap heavily.&lt;/p&gt;

&lt;p&gt;And once the system starts depending on swap, performance can drop quickly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check Memory Before Increasing Server Size
&lt;/h3&gt;

&lt;p&gt;Instead of guessing, check what the server is actually using.&lt;/p&gt;

&lt;p&gt;Commands such as &lt;code&gt;free -h&lt;/code&gt; and &lt;code&gt;top&lt;/code&gt; can give you a quick idea of memory usage.&lt;/p&gt;

&lt;p&gt;The goal is not to keep RAM usage at zero.&lt;/p&gt;

&lt;p&gt;The goal is to leave enough memory for normal traffic spikes and system processes.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Ignoring Disk I/O
&lt;/h2&gt;

&lt;p&gt;Developers often look at CPU usage when an application becomes slow.&lt;/p&gt;

&lt;p&gt;But CPU is not always the problem.&lt;/p&gt;

&lt;p&gt;Sometimes the server is waiting for the disk.&lt;/p&gt;

&lt;p&gt;This can happen with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large database queries&lt;/li&gt;
&lt;li&gt;Log files&lt;/li&gt;
&lt;li&gt;Backups&lt;/li&gt;
&lt;li&gt;Docker images&lt;/li&gt;
&lt;li&gt;File uploads&lt;/li&gt;
&lt;li&gt;Frequent database writes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is one reason &lt;strong&gt;NVMe storage&lt;/strong&gt; can be useful for some VPS workloads.&lt;/p&gt;

&lt;p&gt;But there is another important point.&lt;/p&gt;

&lt;p&gt;Fast storage does not automatically make a database fast.&lt;/p&gt;

&lt;p&gt;Poor queries, missing indexes, and unnecessary disk writes can still create a bottleneck.&lt;/p&gt;

&lt;p&gt;So if your CPU looks normal but requests are slow, check disk activity before upgrading the server.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Running Everything on One VPS Without Limits
&lt;/h2&gt;

&lt;p&gt;A small VPS can run many services.&lt;/p&gt;

&lt;p&gt;That does not mean you should run everything without limits.&lt;/p&gt;

&lt;p&gt;For example, a developer might put the web server, database, queue worker, monitoring system, Docker containers, and build tools on the same machine.&lt;/p&gt;

&lt;p&gt;It works fine during development.&lt;/p&gt;

&lt;p&gt;Then traffic increases.&lt;/p&gt;

&lt;p&gt;Suddenly one background process starts using most of the CPU and the website becomes slow.&lt;/p&gt;

&lt;p&gt;This is where resource limits become useful.&lt;/p&gt;

&lt;p&gt;For Docker containers, you can set CPU and memory limits so one service does not take everything from the others.&lt;/p&gt;

&lt;p&gt;It is a small setup step, but it can prevent a single process from affecting the whole server.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Keeping Huge Logs Forever
&lt;/h2&gt;

&lt;p&gt;Logs are important.&lt;/p&gt;

&lt;p&gt;Keeping every log forever is not.&lt;/p&gt;

&lt;p&gt;I have seen servers where application and system logs quietly grow until the disk is almost full.&lt;/p&gt;

&lt;p&gt;A full disk can cause much bigger problems than just missing logs.&lt;/p&gt;

&lt;p&gt;Databases may fail to write.&lt;/p&gt;

&lt;p&gt;Applications may stop creating files.&lt;/p&gt;

&lt;p&gt;Updates can fail.&lt;/p&gt;

&lt;p&gt;So log rotation should be part of normal VPS maintenance.&lt;/p&gt;

&lt;p&gt;You should also decide how long you actually need to keep logs.&lt;/p&gt;

&lt;p&gt;For many small projects, keeping months or years of logs on the production server is unnecessary.&lt;/p&gt;

&lt;p&gt;Move old logs somewhere else if you need long-term storage.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Not Watching Network Latency
&lt;/h2&gt;

&lt;p&gt;A server can have excellent hardware and still feel slow to users.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;The physical distance between the user and the server matters.&lt;/p&gt;

&lt;p&gt;If your users are mostly in Asia but your VPS is located far away, every request has to travel a longer network path.&lt;/p&gt;

&lt;p&gt;This becomes more noticeable for applications that make many requests.&lt;/p&gt;

&lt;p&gt;That is why &lt;strong&gt;VPS server location&lt;/strong&gt; should be part of your decision when choosing hosting.&lt;/p&gt;

&lt;p&gt;Do not look only at CPU, RAM, and price.&lt;/p&gt;

&lt;p&gt;Think about where your users actually are.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Small VPS Can Be Enough
&lt;/h2&gt;

&lt;p&gt;One mistake I see often is upgrading too early.&lt;/p&gt;

&lt;p&gt;If your application uses 1 GB of RAM most of the time, buying a huge VPS will not magically make your code faster.&lt;/p&gt;

&lt;p&gt;First find the bottleneck.&lt;/p&gt;

&lt;p&gt;Check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;Memory usage&lt;/li&gt;
&lt;li&gt;Disk I/O&lt;/li&gt;
&lt;li&gt;Database performance&lt;/li&gt;
&lt;li&gt;Network latency&lt;/li&gt;
&lt;li&gt;Application response time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then decide whether you actually need more resources.&lt;/p&gt;

&lt;p&gt;This approach can save money and also make troubleshooting easier.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Check Before Buying a VPS
&lt;/h2&gt;

&lt;p&gt;When I compare VPS hosting providers, I do not look at the monthly price alone.&lt;/p&gt;

&lt;p&gt;I check the actual resources and the conditions behind the plan.&lt;/p&gt;

&lt;p&gt;I usually look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU generation&lt;/li&gt;
&lt;li&gt;vCPU allocation&lt;/li&gt;
&lt;li&gt;RAM&lt;/li&gt;
&lt;li&gt;NVMe or SSD storage&lt;/li&gt;
&lt;li&gt;Network speed&lt;/li&gt;
&lt;li&gt;Traffic limits&lt;/li&gt;
&lt;li&gt;Server location&lt;/li&gt;
&lt;li&gt;Backup options&lt;/li&gt;
&lt;li&gt;Upgrade options&lt;/li&gt;
&lt;li&gt;Root access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hardware matters, but the provider's network and server setup matter too.&lt;/p&gt;

&lt;p&gt;For developers looking for an affordable VPS, &lt;strong&gt;&lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;HelloServer&lt;/a&gt;&lt;/strong&gt; is one option worth comparing with other providers before choosing a plan.&lt;/p&gt;

&lt;p&gt;The important thing is to match the VPS to the application instead of buying the biggest plan available.&lt;/p&gt;

&lt;h2&gt;
  
  
  One More Thing Developers Often Forget
&lt;/h2&gt;

&lt;p&gt;Backups are not the same as snapshots.&lt;/p&gt;

&lt;p&gt;A snapshot can be useful when you need to quickly restore a server to an earlier state.&lt;/p&gt;

&lt;p&gt;But you should not treat a single snapshot as your complete backup strategy.&lt;/p&gt;

&lt;p&gt;For important applications, keep backups separately from the main server.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because if the server has a serious problem, having the only copy of your data on that same server does not help much.&lt;/p&gt;

&lt;p&gt;A backup is useful when you can actually restore it.&lt;/p&gt;

&lt;p&gt;So test your backups from time to time.&lt;/p&gt;

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

&lt;p&gt;A VPS gives developers a lot of control.&lt;/p&gt;

&lt;p&gt;But that control also means you are responsible for how the server is configured and maintained.&lt;/p&gt;

&lt;p&gt;Before upgrading your VPS, find the real bottleneck.&lt;/p&gt;

&lt;p&gt;Before buying a VPS, look beyond the price.&lt;/p&gt;

&lt;p&gt;And before putting an application into production, think about backups, resource limits, logs, security, and monitoring.&lt;/p&gt;

&lt;p&gt;These small things are easy to ignore when everything is working.&lt;/p&gt;

&lt;p&gt;They become very important when traffic starts growing.&lt;/p&gt;

</description>
      <category>vps</category>
      <category>devops</category>
      <category>webdev</category>
      <category>linux</category>
    </item>
    <item>
      <title>The 2026 Skill Most Website Owners Are Still Ignoring</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Sat, 22 Aug 2026 07:07:53 +0000</pubDate>
      <link>https://dev.to/arthur_luca/the-2026-skill-most-website-owners-are-still-ignoring-bfk</link>
      <guid>https://dev.to/arthur_luca/the-2026-skill-most-website-owners-are-still-ignoring-bfk</guid>
      <description>&lt;p&gt;Hi everyone, I’m the author, and in this blog, I want to tell you about a skill that I think is really useful in 2026: &lt;strong&gt;VPS optimization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You may have heard about VPS before, but maybe you never thought about learning how to manage and improve it yourself.&lt;/p&gt;

&lt;p&gt;Honestly, it is not as difficult as it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Is This Skill Useful in 2026?
&lt;/h2&gt;

&lt;p&gt;Today, almost every website wants to be fast, stable, and ready for more visitors.&lt;/p&gt;

&lt;p&gt;But here is the thing.&lt;/p&gt;

&lt;p&gt;People often focus only on SEO, keywords, backlinks, and content. They forget about the server running the website.&lt;/p&gt;

&lt;p&gt;If your server is slow or poorly managed, even a good website can have problems.&lt;/p&gt;

&lt;p&gt;That is why learning some basic &lt;strong&gt;VPS skills&lt;/strong&gt; can be a smart move.&lt;/p&gt;

&lt;p&gt;If you are new to VPS, you can start by learning about &lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;VPS hosting&lt;/a&gt; and how it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Simple Secret
&lt;/h2&gt;

&lt;p&gt;Here is the part I find interesting.&lt;/p&gt;

&lt;p&gt;You do not always need to buy a bigger server to get better performance.&lt;/p&gt;

&lt;p&gt;Sometimes, you just need to use your current server in a better way.&lt;/p&gt;

&lt;p&gt;For example, you can check your RAM and CPU usage, remove things you do not need, use caching, and keep your server updated.&lt;/p&gt;

&lt;p&gt;These small changes can make a big difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  You Can Learn It Step by Step
&lt;/h2&gt;

&lt;p&gt;The best thing is that you do not need to learn everything at once.&lt;/p&gt;

&lt;p&gt;Start with simple things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check your CPU and RAM usage&lt;/li&gt;
&lt;li&gt;Remove unused services&lt;/li&gt;
&lt;li&gt;Keep your server updated&lt;/li&gt;
&lt;li&gt;Use caching&lt;/li&gt;
&lt;li&gt;Compress large files&lt;/li&gt;
&lt;li&gt;Check your database&lt;/li&gt;
&lt;li&gt;Monitor your server&lt;/li&gt;
&lt;li&gt;Keep regular backups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Take one skill at a time.&lt;/p&gt;

&lt;p&gt;After a while, you will understand much more about what is happening behind your website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Should You Learn It?
&lt;/h2&gt;

&lt;p&gt;Learning VPS optimization can help you in many ways.&lt;/p&gt;

&lt;p&gt;You can understand your hosting better, find server problems faster, and make better decisions when your website starts getting more traffic.&lt;/p&gt;

&lt;p&gt;It can also help you avoid paying for resources you do not really need.&lt;/p&gt;

&lt;p&gt;And honestly, having this knowledge feels good.&lt;/p&gt;

&lt;p&gt;Instead of always asking someone else, you can look at your server and understand what is going on.&lt;/p&gt;

&lt;h2&gt;
  
  
  One Thing Many People Miss
&lt;/h2&gt;

&lt;p&gt;When people talk about website growth, they usually talk about SEO, content, keywords, and backlinks.&lt;/p&gt;

&lt;p&gt;All of these things matter.&lt;/p&gt;

&lt;p&gt;But your website also needs a strong place to run.&lt;/p&gt;

&lt;p&gt;That is your server.&lt;/p&gt;

&lt;p&gt;So if you are already learning SEO or website development in 2026, why not learn a little about &lt;strong&gt;VPS optimization&lt;/strong&gt; too?&lt;/p&gt;

&lt;p&gt;It could become one of those skills you are happy you learned.&lt;/p&gt;

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

&lt;p&gt;You do not need to become a server expert.&lt;/p&gt;

&lt;p&gt;Just start small.&lt;/p&gt;

&lt;p&gt;Learn how VPS works, understand your resources, and try a few simple optimizations.&lt;/p&gt;

&lt;p&gt;You may be surprised by how much you can learn.&lt;/p&gt;

&lt;p&gt;Sometimes, the most useful website skill is not the one everyone is talking about.&lt;/p&gt;

&lt;p&gt;It is the one you decide to learn before everyone else does.&lt;/p&gt;

</description>
      <category>website</category>
      <category>seo</category>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>Docker for Developers: 10 Practical Things You Should Know Before Deploying an App</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Fri, 21 Aug 2026 17:07:42 +0000</pubDate>
      <link>https://dev.to/arthur_luca/docker-for-developers-10-practical-things-you-should-know-before-deploying-an-app-53n8</link>
      <guid>https://dev.to/arthur_luca/docker-for-developers-10-practical-things-you-should-know-before-deploying-an-app-53n8</guid>
      <description>&lt;p&gt;Hi everyone ,I am a Arthur and in this article I want to talk about some Docker things that are easy to miss when you are just starting with containers.&lt;/p&gt;

&lt;p&gt;Docker is not only about writing a &lt;code&gt;Dockerfile&lt;/code&gt; and running &lt;code&gt;docker build&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Once you start using Docker for real projects, small things can create big problems.&lt;/p&gt;

&lt;p&gt;Your image can become too large.&lt;/p&gt;

&lt;p&gt;Your container can use more memory than expected.&lt;/p&gt;

&lt;p&gt;Your app can work locally but fail after deployment.&lt;/p&gt;

&lt;p&gt;So here are some practical Docker lessons that are worth knowing.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Your Docker Image Can Become Very Large
&lt;/h2&gt;

&lt;p&gt;One common mistake is copying everything into the image.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This can also copy files you do not need, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node_modules&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;log files&lt;/li&gt;
&lt;li&gt;local configuration&lt;/li&gt;
&lt;li&gt;temporary files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple &lt;code&gt;.dockerignore&lt;/code&gt; file can help:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node_modules
.git
.env
*.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the build cleaner and can also reduce the image size.&lt;/p&gt;

&lt;p&gt;A smaller image usually means less data to transfer and faster image pulls during deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Do Not Put Secrets Inside the Image
&lt;/h2&gt;

&lt;p&gt;This is an important one.&lt;/p&gt;

&lt;p&gt;You should not put things like database passwords or API keys directly inside your Dockerfile.&lt;/p&gt;

&lt;p&gt;For example, avoid doing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; DATABASE_PASSWORD=my-secret-password&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because image layers can keep information that you thought you removed later.&lt;/p&gt;

&lt;p&gt;Use environment variables or a proper secrets system instead.&lt;/p&gt;

&lt;p&gt;For local development, you might use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;DATABASE_URL=your_database_url
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For production, use the secret management system provided by your platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Your Container Is Not Your Server
&lt;/h2&gt;

&lt;p&gt;This is something new Docker users often misunderstand.&lt;/p&gt;

&lt;p&gt;A container is meant to run your application.&lt;/p&gt;

&lt;p&gt;It is not normally a replacement for the whole server.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server
   ↓
Docker
   ↓
Container
   ↓
Your Application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The server provides the CPU, RAM, storage, and network.&lt;/p&gt;

&lt;p&gt;Docker creates an isolated environment where your application runs.&lt;/p&gt;

&lt;p&gt;This difference becomes important when you deploy multiple applications on the same machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Containers Can Use Too Much Memory
&lt;/h2&gt;

&lt;p&gt;Docker does not magically make an application lightweight.&lt;/p&gt;

&lt;p&gt;If your Node.js application has a memory problem, putting it inside Docker will not fix the problem.&lt;/p&gt;

&lt;p&gt;You can set resource limits when needed.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;512m my-node-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the container has a memory limit.&lt;/p&gt;

&lt;p&gt;This is useful on shared servers because one application should not be allowed to consume all available memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Use a Small Base Image
&lt;/h2&gt;

&lt;p&gt;Your base image matters.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:24&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can be much larger than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="s"&gt; node:24-alpine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A smaller image can reduce storage and download time.&lt;/p&gt;

&lt;p&gt;But do not blindly choose the smallest image.&lt;/p&gt;

&lt;p&gt;Some packages need system libraries that may not be available in a minimal image.&lt;/p&gt;

&lt;p&gt;So the better rule is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use a small image, but make sure your application actually works with it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Build Layers Can Make Your Builds Faster
&lt;/h2&gt;

&lt;p&gt;Look at this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; package*.json ./&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; . .&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This order is useful.&lt;/p&gt;

&lt;p&gt;Docker can reuse previous build layers when the files have not changed.&lt;/p&gt;

&lt;p&gt;If you change only your application code, Docker may not need to install all your packages again.&lt;/p&gt;

&lt;p&gt;That can make development builds much faster.&lt;/p&gt;

&lt;p&gt;This is a small Docker detail, but it makes a big difference when you build images many times every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Do Not Store Application Data Inside the Container
&lt;/h2&gt;

&lt;p&gt;Containers can be removed and recreated.&lt;/p&gt;

&lt;p&gt;So if your application writes important data inside the container filesystem, you can lose it when the container is replaced.&lt;/p&gt;

&lt;p&gt;For example, databases should normally use persistent storage.&lt;/p&gt;

&lt;p&gt;The same idea applies to uploaded files.&lt;/p&gt;

&lt;p&gt;Use volumes or external storage when data needs to survive container changes.&lt;/p&gt;

&lt;p&gt;Think about it this way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Container = temporary

Persistent storage = data that must stay
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially important when moving from local development to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Health Checks Matter
&lt;/h2&gt;

&lt;p&gt;Your container being "running" does not always mean your application is working.&lt;/p&gt;

&lt;p&gt;A process can still exist while the application is unhealthy.&lt;/p&gt;

&lt;p&gt;A health check can help detect this.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="k"&gt;HEALTHCHECK&lt;/span&gt;&lt;span class="s"&gt; CMD curl --fail http://localhost:3000/ || exit 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the system can check whether the application is actually responding.&lt;/p&gt;

&lt;p&gt;This becomes useful when you later use Docker Compose, Kubernetes, or a load balancer.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Why Developers Use a VPS for Docker
&lt;/h2&gt;

&lt;p&gt;When you want to move from local development to a real server, you need somewhere to run your containers.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;VPS (Virtual Private Server)&lt;/strong&gt; gives you a private virtual machine with allocated resources such as CPU, RAM, storage, and network access.&lt;/p&gt;

&lt;p&gt;That makes it useful for developers who want more control than basic shared hosting.&lt;/p&gt;

&lt;p&gt;For example, you can rent a &lt;strong&gt;&lt;a href="https://helloserver.tech/" rel="noopener noreferrer"&gt;VPS&lt;/a&gt;&lt;/strong&gt; and install Docker on it.&lt;/p&gt;

&lt;p&gt;Then your deployment can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub
   ↓
Docker Build
   ↓
Docker Image
   ↓
VPS
   ↓
Docker Container
   ↓
Your App
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is also a good way to learn real deployment.&lt;/p&gt;

&lt;p&gt;You can manage the server, configure a firewall, connect a domain, add HTTPS, run Docker containers, check logs, and monitor CPU and RAM.&lt;/p&gt;

&lt;p&gt;The important part is that you are working with a real environment instead of only running code on your laptop.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. Docker Is Only One Part of Deployment
&lt;/h2&gt;

&lt;p&gt;This is probably the biggest thing to understand.&lt;/p&gt;

&lt;p&gt;Docker solves the application environment problem.&lt;/p&gt;

&lt;p&gt;It does not automatically solve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTPS&lt;/li&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;Backups&lt;/li&gt;
&lt;li&gt;Monitoring&lt;/li&gt;
&lt;li&gt;Server security&lt;/li&gt;
&lt;li&gt;Database management&lt;/li&gt;
&lt;li&gt;Scaling&lt;/li&gt;
&lt;li&gt;Deployment automation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A real production setup may look more like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
   ↓
GitHub
   ↓
CI/CD
   ↓
Docker Image
   ↓
VPS / Cloud
   ↓
Nginx
   ↓
Docker Container
   ↓
Application
   ↓
Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each part has a different job.&lt;/p&gt;

&lt;p&gt;Once you understand this, Docker starts making much more sense.&lt;/p&gt;

&lt;h1&gt;
  
  
  A Simple Docker Workflow for Developers
&lt;/h1&gt;

&lt;p&gt;For a small project, you can start with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Write Code
   ↓
Test Locally
   ↓
Build Docker Image
   ↓
Run Container
   ↓
Push Code
   ↓
Deploy
   ↓
Monitor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Later, you can add GitHub Actions, automated testing, image scanning, a container registry, and automatic deployment.&lt;/p&gt;

&lt;p&gt;You do not need all of these on day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Main Lesson
&lt;/h2&gt;

&lt;p&gt;Docker is not just a skill where you learn five commands and put "Docker" on your resume.&lt;/p&gt;

&lt;p&gt;The useful skill is understanding &lt;strong&gt;why containers behave the way they do&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Know what happens to your files.&lt;/p&gt;

&lt;p&gt;Know where your data lives.&lt;/p&gt;

&lt;p&gt;Know how much memory your application uses.&lt;/p&gt;

&lt;p&gt;Know how your image is built.&lt;/p&gt;

&lt;p&gt;Know how secrets are handled.&lt;/p&gt;

&lt;p&gt;And most importantly, know what happens when that container reaches a real server.&lt;/p&gt;

&lt;p&gt;That is when Docker becomes a real developer skill instead of just another tool to learn.&lt;/p&gt;

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

&lt;p&gt;If you are learning Docker, don't spend all your time watching tutorials.&lt;/p&gt;

&lt;p&gt;Take one application you already have.&lt;/p&gt;

&lt;p&gt;Put it inside a container.&lt;/p&gt;

&lt;p&gt;Make the image smaller.&lt;/p&gt;

&lt;p&gt;Add a health check.&lt;/p&gt;

&lt;p&gt;Handle your environment variables properly.&lt;/p&gt;

&lt;p&gt;Deploy it to a real &lt;strong&gt;&lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;VPS&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Then break something and fix it.&lt;/p&gt;

&lt;p&gt;You will probably learn more from that one project than from another ten hours of tutorials.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>webdev</category>
      <category>cloudcomputing</category>
      <category>developers</category>
    </item>
    <item>
      <title>How to Create Your Own Claude Code Skill With SKILL.md</title>
      <dc:creator>Arthur</dc:creator>
      <pubDate>Thu, 20 Aug 2026 15:30:25 +0000</pubDate>
      <link>https://dev.to/arthur_luca/how-to-create-your-own-claude-code-skill-with-skillmd-3555</link>
      <guid>https://dev.to/arthur_luca/how-to-create-your-own-claude-code-skill-with-skillmd-3555</guid>
      <description>&lt;p&gt;If you use Claude Code for frontend development, you may have noticed something.&lt;/p&gt;

&lt;p&gt;Claude can write code very fast.&lt;/p&gt;

&lt;p&gt;But sometimes the UI it creates looks too similar to other AI-generated websites.&lt;/p&gt;

&lt;p&gt;You get the same rounded cards, large headings, soft shadows, gradients, and simple layouts.&lt;/p&gt;

&lt;p&gt;The code works.&lt;/p&gt;

&lt;p&gt;But the design does not always feel like your own.&lt;/p&gt;

&lt;p&gt;Hi everyone, I am Henry.&lt;/p&gt;

&lt;p&gt;In this article, I want to show you a simple way to fix that.&lt;/p&gt;

&lt;p&gt;We are going to create our own &lt;strong&gt;Claude Code Skill&lt;/strong&gt; using a &lt;code&gt;SKILL.md&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;You do not need to build a complicated tool.&lt;/p&gt;

&lt;p&gt;You just need a clear set of instructions that Claude can follow when working on your frontend.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is a Claude Code Skill?
&lt;/h2&gt;

&lt;p&gt;A Claude Code Skill is a reusable set of instructions for a specific type of work.&lt;/p&gt;

&lt;p&gt;For example, you can create a skill for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend design&lt;/li&gt;
&lt;li&gt;Testing&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Code review&lt;/li&gt;
&lt;li&gt;Database work&lt;/li&gt;
&lt;li&gt;DevOps&lt;/li&gt;
&lt;li&gt;UI accessibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this tutorial, we will create a &lt;strong&gt;frontend design skill&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Our goal is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Help Claude create clean frontend UI without falling back to the same generic design patterns.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of writing the same design rules in every prompt, we can keep them inside a skill.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Create the Skill Folder
&lt;/h2&gt;

&lt;p&gt;Open your project in the terminal.&lt;/p&gt;

&lt;p&gt;Create a &lt;code&gt;.claude&lt;/code&gt; folder if you do not already have one.&lt;/p&gt;

&lt;p&gt;Then create a skills folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; .claude/skills/frontend-design
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now create the skill file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch&lt;/span&gt; .claude/skills/frontend-design/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your project should now look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;your-project/
├── .claude/
│   └── skills/
│       └── frontend-design/
│           └── SKILL.md
├── src/
├── package.json
└── README.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important file here is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where we will put our instructions.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Write Your SKILL.md
&lt;/h2&gt;

&lt;p&gt;Open the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;code .claude/skills/frontend-design/SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now add the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;frontend-design&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Build clean, responsive frontend UI with simple and consistent design rules.&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

&lt;span class="gh"&gt;# Frontend Design Rules&lt;/span&gt;

Before writing UI code:
&lt;span class="p"&gt;
1.&lt;/span&gt; Understand the purpose of the page.
&lt;span class="p"&gt;2.&lt;/span&gt; Think about the target user.
&lt;span class="p"&gt;3.&lt;/span&gt; Keep the layout simple and easy to scan.
&lt;span class="p"&gt;4.&lt;/span&gt; Use consistent spacing.
&lt;span class="p"&gt;5.&lt;/span&gt; Use a clear typography hierarchy.
&lt;span class="p"&gt;6.&lt;/span&gt; Avoid unnecessary cards and containers.
&lt;span class="p"&gt;7.&lt;/span&gt; Do not use gradients unless they have a clear purpose.
&lt;span class="p"&gt;8.&lt;/span&gt; Do not add icons just to fill empty space.
&lt;span class="p"&gt;9.&lt;/span&gt; Keep buttons clear and easy to understand.
&lt;span class="p"&gt;10.&lt;/span&gt; Make the design responsive.

&lt;span class="gu"&gt;## Typography&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use a clear heading hierarchy.
&lt;span class="p"&gt;-&lt;/span&gt; Keep paragraphs easy to read.
&lt;span class="p"&gt;-&lt;/span&gt; Avoid very long lines of text.
&lt;span class="p"&gt;-&lt;/span&gt; Use font weight to create hierarchy.
&lt;span class="p"&gt;-&lt;/span&gt; Do not make every heading extremely large.

&lt;span class="gu"&gt;## Colors&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use a small color palette.
&lt;span class="p"&gt;-&lt;/span&gt; Keep the main action easy to recognize.
&lt;span class="p"&gt;-&lt;/span&gt; Do not use several bright colors without a reason.
&lt;span class="p"&gt;-&lt;/span&gt; Make sure text has enough contrast.

&lt;span class="gu"&gt;## Layout&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use whitespace to separate important sections.
&lt;span class="p"&gt;-&lt;/span&gt; Avoid putting every element inside a card.
&lt;span class="p"&gt;-&lt;/span&gt; Keep related content together.
&lt;span class="p"&gt;-&lt;/span&gt; Make the main action easy to find.

&lt;span class="gu"&gt;## Responsive Design&lt;/span&gt;

Always check:
&lt;span class="p"&gt;
-&lt;/span&gt; Desktop
&lt;span class="p"&gt;-&lt;/span&gt; Tablet
&lt;span class="p"&gt;-&lt;/span&gt; Mobile

Do not simply shrink the desktop layout.

Change the layout when needed.

&lt;span class="gu"&gt;## Interaction&lt;/span&gt;

Add useful states for:
&lt;span class="p"&gt;
-&lt;/span&gt; Hover
&lt;span class="p"&gt;-&lt;/span&gt; Focus
&lt;span class="p"&gt;-&lt;/span&gt; Active
&lt;span class="p"&gt;-&lt;/span&gt; Disabled
&lt;span class="p"&gt;-&lt;/span&gt; Loading
&lt;span class="p"&gt;-&lt;/span&gt; Error
&lt;span class="p"&gt;-&lt;/span&gt; Success

Keep animations small and useful.

Do not animate every element.

&lt;span class="gu"&gt;## Accessibility&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Use semantic HTML.
&lt;span class="p"&gt;-&lt;/span&gt; Add labels to form fields.
&lt;span class="p"&gt;-&lt;/span&gt; Keep keyboard navigation working.
&lt;span class="p"&gt;-&lt;/span&gt; Use visible focus states.
&lt;span class="p"&gt;-&lt;/span&gt; Add useful alt text to meaningful images.

&lt;span class="gu"&gt;## Before Finishing&lt;/span&gt;

Check the page for:
&lt;span class="p"&gt;
-&lt;/span&gt; Inconsistent spacing
&lt;span class="p"&gt;-&lt;/span&gt; Weak typography
&lt;span class="p"&gt;-&lt;/span&gt; Too many cards
&lt;span class="p"&gt;-&lt;/span&gt; Unnecessary animations
&lt;span class="p"&gt;-&lt;/span&gt; Poor mobile layout
&lt;span class="p"&gt;-&lt;/span&gt; Low color contrast
&lt;span class="p"&gt;-&lt;/span&gt; Missing button states
&lt;span class="p"&gt;-&lt;/span&gt; Missing form states

Remove anything that does not help the user.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is already enough to create a useful starting skill.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Why These Rules Matter
&lt;/h2&gt;

&lt;p&gt;You may be wondering why we need so many simple rules.&lt;/p&gt;

&lt;p&gt;Because Claude needs a direction.&lt;/p&gt;

&lt;p&gt;For example, if you only say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a modern landing page.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude has to guess what “modern” means.&lt;/p&gt;

&lt;p&gt;It may create something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Huge heading
↓
Gradient background
↓
Two buttons
↓
Three rounded cards
↓
More cards
↓
Testimonials
↓
Pricing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is nothing technically wrong with that.&lt;/p&gt;

&lt;p&gt;But it can feel very predictable.&lt;/p&gt;

&lt;p&gt;Now compare that with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a developer-focused landing page.

Keep the layout compact.

Use strong typography.

Avoid large gradients.

Do not put every feature inside a card.

Use simple colors.

Keep animations subtle.

Make the main action clear.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second prompt gives Claude a much better direction.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;SKILL.md&lt;/code&gt; lets you keep those rules available for the project.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Add Project-Specific Rules
&lt;/h2&gt;

&lt;p&gt;The real power comes when you make the skill fit your project.&lt;/p&gt;

&lt;p&gt;For example, maybe you are building a developer tool.&lt;/p&gt;

&lt;p&gt;You can add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Project Style&lt;/span&gt;

This product is made for developers.

The UI should feel:
&lt;span class="p"&gt;
-&lt;/span&gt; Technical
&lt;span class="p"&gt;-&lt;/span&gt; Clean
&lt;span class="p"&gt;-&lt;/span&gt; Fast
&lt;span class="p"&gt;-&lt;/span&gt; Focused

Avoid:
&lt;span class="p"&gt;
-&lt;/span&gt; Large decorative illustrations
&lt;span class="p"&gt;-&lt;/span&gt; Heavy gradients
&lt;span class="p"&gt;-&lt;/span&gt; Excessive rounded cards
&lt;span class="p"&gt;-&lt;/span&gt; Large empty hero sections
&lt;span class="p"&gt;-&lt;/span&gt; Unnecessary animations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Claude has a much clearer idea of the product.&lt;/p&gt;

&lt;p&gt;You can do the same thing for a SaaS app, portfolio, dashboard, ecommerce site, or documentation website.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Use the Skill While Building
&lt;/h2&gt;

&lt;p&gt;Now you can work on your frontend normally with Claude Code.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a pricing page for this project.

Follow the frontend-design skill.

Keep the layout simple and easy to scan.

Make the pricing options clear on mobile.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Follow the frontend-design skill.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Claude has both:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your current request&lt;/li&gt;
&lt;li&gt;Your reusable design rules&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is much better than putting the same 20 design instructions into every prompt.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Ask Claude to Review the UI
&lt;/h2&gt;

&lt;p&gt;This is one of my favorite ways to use a skill.&lt;/p&gt;

&lt;p&gt;Do not only use Claude to create the page.&lt;/p&gt;

&lt;p&gt;Use it to review the page too.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review the current page using the frontend-design skill.

Find problems with:

- spacing
- typography
- colors
- responsive layout
- button states
- accessibility
- unnecessary UI

Fix the problems directly.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives Claude a clear checklist.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make this page better.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;you are asking for specific checks.&lt;/p&gt;

&lt;p&gt;That usually produces a much more useful result.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 7: Add Real Interaction States
&lt;/h2&gt;

&lt;p&gt;One thing I always check is button and form states.&lt;/p&gt;

&lt;p&gt;For example, a simple button should not only have a normal state.&lt;/p&gt;

&lt;p&gt;It should also handle:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:hover&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.9&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:focus-visible&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;outline&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt; &lt;span class="nb"&gt;solid&lt;/span&gt; &lt;span class="n"&gt;currentColor&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;outline-offset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0.98&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.button&lt;/span&gt;&lt;span class="nd"&gt;:disabled&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;opacity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;not-allowed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You do not need a big animation system.&lt;/p&gt;

&lt;p&gt;Small details like these can make a UI feel much more complete.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 8: Make Claude Check Mobile
&lt;/h2&gt;

&lt;p&gt;A page can look great on a laptop and still be bad on a phone.&lt;/p&gt;

&lt;p&gt;So I usually add a separate mobile check.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Review this page at mobile width.

Check:

- Navigation
- Headings
- Buttons
- Cards
- Forms
- Horizontal scrolling
- Text size
- Section spacing

Fix anything that feels difficult to use.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much better than simply saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make it responsive.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You are telling Claude exactly what to check.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where Should You Host the Project?
&lt;/h2&gt;

&lt;p&gt;Once your frontend is ready, you need somewhere to run and test it.&lt;/p&gt;

&lt;p&gt;A VPS gives you more control over your environment, especially when you are working with your own applications, APIs, databases, or development tools.&lt;/p&gt;

&lt;p&gt;If you are looking for a VPS for your web projects, &lt;strong&gt;&lt;a href="https://helloserver.tech/vps-hosting/" rel="noopener noreferrer"&gt;HelloServer&lt;/a&gt;&lt;/strong&gt; is one option you can check.&lt;/p&gt;

&lt;p&gt;Choose your VPS based on what your project actually needs instead of paying for resources you will never use.&lt;/p&gt;

&lt;p&gt;For a small project, start simple.&lt;/p&gt;

&lt;p&gt;As your traffic and workload grow, you can increase your resources.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Mistakes When Creating a Claude Code Skill
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Making the Skill Too Long
&lt;/h3&gt;

&lt;p&gt;You do not need hundreds of rules.&lt;/p&gt;

&lt;p&gt;Keep the important ones.&lt;/p&gt;

&lt;p&gt;Claude needs clear instructions, not a huge design textbook.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Using Vague Words
&lt;/h3&gt;

&lt;p&gt;Words like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Make it beautiful.
Make it modern.
Make it premium.
Make it awesome.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;are not very useful on their own.&lt;/p&gt;

&lt;p&gt;Explain what those words mean for your project.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Adding Too Many Design Rules
&lt;/h3&gt;

&lt;p&gt;If you tell Claude:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Use 17 different rules for every button, card, heading, icon, and animation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;the skill can become difficult to maintain.&lt;/p&gt;

&lt;p&gt;Start small.&lt;/p&gt;

&lt;p&gt;Add rules when you find a real problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Forgetting Mobile
&lt;/h3&gt;

&lt;p&gt;Always include mobile checks in your skill.&lt;/p&gt;

&lt;p&gt;A frontend design skill should not only think about desktop screens.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Forgetting Accessibility
&lt;/h3&gt;

&lt;p&gt;A design can look good and still be difficult to use.&lt;/p&gt;

&lt;p&gt;Add simple checks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keyboard navigation&lt;/li&gt;
&lt;li&gt;Focus states&lt;/li&gt;
&lt;li&gt;Contrast&lt;/li&gt;
&lt;li&gt;Form labels&lt;/li&gt;
&lt;li&gt;Semantic HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These things matter.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Simple Workflow I Use
&lt;/h2&gt;

&lt;p&gt;My workflow is basically this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create SKILL.md
      ↓
Add project design rules
      ↓
Build the first version
      ↓
Ask Claude to review it
      ↓
Fix layout and typography
      ↓
Check mobile
      ↓
Check accessibility
      ↓
Polish interactions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You do not need a complicated system.&lt;/p&gt;

&lt;p&gt;A small skill with good rules can already make your workflow much better.&lt;/p&gt;




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

&lt;p&gt;Claude Code is already very good at writing code.&lt;/p&gt;

&lt;p&gt;The problem is that the first UI it creates can sometimes look too generic.&lt;/p&gt;

&lt;p&gt;A custom &lt;strong&gt;Claude Code Skill&lt;/strong&gt; gives you a simple way to add your own design rules.&lt;/p&gt;

&lt;p&gt;You can tell Claude what to use.&lt;/p&gt;

&lt;p&gt;You can tell it what to avoid.&lt;/p&gt;

&lt;p&gt;You can give it rules for typography, spacing, colors, responsive design, accessibility, and interaction.&lt;/p&gt;

&lt;p&gt;And the best part is that you can keep improving the skill as you work.&lt;/p&gt;

&lt;p&gt;If you notice Claude making the same mistake again and again, don't just fix that page.&lt;/p&gt;

&lt;p&gt;Add a rule to your &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then Claude can follow that rule the next time too.&lt;/p&gt;

&lt;p&gt;That's what makes a custom skill useful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Write the rule once. Reuse it across your project.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you use Claude Code, I would love to know what kind of custom skill you would build first. Let me know in the comments.&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>frontend</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
