<?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: ServerAvatar</title>
    <description>The latest articles on DEV Community by ServerAvatar (serveravatar).</description>
    <link>https://dev.to/serveravatar</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%2Forganization%2Fprofile_image%2F10842%2F09fcbec7-cef1-4cc4-a9a1-705d6d9dc893.jpeg</url>
      <title>DEV Community: ServerAvatar</title>
      <link>https://dev.to/serveravatar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/serveravatar"/>
    <language>en</language>
    <item>
      <title>How to Fix SSH Connection Refused Error</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Tue, 28 Jul 2026 06:11:08 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-fix-ssh-connection-refused-error-3dej</link>
      <guid>https://dev.to/serveravatar/how-to-fix-ssh-connection-refused-error-3dej</guid>
      <description>&lt;p&gt;You have typed your command, hit Enter, expecting to connect to your server. Instead, you’re greeted with the frustrating SSH Connection Refused error rather than a welcoming shell prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh: connect to host your-server port 22: Connection refused
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That flat, unhelpful line is one of the most frustrating messages in server management. No explanation. No suggested fix. Just a door slammed in your face.&lt;/p&gt;

&lt;p&gt;I have been there more times than I’d like to admit, particularly after spinning up new VPS instances where I’d forgotten to note the custom SSH port, or after a firewall rule I applied broader than intended cut off my own access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The good news:&lt;/strong&gt; SSH Connection Refused is almost always fixable in minutes once you know what to check. This guide walks through every real cause I have encountered in practice, with the exact commands that diagnose and resolve each one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this guide covers:&lt;/strong&gt; the meaning behind the error, causes, step-by-step fixes, a prevention checklist, and the FAQs I actually hear from developers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who it’s for:&lt;/strong&gt; anyone managing a Linux server, whether it’s your first VPS or your hundredth.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;SSH Connection Refused means the server is actively rejecting your connection attempt&lt;/li&gt;
&lt;li&gt;The most common causes: wrong port, service not running, firewall blocking, wrong credentials, and SSH not installed&lt;/li&gt;
&lt;li&gt;Most fixes take under 5 minutes from your terminal&lt;/li&gt;
&lt;li&gt;Always verify the fix by attempting to reconnect before assuming the problem is solved&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prevention:&lt;/strong&gt; use non-default ports, configure fail2ban, and restrict SSH to specific IPs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Does “SSH Connection Refused” Actually Mean?
&lt;/h2&gt;

&lt;p&gt;Let’s be precise, because understanding the mechanics changes how you debug.&lt;/p&gt;

&lt;p&gt;“Connection Refused” is TCP’s way of saying: I heard you, but I’m not accepting this connection. The server received your SYN packet, processed it, and sent back a RST (reset) flag. This is fundamentally different from a timeout (where the server never responds at all) or an authentication failure (where the server accepts the connection but rejects your credentials).&lt;/p&gt;

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

&lt;p&gt;In SSH terms, this means the SSH daemon, sshd , either isn’t listening on the port you are targeting, isn’t running at all, or something network-level is intercepting the request before it reaches the daemon.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The practical difference matters:&lt;/strong&gt; if you see “Connection Refused”, you at least know the server is reachable over the network. That’s useful diagnostic information.&lt;/p&gt;

&lt;p&gt;If you want to learn more about how SSH works internally, including its configuration options and authentication process, the &lt;a href="https://www.openssh.org/manual.html?ref=serveravatar.com" rel="noopener noreferrer"&gt;official OpenSSH documentation&lt;/a&gt; provides detailed explanations.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  How to Diagnose SSH Connection Refused
&lt;/h2&gt;

&lt;p&gt;Before fixing anything, verify. The most common mistake I see is jumping to conclusions, changing the SSH port when the problem was the firewall, or reinstalling SSH when the service just needed a restart.&lt;/p&gt;

&lt;p&gt;Here’s the diagnostic sequence I follow, in order:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Confirm the server is reachable at all&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ping -c 3 your-server-ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If ping fails, you have a network connectivity issue, possibly the server is down, or it’s on an unreachable network. That’s a different problem than Connection Refused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Check if the SSH port is reachable&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nc -zv your-server-ip 22
# or if the port is non-standard:
nc -zv your-server-ip 2222
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If this shows “Connection refused”, you have confirmation the problem is at the SSH layer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Use SSH verbose mode for more detail&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -v username@your-server-ip -p PORT
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The -v flag (use -vvv for maximum verbosity) shows exactly where the connection attempt stalls.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focbywkl7emtszg7f7jhp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Focbywkl7emtszg7f7jhp.jpg" alt="using ssh verbose mode for more details - SSH Connection Refused" width="796" height="42"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This alone often points you directly to the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/ssh-connection-refused" rel="noopener noreferrer"&gt;https://serveravatar.com/ssh-connection-refused&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>linux</category>
      <category>devops</category>
      <category>networking</category>
    </item>
    <item>
      <title>Linux File Permissions Explained: Read, Write, and Change Permissions</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Sat, 25 Jul 2026 06:28:56 +0000</pubDate>
      <link>https://dev.to/serveravatar/linux-file-permissions-explained-read-write-and-change-permissions-3ble</link>
      <guid>https://dev.to/serveravatar/linux-file-permissions-explained-read-write-and-change-permissions-3ble</guid>
      <description>&lt;p&gt;Linux file permissions are one of the first concepts every Linux user and system administrator needs to master. Every sysadmin has been burned by a permissions mistake at least once. Uploaded a script that won’t run. Moved a file you couldn’t overwrite. Set up a deployment hook that silently failed because the user running it didn’t have write access to the log directory. These aren’t exotic edge cases, they’re the daily friction of working on a Linux system.&lt;/p&gt;

&lt;p&gt;Linux file permissions are the gatekeepers of everything that runs on your server. Get them right, and your applications work smoothly, your users can access what they need, and your server stays reasonably secure. Get them wrong, and you’re either locked out of your own files or handing out access like candy.&lt;/p&gt;

&lt;p&gt;This guide cuts through the noise. You’ll learn exactly how Linux permission bits work, what each one actually does when you’re logged in, how to read the cryptic output of &lt;code&gt;ls -l&lt;/code&gt;, and how to change permissions the right way using both symbolic and numeric chmod. Everything here is written from the perspective of someone who’s spent real hours on actual servers, not just quoting man pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Linux has three permission types: Read (r), Write (w), and Execute (x)&lt;/li&gt;
&lt;li&gt;Permissions apply to three categories of users: Owner (u), Group (g), and Others (o)&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;ls -l&lt;/code&gt; command shows permissions in a 10-character string like &lt;code&gt;-rw-r--r--&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Use chmod to change permissions, symbolic mode (u+x) or numeric mode (755)&lt;/li&gt;
&lt;li&gt;Use chown and chgrp to change ownership&lt;/li&gt;
&lt;li&gt;Common pitfalls: execute bit on directories, wrong group ownership, restrictive umask in production&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Linux Permissions Matter More Than You Think
&lt;/h2&gt;

&lt;p&gt;On a single-user laptop, permissions feel academic. On a server running multiple services, serving web traffic, and handling multiple users? Permissions are load-bearing infrastructure.&lt;/p&gt;

&lt;p&gt;When a web server like Nginx runs, it typically operates under its own user, www-data on Ubuntu. The user account must have read permissions for the web root directory in order to serve website files. Your deployment script, running as a deploy user, needs write access to certain directories and execute access to deployment hooks. Your backup cron job, running as root, needs read access to everything but write access only to the backup volume.&lt;/p&gt;

&lt;p&gt;Getting any one of these wrong breaks something silently. I’ve seen a Node.js app that kept crashing every night because a cron job was deleting its log directory, and the app didn’t have permission to recreate it. Permissions weren’t on anyone’s radar until the app started failing.&lt;/p&gt;

&lt;p&gt;Understanding permissions also matters for security. The difference between chmod 777 and chmod 644 on a configuration file could be the difference between a server that’s yours and a server that’s been compromised. That’s not hyperbole, misconfigured permissions are a documented entry point for a wide range of attacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Layers: Owner, Group, Others
&lt;/h2&gt;

&lt;p&gt;Before you can understand what a permission means, you need to know who it’s being applied to. Linux splits access into three layers:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fenzgq37s2di69m2sxy0h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fenzgq37s2di69m2sxy0h.jpg" alt="three layers - Linux File Permissions" width="652" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Owner (u)
&lt;/h3&gt;

&lt;p&gt;The user who created the file. On a shared server, each user has their own home directory with files they own. The owner can change permissions on their own files, or take them away from themselves, which is a fun way to lock yourself out of something.&lt;/p&gt;

&lt;h3&gt;
  
  
  Group (g)
&lt;/h3&gt;

&lt;p&gt;A group is a named collection of users. Instead of granting the same permission to five individual users one by one, you put them in a group and set permissions once. This is how most team-based server access works in practice.&lt;/p&gt;

&lt;h3&gt;
  
  
  Others (o)
&lt;/h3&gt;

&lt;p&gt;Everyone else, users who aren’t the owner and aren’t in the owning group. “Others” permissions are your last line of defense. They’re what the world gets when someone with no account on your server tries to access your files.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Permission Types Explained
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Read (r or 4)
&lt;/h3&gt;

&lt;p&gt;Read permission lets a user view a file’s contents. For a directory, read means listing the directory’s contents, you can see what files and subdirectories exist inside it, but you can’t enter it or access any of those files without additional permissions.&lt;/p&gt;

&lt;p&gt;In practice, read on a directory is the permission that ls checks. Without it, ls returns a permission denied error even if you already know the directory exists.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write (w or 2)
&lt;/h3&gt;

&lt;p&gt;Write permission lets a user modify a file’s contents, add data, truncate it, rewrite it entirely. On a directory, write means you can create, delete, and rename files inside that directory.&lt;/p&gt;

&lt;p&gt;Here’s the part that catches people: you need write permission on the directory itself to delete a file, not write permission on the file.&lt;/p&gt;

&lt;h3&gt;
  
  
  Execute (x or 1)
&lt;/h3&gt;

&lt;p&gt;Execute permission is what makes a file run as a program or script. Without it, trying to run &lt;code&gt;./script.sh&lt;/code&gt; gives you a “permission denied” error, even if you own the file and have full read/write access.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For directories, execute has a different meaning:&lt;/strong&gt; it allows access to the directory’s metadata and file contents. Without execute on a directory, you can’t cd into it or access any file inside it, even if you have read permission on those individual files.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/linux-file-permissions" rel="noopener noreferrer"&gt;https://serveravatar.com/linux-file-permissions&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>devops</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How to Upload Image File in Laravel: Step-by-Step Guide</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Thu, 23 Jul 2026 06:29:44 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-upload-image-file-in-laravel-step-by-step-guide-1lfl</link>
      <guid>https://dev.to/serveravatar/how-to-upload-image-file-in-laravel-step-by-step-guide-1lfl</guid>
      <description>&lt;p&gt;Every Laravel project I’ve worked on, whether it’s a client portal, a content management system, or an e-commerce setup, eventually needs one thing: upload image functionality. User avatars, product photos, blog thumbnails, and document attachments all rely on a reliable image upload system. The requirement shows up predictably, yet every time I reach for the documentation, I find myself piecing together bits from half a dozen sources.&lt;/p&gt;

&lt;p&gt;Most tutorials cover the happy path. They show you the store() method, they mention &lt;code&gt;enctype="multipart/form-data"&lt;/code&gt;, and they call it done. But what about the messy parts? What happens when a user uploads a 12MB file and your server chokes? What if the validation rule passes locally but fails on your production VPS because of a misconfigured php.ini? And does your application actually handle filename collisions gracefully, or is it quietly overwriting files?&lt;/p&gt;

&lt;p&gt;This guide is the tutorial I wish existed when I first needed to build robust image upload functionality in Laravel. We are going to cover the full picture, from setting up your database schema for image metadata, to building a form with client-side preview, to handling validation edge cases that tutorials skip, to the security considerations that actually matter in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Laravel handles image uploads through its filesystem layer, no extra packages needed for basic uploads&lt;/li&gt;
&lt;li&gt;Store metadata (not just files) in your database: filename, path, MIME type, size, dimensions&lt;/li&gt;
&lt;li&gt;Always validate on the server AND (for UX) on the client, server-side validation is non-negotiable&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;storage:link&lt;/code&gt; command is still essential for serving files from the public web&lt;/li&gt;
&lt;li&gt;Production concerns, PHP limits, disk permissions, filename collisions, are where most tutorials fall short&lt;/li&gt;
&lt;li&gt;ServerAvatar’s built-in server management removes the permission and PHP config headaches from your deployment workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Laravel’s File Storage Actually Works
&lt;/h2&gt;

&lt;p&gt;Before we write a single line of code, it helps to understand what actually happens when a file upload reaches a Laravel application. This model will save you hours of debugging later.&lt;/p&gt;

&lt;p&gt;When a user submits a multipart form, Laravel wraps the uploaded file in an UploadedFile object. This isn’t just the file data, it carries metadata: original filename, MIME type, file size, temporary path on disk, and more.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://laravel.com/docs/13.x/filesystem?ref=serveravatar.com" rel="noopener noreferrer"&gt;Laravel’s official documentation&lt;/a&gt; provides a detailed overview of uploaded files, storage disks, and filesystem operations if you want to explore advanced storage features.&lt;/p&gt;

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

&lt;p&gt;Laravel then hands this object to the filesystem layer, which decides where to put the file based on your  &lt;code&gt;config/filesystems.php&lt;/code&gt; configuration. The two most relevant disks for image uploads are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;public –&lt;/strong&gt; Files land in &lt;code&gt;storage/app/public&lt;/code&gt;. These are accessible directly from the web, but only if you’ve run &lt;code&gt;php artisan storage:link&lt;/code&gt; to create a symlink from &lt;code&gt;public/storage&lt;/code&gt; to &lt;code&gt;storage/app/public&lt;/code&gt;. This is the standard path for user-uploaded content you want publicly served.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;local –&lt;/strong&gt; Files land in &lt;code&gt;storage/app&lt;/code&gt;. These are not web-accessible by default, which makes them suitable for files you want to control access to, think documents behind a paywall, or images served through a signed URL.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most image upload use cases, profile photos, product images, gallery uploads, you will use public with the storage:link symlink. I will focus on that path in this guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Database Design: Storing Image Metadata the Right Way
&lt;/h2&gt;

&lt;p&gt;Here’s a mistake I see constantly: they store the uploaded image path as a plain string column on the user or product table, and call it a day. This works until you need to display the image’s dimensions, filter by file size, or track which uploads are causing storage bloat.&lt;/p&gt;

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

&lt;p&gt;Separate your concerns. Create a dedicated images table and use a polymorphic relationship. This way, any model in your application can have images, a user, a product, a blog post, without cluttering your main tables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Schema::create('images', function (Blueprint $table) {
$table-&amp;gt;id();
$table-&amp;gt;morphs('imageable'); &amp;lt;em&amp;gt;// adds imageable_type and imageable_id&amp;lt;/em&amp;gt;
$table-&amp;gt;string('filename');
$table-&amp;gt;string('path');
$table-&amp;gt;string('mime_type');
$table-&amp;gt;unsignedInteger('size'); &amp;lt;em&amp;gt;// in bytes&amp;lt;/em&amp;gt;
$table-&amp;gt;unsignedSmallInteger('width')-&amp;gt;nullable();
$table-&amp;gt;unsignedSmallInteger('height')-&amp;gt;nullable();
$table-&amp;gt;timestamps();
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Storing image width and height can be useful for generating responsive images, validating aspect ratios, and creating thumbnails. You can easily retrieve these values during upload using PHP’s &lt;code&gt;getimagesize()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The corresponding Eloquent model is straightforward:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;class Image extends Model
{
protected $fillable = [
'filename', 'path', 'mime_type', 'size', 'width', 'height'
];

public function imageable()
{
return $this-&amp;gt;morphTo();
}

public function url(): string
{
return asset('storage/' . $this-&amp;gt;path . '/' . $this-&amp;gt;filename);
}
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this gives you that a plain string column doesn’t: you can query images by size, filter by dimensions, eager-load them efficiently, and swap storage backends without touching your application code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/laravel-image-upload" rel="noopener noreferrer"&gt;https://serveravatar.com/laravel-image-upload&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>How to Copy and Overwrite Files in Linux Without Confirmation</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Wed, 22 Jul 2026 07:35:27 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-copy-and-overwrite-files-in-linux-without-confirmation-4bd9</link>
      <guid>https://dev.to/serveravatar/how-to-copy-and-overwrite-files-in-linux-without-confirmation-4bd9</guid>
      <description>&lt;p&gt;There is a moment every Linux user runs into when trying to copy and overwrite files in Linux without confirmation. You have a script ready, everything is automated, and then a single confirmation prompt breaks the whole pipeline. You did not plan for it. The script hangs, waiting for a y that will never come. That frustration is exactly what this guide aims to address.&lt;/p&gt;

&lt;p&gt;When you copy files in Linux, the cp command does not always behave the same way twice. On some systems, it overwrites without asking. On others, it stops and waits for input. Sometimes it refuses to touch a file at all. If you are automating anything, deployment scripts, backup routines, container image builds, these inconsistencies can quietly derail your workflow.&lt;/p&gt;

&lt;p&gt;This is a practical guide for people who need to copy and overwrite files in Linux without confirmation. We will walk through the default behavior, every relevant flag, how shell aliases interfere, and how to write scripts that never stop mid-execution waiting for human input.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The cp command’s default behavior depends on your shell environment&lt;/li&gt;
&lt;li&gt;-f forces overwrites; -n prevents them entirely&lt;/li&gt;
&lt;li&gt;Shell aliases like cp='cp -i' can silently change behavior&lt;/li&gt;
&lt;li&gt;Backslash prefix (\cp) bypasses aliases temporarily&lt;/li&gt;
&lt;li&gt;The noclobber shell option provides another safety layer&lt;/li&gt;
&lt;li&gt;Piping yes to cp automates all confirmation responses&lt;/li&gt;
&lt;li&gt;All of this is scriptable and automation-friendly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Comparison of cp Overwrite Options
&lt;/h2&gt;

&lt;p&gt;Before choosing an overwrite option, it helps to understand what each cp flag does. The table below summarizes the most commonly used options so you can quickly pick the right command for your use case.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Understanding How cp Behaves by Default
&lt;/h2&gt;

&lt;p&gt;Before diving into flags, it helps to understand what cp actually does when you run it on a typical Linux system.&lt;/p&gt;

&lt;p&gt;The basic syntax is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp [OPTIONS] SOURCE DESTINATION
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can specify a single source file, multiple files, or an entire directory. The last argument is always treated as the destination, everything before it is the source.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xyozhaqfvl7wra5xw9y.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xyozhaqfvl7wra5xw9y.jpg" alt="cp - Copy and Overwrite Files" width="798" height="28"&gt;&lt;/a&gt;&lt;/p&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;cp file.txt /home/user/Documents/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file.txt – Source file to copy&lt;/li&gt;
&lt;li&gt;/home/user/Documents/ – Destination directory&lt;/li&gt;
&lt;li&gt;This copies file.txt into the Documents folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Your cp Might Ask Before Overwriting
&lt;/h2&gt;

&lt;p&gt;The same cp command may overwrite files on one system but ask for confirmation on another because of a shell alias. An alias is a shell shortcut that automatically adds predefined options to a command before it runs.&lt;/p&gt;

&lt;p&gt;Some distributions define this in their default shell configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;alias cp='cp -i'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The -i option enables interactive mode, prompting for confirmation before overwriting existing files.&lt;/p&gt;

&lt;p&gt;With this alias enabled, every cp command automatically runs as cp -i. While this is helpful for manual use, it can interrupt automated scripts and deployments.&lt;/p&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;cp file.txt /home/user/Documents/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If there is already a same name file, it will prompt for confirmation before overwriting an existing file.txt in the backup folder.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/copy-overwrite-files-in-linux" rel="noopener noreferrer"&gt;https://serveravatar.com/copy-overwrite-files-in-linux&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>bash</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Fix WordPress Stuck in Maintenance Mode</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Tue, 21 Jul 2026 06:04:35 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-fix-wordpress-stuck-in-maintenance-mode-1aad</link>
      <guid>https://dev.to/serveravatar/how-to-fix-wordpress-stuck-in-maintenance-mode-1aad</guid>
      <description>&lt;p&gt;You just clicked “Update Now” on a plugin. Thirty seconds later, your WordPress stuck in maintenance mode and shows a white screen that says: “Briefly unavailable for scheduled maintenance. Check back in a minute.” That minute passes. Then ten. Then an hour. You refresh. Still the same message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvt4csccqae469qzyay69.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvt4csccqae469qzyay69.jpg" alt="WordPress stuck in maintenance mode error" width="800" height="512"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you’ve been there, and plenty of WordPress users have, you already know the sinking feeling. You are locked out of your own website, and your visitors are seeing the same thing. You start wondering if you broke the internet, lost months of content, or need to restore from a backup.&lt;/p&gt;

&lt;p&gt;Take a breath. You almost certainly didn’t break anything. Getting WordPress unstuck from maintenance mode is usually a simple fix, and you don’t need to be a server admin to do it. This guide walks you through exactly what’s happening, why it happened, and how to get your site back right now. I will also walk you through the best practices to prevent this issue from returning.&lt;/p&gt;

&lt;p&gt;By the time you finish reading, you’ll know how to diagnose the issue, fix it yourself, and harden your setup so interruptions don’t leave you stranded again.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  What Is WordPress Maintenance Mode, Exactly?
&lt;/h2&gt;

&lt;p&gt;When WordPress runs an update, whether it’s a plugin, a theme, or the core itself, it needs a moment where nothing else touches the site while files are being swapped out. If a visitor tried to load a page mid-update, they could end up with a half-written file or corrupted database entry.&lt;/p&gt;

&lt;p&gt;So WordPress puts the site into a brief holding state. It drops a small file called .maintenance in your root directory, and every visitor, including you, sees that “Briefly unavailable” message instead of your actual content. If you’re new to WP-CLI, the official &lt;a href="https://wordpress.org/documentation?ref=serveravatar.com" rel="noopener noreferrer"&gt;WP-CLI documentation&lt;/a&gt; explains its available commands and how to use them for managing WordPress from the command line.&lt;/p&gt;

&lt;p&gt;Under normal circumstances, this is invisible. The update finishes, WordPress deletes the .maintenance file, and everything goes back to normal within seconds.&lt;/p&gt;

&lt;p&gt;The problem starts when something interrupts the update process before WordPress can clean up. Maybe your browser tab closed mid-upload. Maybe your internet dropped. Maybe your server ran out of memory and killed the process. When that happens, the .maintenance file stays right where it is, and your site stays locked.&lt;/p&gt;

&lt;p&gt;I’ve seen this happen on everything from small personal blogs to agency-managed client sites. The good news is that the fix is almost always the same: find that file and remove it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Tell If Your WordPress Site Is Actually Stuck
&lt;/h2&gt;

&lt;p&gt;Not every slow update means your site is stuck. Sometimes WordPress really is just taking a minute to process a large plugin update. Here’s how to know the difference.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The message is the first clue.&lt;/strong&gt; If your site displays “Briefly unavailable for scheduled maintenance. When the maintenance message stays visible for several minutes instead of disappearing, it’s usually a sign that WordPress is stuck in maintenance mode and requires manual intervention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can’t reach the admin dashboard.&lt;/strong&gt; If you cannot access your WordPress admin dashboard and visiting /wp-admin redirects you back to the maintenance screen, your site is likely stuck in maintenance mode rather than simply taking longer to update.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The message persists after refreshing.&lt;/strong&gt; Give it a few refreshes over the course of a minute or two. If it never resolves, something has interrupted the process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can confirm it by checking your files.&lt;/strong&gt; You can verify the issue by checking your WordPress root directory for a .maintenance file using your hosting file manager, FTP, or SSH. If the file exists after several minutes of an update, it is likely causing the maintenance mode lock.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A useful side note:&lt;/strong&gt; if you see the maintenance message but never initiated an update yourself, that’s actually a red flag. Someone may have triggered an update on your site without you knowing, or a plugin auto-updated itself. Either way, the fix is the same.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Causes WordPress to Get Stuck?
&lt;/h2&gt;

&lt;p&gt;Understanding why this happens helps you fix it faster and avoid it in the future. Here are the most common culprits I’ve encountered in practice.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interrupted updates&lt;/strong&gt; are the most common reason WordPress gets stuck in maintenance mode. If an update is stopped due to a closed browser, lost connection, or system sleep, the .maintenance file may remain and keep the site locked.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server resource limits&lt;/strong&gt; can also cause maintenance mode issues. On shared hosting, low PHP memory limits or execution timeouts may interrupt plugin updates, especially when updating multiple plugins or handling large update files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin and theme conflicts&lt;/strong&gt; can also interrupt updates. Incompatible plugins, outdated themes, or resource conflicts may cause the update process to fail and leave WordPress stuck in maintenance mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;File permission problems&lt;/strong&gt; can also prevent WordPress from exiting maintenance mode. If WordPress lacks proper write access to manage the .maintenance file, it may remain even after a successful update.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Running multiple updates&lt;/strong&gt; at the same time can create conflicts, especially on multi-user sites. These overlapping processes may leave the .maintenance file behind and keep WordPress stuck in maintenance mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual maintenance mode activation&lt;/strong&gt; can also be the cause. If a site owner or developer enables maintenance mode through wp-config.php or a plugin and forgets to disable it, the .maintenance file may remain and keep the site inaccessible.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Fix WordPress Stuck in Maintenance Mode
&lt;/h2&gt;

&lt;p&gt;Here’s the step-by-step process I use every time. These steps work regardless of which hosting platform you’re on, though the exact interface will differ slightly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/fix-wordpress-stuck-in-maintenance-mode" rel="noopener noreferrer"&gt;https://serveravatar.com/fix-wordpress-stuck-in-maintenance-mode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Hostname vs Domain Name: Key Differences Explained</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Mon, 20 Jul 2026 06:58:20 +0000</pubDate>
      <link>https://dev.to/serveravatar/hostname-vs-domain-name-key-differences-explained-2h7n</link>
      <guid>https://dev.to/serveravatar/hostname-vs-domain-name-key-differences-explained-2h7n</guid>
      <description>&lt;p&gt;If you have ever configured a website, managed a VPS, or set up a server, you have probably encountered the terms Hostname vs Domain Name. Although hostname and domain name are often mentioned together, they don’t mean the same thing. Understanding Hostname vs Domain Name is essential for managing websites, configuring servers, and troubleshooting DNS-related issues effectively.&lt;/p&gt;

&lt;p&gt;This confusion is common because both are used to identify systems on a network, and in many cases they appear together in web addresses. It’s easy to assume they are interchangeable, but understanding the difference becomes important when you’re configuring DNS records, setting up email, installing SSL certificates, or deploying applications.&lt;/p&gt;

&lt;p&gt;For example, if you are hosting a website on your own server, you’ll typically assign a hostname to the machine while pointing a registered domain name to its IP address. Knowing which one serves which purpose helps avoid configuration mistakes and makes troubleshooting much easier.&lt;/p&gt;

&lt;p&gt;In this guide, you will learn what hostnames and domain names are, how they differ, how they work together, where each is used, and which one matters in different real-world scenarios.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A hostname identifies a specific device or service on a network.&lt;/li&gt;
&lt;li&gt;A domain name identifies an internet namespace that users can access.&lt;/li&gt;
&lt;li&gt;A hostname can exist without a public domain.&lt;/li&gt;
&lt;li&gt;A domain can contain multiple hostnames.&lt;/li&gt;
&lt;li&gt;Websites commonly use both together, such as “blog.example.com”.&lt;/li&gt;
&lt;li&gt;Understanding the difference helps with DNS management, server administration, email configuration, and website hosting.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Hostname vs Domain Name: Quick Comparison
&lt;/h2&gt;

&lt;p&gt;If you’re short on time, here’s the simplest way to understand the difference between a hostname and a domain name.&lt;/p&gt;

&lt;p&gt;While hostnames and domain names often appear together, they solve different problems. A hostname identifies a specific system or service, whereas a domain name provides a memorable internet address that groups related services under one identity.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  What Is a Hostname?
&lt;/h2&gt;

&lt;p&gt;A hostname is the name assigned to a specific device, server, virtual machine, or network resource. Instead of identifying a machine by its numerical IP address, people can use a hostname that’s much easier to recognize and remember.&lt;/p&gt;

&lt;p&gt;Think of a hostname as the label attached to an individual computer. For instance, imagine a company with several servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application Server&lt;/li&gt;
&lt;li&gt;Database Server&lt;/li&gt;
&lt;li&gt;Backup Server&lt;/li&gt;
&lt;li&gt;Monitoring Server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each server needs its own identity, even if they’re all part of the same infrastructure. Instead of referring to them by IP addresses like 192.168.10.25, administrators assign meaningful names such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;app-server&lt;/li&gt;
&lt;li&gt;db-server&lt;/li&gt;
&lt;li&gt;backup-node&lt;/li&gt;
&lt;li&gt;monitor-01&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These names simplify server management, documentation, monitoring, and troubleshooting. Hostnames are commonly used inside private networks and don’t always need to be publicly accessible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where Are Hostnames Used?
&lt;/h3&gt;

&lt;p&gt;You will encounter hostnames in many environments, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux servers&lt;/li&gt;
&lt;li&gt;Windows systems&lt;/li&gt;
&lt;li&gt;Cloud virtual machines&lt;/li&gt;
&lt;li&gt;Docker containers&lt;/li&gt;
&lt;li&gt;Kubernetes nodes&lt;/li&gt;
&lt;li&gt;NAS devices&lt;/li&gt;
&lt;li&gt;Routers and firewalls&lt;/li&gt;
&lt;li&gt;Internal enterprise networks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whenever a new server is created, assigning a descriptive hostname is considered a best practice because it makes infrastructure easier to understand as it grows.&lt;/p&gt;

&lt;p&gt;Need to rename a server? Follow our step-by-step guide on How to Change the Hostname on Linux Easily to update your system hostname safely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Hostnames Matter
&lt;/h3&gt;

&lt;p&gt;Although a hostname may seem like a simple label, it plays an important role in daily system administration. A clear naming convention can help administrators:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify servers quickly&lt;/li&gt;
&lt;li&gt;Reduce deployment mistakes&lt;/li&gt;
&lt;li&gt;Simplify monitoring dashboards&lt;/li&gt;
&lt;li&gt;Improve log analysis&lt;/li&gt;
&lt;li&gt;Organize infrastructure across multiple environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;For example, compare these two server names:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;“server01” vs. “production-api-us-east”&lt;/p&gt;

&lt;p&gt;The second hostname immediately tells you what the server does and where it’s located. Small improvements like this become increasingly valuable as your infrastructure scales from a handful of servers to dozens, or even hundreds.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to Check Your System Hostname in Linux
&lt;/h3&gt;

&lt;p&gt;If you’re using Linux, you can quickly view your system’s hostname using the command line. This is useful when managing servers, troubleshooting network issues, or verifying your system configuration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Display the Current Hostname&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This command prints the hostname currently assigned to your system. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;View Detailed Hostname Information&lt;/strong&gt;&lt;br&gt;
To display additional details, including the static hostname, operating system, kernel version, and hardware information, run:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Static hostname: web-server
Operating System: Ubuntu 24.04 LTS
Kernel: Linux 6.x
Architecture: x86-64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Display the Fully Qualified Domain Name (FQDN)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your server is configured with DNS, you can display its Fully Qualified Domain Name (FQDN) using:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Note: The hostname -f command works only when your system’s hostname is properly configured in DNS or the /etc/hosts file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/hostname-vs-domain-name" rel="noopener noreferrer"&gt;https://serveravatar.com/hostname-vs-domain-name&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>dns</category>
      <category>devops</category>
      <category>linux</category>
    </item>
    <item>
      <title>How to Check Running Processes in Linux Using ps, top, htop &amp; atop</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Sun, 19 Jul 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-check-running-processes-in-linux-using-ps-top-htop-atop-3428</link>
      <guid>https://dev.to/serveravatar/how-to-check-running-processes-in-linux-using-ps-top-htop-atop-3428</guid>
      <description>&lt;p&gt;Managing a Linux server involves more than installing applications and keeping the system updated. To check running processes activity effectively, it’s important to understand how Linux manages every service, from a web server and database to scheduled jobs and background scripts. When a website becomes slow, CPU usage suddenly spikes, or memory starts disappearing, the first place to investigate is the list of running processes.&lt;/p&gt;

&lt;p&gt;Linux offers several built-in and advanced tools for monitoring what’s happening inside your system. Some provide a quick snapshot of active processes, while others continuously update resource usage in real time or record historical performance data for deeper analysis.&lt;/p&gt;

&lt;p&gt;If you’re new to Linux administration, choosing between commands like ps, top, htop, and atop can be confusing because they all display process information in different ways. Knowing when to use each one can save time during troubleshooting and help you identify performance bottlenecks much faster.&lt;/p&gt;

&lt;p&gt;In this guide, you’ll learn what each tool does and how to use it effectively with practical examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Linux processes are running instances of applications or system services.&lt;/li&gt;
&lt;li&gt;The ps command provides a snapshot of currently running processes.&lt;/li&gt;
&lt;li&gt;top displays live CPU, memory, and process activity directly in the terminal.&lt;/li&gt;
&lt;li&gt;htop offers an interactive, user-friendly interface with easier navigation and process management.&lt;/li&gt;
&lt;li&gt;atop records system activity over time, making it useful for diagnosing performance issues that occurred earlier.&lt;/li&gt;
&lt;li&gt;Each tool serves a different purpose, and many administrators use them together for a more complete view of system performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Process Monitoring Matters in Linux
&lt;/h2&gt;

&lt;p&gt;Every application running on your Linux server consumes system resources such as CPU time, memory, storage, or network bandwidth. Unexpected events like a runaway script, an overloaded web application, or a failing service can quickly affect overall system performance.&lt;/p&gt;

&lt;p&gt;Regularly monitoring running processes helps you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Identify applications consuming excessive CPU or memory.&lt;/li&gt;
&lt;li&gt;Detect unresponsive or stuck processes.&lt;/li&gt;
&lt;li&gt;Troubleshoot slow server performance.&lt;/li&gt;
&lt;li&gt;Verify that essential services are running correctly.&lt;/li&gt;
&lt;li&gt;Monitor applications after deployments or configuration changes.&lt;/li&gt;
&lt;li&gt;Discover unusual resource usage before it impacts users.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you’re managing a personal VPS or multiple production servers, understanding your system’s active processes makes troubleshooting significantly easier.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; Process monitoring isn’t only for fixing problems. It’s equally useful for validating that a server is operating as expected after updates, deployments, or maintenance.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Is a Linux Process?
&lt;/h2&gt;

&lt;p&gt;A process is simply a program that is currently running on your Linux system. Every time you execute a command, start a service, or launch an application, Linux creates one or more processes to perform the required tasks.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Starting the Apache or Nginx web server creates server processes.&lt;/li&gt;
&lt;li&gt;Connecting to a server over SSH starts a user session process.&lt;/li&gt;
&lt;li&gt;Running a backup script creates a temporary process until the job finishes.&lt;/li&gt;
&lt;li&gt;Database servers like MySQL or PostgreSQL continuously run multiple background processes to handle queries and maintenance tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each process is assigned a unique Process ID (PID), which allows the operating system to manage it independently.&lt;/p&gt;

&lt;p&gt;Understanding these basics makes it much easier to interpret the output of process monitoring tools later in this guide. All utilities display process information, they solve different problems. Choosing the right one depends on whether you need a quick snapshot, continuous monitoring, easier navigation, or historical performance records.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  When Should You Use Each Tool?
&lt;/h2&gt;

&lt;p&gt;There’s no single “best” command for every situation. Instead, each utility fits a specific workflow.&lt;/p&gt;

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

&lt;p&gt;Choosing the appropriate tool not only speeds up troubleshooting but also gives you more relevant information without unnecessary complexity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/check-running-processes-linux" rel="noopener noreferrer"&gt;https://serveravatar.com/check-running-processes-linux&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>devops</category>
      <category>monitoring</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>Paperclip AI Guide: Best Use Cases for Automating Business Operations</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Sat, 18 Jul 2026 07:14:33 +0000</pubDate>
      <link>https://dev.to/serveravatar/paperclip-ai-guide-best-use-cases-for-automating-business-operations-g00</link>
      <guid>https://dev.to/serveravatar/paperclip-ai-guide-best-use-cases-for-automating-business-operations-g00</guid>
      <description>&lt;p&gt;There is a moment every founder, CTO, or operations lead hits. You have stripped everything down to the essentials. You have automated what you can with scripts, webhooks, and no-code tools. And still, there is a feeling that you are manually stitching together a set of tools that should, by now, work like a team. Paperclip AI is designed to solve exactly this challenge by helping AI agents work together in structured, goal-driven business workflows instead of isolated automations.&lt;/p&gt;

&lt;p&gt;That feeling is not wrong. Most automation today solves individual tasks. It does not solve coordination. Sending a Slack message when a form is filled out is useful, but it is not the same as having someone who knows why that form matters, who to hand it off to, and what to do if the next step fails.&lt;/p&gt;

&lt;p&gt;Paperclip is built around a different idea. Instead of automating a single process, it lets you automate an entire operation, with structure, accountability, and costs that scale predictably.&lt;/p&gt;

&lt;p&gt;This guide is not a feature list. It is a practical look at what that actually means for your business, and which use cases tend to deliver real value first.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

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

&lt;h2&gt;
  
  
  The Mental Model That Changes Everything
&lt;/h2&gt;

&lt;p&gt;Most people approach AI agents like smart scripts. Enter your prompt, receive a response, and continue with the next task.&lt;/p&gt;

&lt;p&gt;Paperclip works better when you stop thinking that way and start thinking about agents like employees. Not metaphorically, structurally. Each agent has a role, a budget, a reporting line, and access to the full context of why it is doing something, not just what it was asked to do.&lt;/p&gt;

&lt;p&gt;That distinction sounds small. It is not. A marketing agent that understands a blog post is part of a broader objective, such as reaching 10,000 quarterly signups, can make more informed decisions than one who only receives a simple instruction like, “Write a 500-word article about Paperclip.” Context drives alignment. And alignment is what separates AI agents that produce noise from those that produce progress.&lt;/p&gt;

&lt;p&gt;This is the mental model that makes Paperclip different from Zapier, Make, or any workflow tool you have tried before. Those tools automate a process. Paperclip automates a department.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Paperclip Actually Is
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://paperclip.ing/?ref=serveravatar.com" rel="noopener noreferrer"&gt;Paperclip&lt;/a&gt; is a Node.js application with a React dashboard. You install it on a server, define your organizational structure, assign AI agents to roles, and let them work.&lt;/p&gt;

&lt;p&gt;Under the hood, it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Org charts:&lt;/strong&gt; define who reports to whom&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ticketing:&lt;/strong&gt; every task is a structured ticket with owner, status, and thread&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-agent budgets:&lt;/strong&gt; set spending limits so one agent cannot burn through your entire API quota&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immutable audit log:&lt;/strong&gt; every decision, tool call, and API request is recorded&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-company isolation:&lt;/strong&gt; run completely separate operations from one deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is open source, self-hosted, and does not send your data anywhere. If you care about where your business data lives, that matters.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment Note:&lt;/strong&gt; You’ll need to install PostgreSQL, configure the required environment variables, and deploy the application manually. To simplify the process, follow our &lt;a href="https://serveravatar.com/deploy-paperclip-on-vps/" rel="noopener noreferrer"&gt;step-by-step guide on deploying Paperclip on a VPS with ServerAvatar&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Paperclip vs Traditional AI Automation
&lt;/h2&gt;

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

&lt;p&gt;This comparison highlights how Paperclip differs from traditional AI automation platforms by offering structured agent management, governance, auditability, and scalable business operations instead of isolated task automation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/paperclip-ai-use-cases" rel="noopener noreferrer"&gt;https://serveravatar.com/paperclip-ai-use-cases&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How to Deploy Paperclip on a VPS with ServerAvatar</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Thu, 16 Jul 2026 06:47:45 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-deploy-paperclip-on-a-vps-with-serveravatar-1f8o</link>
      <guid>https://dev.to/serveravatar/how-to-deploy-paperclip-on-a-vps-with-serveravatar-1f8o</guid>
      <description>&lt;p&gt;If you’re looking to deploy Paperclip for your team, a VPS gives you full control over your AI infrastructure. Paperclip is an open-source platform that lets you create AI agents, define goals, and connect LLM providers like Anthropic Claude and OpenAI, all from a clean dashboard. The catch is that the hosted version stores your data in Paperclip’s cloud. For companies with strict data privacy requirements, or teams that simply want complete ownership of their infrastructure, self-hosting is the better choice. In this guide, you’ll learn how to deploy Paperclip on a VPS quickly and securely using ServerAvatar.&lt;/p&gt;

&lt;p&gt;This guide walks you through deploying Paperclip on a VPS running Ubuntu, behind a custom domain, with HTTPS, a proper PostgreSQL database, and authentication required for every user.&lt;/p&gt;

&lt;p&gt;ServerAvatar handles the heavy lifting on server provisioning, application deployment, and SSL certificate management, so you can focus on the setup itself rather than wrestling with DNS records and firewall rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Paperclip is an open-source AI agent management platform with a web UI&lt;/li&gt;
&lt;li&gt;Self-hosting gives you full data ownership and keeps agent data on your own infrastructure&lt;/li&gt;
&lt;li&gt;ServerAvatar simplifies VPS provisioning, application deployment, and SSL management&lt;/li&gt;
&lt;li&gt;PostgreSQL 17 is required, Paperclip’s Drizzle ORM doesn’t support MySQL or MariaDB&lt;/li&gt;
&lt;li&gt;Paperclip listens on 127.0.0.1:3100 only, Apache handles all public traffic through a reverse proxy&lt;/li&gt;
&lt;li&gt;A clean install on a fresh Ubuntu VPS takes roughly 15–20 minutes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is Paperclip?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://paperclip.ing/?ref=serveravatar.com" rel="noopener noreferrer"&gt;Paperclip&lt;/a&gt; is an open-source platform that gives teams a web-based control panel for AI agents. You can define agents, assign them goals, manage workloads, and connect your own LLM API keys, without having to build your own tooling from scratch.&lt;/p&gt;

&lt;p&gt;Explore the hosted version at &lt;a href="https://paperclip.ing/?ref=serveravatar.com" rel="noopener noreferrer"&gt;paperclip.ing&lt;/a&gt;, and access the &lt;a href="https://docs.paperclip.ing/?ref=serveravatar.com" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; and &lt;a href="https://github.com/paperclipai/paperclip?ref=serveravatar.com" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt; to learn more.&lt;/p&gt;

&lt;p&gt;Going the self-hosted route changes the picture significantly:&lt;/p&gt;

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

&lt;p&gt;The self-hosted approach makes the most sense when data residency, internal privacy policies, or avoiding another SaaS dependency are driving your decisions. If any of those resonate, keep reading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who this guide is for:&lt;/strong&gt; Teams that need full control over agent management data, companies with compliance requirements, and developers comfortable on the command line. Budget about 15–20 minutes for a clean install on a fresh VPS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;Before diving into the steps, it helps to understand how everything connects.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 ┌──────────────────────────────────────────────┐
 │                   Your VPS                   │
 │                                              │
 │                                              │
Internet ─────────────── Apache :443 (SSL) ─────┼──────► Paperclip :3100
(https://paperclip.example.com)   │             │               │
                                  │ Apache :80──┘               │
                                  │                             │
                                  │   PostgreSQL :5432          │
 └──────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s what each piece does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apache (443)&lt;/strong&gt; – Terminates SSL, handles Let’s Encrypt certificates, receives all public traffic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache (80)&lt;/strong&gt; – Catches plain HTTP requests and redirects them to HTTPS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paperclip (3100)&lt;/strong&gt; – The agent management UI that is tied exclusively to localhost, and never directly exposed to the internet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL (5432)&lt;/strong&gt; – Stores all agent data, configurations, and user information, also localhost-only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Traffic always flows:&lt;/strong&gt; Client &amp;gt;&amp;gt; Apache (SSL) &amp;gt;&amp;gt; Paperclip (localhost) &amp;gt;&amp;gt; PostgreSQL (localhost). Nothing is directly reachable from the internet except Apache on ports 80 and 443.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this design matters
&lt;/h3&gt;

&lt;p&gt;Paperclip is intentionally designed to sit behind a reverse proxy. It binds to 127.0.0.1:3100, which means it cannot be reached directly from the internet under any misconfiguration. Apache handles all SSL complexity. PostgreSQL is on localhost too, so you don’t need to open firewall rules for the database. “systemd” takes care of restarts if the process crashes or the server reboots.&lt;/p&gt;

&lt;p&gt;This layered approach means you get a production-ready setup where each component only communicates with the ones it actually needs to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Create Your Server with ServerAvatar
&lt;/h2&gt;

&lt;p&gt;Log into your ServerAvatar account and create a new server. If you already have a server, &lt;a href="https://serveravatar.com/" rel="noopener noreferrer"&gt;ServerAvatar&lt;/a&gt; makes the process straightforward, you can connect your server from any cloud provider with ServerAvatar using the &lt;a href="https://serveravatar.com/docs/server-management/installation/direct-method/" rel="noopener noreferrer"&gt;Direct Method installation guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can also connect your cloud provider account from &lt;a href="https://serveravatar.com/docs/server-management/installation/digitalocean/" rel="noopener noreferrer"&gt;DigitalOcean&lt;/a&gt;, &lt;a href="https://serveravatar.com/docs/server-management/installation/vultr/" rel="noopener noreferrer"&gt;Vultr&lt;/a&gt;, &lt;a href="https://serveravatar.com/docs/server-management/installation/linode/" rel="noopener noreferrer"&gt;Linode&lt;/a&gt;, &lt;a href="https://serveravatar.com/docs/server-management/installation/hetzner/" rel="noopener noreferrer"&gt;Hetzner&lt;/a&gt;, and &lt;a href="https://serveravatar.com/docs/server-management/installation/amazon-lightsail/" rel="noopener noreferrer"&gt;Amazon Lightsail&lt;/a&gt; to directly deploy a server using ServerAvatar.&lt;/p&gt;

&lt;p&gt;During the server creation workflow, you’ll see an option to &lt;strong&gt;Install Node.js&lt;/strong&gt;, enable this toggle. Paperclip runs on Node.js, and having ServerAvatar install it during provisioning saves you a manual step afterward.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Step 2: Create the Application in ServerAvatar
&lt;/h2&gt;

&lt;p&gt;After your server is live, create a new application in ServerAvatar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the server panel by clicking on the server dashboard icon.&lt;/li&gt;
&lt;li&gt;Navigate to the Application section from the left sidebar.&lt;/li&gt;
&lt;li&gt;Click on the Create an Application button.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Enter your application name.&lt;/li&gt;
&lt;li&gt;Select your domain from Primary and Test. ServerAvatar lets you deploy applications on a temporary test domain first, useful for verifying your setup before pointing production traffic at it.&lt;/li&gt;
&lt;li&gt;Enter your domain name.&lt;/li&gt;
&lt;li&gt;Choose Custom PHP Application as the deployment method.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click on Show Advance Options. Enter New User and give Username and Password.&lt;/li&gt;
&lt;li&gt;Select your PHP Version as 8.2&lt;/li&gt;
&lt;li&gt;Click on Create Application.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;ServerAvatar will create the application structure and set a document root. You’ll deploy Paperclip into this environment. Refer to the &lt;a href="https://serveravatar.com/docs/application/deploy-custom-php/" rel="noopener noreferrer"&gt;custom PHP deployment guide&lt;/a&gt; for further details.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/deploy-paperclip-on-vps" rel="noopener noreferrer"&gt;https://serveravatar.com/deploy-paperclip-on-vps&lt;/a&gt;&lt;/p&gt;

</description>
      <category>paperclip</category>
      <category>devops</category>
      <category>selfhosted</category>
      <category>linux</category>
    </item>
    <item>
      <title>How to Reduce HTTP Requests in WordPress to Improve Site Speed</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Wed, 15 Jul 2026 06:24:04 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-reduce-http-requests-in-wordpress-to-improve-site-speed-41a1</link>
      <guid>https://dev.to/serveravatar/how-to-reduce-http-requests-in-wordpress-to-improve-site-speed-41a1</guid>
      <description>&lt;p&gt;Every time someone visits your WordPress site, their browser has to do many things. To reduce HTTP requests, it first has a list of files it needs before it can show a single pixel. CSS files. JavaScript files. Images. Fonts. Tracking pixels. Font icons. Video embeds.&lt;/p&gt;

&lt;p&gt;Each item on that list is one HTTP request. And here’s the thing most people don’t realize until they actually look: that list is usually way longer than it needs to be.&lt;/p&gt;

&lt;p&gt;I remember opening GTmetrix for a client’s WordPress site for the first time a couple of months ago and seeing 94 requests for a simple blog page. The site was loading four separate JavaScript files from a plugin the client had forgotten they even installed. Just disabling that one plugin brought it down to 71 requests and dropped the load time by nearly two seconds. That’s the kind of gap we’re talking about here.&lt;/p&gt;

&lt;p&gt;In this guide, I’m going to walk you through how HTTP requests actually work in WordPress, how to measure them properly, and, more importantly, which optimizations actually move the needle.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Every file your browser fetches is a separate HTTP request, more requests mean a slower site&lt;/li&gt;
&lt;li&gt;The biggest culprits are heavy plugins, unoptimized fonts, external tracking scripts, and oversized images&lt;/li&gt;
&lt;li&gt;You can cut requests dramatically by auditing what loads, hosting assets locally, deferring non-critical scripts, and using modern formats&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Actually Are HTTP Requests
&lt;/h2&gt;

&lt;p&gt;Think of your browser like a customer in a restaurant where every ingredient needed for a dish comes from a different supplier. Each supplier call represents an HTTP request. The browser makes these requests over a network (not a phone line, but the idea is similar), and every single request introduces a small delay or latency before the page can fully load.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu9zixctsie9ndal288g6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu9zixctsie9ndal288g6.jpg" alt="Visual diagram of a browser sending HTTP requests - reduce HTTP requests&lt;br&gt;
How This Works in WordPress" width="652" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How This Works in WordPress
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Every WordPress page is built using multiple assets that the browser must load before displaying the page.&lt;/li&gt;
&lt;li&gt;These assets include CSS stylesheets, JavaScript files, fonts, images, and other supporting resources.&lt;/li&gt;
&lt;li&gt;The browser sends a separate request to the server for each asset.&lt;/li&gt;
&lt;li&gt;It waits for the server to respond before downloading the requested file.&lt;/li&gt;
&lt;li&gt;Once the file is received, the browser continues requesting the remaining assets.&lt;/li&gt;
&lt;li&gt;This sequence is repeated until every required resource has been downloaded and processed.&lt;/li&gt;
&lt;li&gt;The more assets a page contains, the more requests the browser needs to make before the page is fully rendered.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every resource that your browser downloads requires its own HTTP request. Understanding which assets generate requests helps you identify where optimization efforts will have the biggest impact.&lt;/p&gt;

&lt;p&gt;The table below highlights the most common asset types found on WordPress websites and the best ways to optimize them.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Why This Becomes a Problem
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Every file request takes time, even on a fast internet connection.&lt;/li&gt;
&lt;li&gt;Requests to a local server are typically faster, while external resources introduce additional delay.&lt;/li&gt;
&lt;li&gt;Third-party services, such as analytics, advertising scripts, or embedded widgets, often take the longest to respond.&lt;/li&gt;
&lt;li&gt;A typical WordPress page can generate 80 to 100 or more individual requests.&lt;/li&gt;
&lt;li&gt;As these requests add up, the browser spends more time waiting for resources to load.&lt;/li&gt;
&lt;li&gt;The extra waiting time delays page rendering and interactivity.&lt;/li&gt;
&lt;li&gt;This results in slower page load speeds, a poorer user experience, and can negatively affect website performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Impact on Performance &amp;amp; SEO
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Slow page loading affects more than just the visitor experience.&lt;/li&gt;
&lt;li&gt;Search engines consider page speed as one of the signals when evaluating website quality and rankings.&lt;/li&gt;
&lt;li&gt;Excessive network requests can slow down the delivery of important page content.&lt;/li&gt;
&lt;li&gt;Google Core Web Vitals are directly impacts important performance metrics, including Largest Contentful Paint (LCP).&lt;/li&gt;
&lt;li&gt;Delayed loading of scripts and resources can also affect Interaction to Next Paint (INP) by making the page less responsive.&lt;/li&gt;
&lt;li&gt;The more requests a page makes, the longer it takes to load and become interactive.&lt;/li&gt;
&lt;li&gt;Reducing unnecessary requests can improve performance scores, user satisfaction, and overall SEO.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’ll skip the surface-level advice and focus on the changes that genuinely speed up a live site. If you want a broader view, I’ve written a complete guide to &lt;a href="https://serveravatar.com/speed-up-a-wordpress-website-performance" rel="noopener noreferrer"&gt;speeding up WordPress with optimization methods&lt;/a&gt; that covers everything from caching to image optimization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Reducing Requests Matters More Than You Think
&lt;/h2&gt;

&lt;p&gt;I’ve seen developers spend days optimizing database queries when the real bottleneck was twenty JavaScript files loading synchronously on every single page. The database was fine. The theme was fine. The plugins were the problem.&lt;/p&gt;

&lt;p&gt;When you cut down HTTP requests, three things happen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First&lt;/strong&gt;, the browser has less work to do. It downloads fewer files, parses less code, and renders the page faster. For your visitors, this means a noticeably snappier experience, especially on mobile, where network conditions are less predictable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Second&lt;/strong&gt;, your server handles less work. Each request consumes CPU and memory on the server side. Fewer requests means your server can serve more visitors simultaneously without breaking a sweat. For growing sites, this is the difference between a server that scales and one that falls over during a traffic spike. If your server response time is already slow, start with my &lt;a href="https://serveravatar.com/wordpress-ttfb-optimization" rel="noopener noreferrer"&gt;TTFB optimization guide&lt;/a&gt; first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Third&lt;/strong&gt;, your Core Web Vitals improve. Google measures how quickly your page becomes interactive. Fewer requests means faster LCP, lower INP, and better CLS scores. That directly translates to better rankings.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2rxxjdfkh9chlx1edt4f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2rxxjdfkh9chlx1edt4f.jpg" alt="Bar chart comparing WordPress site performance before and after reduce HTTP requests" width="744" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The good news:&lt;/strong&gt; you don’t need to overhaul your entire site. A handful of targeted fixes usually handles the bulk of the problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/improve-wordpress-site-speed" rel="noopener noreferrer"&gt;https://serveravatar.com/improve-wordpress-site-speed&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>performance</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Add Expires Headers in WordPress</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Tue, 14 Jul 2026 06:36:05 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-add-expires-headers-in-wordpress-3l42</link>
      <guid>https://dev.to/serveravatar/how-to-add-expires-headers-in-wordpress-3l42</guid>
      <description>&lt;p&gt;If you want to add expires headers in WordPress, it’s important to understand how browsers handle your website’s static files. Every time a visitor lands on your WordPress site, their browser downloads images, stylesheets, fonts, scripts, and other assets. If your server doesn’t instruct the browser to store these files locally for a certain period, it has to download them all over again on the next visit. This increases page load times, consumes more bandwidth, and negatively impacts your site’s performance.&lt;/p&gt;

&lt;p&gt;The “Add Expires Headers” warning shows up in tools like &lt;a href="https://pagespeed.web.dev/?ref=serveravatar.com" rel="noopener noreferrer"&gt;Google PageSpeed Insights&lt;/a&gt; and &lt;a href="https://gtmetrix.com/?ref=serveravatar.com" rel="noopener noreferrer"&gt;GTmetrix&lt;/a&gt; precisely because it has a measurable impact on page speed. Beyond the audit score, slow-loading assets eat bandwidth, hurt your SEO, and create a poor experience, especially for returning visitors.&lt;/p&gt;

&lt;p&gt;This guide walks you through exactly how to fix it. You’ll learn what Expires Headers actually do, how they differ from Cache-Control, which file types should be cached for how long, and most importantly, how to set everything up on your server without breaking your site.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Expires Headers tell browsers how long to keep cached files before asking the server again&lt;/li&gt;
&lt;li&gt;They directly improve load speed for returning visitors and reduce server bandwidth&lt;/li&gt;
&lt;li&gt;CSS, JS, images, and fonts should be cached for extended periods; HTML should not&lt;/li&gt;
&lt;li&gt;NGINX uses expires directives inside location blocks; Apache uses mod_expires in .htaccess&lt;/li&gt;
&lt;li&gt;Clear your site cache after making changes, and always test before going live&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Are Expires Headers, Exactly?
&lt;/h2&gt;

&lt;p&gt;When a browser requests a file from your server, the server responds with the file along with HTTP headers. These headers are invisible to visitors but carry instructions that browsers follow.&lt;/p&gt;

&lt;p&gt;An Expires Header tells the browser: “Keep this file in your local cache until this specific date and time. Don’t bother asking me for it again until then.”&lt;/p&gt;

&lt;p&gt;Without it, the browser has no persistent instruction. It may still cache files temporarily based on its internal heuristics, but it will frequently revalidate with your server, adding latency to every page load.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this looks like in practice:&lt;/strong&gt; a first-time visitor downloads your entire page design. A returning visitor three days later should theoretically load everything from their local cache. But without Expires Headers, the browser checks with your server anyway, waiting for confirmation that the files haven’t changed. For a text-heavy page with multiple assets, those round-trips add up fast.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Expires vs. Cache-Control: Why You Need to Know Both
&lt;/h2&gt;

&lt;p&gt;These two get confused constantly, and for good reason, they do essentially the same job. But they go about it differently.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Here’s the practical detail that trips people up:&lt;/strong&gt; if both headers are present, Cache-Control wins. Browsers prioritize the newer standard and ignore the older Expires date when both exist. Mozilla’s &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Caching?ref=serveravatar.com" rel="noopener noreferrer"&gt;MDN documentation on HTTP caching&lt;/a&gt; is a solid reference if you want to go deeper on how these headers interact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which One Should You Use?
&lt;/h3&gt;

&lt;p&gt;Most servers today default to Cache-Control because it’s cleaner and more precise. But if you’re manually configuring headers, there’s no harm in setting both, you just need to make sure they don’t contradict each other, or the Expires header becomes meaningless noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Long Should Each File Type Be Cached?
&lt;/h2&gt;

&lt;p&gt;Not every asset on your site deserves the same caching treatment. Getting this right is where a lot of people go wrong, either over-caching things that change often, or under-caching things that never change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here’s the logic:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Files that rarely change&lt;/strong&gt;, like images, stylesheets, JavaScript, and fonts, are ideal candidates for long-term caching. You set them once, and browsers hold onto them for months. The performance gain is substantial because these are typically the heaviest files on any page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files that change frequently&lt;/strong&gt;, like your HTML documents, should get short or zero caching. Your HTML is where new content lives. If a visitor’s browser caches your homepage for a year, they’ll never see your latest blog post. It kills content freshness and makes your site feel broken.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Third-party files&lt;/strong&gt;, like Google Analytics scripts or Facebook Pixels, are outside your control. You can’t set headers on files you don’t host, so don’t worry about those in your configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/add-expires-headers-wordpress" rel="noopener noreferrer"&gt;https://serveravatar.com/add-expires-headers-wordpress&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>performance</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>How to Remove WordPress Default Image Sizes: Step-by-Step Guide</title>
      <dc:creator>Meghna Meghwani</dc:creator>
      <pubDate>Mon, 13 Jul 2026 06:16:43 +0000</pubDate>
      <link>https://dev.to/serveravatar/how-to-remove-wordpress-default-image-sizes-step-by-step-guide-10ei</link>
      <guid>https://dev.to/serveravatar/how-to-remove-wordpress-default-image-sizes-step-by-step-guide-10ei</guid>
      <description>&lt;p&gt;If you’ve uploaded images to WordPress, you’ve probably noticed your wp-content/uploads folder filling up with multiple copies of the same image. That’s because WordPress Default Image Sizes automatically generate several resized versions of every uploaded image, even if your website never uses them. Over time, these extra files can consume valuable server storage, clutter your media library, and make backups larger than necessary.&lt;/p&gt;

&lt;p&gt;Over time, these extra files waste storage, increase upload processing, and add unnecessary server load. While WordPress lets you change image dimensions, it doesn’t provide a built-in option to disable image size generation completely.&lt;/p&gt;

&lt;p&gt;In this guide, you’ll learn how to stop WordPress from creating unused image sizes using a plugin or code, and how to clean up the extra images already stored in your media library.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;WordPress creates thumbnail, medium, and large versions of every image you upload by default&lt;/li&gt;
&lt;li&gt;These extra files consume server storage and increase upload processing time&lt;/li&gt;
&lt;li&gt;You can stop this behavior using a plugin or by adding a filter to your theme’s functions.php file&lt;/li&gt;
&lt;li&gt;Existing images need a separate cleanup step to remove previously generated sizes&lt;/li&gt;
&lt;li&gt;Choose the method that matches your comfort level with code&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What WordPress Does Behind Every Image Upload
&lt;/h2&gt;

&lt;p&gt;Uploading an image to the WordPress Media Library does more than simply save the original file. During every upload, WordPress automatically creates multiple resized versions of that image for use across different areas of your website.&lt;/p&gt;

&lt;p&gt;By default, WordPress generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thumbnail:&lt;/strong&gt; 150 × 150 px (cropped square), commonly used for galleries and widgets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; Maximum 300 px on the longest side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Large:&lt;/strong&gt; Maximum 1024 px on the longest side.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full Size:&lt;/strong&gt; The original uploaded image (unchanged).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h3&gt;
  
  
  Custom Image Sizes
&lt;/h3&gt;

&lt;p&gt;The default sizes are only part of the story. Many themes and plugins register their own image dimensions, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page builders&lt;/li&gt;
&lt;li&gt;Gallery plugins&lt;/li&gt;
&lt;li&gt;Slider plugins&lt;/li&gt;
&lt;li&gt;WooCommerce&lt;/li&gt;
&lt;li&gt;Custom WordPress themes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result, uploading one image can generate 5–10+ files depending on your site’s configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why It Becomes a Problem
&lt;/h3&gt;

&lt;p&gt;If your website stores hundreds or thousands of images, these additional copies consume a significant amount of server resources.&lt;/p&gt;

&lt;p&gt;Common drawbacks include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased disk usage&lt;/li&gt;
&lt;li&gt;Slower image uploads&lt;/li&gt;
&lt;li&gt;Longer backup times&lt;/li&gt;
&lt;li&gt;Higher storage costs&lt;/li&gt;
&lt;li&gt;Extra CPU usage during image processing&lt;/li&gt;
&lt;li&gt;Larger media libraries to maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;500 original images × 2 MB each = 1 GB&lt;/li&gt;
&lt;li&gt;If WordPress creates five additional sizes per image, total storage can easily exceed 5 GB, even when many of those files are never used.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;If your theme never displays certain image sizes, generating them simply wastes storage and processing power.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Ways to Control WordPress Image Size Generation
&lt;/h2&gt;

&lt;p&gt;You have two solid paths to stop WordPress from generating image sizes you don’t need.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The plugin route is the most approachable, it gives you a settings interface and doesn’t require touching any code.&lt;/li&gt;
&lt;li&gt;The code route is more precise and doesn’t add another plugin to your site, but it does mean working with your theme’s functions.php file.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither approach is wrong. Pick based on what you’re comfortable with.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read Full Article:&lt;/strong&gt; &lt;a href="https://serveravatar.com/remove-wordpress-default-image-sizes" rel="noopener noreferrer"&gt;https://serveravatar.com/remove-wordpress-default-image-sizes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>webdev</category>
      <category>php</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
