<?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: Nitin Mehta</title>
    <description>The latest articles on DEV Community by Nitin Mehta (@nitinmehta).</description>
    <link>https://dev.to/nitinmehta</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3887044%2F332e1162-2d0b-4ab9-9e4a-4de850a78172.jpg</url>
      <title>DEV Community: Nitin Mehta</title>
      <link>https://dev.to/nitinmehta</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nitinmehta"/>
    <language>en</language>
    <item>
      <title>I Built a Self-Hosted WhatsApp Gateway Using Node.js, Docker and PostgreSQL</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Sat, 31 Oct 2026 04:39:03 +0000</pubDate>
      <link>https://dev.to/nitinmehta/i-built-a-self-hosted-whatsapp-gateway-using-nodejs-docker-and-postgresql-2mmb</link>
      <guid>https://dev.to/nitinmehta/i-built-a-self-hosted-whatsapp-gateway-using-nodejs-docker-and-postgresql-2mmb</guid>
      <description>&lt;h1&gt;
  
  
  Building Puffx WhatsApp Gateway: A Self-Hosted WhatsApp Messaging API with Node.js, Docker and PostgreSQL
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Author:&lt;/strong&gt; Nitin Mehta&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Project:&lt;/strong&gt; Puffx WhatsApp Gateway&lt;br&gt;&lt;br&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://puffxhost.com" rel="noopener noreferrer"&gt;https://puffxhost.com&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;What if developers could run their own WhatsApp messaging gateway instead of depending entirely on a third-party hosted messaging service?&lt;/p&gt;

&lt;p&gt;That question inspired me to build &lt;strong&gt;Puffx WhatsApp Gateway&lt;/strong&gt;, an open-source, self-hosted messaging gateway designed to connect a WhatsApp account with applications through a REST API.&lt;/p&gt;

&lt;p&gt;The project brings together a web dashboard, WhatsApp account pairing, API key authentication, PostgreSQL, and Docker-based deployment.&lt;/p&gt;

&lt;p&gt;The main idea is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run the gateway on your own computer or VPS.&lt;/li&gt;
&lt;li&gt;Connect a WhatsApp account using QR pairing or a phone pairing code.&lt;/li&gt;
&lt;li&gt;Manage the connected session through a web dashboard.&lt;/li&gt;
&lt;li&gt;Generate an API key.&lt;/li&gt;
&lt;li&gt;Send text messages from your own backend applications using HTTP requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built this project under &lt;strong&gt;Puffx Host&lt;/strong&gt; to explore backend development, API architecture, self-hosted infrastructure, and messaging integrations.&lt;/p&gt;

&lt;p&gt;The project is currently in its initial beta stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore the source code:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  1. What Is Puffx WhatsApp Gateway?
&lt;/h2&gt;

&lt;p&gt;Puffx WhatsApp Gateway is a self-hosted application that exposes a REST API for sending text messages through a paired WhatsApp Web session.&lt;/p&gt;

&lt;p&gt;Instead of using a gateway hosted by someone else, developers can deploy the application on infrastructure they control.&lt;/p&gt;

&lt;p&gt;The application provides a web dashboard for managing sessions and API credentials.&lt;/p&gt;
&lt;h3&gt;
  
  
  Main Features
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. QR Code Pairing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Connect a WhatsApp account by scanning a QR code using WhatsApp's Linked Devices feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Phone Pairing Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project also supports an alternative phone pairing code flow.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Web Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manage your account, create WhatsApp sessions, check connection status, and generate API keys.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. REST API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Send text messages programmatically through an HTTP endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. API Key Authentication&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The API uses Bearer token authentication to authorize message requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. PostgreSQL Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PostgreSQL stores application data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Docker Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker Compose provides a convenient way to run the gateway and its database together.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Persistent Session Storage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Docker volumes preserve database data and WhatsApp authentication state across normal container restarts.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Technology Stack
&lt;/h2&gt;

&lt;p&gt;I used the following technologies and tools to build the project.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;Backend runtime&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TypeScript&lt;/td&gt;
&lt;td&gt;Application development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;td&gt;Containerization&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Compose&lt;/td&gt;
&lt;td&gt;Service orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;REST API&lt;/td&gt;
&lt;td&gt;Application integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Baileys&lt;/td&gt;
&lt;td&gt;WhatsApp Web connectivity&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Why Docker?
&lt;/h3&gt;

&lt;p&gt;A self-hosted application should be relatively straightforward to deploy and maintain.&lt;/p&gt;

&lt;p&gt;Docker makes it easier to package the gateway and database into a consistent environment.&lt;/p&gt;

&lt;p&gt;Instead of manually configuring every dependency, developers can start the application using Docker Compose.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why PostgreSQL?
&lt;/h3&gt;

&lt;p&gt;The project needs persistent application data. PostgreSQL provides a relational database for managing that information.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Understanding the Architecture
&lt;/h2&gt;

&lt;p&gt;At a high level, the application has four important parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dashboard: The interface used to manage accounts, sessions, and API keys.&lt;/li&gt;
&lt;li&gt;Backend API: Handles authentication, session management, and message requests.&lt;/li&gt;
&lt;li&gt;PostgreSQL: Stores persistent application data.&lt;/li&gt;
&lt;li&gt;WhatsApp Web integration: Handles the paired WhatsApp session and communication.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The basic message flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your Application
       |
       | HTTP Request
       v
Puffx REST API
       |
       | Bearer Token Authentication
       v
Session Validation
       |
       v
WhatsApp Integration
       |
       v
WhatsApp Network
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This architecture allows another backend application to communicate with the gateway without directly managing the WhatsApp session itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Installing the Project with Docker
&lt;/h2&gt;

&lt;p&gt;One of the main goals was to make local setup accessible to developers.&lt;/p&gt;

&lt;h3&gt;
  
  
  Requirements
&lt;/h3&gt;

&lt;p&gt;Before starting, install:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker Desktop or Docker Engine.&lt;/li&gt;
&lt;li&gt;Docker Compose.&lt;/li&gt;
&lt;li&gt;Git.&lt;/li&gt;
&lt;li&gt;A WhatsApp account that can use Linked Devices.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Windows users, Docker Desktop should be installed and running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the Repository
&lt;/h3&gt;

&lt;p&gt;Open Windows CMD, PowerShell, or a terminal on Linux/macOS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/puffxhost/puffx-whatsapp-gateway.git

&lt;span class="nb"&gt;cd &lt;/span&gt;puffx-whatsapp-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Configure Environment Variables
&lt;/h3&gt;

&lt;p&gt;Copy the example environment configuration.&lt;/p&gt;

&lt;p&gt;On Windows CMD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight batchfile"&gt;&lt;code&gt;&lt;span class="nb"&gt;copy&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Linux/macOS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the &lt;code&gt;.env&lt;/code&gt; file and configure the required secrets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POSTGRES_PASSWORD=your_strong_database_password
SESSION_SECRET=your_random_session_secret
API_KEY_PEPPER=your_random_api_key_pepper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use unique, randomly generated values.&lt;/p&gt;

&lt;p&gt;The session secret and API key pepper should be different from each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Never commit your real &lt;code&gt;.env&lt;/code&gt; file to a public repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Start Docker Compose
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Docker Compose will build and start the gateway and database services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Open the Dashboard
&lt;/h3&gt;

&lt;p&gt;After the services start, open:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You can also check the readiness endpoint:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;The endpoint should report that the application is ready.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Check Container Status
&lt;/h3&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To view gateway logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose logs &lt;span class="nt"&gt;-f&lt;/span&gt; gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To restart the gateway:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose restart gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To stop the services while preserving data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker compose down
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Be careful with &lt;code&gt;docker compose down -v&lt;/code&gt;. It removes the associated named volumes and can permanently delete the database and WhatsApp login data.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Connecting a WhatsApp Account
&lt;/h2&gt;

&lt;p&gt;After opening the dashboard, follow these steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an account in the dashboard.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Add session&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Give your WhatsApp session a name.&lt;/li&gt;
&lt;li&gt;Choose QR pairing or phone pairing code.&lt;/li&gt;
&lt;li&gt;For QR pairing, open WhatsApp on your phone.&lt;/li&gt;
&lt;li&gt;Navigate to Settings → Linked Devices → Link a Device.&lt;/li&gt;
&lt;li&gt;Scan the displayed QR code.&lt;/li&gt;
&lt;li&gt;Wait until the session status becomes &lt;code&gt;connected&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once connected, the session is available for API integration.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security note:&lt;/strong&gt; Never share QR codes, pairing codes, WhatsApp authentication files, or session backups with anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Generating an API Key
&lt;/h2&gt;

&lt;p&gt;After connecting your WhatsApp session:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the connected session in the dashboard.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Create API key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Copy the generated key immediately.&lt;/li&gt;
&lt;li&gt;Store it securely on your backend server.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The key is displayed only once.&lt;/p&gt;

&lt;p&gt;If you lose it, revoke it and generate a new key.&lt;/p&gt;

&lt;p&gt;The API key is associated with the session selected when it was created.&lt;/p&gt;

&lt;p&gt;The session UUID is also required when making a message request. Use the dashboard's &lt;strong&gt;Copy ID&lt;/strong&gt; option to obtain it.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Sending Your First WhatsApp Message Through the REST API
&lt;/h2&gt;

&lt;p&gt;This is one of the most important parts of the project.&lt;/p&gt;

&lt;p&gt;Once the gateway is running and a WhatsApp session is connected, another application can send a text message using an authenticated HTTP request.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Endpoint
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /api/v1/messages/send
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Authentication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Authorization: Bearer YOUR_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Request Body
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sessionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_SESSION_UUID"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"919876543210"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Hello from Puffx WhatsApp Gateway!"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the example phone number with the recipient's number, including the country code and digits only.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complete cURL Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"http://127.0.0.1:3000/api/v1/messages/send"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer YOUR_API_KEY"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "sessionId": "YOUR_SESSION_UUID",
    "to": "919876543210",
    "type": "text",
    "message": "Hello from Puffx WhatsApp Gateway!"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the API key and session UUID with your actual values.&lt;/p&gt;

&lt;p&gt;The API returns HTTP &lt;code&gt;202&lt;/code&gt; when the provider accepts the message request.&lt;/p&gt;

&lt;p&gt;An important distinction: HTTP &lt;code&gt;202&lt;/code&gt; does not guarantee successful delivery or confirm that the recipient has read the message.&lt;/p&gt;

&lt;p&gt;Delivery and read receipts are not currently implemented in this beta.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Integrating with Other Programming Languages
&lt;/h2&gt;

&lt;p&gt;The gateway is designed to be accessed through HTTP, so a developer can integrate it with a backend written in different programming languages.&lt;/p&gt;

&lt;p&gt;Examples and integration guidance are included in the repository's API documentation.&lt;/p&gt;

&lt;p&gt;Potential client applications include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js applications.&lt;/li&gt;
&lt;li&gt;PHP applications.&lt;/li&gt;
&lt;li&gt;Python applications.&lt;/li&gt;
&lt;li&gt;Internal business tools.&lt;/li&gt;
&lt;li&gt;Backend automation systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, a PHP application could make an HTTP POST request to the gateway with its API key stored in a server-side environment variable.&lt;/p&gt;

&lt;p&gt;Never expose an API key in frontend JavaScript, a public GitHub repository, or a mobile application's publicly accessible configuration.&lt;/p&gt;

&lt;p&gt;For detailed examples, refer to:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/api-reference.md" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/api-reference.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  9. Can It Run on a VPS?
&lt;/h2&gt;

&lt;p&gt;Yes. The application is designed for self-hosted deployment on a Linux VPS or cloud virtual machine.&lt;/p&gt;

&lt;p&gt;A typical deployment needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Linux server.&lt;/li&gt;
&lt;li&gt;Docker Engine.&lt;/li&gt;
&lt;li&gt;Docker Compose.&lt;/li&gt;
&lt;li&gt;PostgreSQL.&lt;/li&gt;
&lt;li&gt;Persistent storage.&lt;/li&gt;
&lt;li&gt;Domain name.&lt;/li&gt;
&lt;li&gt;HTTPS reverse proxy.&lt;/li&gt;
&lt;li&gt;Outbound WebSocket connectivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For public deployments, the gateway should run behind an HTTPS reverse proxy such as Nginx.&lt;/p&gt;

&lt;p&gt;The repository includes deployment documentation and an example Nginx configuration.&lt;/p&gt;

&lt;p&gt;A typical deployment workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Domain
  |
  v
HTTPS Reverse Proxy
  |
  v
Puffx WhatsApp Gateway
  |
  +------ PostgreSQL
  |
  +------ Persistent WhatsApp Session Data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Docker Compose configuration binds the gateway to localhost on port 3000. The reverse proxy forwards HTTPS requests to that local service.&lt;/p&gt;

&lt;p&gt;Ordinary shared hosting and static website hosting are generally unsuitable because the application requires continuously running services and persistent writable storage.&lt;/p&gt;

&lt;p&gt;For additional information:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker deployment: &lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/docker-deployment.md" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/docker-deployment.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;VPS deployment: &lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/vps-deployment.md" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/vps-deployment.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Installation guide: &lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/installation.md" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/installation.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. Security Considerations
&lt;/h2&gt;

&lt;p&gt;Self-hosting gives developers control over their infrastructure, but it also means they are responsible for securing it.&lt;/p&gt;

&lt;p&gt;Some important considerations:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Environment Secrets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use strong, unique secrets for the database password, session secret, and API key pepper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTPS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Never expose a public dashboard or API over unencrypted HTTP. Configure a valid TLS certificate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Key Protection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Keep API keys in backend environment variables or a secret manager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session Data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;WhatsApp authentication state is stored on disk and is not encrypted by the application. Protect the Docker volume and its backups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Database Backups&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Back up PostgreSQL and the WhatsApp authentication volume. Treat both as sensitive data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access Restrictions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do not expose internal database ports or unnecessary services to the public internet.&lt;/p&gt;

&lt;p&gt;Read the full security documentation before deploying publicly:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/security.md" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway/blob/main/docs/security.md&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Current Beta Status and Limitations
&lt;/h2&gt;

&lt;p&gt;I want to be transparent about the current state of the project.&lt;/p&gt;

&lt;p&gt;Puffx WhatsApp Gateway is an initial beta implementation.&lt;/p&gt;

&lt;p&gt;Currently supported functionality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WhatsApp QR pairing.&lt;/li&gt;
&lt;li&gt;Phone pairing code.&lt;/li&gt;
&lt;li&gt;Web dashboard.&lt;/li&gt;
&lt;li&gt;Session management.&lt;/li&gt;
&lt;li&gt;API key creation.&lt;/li&gt;
&lt;li&gt;REST API authentication.&lt;/li&gt;
&lt;li&gt;Text message sending.&lt;/li&gt;
&lt;li&gt;Docker Compose deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Current limitations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only text messages are supported.&lt;/li&gt;
&lt;li&gt;Media messaging is not implemented.&lt;/li&gt;
&lt;li&gt;Webhooks are not implemented.&lt;/li&gt;
&lt;li&gt;Message queues are not implemented.&lt;/li&gt;
&lt;li&gt;Delivery and read receipts are not implemented.&lt;/li&gt;
&lt;li&gt;There is no separate admin console.&lt;/li&gt;
&lt;li&gt;Real WhatsApp pairing and delivery behavior have not been verified by automated tests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These limitations are important. The project should not be treated as a fully production-ready messaging platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  12. Why I Started This Project
&lt;/h2&gt;

&lt;p&gt;I enjoy exploring how software systems work beyond the frontend.&lt;/p&gt;

&lt;p&gt;Working on this project has given me an opportunity to explore:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Backend architecture.&lt;/li&gt;
&lt;li&gt;REST API design.&lt;/li&gt;
&lt;li&gt;Database integration.&lt;/li&gt;
&lt;li&gt;Docker-based deployment.&lt;/li&gt;
&lt;li&gt;Authentication and secrets management.&lt;/li&gt;
&lt;li&gt;Persistent application data.&lt;/li&gt;
&lt;li&gt;VPS infrastructure.&lt;/li&gt;
&lt;li&gt;WhatsApp Web connectivity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also wanted to build a practical tool that other developers could inspect, run, and experiment with.&lt;/p&gt;

&lt;p&gt;This is an ongoing learning and development project under Puffx Host.&lt;/p&gt;

&lt;h2&gt;
  
  
  13. Open Source and Community Feedback
&lt;/h2&gt;

&lt;p&gt;The project is publicly available on GitHub.&lt;/p&gt;

&lt;p&gt;I welcome feedback from developers who work with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node.js.&lt;/li&gt;
&lt;li&gt;TypeScript.&lt;/li&gt;
&lt;li&gt;PostgreSQL.&lt;/li&gt;
&lt;li&gt;Docker.&lt;/li&gt;
&lt;li&gt;REST APIs.&lt;/li&gt;
&lt;li&gt;Backend development.&lt;/li&gt;
&lt;li&gt;Self-hosted infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can explore the source code, read the documentation, report issues, and contribute improvements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you find a bug or have a technical suggestion, please open an issue in the GitHub repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Puffx WhatsApp Gateway is my attempt to build a self-hosted messaging gateway with a practical REST API and Docker-based deployment.&lt;/p&gt;

&lt;p&gt;It is still in beta, and there is plenty of room for improvement.&lt;/p&gt;

&lt;p&gt;Building this project has been a useful experience in backend engineering, infrastructure, and API development.&lt;/p&gt;

&lt;p&gt;I would love to hear your feedback:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What would you improve in a self-hosted WhatsApp messaging gateway?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Would you focus on better session management, more API capabilities, monitoring, or deployment improvements?&lt;/p&gt;

&lt;p&gt;Explore the project:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/puffxhost/puffx-whatsapp-gateway" rel="noopener noreferrer"&gt;https://github.com/puffxhost/puffx-whatsapp-gateway&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Built by Nitin Mehta | Puffx Host&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://puffxhost.com" rel="noopener noreferrer"&gt;https://puffxhost.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/puffxhost" rel="noopener noreferrer"&gt;https://github.com/puffxhost&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Disclaimer
&lt;/h3&gt;

&lt;p&gt;Puffx WhatsApp Gateway uses Baileys, an unofficial WhatsApp Web integration. It is not the official WhatsApp Business Platform and is not affiliated with, endorsed by, or sponsored by WhatsApp or Meta.&lt;/p&gt;

&lt;p&gt;WhatsApp pairing and service availability may change. Users are responsible for complying with applicable WhatsApp terms, local laws, privacy requirements, and recipient-consent requirements. Use this project responsibly.&lt;/p&gt;

</description>
      <category>node</category>
      <category>docker</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>PHP2Shell: Two Critical PHP Security Vulnerabilities Every Developer Should Know About</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Fri, 23 Oct 2026 05:55:24 +0000</pubDate>
      <link>https://dev.to/nitinmehta/php2shell-two-critical-php-security-vulnerabilities-every-developer-should-know-about-2546</link>
      <guid>https://dev.to/nitinmehta/php2shell-two-critical-php-security-vulnerabilities-every-developer-should-know-about-2546</guid>
      <description>&lt;h1&gt;
  
  
  PHP2Shell Explained: Critical PHP RCE Vulnerabilities, Affected Versions, and How to Secure Your Server
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Two critical PHP vulnerabilities have put web application security in the spotlight. Here is what developers, DevOps engineers, and hosting providers need to know.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On October 21, 2026, the PHP project released security updates addressing two critical vulnerabilities identified as &lt;strong&gt;CVE-2026-109618 and CVE-2026-109619&lt;/strong&gt;, collectively discussed under the name PHP2Shell.&lt;/p&gt;

&lt;p&gt;These vulnerabilities can allow unauthenticated remote code execution (RCE) on affected PHP installations. In practical terms, a vulnerable server may process a specially crafted network request in a way that allows an attacker to execute unauthorized code.&lt;/p&gt;

&lt;p&gt;The PHP runtime is used across a large portion of the web, making these vulnerabilities important for developers, system administrators, managed hosting providers, and organizations running PHP-based applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the full security report from Puffx Host:&lt;/strong&gt; &lt;a href="https://puffxhost.com/news/php2shell-php-vulnerability" rel="noopener noreferrer"&gt;PHP2Shell: Critical PHP Flaw — Update Now&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this article, we will examine how PHP2Shell works at a high level, which versions are affected, how to prioritize remediation, and what you should check before considering a server secure.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What Is PHP2Shell?
&lt;/h2&gt;

&lt;p&gt;PHP is a server-side programming language that processes application logic, interacts with databases, handles requests, and generates dynamic web pages.&lt;/p&gt;

&lt;p&gt;It is used by popular platforms and applications, including WordPress, Drupal, and many custom PHP websites.&lt;/p&gt;

&lt;p&gt;PHP2Shell refers to two critical vulnerabilities in the PHP runtime itself. This distinction matters because a vulnerability in the language runtime can affect multiple applications running on the same server.&lt;/p&gt;

&lt;p&gt;The reported issues are not limited to a particular WordPress plugin or application framework. They concern the underlying PHP runtime that processes web requests.&lt;/p&gt;

&lt;p&gt;The two vulnerabilities are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-109618:&lt;/strong&gt; Remote code execution associated with memory corruption during out-of-memory handling.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-109619:&lt;/strong&gt; Remote code execution associated with stale internal state and use-after-free behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both vulnerabilities were assigned a reported CVSS v4.0 severity score of 9.2, placing them in the critical category.&lt;/p&gt;

&lt;p&gt;Official references:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.php.net/" rel="noopener noreferrer"&gt;PHP security release information&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cert.europa.eu/publications/security-advisories/2026-018" rel="noopener noreferrer"&gt;CERT-EU technical advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Why Is Remote Code Execution So Dangerous?
&lt;/h2&gt;

&lt;p&gt;Remote code execution is one of the most serious classes of application security vulnerability.&lt;/p&gt;

&lt;p&gt;Normally, a web server receives a request, processes it through the application stack, and returns a response. A runtime vulnerability can disrupt that expected process.&lt;/p&gt;

&lt;p&gt;If an attacker successfully exploits an RCE vulnerability, the attacker may be able to execute code with the privileges of the affected server process.&lt;/p&gt;

&lt;p&gt;Depending on those permissions and the server's configuration, potential consequences include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access to sensitive application data.&lt;/li&gt;
&lt;li&gt;Unauthorized changes to website files.&lt;/li&gt;
&lt;li&gt;Exposure of database credentials stored in configuration files.&lt;/li&gt;
&lt;li&gt;Installation of malicious scripts or backdoors.&lt;/li&gt;
&lt;li&gt;Abuse of server resources.&lt;/li&gt;
&lt;li&gt;Attempts to access other services or applications available to the compromised account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are potential consequences of successful exploitation, not proof that every vulnerable website has been compromised.&lt;/p&gt;

&lt;p&gt;The actual impact depends on factors such as process permissions, isolation between hosting accounts, filesystem access, application architecture, and other security controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Technical Overview: How the Two Vulnerabilities Differ
&lt;/h2&gt;

&lt;p&gt;Understanding the underlying concepts helps developers understand why runtime patches are important.&lt;/p&gt;

&lt;h3&gt;
  
  
  CVE-2026-109618: Memory Corruption During Out-of-Memory Handling
&lt;/h3&gt;

&lt;p&gt;Applications have memory limits to prevent excessive resource consumption.&lt;/p&gt;

&lt;p&gt;PHP can interrupt request processing when a request exceeds the configured memory limit. During that interruption, internal request data may not have been fully initialized.&lt;/p&gt;

&lt;p&gt;The reported vulnerability involves cleanup logic handling invalid or partially initialized internal data as though it were valid.&lt;/p&gt;

&lt;p&gt;This creates an opportunity for memory corruption under the relevant conditions.&lt;/p&gt;

&lt;p&gt;The important engineering lesson is that error handling and cleanup paths are part of the security boundary. Code that runs when an application fails must be just as carefully designed and tested as code that handles normal requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  CVE-2026-109619: Stale Internal State
&lt;/h3&gt;

&lt;p&gt;A use-after-free vulnerability occurs when software continues to use a memory reference after the memory it points to has been released.&lt;/p&gt;

&lt;p&gt;The memory may subsequently be reused for something else. If the application continues to treat the old reference as valid, unexpected behavior can follow.&lt;/p&gt;

&lt;p&gt;In the reported PHP2Shell issue, internal state can survive after the memory associated with it has been freed. A subsequent operation may encounter that stale state before it has been properly reinitialized.&lt;/p&gt;

&lt;p&gt;The risk depends on the runtime configuration and the execution path involved.&lt;/p&gt;

&lt;p&gt;These are runtime-level problems. Fixing an unrelated application bug or updating a WordPress plugin does not, by itself, repair a vulnerable PHP runtime.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Which PHP Versions Are Affected?
&lt;/h2&gt;

&lt;p&gt;The PHP project published security releases for four branches on October 21, 2026.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;PHP branch&lt;/th&gt;
&lt;th&gt;Security-fixed release&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.5&lt;/td&gt;
&lt;td&gt;8.5.12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.4&lt;/td&gt;
&lt;td&gt;8.4.27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.3&lt;/td&gt;
&lt;td&gt;8.3.36&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHP 8.2&lt;/td&gt;
&lt;td&gt;8.2.35&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Install the appropriate patched release or a verified security-fixed package supplied by your operating system or hosting vendor.&lt;/p&gt;

&lt;h3&gt;
  
  
  What about PHP 8.1, 8.0, and 7.4?
&lt;/h3&gt;

&lt;p&gt;Older branches require special attention because they are no longer covered by the same official release process as currently supported branches.&lt;/p&gt;

&lt;p&gt;The PHP project has published minimal source backports for certain older branches, and some operating-system vendors provide their own security fixes. Availability depends on the specific branch and package source.&lt;/p&gt;

&lt;p&gt;If your server runs an older version:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Check whether your distribution or hosting vendor supplies a security backport.&lt;/li&gt;
&lt;li&gt;Confirm that the installed package includes the relevant fix.&lt;/li&gt;
&lt;li&gt;Plan a migration to a supported PHP branch.&lt;/li&gt;
&lt;li&gt;If you cannot mitigate the exposure promptly, restrict public access until remediation is possible.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Do not judge security solely by the displayed version number.&lt;/strong&gt; Some vendor packages backport security patches without changing the upstream version string to the latest release number.&lt;/p&gt;

&lt;p&gt;Reference: &lt;a href="https://www.php.net/supported-versions.php" rel="noopener noreferrer"&gt;PHP Supported Versions&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5. How to Check Your Website's PHP Version
&lt;/h2&gt;

&lt;p&gt;A common mistake is checking the PHP version available in the terminal and assuming the website uses the same runtime.&lt;/p&gt;

&lt;p&gt;That is not always true.&lt;/p&gt;

&lt;p&gt;A server can have multiple PHP versions installed, with different versions assigned to individual domains, command-line jobs, containers, or PHP-FPM pools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method A: Using SSH
&lt;/h3&gt;

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

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

&lt;/div&gt;



&lt;p&gt;This shows the PHP version used by the command-line executable resolved by your shell.&lt;/p&gt;

&lt;p&gt;You can also check which executable is being used:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;On Windows, the equivalent command is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;where.exe&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;php&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These commands help identify the CLI runtime, but they do not independently establish which PHP runtime is serving your website.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method B: Using cPanel
&lt;/h3&gt;

&lt;p&gt;For websites hosted through cPanel:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sign in to cPanel.&lt;/li&gt;
&lt;li&gt;Open MultiPHP Manager or Select PHP Version, depending on your configuration.&lt;/li&gt;
&lt;li&gt;Locate the domain you want to inspect.&lt;/li&gt;
&lt;li&gt;Check its assigned PHP version.&lt;/li&gt;
&lt;li&gt;Ask your hosting provider whether the actual serving runtime has received the relevant security update.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you manage your own VPS or dedicated server, also inspect the package source, PHP-FPM pools, Apache configuration, and any containers that run PHP.&lt;/p&gt;

&lt;p&gt;Avoid leaving a public &lt;code&gt;phpinfo()&lt;/code&gt; page accessible on production websites. Such pages can disclose sensitive configuration details.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. How to Patch PHP2Shell Properly
&lt;/h2&gt;

&lt;p&gt;A security update is not complete merely because a package was downloaded or a version setting was changed.&lt;/p&gt;

&lt;p&gt;You need to confirm that the running service actually uses the fixed runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Inventory your PHP installations
&lt;/h3&gt;

&lt;p&gt;Identify all systems that may contain PHP, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public-facing websites and APIs.&lt;/li&gt;
&lt;li&gt;WordPress and Drupal installations.&lt;/li&gt;
&lt;li&gt;cPanel and Plesk hosting accounts.&lt;/li&gt;
&lt;li&gt;VPS and dedicated servers.&lt;/li&gt;
&lt;li&gt;PHP-FPM and Apache &lt;code&gt;mod_php&lt;/code&gt; deployments.&lt;/li&gt;
&lt;li&gt;Containers and deployment images.&lt;/li&gt;
&lt;li&gt;Third-party products and appliances that bundle PHP.&lt;/li&gt;
&lt;li&gt;Development, staging, and internal applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not rely only on your main website inventory. A forgotten subdomain or an old application can still expose a vulnerable runtime.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Prioritize internet-facing systems
&lt;/h3&gt;

&lt;p&gt;Start with publicly accessible systems, particularly those running vulnerable PHP versions.&lt;/p&gt;

&lt;p&gt;The PHP team identified Apache &lt;code&gt;mod_php&lt;/code&gt; as a particularly high-risk configuration because a demonstrated attack path can be reached before application code executes.&lt;/p&gt;

&lt;p&gt;Other request-serving PHP configurations—including PHP-FPM, &lt;code&gt;php-cgi&lt;/code&gt;, FrankenPHP, and LiteSpeed—also require assessment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Install the correct security update
&lt;/h3&gt;

&lt;p&gt;Use the package manager or trusted software distribution channel for your environment.&lt;/p&gt;

&lt;p&gt;For example, on a Debian- or Ubuntu-based system, you can inspect installed PHP packages with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dpkg &lt;span class="nt"&gt;-l&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s1"&gt;'php[0-9.-]*'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a compatible RPM-based system, you can inspect installed packages with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;rpm &lt;span class="nt"&gt;-qa&lt;/span&gt; | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^php'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are inventory commands, not patching commands. The correct update procedure depends on your operating system, configured repositories, PHP installation method, and application requirements.&lt;/p&gt;

&lt;p&gt;Do not blindly replace system PHP packages with unrelated packages from an untrusted repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Restart the relevant services
&lt;/h3&gt;

&lt;p&gt;After installing an update, restart or reload the relevant PHP and web server services as required by your environment.&lt;/p&gt;

&lt;p&gt;For example, a PHP-FPM deployment may require restarting the appropriate PHP-FPM service, while an Apache deployment may require restarting Apache or its relevant PHP handler.&lt;/p&gt;

&lt;p&gt;Service names differ between operating systems and PHP versions. Confirm the correct service before running administrative commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Verify the running runtime
&lt;/h3&gt;

&lt;p&gt;Check the package status and the PHP version serving the application. Verify that the appropriate fix is present and that old worker processes have been replaced.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 6: Test the application
&lt;/h3&gt;

&lt;p&gt;Check important application functions, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login and session handling.&lt;/li&gt;
&lt;li&gt;File uploads.&lt;/li&gt;
&lt;li&gt;Database connectivity.&lt;/li&gt;
&lt;li&gt;API endpoints.&lt;/li&gt;
&lt;li&gt;Background jobs and cron tasks.&lt;/li&gt;
&lt;li&gt;Payment and checkout workflows.&lt;/li&gt;
&lt;li&gt;Error logs and application performance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A successful update should leave the application functional while ensuring the relevant security fix is active.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Are WordPress Websites Affected?
&lt;/h2&gt;

&lt;p&gt;WordPress is written primarily in PHP, so the PHP runtime used by a WordPress website must be assessed.&lt;/p&gt;

&lt;p&gt;Updating WordPress core, themes, or plugins is important, but those updates are not substitutes for patching the underlying PHP installation.&lt;/p&gt;

&lt;p&gt;WordPress administrators should:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Confirm the PHP version assigned to their website.&lt;/li&gt;
&lt;li&gt;Contact their hosting provider if they cannot verify the runtime.&lt;/li&gt;
&lt;li&gt;Apply a compatible security-fixed PHP package.&lt;/li&gt;
&lt;li&gt;Update WordPress core, plugins, and themes.&lt;/li&gt;
&lt;li&gt;Back up the site and database.&lt;/li&gt;
&lt;li&gt;Review logs for suspicious activity.&lt;/li&gt;
&lt;li&gt;Test the website after the change.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same principle applies to Drupal, custom PHP applications, and other platforms that depend on PHP.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. What If You Cannot Update Immediately?
&lt;/h2&gt;

&lt;p&gt;The preferred solution is to apply the appropriate security fix.&lt;/p&gt;

&lt;p&gt;If immediate remediation is not possible, consider temporarily isolating the affected application from public access or restricting access to trusted networks while the update is prepared.&lt;/p&gt;

&lt;p&gt;A web application firewall may provide an additional defensive layer, but it is not a replacement for a patched runtime.&lt;/p&gt;

&lt;p&gt;PHP's interim guidance includes configuration changes that can reduce exposure in certain circumstances. However, these measures are incomplete and must not be treated as proof that an unpatched installation is safe.&lt;/p&gt;

&lt;p&gt;For production systems, consult the official advisory and have a qualified administrator assess the appropriate temporary controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  9. How to Investigate a Potential Compromise
&lt;/h2&gt;

&lt;p&gt;A vulnerable version does not automatically mean an attacker has compromised the server. However, an internet-facing system that remained vulnerable should be assessed carefully.&lt;/p&gt;

&lt;p&gt;Review:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web server and PHP application logs.&lt;/li&gt;
&lt;li&gt;Authentication and administrative activity.&lt;/li&gt;
&lt;li&gt;Unexpected files or modified application code.&lt;/li&gt;
&lt;li&gt;Unknown scheduled tasks or processes.&lt;/li&gt;
&lt;li&gt;Unexpected outbound network connections.&lt;/li&gt;
&lt;li&gt;Changes to application configuration files.&lt;/li&gt;
&lt;li&gt;Suspicious access to credentials or sensitive data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look for activity around the period when the system was exposed, and preserve relevant logs before making changes that could destroy evidence.&lt;/p&gt;

&lt;p&gt;If there is credible evidence of compromise, isolate the affected system where appropriate and follow your incident-response process. Patching alone may not remove a backdoor or reverse unauthorized changes.&lt;/p&gt;

&lt;p&gt;Do not publish sensitive logs or credentials while requesting assistance.&lt;/p&gt;

&lt;h2&gt;
  
  
  10. What Hosting Providers Should Do
&lt;/h2&gt;

&lt;p&gt;Hosting providers have a particular responsibility because one server can serve many customer websites.&lt;/p&gt;

&lt;p&gt;A practical response should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inventorying affected PHP installations.&lt;/li&gt;
&lt;li&gt;Identifying domains using vulnerable runtimes.&lt;/li&gt;
&lt;li&gt;Updating system packages or applying verified vendor backports.&lt;/li&gt;
&lt;li&gt;Restarting services and verifying loaded versions.&lt;/li&gt;
&lt;li&gt;Reviewing monitoring and security logs.&lt;/li&gt;
&lt;li&gt;Checking container images and bundled PHP runtimes.&lt;/li&gt;
&lt;li&gt;Communicating clearly with customers.&lt;/li&gt;
&lt;li&gt;Maintaining backups and incident-response procedures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For shared hosting, customers may not have the privileges required to update the server-level PHP runtime themselves. In that situation, the provider should confirm the patch status and explain any required customer-side actions.&lt;/p&gt;

&lt;p&gt;At Puffx Host, we encourage website owners to verify their PHP versions and work with their hosting provider to resolve any outstanding security issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read our full report:&lt;/strong&gt; &lt;a href="https://puffxhost.com/news/php2shell-php-vulnerability" rel="noopener noreferrer"&gt;PHP2Shell: Critical PHP Flaw — Update Now&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  11. Developer Checklist
&lt;/h2&gt;

&lt;p&gt;Before closing your PHP2Shell remediation task, confirm the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] All PHP installations have been inventoried.&lt;/li&gt;
&lt;li&gt;[ ] Internet-facing systems have been prioritized.&lt;/li&gt;
&lt;li&gt;[ ] The correct security-fixed package or verified backport has been installed.&lt;/li&gt;
&lt;li&gt;[ ] PHP-FPM, Apache, or other relevant services are running the fixed code.&lt;/li&gt;
&lt;li&gt;[ ] Containers and bundled PHP runtimes have been checked.&lt;/li&gt;
&lt;li&gt;[ ] WordPress, plugins, frameworks, and dependencies have been reviewed.&lt;/li&gt;
&lt;li&gt;[ ] Logs have been examined for signs of compromise.&lt;/li&gt;
&lt;li&gt;[ ] Backups and recovery procedures have been verified.&lt;/li&gt;
&lt;li&gt;[ ] Application functionality has been tested.&lt;/li&gt;
&lt;li&gt;[ ] Remaining vulnerable systems have been isolated or have a documented remediation plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;PHP2Shell highlights an important lesson in secure software engineering: application security depends on the entire stack, including the runtime, operating system, dependencies, and server configuration.&lt;/p&gt;

&lt;p&gt;Developers should verify official advisories and apply the appropriate security updates. DevOps teams should inventory their infrastructure and confirm that running services use the fixed packages. Hosting providers should prioritize exposed systems and communicate clearly with customers.&lt;/p&gt;

&lt;p&gt;Security maintenance is not a one-time task. It requires ongoing monitoring, timely updates, and a clear incident-response process.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;Puffx Host&lt;/strong&gt;, we believe reliable hosting begins with responsible infrastructure management, security awareness, and proactive maintenance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep your runtime patched. Monitor your infrastructure. Protect your applications.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Official References
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.php.net/" rel="noopener noreferrer"&gt;PHP Official Website and Security Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.php.net/supported-versions.php" rel="noopener noreferrer"&gt;PHP Supported Versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cert.europa.eu/publications/security-advisories/2026-018" rel="noopener noreferrer"&gt;CERT-EU: Critical Vulnerabilities in PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cyber.gc.ca/en/alerts-advisories/al26-026-critical-vulnerabilities-impacting-php-cve-2026-109618-and-cve-2026-109619" rel="noopener noreferrer"&gt;Canadian Centre for Cyber Security Advisory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ncsc.gov.uk/news/critical-security-issue-affecting-php" rel="noopener noreferrer"&gt;UK National Cyber Security Centre Advisory&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  About Puffx Host
&lt;/h3&gt;

&lt;p&gt;Puffx Host provides web hosting services designed to help businesses and developers run their websites and applications.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://puffxhost.com" rel="noopener noreferrer"&gt;https://puffxhost.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For security guidance and related updates, visit our &lt;a href="https://puffxhost.com/news/php2shell-php-vulnerability" rel="noopener noreferrer"&gt;PHP2Shell security article&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Editorial note: Technical details and release information in this article are based on the cited advisories available at the time of writing. Always consult the current official guidance for your specific environment.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  php #security #webdev #devops
&lt;/h1&gt;

</description>
      <category>php</category>
      <category>security</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Best Web Hosting in 2026: Top 20 Hosting Providers Compared</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Tue, 20 Oct 2026 07:54:43 +0000</pubDate>
      <link>https://dev.to/nitinmehta/best-web-hosting-in-2026-top-20-hosting-providers-compared-3aio</link>
      <guid>https://dev.to/nitinmehta/best-web-hosting-in-2026-top-20-hosting-providers-compared-3aio</guid>
      <description>&lt;h1&gt;
  
  
  Best Web Hosting in 2026: Top 20 Hosting Providers Compared
&lt;/h1&gt;

&lt;p&gt;Choosing a web hosting provider is one of the most important decisions when launching a website, blog, online store, SaaS product, or business application.&lt;/p&gt;

&lt;p&gt;A hosting provider affects more than just your website's loading speed. It also influences security, uptime, scalability, technical flexibility, customer support, and the total cost of running your project.&lt;/p&gt;

&lt;p&gt;But with so many hosting companies available, how do you decide which one is right for you?&lt;/p&gt;

&lt;p&gt;In this guide, we'll compare 20 hosting providers, explain what each one is best suited for, and help you understand what to check before purchasing a hosting plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; This article is published by Puffx Host. Puffx Host is our own hosting service and is included as one of the options. The rankings are an editorial comparison, not the result of a controlled benchmark of every provider. Pricing, features, and availability can change, so verify the current plan details before purchasing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What makes a good web hosting provider?&lt;/li&gt;
&lt;li&gt;Top 20 web hosting providers in 2026&lt;/li&gt;
&lt;li&gt;Hosting comparison table&lt;/li&gt;
&lt;li&gt;How to choose the right hosting&lt;/li&gt;
&lt;li&gt;Common hosting mistakes&lt;/li&gt;
&lt;li&gt;Frequently asked questions&lt;/li&gt;
&lt;li&gt;Final thoughts&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. What Makes a Good Web Hosting Provider?
&lt;/h2&gt;

&lt;p&gt;Before comparing companies, understand the factors that actually matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance and loading speed
&lt;/h3&gt;

&lt;p&gt;A fast website provides a better user experience. Server resources, storage technology, caching, PHP configuration, database performance, and server location can all affect response times.&lt;/p&gt;

&lt;p&gt;For an audience primarily in India, compare the available server locations and test latency from your target region.&lt;/p&gt;

&lt;h3&gt;
  
  
  Uptime and reliability
&lt;/h3&gt;

&lt;p&gt;Uptime represents the percentage of time a service remains available.&lt;/p&gt;

&lt;p&gt;A 99.9% uptime target allows approximately 8 hours and 46 minutes of downtime over a 365-day year. A published uptime commitment is not the same as independently measured performance, so check the provider's service-level agreement and exclusions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Security
&lt;/h3&gt;

&lt;p&gt;Look for SSL/TLS certificates, security updates, account isolation, malware protection, backup options, and a clear recovery process.&lt;/p&gt;

&lt;p&gt;Remember that SSL alone does not make a website completely secure. Your application, passwords, plugins, and server configuration also matter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pricing and renewal costs
&lt;/h3&gt;

&lt;p&gt;A low introductory price can be attractive, but always compare the renewal price, billing period, taxes, domain renewal, backup fees, and migration costs.&lt;/p&gt;

&lt;p&gt;The cheapest first payment is not necessarily the cheapest long-term solution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Customer support
&lt;/h3&gt;

&lt;p&gt;Beginners may need help with DNS configuration, SSL installation, email setup, database creation, WordPress installation, or application deployment.&lt;/p&gt;

&lt;p&gt;Check support hours, available contact channels, response commitments, and whether technical assistance is included in your plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Top 20 Web Hosting Providers in 2026
&lt;/h2&gt;

&lt;p&gt;The following list is a practical shortlist organized around different use cases. The order should not be treated as a verified global performance ranking; the best option depends on your requirements, location, and budget.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Puffx Host — An Option for Indian Customers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Budget-conscious users looking for hosting with direct support.&lt;/p&gt;

&lt;p&gt;Puffx Host focuses on affordable hosting services and support for customers who want to establish an online presence without managing an entire server themselves.&lt;/p&gt;

&lt;p&gt;It may be worth considering if you prefer assistance with basic hosting setup, domain configuration, SSL, and website deployment.&lt;/p&gt;

&lt;p&gt;Before purchasing, compare the exact plan specifications, resource limits, backup policy, uptime commitment, and support scope with other providers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore plans:&lt;/strong&gt; &lt;a href="https://puffxhost.com/packages" rel="noopener noreferrer"&gt;https://puffxhost.com/packages&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Hostinger — Beginner-Friendly Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Beginners, personal websites, and small businesses.&lt;/p&gt;

&lt;p&gt;Hostinger offers shared hosting, WordPress hosting, cloud hosting, and other website services. Its control panel and website-building tools can make getting started easier for people without server administration experience.&lt;/p&gt;

&lt;p&gt;Compare the current plan's storage, number of websites, backup schedule, renewal price, and available server locations before choosing a package.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.hostinger.com/" rel="noopener noreferrer"&gt;https://www.hostinger.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Bluehost — WordPress Websites
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; WordPress beginners and small business websites.&lt;/p&gt;

&lt;p&gt;Bluehost provides hosting products designed for websites and WordPress-based projects. It is worth comparing if you want a conventional hosting setup rather than managing your own server.&lt;/p&gt;

&lt;p&gt;Check the current WordPress recommendations, renewal costs, resource limits, and included support before buying.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.bluehost.com/" rel="noopener noreferrer"&gt;https://www.bluehost.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. SiteGround — Managed Website Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Users who prioritize managed services and support.&lt;/p&gt;

&lt;p&gt;SiteGround offers managed WordPress and other website hosting products. Its tooling can reduce the amount of server administration required for supported websites.&lt;/p&gt;

&lt;p&gt;It may cost more than entry-level hosting, so evaluate whether the included features justify the price for your project.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.siteground.com/" rel="noopener noreferrer"&gt;https://www.siteground.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  5. HostGator — General-Purpose Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Small websites and conventional hosting requirements.&lt;/p&gt;

&lt;p&gt;HostGator offers hosting services for websites, including shared hosting options. It is an option for users who want a standard hosting environment.&lt;/p&gt;

&lt;p&gt;Review the current storage, backup, resource, and renewal policies rather than relying on broad claims such as unlimited resources.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.hostgator.com/" rel="noopener noreferrer"&gt;https://www.hostgator.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. DreamHost — Websites and WordPress
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Personal websites, blogs, and WordPress projects.&lt;/p&gt;

&lt;p&gt;DreamHost provides shared, managed WordPress, VPS, and other hosting products. Different plans have different limits, so check how many websites you can host and which resources are included.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.dreamhost.com/" rel="noopener noreferrer"&gt;https://www.dreamhost.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. A2 Hosting / Hosting.com — Performance-Focused Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Users comparing performance-oriented hosting plans.&lt;/p&gt;

&lt;p&gt;A2 Hosting is a familiar name in the performance-hosting market, although its branding and service offering have evolved. Check the current provider identity and product terms before purchasing.&lt;/p&gt;

&lt;p&gt;Compare PHP performance, caching, CPU limits, memory, and server location rather than relying on a marketing label such as “Turbo.”&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://hosting.com/" rel="noopener noreferrer"&gt;https://hosting.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8. InMotion Hosting — Business and Reseller Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Businesses and users considering reseller hosting.&lt;/p&gt;

&lt;p&gt;InMotion Hosting offers several hosting categories, including business-oriented services and reseller products.&lt;/p&gt;

&lt;p&gt;If you plan to host multiple customer websites, compare account limits, resource allocation, billing tools, backups, and the amount of technical administration required.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.inmotionhosting.com/" rel="noopener noreferrer"&gt;https://www.inmotionhosting.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  9. GreenGeeks — Environmentally Focused Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Users who care about environmental initiatives.&lt;/p&gt;

&lt;p&gt;GreenGeeks markets hosting services with an emphasis on environmental sustainability. It also offers conventional website hosting features.&lt;/p&gt;

&lt;p&gt;Review the provider's current sustainability disclosures alongside its performance, pricing, backup policy, and support terms.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.greengeeks.com/" rel="noopener noreferrer"&gt;https://www.greengeeks.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  10. Kinsta — Premium Managed WordPress
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Businesses that want managed WordPress infrastructure.&lt;/p&gt;

&lt;p&gt;Kinsta focuses on managed WordPress hosting and provides tools designed to simplify deployment, maintenance, and website management.&lt;/p&gt;

&lt;p&gt;It is generally a different budget category from entry-level shared hosting. Compare visitor limits, resource policies, included environments, backups, and additional-site costs.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://kinsta.com/" rel="noopener noreferrer"&gt;https://kinsta.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  11. Cloudways — Managed Cloud Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Growing websites that need cloud infrastructure.&lt;/p&gt;

&lt;p&gt;Cloudways provides a managed interface for deploying applications on supported cloud infrastructure providers.&lt;/p&gt;

&lt;p&gt;It can reduce server-management complexity, but it does not eliminate the need to understand application performance, backups, security, and resource usage.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.cloudways.com/" rel="noopener noreferrer"&gt;https://www.cloudways.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  12. Namecheap — Domains and Budget Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Users purchasing domains and hosting together.&lt;/p&gt;

&lt;p&gt;Namecheap is known for domain registration and also offers hosting products.&lt;/p&gt;

&lt;p&gt;Compare the total cost of domain renewal and hosting renewal, not just the introductory price. Check email, backups, migration options, and resource limits as well.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.namecheap.com/" rel="noopener noreferrer"&gt;https://www.namecheap.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  13. IONOS — Small Business Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Small businesses evaluating website and cloud services.&lt;/p&gt;

&lt;p&gt;IONOS offers several hosting and website services, with product availability varying by market.&lt;/p&gt;

&lt;p&gt;Compare the exact plan configuration, contract period, support availability, and renewal pricing for your country.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.ionos.com/" rel="noopener noreferrer"&gt;https://www.ionos.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  14. GoDaddy — Domains and Website Services
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Users who want domain registration and hosting services from one provider.&lt;/p&gt;

&lt;p&gt;GoDaddy provides domain registration, website tools, hosting, and other online business services.&lt;/p&gt;

&lt;p&gt;Its broad product range can be convenient, but compare hosting performance, renewal costs, backups, and add-on fees with competing providers.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.godaddy.com/" rel="noopener noreferrer"&gt;https://www.godaddy.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  15. InterServer — Traditional Hosting
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Users comparing conventional hosting plans and pricing policies.&lt;/p&gt;

&lt;p&gt;InterServer offers hosting services across several categories. It may be worth comparing if you want a traditional hosting environment.&lt;/p&gt;

&lt;p&gt;Read the exact price-lock terms, resource limits, server locations, and support conditions applicable to your selected product.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.interserver.net/" rel="noopener noreferrer"&gt;https://www.interserver.net/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  16. Liquid Web — Managed VPS and Dedicated Infrastructure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Businesses with demanding infrastructure requirements.&lt;/p&gt;

&lt;p&gt;Liquid Web focuses on managed hosting and infrastructure services for businesses and more resource-intensive applications.&lt;/p&gt;

&lt;p&gt;It is worth evaluating when you need more control or managed server resources than an entry-level shared plan can provide.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.liquidweb.com/" rel="noopener noreferrer"&gt;https://www.liquidweb.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  17. DigitalOcean — Cloud Servers for Developers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers deploying custom applications.&lt;/p&gt;

&lt;p&gt;DigitalOcean offers cloud infrastructure and managed services. It is useful for developers who need control over virtual machines, networking, databases, and application deployment.&lt;/p&gt;

&lt;p&gt;However, a virtual machine is not the same as fully managed shared hosting. You may need to configure security updates, firewalls, web servers, monitoring, backups, and application dependencies yourself.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.digitalocean.com/" rel="noopener noreferrer"&gt;https://www.digitalocean.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  18. Vultr — Flexible Cloud Infrastructure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers and teams needing configurable cloud servers.&lt;/p&gt;

&lt;p&gt;Vultr offers cloud computing products with different server configurations and deployment options.&lt;/p&gt;

&lt;p&gt;Compare CPU type, RAM, storage, bandwidth, network performance, backups, and regional availability before selecting an instance.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://www.vultr.com/" rel="noopener noreferrer"&gt;https://www.vultr.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  19. AWS — Scalable Cloud Infrastructure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Applications that need a broad cloud services ecosystem.&lt;/p&gt;

&lt;p&gt;Amazon Web Services offers computing, storage, databases, networking, and many other cloud products.&lt;/p&gt;

&lt;p&gt;Its flexibility is powerful, but costs and configuration complexity can increase if you do not understand resource usage, security permissions, and billing.&lt;/p&gt;

&lt;p&gt;For a simple blog, AWS may be unnecessarily complicated. For a growing application, its range of services may be useful.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;https://aws.amazon.com/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  20. Google Cloud — Cloud Applications and Infrastructure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; Developers building scalable applications and data-driven services.&lt;/p&gt;

&lt;p&gt;Google Cloud offers virtual machines, managed databases, storage, networking, and application development services.&lt;/p&gt;

&lt;p&gt;Evaluate expected usage, networking charges, regional availability, security requirements, and operational complexity before moving a production application.&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://cloud.google.com/" rel="noopener noreferrer"&gt;https://cloud.google.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Hosting Comparison: Which Type Should You Choose?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Hosting type&lt;/th&gt;
&lt;th&gt;Best suited for&lt;/th&gt;
&lt;th&gt;Main consideration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shared hosting&lt;/td&gt;
&lt;td&gt;Blogs and small websites&lt;/td&gt;
&lt;td&gt;Shared server resources&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed WordPress&lt;/td&gt;
&lt;td&gt;WordPress sites&lt;/td&gt;
&lt;td&gt;Convenience versus cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reseller hosting&lt;/td&gt;
&lt;td&gt;Hosting businesses&lt;/td&gt;
&lt;td&gt;Account and resource limits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPS hosting&lt;/td&gt;
&lt;td&gt;Custom applications&lt;/td&gt;
&lt;td&gt;More administration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Managed cloud hosting&lt;/td&gt;
&lt;td&gt;Growing websites&lt;/td&gt;
&lt;td&gt;Recurring infrastructure costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud infrastructure&lt;/td&gt;
&lt;td&gt;Developers and larger applications&lt;/td&gt;
&lt;td&gt;Configuration and operational responsibility&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;There is no universal winner. A small portfolio website and a high-traffic application have very different hosting requirements.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. How to Choose the Right Hosting Provider
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Identify your website type
&lt;/h3&gt;

&lt;p&gt;Start by identifying the software you will run.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WordPress blog: Look for suitable PHP, database, caching, and backup support.&lt;/li&gt;
&lt;li&gt;Laravel application: Check PHP version, required extensions, Composer availability, SSH access, cron jobs, and document-root configuration.&lt;/li&gt;
&lt;li&gt;Online store: Prioritize security, backups, reliable database performance, and payment-system compatibility.&lt;/li&gt;
&lt;li&gt;Custom Node.js application: Confirm whether the plan supports Node.js processes, deployment, and persistent application execution.&lt;/li&gt;
&lt;li&gt;Multiple customer websites: Compare reseller hosting or VPS options.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: Estimate resource requirements
&lt;/h3&gt;

&lt;p&gt;Do not buy a large server simply because a provider advertises more CPU cores.&lt;/p&gt;

&lt;p&gt;Consider your expected traffic, concurrent requests, database workload, storage, background jobs, and memory consumption. Start with a suitable configuration and monitor actual usage.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Check the full cost
&lt;/h3&gt;

&lt;p&gt;Calculate the cost for at least the first year and, if possible, the second year.&lt;/p&gt;

&lt;p&gt;Include hosting renewal, domain renewal, backups, email, paid SSL options if applicable, migrations, and any required server-management services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Verify technical compatibility
&lt;/h3&gt;

&lt;p&gt;Before ordering, confirm:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supported PHP or Node.js versions.&lt;/li&gt;
&lt;li&gt;Required PHP extensions and database versions.&lt;/li&gt;
&lt;li&gt;SSH or terminal availability.&lt;/li&gt;
&lt;li&gt;Composer and deployment support.&lt;/li&gt;
&lt;li&gt;Cron-job limits and execution frequency.&lt;/li&gt;
&lt;li&gt;File, process, CPU, memory, and inode limits.&lt;/li&gt;
&lt;li&gt;SSL issuance and renewal.&lt;/li&gt;
&lt;li&gt;Backup retention and restoration procedure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These checks can prevent expensive migrations later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 5: Test support before committing
&lt;/h3&gt;

&lt;p&gt;Ask a specific pre-sales question about your intended application. Evaluate how clearly the provider explains compatibility, limitations, and what its support team will actually configure.&lt;/p&gt;

&lt;p&gt;A vague promise of “full support” is not a substitute for a written support scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Common Web Hosting Mistakes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choosing only by price:&lt;/strong&gt; A low initial payment can hide expensive renewals or missing features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring backups:&lt;/strong&gt; A backup is useful only if it can be restored successfully. Check retention and restoration procedures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Buying VPS hosting without the skills to manage it:&lt;/strong&gt; Root access gives you control, but it also makes you responsible for more security and maintenance tasks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ignoring server location:&lt;/strong&gt; Physical distance, routing, and network quality can affect latency for your visitors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Assuming unlimited means unlimited:&lt;/strong&gt; Most plans have acceptable-use policies and technical limits. Read the terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Skipping security updates:&lt;/strong&gt; Outdated application dependencies and plugins can compromise a properly configured server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migrating without testing:&lt;/strong&gt; Always maintain a backup and test DNS, email, databases, SSL, and application behavior before switching production traffic.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Which hosting is best for beginners in 2026?
&lt;/h3&gt;

&lt;p&gt;A beginner should generally look for easy setup, clear documentation, suitable support, automatic SSL, backups, and transparent renewal pricing. Shared hosting or managed WordPress hosting is often a reasonable starting point.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which hosting is suitable for WordPress?
&lt;/h3&gt;

&lt;p&gt;Managed WordPress hosting can simplify maintenance, while standard shared hosting can be more affordable. The right choice depends on traffic, technical requirements, budget, and the support included.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is VPS hosting better than shared hosting?
&lt;/h3&gt;

&lt;p&gt;Not automatically. VPS hosting can provide more control and dedicated resource allocations, depending on the plan. Shared hosting is often simpler and more economical for smaller websites.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I host a Laravel application on shared hosting?
&lt;/h3&gt;

&lt;p&gt;Sometimes. You need compatible PHP versions and extensions, Composer or another supported deployment method, database access, cron support where required, and a secure document root. Verify these requirements before buying.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is cheap hosting reliable?
&lt;/h3&gt;

&lt;p&gt;Price alone does not determine reliability. Review the actual resource limits, support terms, backups, uptime commitment, renewal costs, and independent performance evidence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Should I choose Indian hosting for Indian visitors?
&lt;/h3&gt;

&lt;p&gt;A suitable Indian server location may reduce network latency for Indian visitors, but routing, caching, application performance, and server quality also matter. Test from your target audience's region when possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  How often should I back up my website?
&lt;/h3&gt;

&lt;p&gt;It depends on how frequently your website changes and how much data you can afford to lose. A store receiving orders every few minutes needs a more rigorous backup and recovery strategy than a static portfolio site.&lt;/p&gt;

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

&lt;p&gt;Choosing web hosting is not about finding the company with the biggest name or the lowest advertised price. It is about finding the right balance of performance, security, support, cost, and technical compatibility for your project.&lt;/p&gt;

&lt;p&gt;For a simple blog, shared hosting may be enough. For WordPress, managed hosting may save time. For a custom application, a VPS or cloud platform may offer the flexibility you need.&lt;/p&gt;

&lt;p&gt;Compare the actual plans, check the terms, and make your decision based on your requirements rather than a ranking alone.&lt;/p&gt;

&lt;p&gt;If you are exploring affordable hosting for your next website, you can review Puffx Host's available plans here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore Puffx Host:&lt;/strong&gt; &lt;a href="https://puffxhost.com/packages" rel="noopener noreferrer"&gt;https://puffxhost.com/packages&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have you used any of these hosting providers? Share your experience, including performance, support quality, renewal pricing, and any limitations you encountered. Real-world experiences can help other developers make better decisions.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclaimer: Hosting features, prices, and service availability can change. Verify current terms directly with each provider. Puffx Host is the publisher's own service; readers should compare it independently with other options.&lt;/em&gt;&lt;br&gt;
`&lt;/p&gt;




&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;`&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;code&gt;plaintext&lt;br&gt;
&lt;/code&gt;`&lt;/p&gt;



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

`
`
`
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>webdev</category>
      <category>hosting</category>
      <category>beginners</category>
      <category>devops</category>
    </item>
    <item>
      <title>I Built a Multimodal RAG System with Gemini File Search — Here’s What I Learned</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Tue, 25 Aug 2026 11:03:10 +0000</pubDate>
      <link>https://dev.to/nitinmehta/i-built-a-multimodal-rag-system-with-gemini-file-search-heres-what-i-learned-3cm2</link>
      <guid>https://dev.to/nitinmehta/i-built-a-multimodal-rag-system-with-gemini-file-search-heres-what-i-learned-3cm2</guid>
      <description>&lt;h1&gt;
  
  
  I Built a Multimodal RAG System with Gemini File Search — Here’s What I Learned
&lt;/h1&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%2F91qckrjgtj4pw4aqqrb2.gif" 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%2F91qckrjgtj4pw4aqqrb2.gif" alt="Multimodal RAG with Gemini File Search" width="560" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;RAG has become one of the most practical ways to build AI applications that need to work with private or domain-specific information.&lt;/p&gt;

&lt;p&gt;Instead of expecting an LLM to already know everything, we can give it access to our own documents and retrieve the relevant information when a user asks a question.&lt;/p&gt;

&lt;p&gt;That sounds simple until the data stops being simple.&lt;/p&gt;

&lt;p&gt;Real-world knowledge bases rarely contain only plain text. They can contain PDFs, screenshots, product images, diagrams, tables, architecture documents, technical manuals, and other visual information.&lt;/p&gt;

&lt;p&gt;That was the problem I wanted to solve.&lt;/p&gt;

&lt;p&gt;I wanted a RAG system where text and images could live in the same searchable knowledge base instead of maintaining separate pipelines for documents and visual data.&lt;/p&gt;

&lt;p&gt;This is where Gemini API File Search becomes interesting.&lt;/p&gt;

&lt;p&gt;Google's Gemini API provides File Search as a managed Retrieval-Augmented Generation system. It handles the ingestion, chunking, embedding, indexing, and retrieval pipeline, while the model uses the retrieved information to generate a grounded response. The newer multimodal capabilities extend this workflow to images as well.&lt;/p&gt;

&lt;p&gt;In this article, I'll walk through how I think about the architecture, why multimodal embeddings matter, how the implementation works, and where this approach makes sense compared with building a traditional RAG stack yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Problem Does RAG Actually Solve?
&lt;/h2&gt;

&lt;p&gt;A normal LLM has a knowledge boundary.&lt;/p&gt;

&lt;p&gt;Even if the model is extremely capable, it doesn't automatically have access to your company's internal documentation, private PDFs, product catalog, support tickets, or architecture diagrams.&lt;/p&gt;

&lt;p&gt;You could fine-tune a model, but that is often the wrong solution.&lt;/p&gt;

&lt;p&gt;If the information changes frequently, you don't want to retrain a model every time a document changes.&lt;/p&gt;

&lt;p&gt;RAG solves this differently.&lt;/p&gt;

&lt;p&gt;Instead of modifying the model's knowledge, you retrieve relevant information from an external knowledge source and provide that information as context to the model.&lt;/p&gt;

&lt;p&gt;The basic workflow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Question
     ↓
Convert Question to Search Representation
     ↓
Search Knowledge Base
     ↓
Retrieve Relevant Chunks
     ↓
Send Retrieved Context to LLM
     ↓
Generate Grounded Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is powerful because the knowledge can be updated without retraining the model.&lt;/p&gt;

&lt;p&gt;But traditional RAG becomes more complicated when your knowledge isn't purely text.&lt;/p&gt;

&lt;p&gt;Consider a technical PDF containing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Written documentation&lt;/li&gt;
&lt;li&gt;Architecture diagrams&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Product images&lt;/li&gt;
&lt;li&gt;Flow charts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your retrieval system only understands extracted text, you may lose valuable information contained inside those visual elements.&lt;/p&gt;

&lt;p&gt;That's where multimodal retrieval changes the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Multimodal RAG Is Different
&lt;/h2&gt;

&lt;p&gt;Traditional text RAG generally converts text into embeddings.&lt;/p&gt;

&lt;p&gt;Those embeddings represent the semantic meaning of the text.&lt;/p&gt;

&lt;p&gt;A user query is also converted into an embedding, and the system searches for chunks that are semantically similar.&lt;/p&gt;

&lt;p&gt;Multimodal RAG extends this idea beyond text.&lt;/p&gt;

&lt;p&gt;With Gemini's &lt;code&gt;gemini-embedding-2&lt;/code&gt;, images can also be embedded and searched alongside textual content. This means an application can retrieve visual information rather than relying entirely on OCR or manually generated image descriptions.&lt;/p&gt;

&lt;p&gt;For example, imagine a product catalog containing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product description
+
Product specifications
+
Product image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A user could ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me the product that has a red design."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A multimodal retrieval system can search the visual representation of the product image along with the associated textual information.&lt;/p&gt;

&lt;p&gt;That opens up use cases that are difficult to implement cleanly with text-only RAG.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture I Would Use
&lt;/h2&gt;

&lt;p&gt;The architecture is surprisingly small when using managed File Search.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌──────────────────────┐
                 │   Documents / Images  │
                 └──────────┬───────────┘
                            ↓
                 ┌──────────────────────┐
                 │   File Search Store  │
                 │                      │
                 │ Chunking              │
                 │ Embeddings            │
                 │ Indexing              │
                 └──────────┬───────────┘
                            ↓
User Question ─────────────→ Semantic Search
                            ↓
                    Relevant Context
                            ↓
                     Gemini Model
                            ↓
                    Grounded Response
                            ↓
                         Citations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is that I don't have to manually operate a vector database, embedding service, document chunking pipeline, and retrieval layer.&lt;/p&gt;

&lt;p&gt;File Search manages those parts for me.&lt;/p&gt;

&lt;p&gt;Google describes a File Search Store as a persistent container for processed document data and embeddings. When files are imported, the content is chunked, converted into embeddings, and indexed for semantic retrieval.&lt;/p&gt;

&lt;p&gt;That removes a significant amount of infrastructure from the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a Multimodal File Search Store
&lt;/h2&gt;

&lt;p&gt;The first important decision is the embedding model.&lt;/p&gt;

&lt;p&gt;If you're building a text-only knowledge base, the text embedding model may be sufficient.&lt;/p&gt;

&lt;p&gt;But if you want native image retrieval, the File Search Store needs to be created using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;models/gemini-embedding-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;genai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_search_stores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;display_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;my-multimodal-knowledge-base&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;embedding_model&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;models/gemini-embedding-2&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This decision matters because the embedding model is associated with the store configuration.&lt;/p&gt;

&lt;p&gt;So don't blindly create a store with the default embedding model and later discover that your application needs multimodal retrieval.&lt;/p&gt;

&lt;p&gt;Google's current documentation specifically recommends &lt;code&gt;gemini-embedding-2&lt;/code&gt; for processing both text and images in a multimodal File Search Store.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uploading Documents
&lt;/h2&gt;

&lt;p&gt;Once the store exists, documents can be uploaded directly.&lt;/p&gt;

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

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

&lt;span class="n"&gt;operation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_search_stores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload_to_file_search_store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;file_search_store_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technical-documentation.pdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;display_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Technical Documentation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;operation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Document indexed&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Behind the scenes, the service processes the document and prepares it for retrieval.&lt;/p&gt;

&lt;p&gt;The important thing for developers is that we don't need to manually implement every stage of the ingestion pipeline.&lt;/p&gt;

&lt;p&gt;Instead of writing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PDF parser
      ↓
Text extraction
      ↓
Chunking service
      ↓
Embedding API
      ↓
Vector database
      ↓
Metadata layer
      ↓
Retriever
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we can work with the managed File Search abstraction.&lt;/p&gt;

&lt;p&gt;That can significantly reduce development and operational overhead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Images
&lt;/h2&gt;

&lt;p&gt;This becomes more interesting with multimodal stores.&lt;/p&gt;

&lt;p&gt;Images can also be uploaded:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;images&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product-red.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product-blue.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;architecture-diagram.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;image_file&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="n"&gt;operation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;file_search_stores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;upload_to_file_search_store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;file_search_store_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;image_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;display_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image_file&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;operation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;operations&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;operation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Google's current documentation states that PNG and JPEG images are supported for multimodal File Search, with an image resolution limit of 4K × 4K pixels. Audio and video are currently not supported by File Search.&lt;/p&gt;

&lt;p&gt;That last limitation is important.&lt;/p&gt;

&lt;p&gt;Multimodal does not mean "every media format."&lt;/p&gt;

&lt;p&gt;You should design your ingestion pipeline around the formats File Search actually supports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying the Knowledge Base
&lt;/h2&gt;

&lt;p&gt;After indexing the data, the actual application logic becomes simple.&lt;/p&gt;

&lt;p&gt;The model can use File Search as a tool:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_content&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gemini-3-flash-preview&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;contents&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Which product is available in red?&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file_search&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;file_search_store_names&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}]&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The query is converted into a representation that can be matched against the indexed content.&lt;/p&gt;

&lt;p&gt;The retrieval system then finds relevant chunks from the File Search Store.&lt;/p&gt;

&lt;p&gt;Those results are supplied as context for the model.&lt;/p&gt;

&lt;p&gt;The model generates an answer based on the retrieved information rather than relying exclusively on its general knowledge.&lt;/p&gt;

&lt;p&gt;That distinction is extremely important.&lt;/p&gt;

&lt;p&gt;RAG doesn't magically make an LLM truthful.&lt;/p&gt;

&lt;p&gt;It gives the model access to better evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Semantic Search Instead of Keyword Search
&lt;/h2&gt;

&lt;p&gt;One reason this architecture is useful is semantic search.&lt;/p&gt;

&lt;p&gt;Consider a document containing:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Our infrastructure automatically increases compute capacity when traffic exceeds predefined thresholds."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A user might ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How does the system handle traffic spikes?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A basic keyword search might struggle because "traffic spikes" doesn't exactly match the original wording.&lt;/p&gt;

&lt;p&gt;Semantic retrieval is designed to understand the relationship between the query and the underlying meaning.&lt;/p&gt;

&lt;p&gt;Gemini File Search uses embeddings to represent the semantic meaning of indexed content and retrieve relevant chunks based on the user's prompt.&lt;/p&gt;

&lt;p&gt;This is one of the fundamental reasons RAG systems are more useful than simple text search.&lt;/p&gt;

&lt;h2&gt;
  
  
  Metadata Makes Retrieval More Useful
&lt;/h2&gt;

&lt;p&gt;Another feature I would use in a real application is metadata.&lt;/p&gt;

&lt;p&gt;Suppose the same knowledge base contains documents from different categories:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;product
support
engineering
billing
legal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of searching everything every time, metadata can help narrow the retrieval scope.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;display_name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Spring Product Catalog&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;custom_metadata&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;category&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string_value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;product&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;season&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string_value&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;spring-2026&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then the query can use a metadata filter.&lt;/p&gt;

&lt;p&gt;This matters because retrieval quality isn't only about the embedding model.&lt;/p&gt;

&lt;p&gt;The quality of your data organization also matters.&lt;/p&gt;

&lt;p&gt;A huge unstructured knowledge base can produce weaker retrieval than a well-organized one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Citations Are More Important Than They Look
&lt;/h2&gt;

&lt;p&gt;One of the biggest problems with AI-generated answers is verification.&lt;/p&gt;

&lt;p&gt;If the model says:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"This product supports feature X."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I want to know where that information came from.&lt;/p&gt;

&lt;p&gt;File Search provides grounding information that can identify the source material used to generate the response. Depending on the response and API surface, this can include document/page information or other citation metadata.&lt;/p&gt;

&lt;p&gt;This changes the UX of a RAG application.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI says something.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can build:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI says something.

Source:
Technical Documentation
Page 14
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For enterprise applications, this can be far more valuable than simply generating a fluent response.&lt;/p&gt;

&lt;p&gt;A good RAG system should make it easier to verify the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  RAG Does Not Automatically Fix Hallucinations
&lt;/h2&gt;

&lt;p&gt;This is where many RAG tutorials oversell the technology.&lt;/p&gt;

&lt;p&gt;Adding a vector database does not guarantee correct answers.&lt;/p&gt;

&lt;p&gt;There are several failure points:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Bad document
    ↓
Bad chunking
    ↓
Bad embedding
    ↓
Bad retrieval
    ↓
Wrong context
    ↓
Wrong answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The LLM is only the final stage.&lt;/p&gt;

&lt;p&gt;If retrieval returns irrelevant information, the model can still generate a confident-looking answer.&lt;/p&gt;

&lt;p&gt;That's why I would test a RAG system with an evaluation dataset instead of judging it from five successful demos.&lt;/p&gt;

&lt;p&gt;Create questions where you already know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The correct answer&lt;/li&gt;
&lt;li&gt;The source document&lt;/li&gt;
&lt;li&gt;The expected section/page&lt;/li&gt;
&lt;li&gt;Whether the answer should exist at all&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then measure retrieval and answer quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Chunking Still Matters
&lt;/h2&gt;

&lt;p&gt;Managed retrieval doesn't mean chunking becomes irrelevant.&lt;/p&gt;

&lt;p&gt;A document can be split into chunks before embedding.&lt;/p&gt;

&lt;p&gt;If chunks are too large, retrieval can become less precise.&lt;/p&gt;

&lt;p&gt;If chunks are too small, important context can be separated.&lt;/p&gt;

&lt;p&gt;Google's File Search API also supports custom chunking configuration. For example, the documentation demonstrates configuring a whitespace-based strategy with a maximum number of tokens per chunk and overlap between chunks.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;chunking_config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;white_space_config&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_tokens_per_chunk&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;max_overlap_tokens&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I wouldn't copy these numbers blindly into production.&lt;/p&gt;

&lt;p&gt;Chunking should be tested against your actual documents.&lt;/p&gt;

&lt;p&gt;Technical manuals, legal documents, product catalogs, and source-code documentation don't necessarily benefit from the same chunking strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where Multimodal RAG Becomes Really Useful
&lt;/h2&gt;

&lt;p&gt;This architecture is particularly interesting for applications where visual information carries meaning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical Documentation
&lt;/h3&gt;

&lt;p&gt;Imagine a developer asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Find the architecture diagram that shows the authentication flow."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A text-only system may retrieve a paragraph describing authentication.&lt;/p&gt;

&lt;p&gt;A multimodal system can also work with the actual diagram.&lt;/p&gt;

&lt;h3&gt;
  
  
  Product Catalogs
&lt;/h3&gt;

&lt;p&gt;A product database can combine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Product name
Description
Specifications
Price information
Product images
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users can search using both natural language and visual characteristics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real Estate
&lt;/h3&gt;

&lt;p&gt;A property knowledge base can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Property descriptions&lt;/li&gt;
&lt;li&gt;Floor plans&lt;/li&gt;
&lt;li&gt;Interior images&lt;/li&gt;
&lt;li&gt;Specifications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The retrieval layer can work with more than just text.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design Systems
&lt;/h3&gt;

&lt;p&gt;Imagine indexing UI screenshots, component documentation, and design specifications.&lt;/p&gt;

&lt;p&gt;A developer could search for a component based on its visual appearance or associated documentation.&lt;/p&gt;

&lt;p&gt;These are the situations where multimodal retrieval becomes more than a marketing feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  What About Cost?
&lt;/h2&gt;

&lt;p&gt;Cost is another reason managed File Search is interesting.&lt;/p&gt;

&lt;p&gt;According to Google's current documentation, storage and query-time embedding generation are free. You pay for embedding creation when files are initially indexed, along with normal Gemini model input/output token usage. Retrieved document tokens are charged as regular context tokens.&lt;/p&gt;

&lt;p&gt;That doesn't mean the system is free.&lt;/p&gt;

&lt;p&gt;Large knowledge bases still create indexing and model-token costs.&lt;/p&gt;

&lt;p&gt;You should monitor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Number of indexed files
+
Indexing frequency
+
Retrieved context size
+
Model requests
+
Response tokens
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A poorly designed application can retrieve too much context and increase token usage unnecessarily.&lt;/p&gt;

&lt;p&gt;The goal isn't to retrieve everything.&lt;/p&gt;

&lt;p&gt;The goal is to retrieve the smallest useful amount of evidence needed to answer the question.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important Limits
&lt;/h2&gt;

&lt;p&gt;Production systems also need to respect service limits.&lt;/p&gt;

&lt;p&gt;Google's current File Search documentation lists a maximum individual document size of 100 MB. Project-level File Search storage limits vary by usage tier, and Google recommends keeping individual stores under 20 GB for better retrieval latency.&lt;/p&gt;

&lt;p&gt;There are also feature limitations.&lt;/p&gt;

&lt;p&gt;For example, File Search isn't currently supported in the Live API, and built-in grounding tools have compatibility restrictions when combined in the same request.&lt;/p&gt;

&lt;p&gt;These details are easy to ignore in a demo and painful to discover in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  When I Would Use File Search Instead of Building My Own RAG Stack
&lt;/h2&gt;

&lt;p&gt;I wouldn't say managed File Search replaces every vector database.&lt;/p&gt;

&lt;p&gt;It doesn't.&lt;/p&gt;

&lt;p&gt;If I need highly customized retrieval logic, specialized ranking, complex hybrid search, or complete infrastructure control, I may still build a custom RAG architecture.&lt;/p&gt;

&lt;p&gt;But if my goal is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Upload documents
        ↓
Index them
        ↓
Search them semantically
        ↓
Ask Gemini questions
        ↓
Return grounded answers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then a managed solution can remove a lot of unnecessary infrastructure.&lt;/p&gt;

&lt;p&gt;I don't have to maintain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My own vector database&lt;/li&gt;
&lt;li&gt;Embedding workers&lt;/li&gt;
&lt;li&gt;Chunking pipelines&lt;/li&gt;
&lt;li&gt;Retrieval services&lt;/li&gt;
&lt;li&gt;Index synchronization&lt;/li&gt;
&lt;li&gt;Separate image retrieval infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That can mean fewer moving parts and less code to maintain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture I Would Build for a Real Application
&lt;/h2&gt;

&lt;p&gt;For a production application, I'd put an application layer in front of File Search.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                User
                 │
                 ▼
          Web / Mobile App
                 │
                 ▼
             API Server
                 │
        ┌────────┴─────────┐
        │                  │
        ▼                  ▼
 Authentication       Query Validation
                           │
                           ▼
                    Gemini File Search
                           │
                           ▼
                    Retrieved Context
                           │
                           ▼
                     Gemini Model
                           │
                           ▼
                Answer + Citations
                           │
                           ▼
                       User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API server should control access.&lt;/p&gt;

&lt;p&gt;Users shouldn't automatically get access to every document in every store.&lt;/p&gt;

&lt;p&gt;I'd separate stores or use metadata according to the application's authorization model.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Company A
 ├── Engineering
 ├── Support
 └── Product

Company B
 ├── Engineering
 ├── Support
 └── Product
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes especially important when the RAG system contains private business information.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Biggest Takeaway
&lt;/h2&gt;

&lt;p&gt;The most interesting part of modern RAG isn't simply that an LLM can "chat with PDFs."&lt;/p&gt;

&lt;p&gt;That's old news.&lt;/p&gt;

&lt;p&gt;The bigger shift is that retrieval is becoming multimodal and increasingly managed.&lt;/p&gt;

&lt;p&gt;Documents aren't just text.&lt;/p&gt;

&lt;p&gt;Knowledge can exist inside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diagrams&lt;/li&gt;
&lt;li&gt;Screenshots&lt;/li&gt;
&lt;li&gt;Images&lt;/li&gt;
&lt;li&gt;Tables&lt;/li&gt;
&lt;li&gt;Product photos&lt;/li&gt;
&lt;li&gt;Technical documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A retrieval system that ignores those formats is potentially throwing away useful information.&lt;/p&gt;

&lt;p&gt;Gemini File Search's multimodal support makes it possible to build a single retrieval workflow around both text and images, while managed indexing, semantic search, metadata, and citations reduce the amount of infrastructure developers need to operate themselves.&lt;/p&gt;

&lt;p&gt;But I wouldn't treat it as a magic "add RAG and everything works" button.&lt;/p&gt;

&lt;p&gt;The real engineering work is still in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data quality
     ↓
Document organization
     ↓
Chunking
     ↓
Metadata
     ↓
Retrieval evaluation
     ↓
Prompt design
     ↓
Access control
     ↓
Answer verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The technology can handle much of the infrastructure.&lt;/p&gt;

&lt;p&gt;It cannot decide what good data looks like for your application.&lt;/p&gt;

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

&lt;p&gt;If you're building a knowledge-based AI application today, I think the right question isn't:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Which vector database should I use?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The better first question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How much retrieval infrastructure do I actually need to own?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For many applications, a managed File Search system can get you from a folder full of documents to a grounded AI assistant much faster.&lt;/p&gt;

&lt;p&gt;And when the data includes images and diagrams, multimodal retrieval makes the architecture considerably more useful.&lt;/p&gt;

&lt;p&gt;The best RAG system isn't the one with the most components.&lt;/p&gt;

&lt;p&gt;It's the one that retrieves the right evidence, gives the model enough context to reason over it, and makes the final answer easy to verify.&lt;/p&gt;

&lt;p&gt;That's the part that actually matters in production.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>gemini</category>
      <category>python</category>
    </item>
    <item>
      <title>How I Automated cPanel Hosting Management Using APIs</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Tue, 25 Aug 2026 10:58:23 +0000</pubDate>
      <link>https://dev.to/nitinmehta/how-i-automated-cpanel-hosting-management-using-apis-1pnj</link>
      <guid>https://dev.to/nitinmehta/how-i-automated-cpanel-hosting-management-using-apis-1pnj</guid>
      <description>&lt;h1&gt;
  
  
  How I Automated cPanel Hosting Management Using APIs
&lt;/h1&gt;

&lt;p&gt;Managing hosting accounts manually works when you have a few customers.&lt;/p&gt;

&lt;p&gt;Once you start managing dozens or hundreds of hosting accounts, it becomes a completely different problem.&lt;/p&gt;

&lt;p&gt;Creating accounts, assigning packages, suspending users, changing plans, checking disk usage, managing domains, creating databases, handling backups, and performing repetitive server operations manually takes a lot of time.&lt;/p&gt;

&lt;p&gt;It also creates another problem: &lt;strong&gt;human error&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I wanted to solve this by putting an automation layer between my hosting management system and cPanel.&lt;/p&gt;

&lt;p&gt;Instead of logging into cPanel every time I needed to perform an operation, I started using the &lt;strong&gt;cPanel APIs&lt;/strong&gt; to communicate with the server programmatically.&lt;/p&gt;

&lt;p&gt;The result was a much more scalable workflow where my application could perform hosting operations automatically. This kind of automation is especially useful when running a hosting business, such as a &lt;a href="https://puffxhost.com/" rel="noopener noreferrer"&gt;web hosting platform in India&lt;/a&gt;, where provisioning and account lifecycle operations can quickly become repetitive.&lt;/p&gt;

&lt;p&gt;In this article, I’ll explain the architecture, API authentication, PHP integration, account management, error handling, security considerations, and some of the lessons I learned while building this type of system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Automate cPanel?
&lt;/h2&gt;

&lt;p&gt;The first question is simple:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why not just use cPanel manually?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a small number of accounts, manual management is perfectly fine.&lt;/p&gt;

&lt;p&gt;But imagine having to perform these operations repeatedly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a hosting account&lt;/li&gt;
&lt;li&gt;Assign a hosting package&lt;/li&gt;
&lt;li&gt;Create an email account&lt;/li&gt;
&lt;li&gt;Add a domain&lt;/li&gt;
&lt;li&gt;Create a database&lt;/li&gt;
&lt;li&gt;Suspend an account&lt;/li&gt;
&lt;li&gt;Unsuspend an account&lt;/li&gt;
&lt;li&gt;Change an account's package&lt;/li&gt;
&lt;li&gt;Check disk usage&lt;/li&gt;
&lt;li&gt;Check bandwidth usage&lt;/li&gt;
&lt;li&gt;Generate backups&lt;/li&gt;
&lt;li&gt;Delete an account&lt;/li&gt;
&lt;li&gt;Update DNS records&lt;/li&gt;
&lt;li&gt;Retrieve account information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Doing this manually is slow.&lt;/p&gt;

&lt;p&gt;More importantly, manual processes don't scale.&lt;/p&gt;

&lt;p&gt;If a customer purchases a hosting package from a billing system, there is no reason for an administrator to manually create the account on cPanel.&lt;/p&gt;

&lt;p&gt;The application should be able to do it automatically.&lt;/p&gt;

&lt;p&gt;That's where APIs become useful.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Basic Architecture
&lt;/h2&gt;

&lt;p&gt;The architecture I use is based on a simple concept:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer
   |
   v
Billing / Client Panel
   |
   v
Automation Layer
   |
   v
cPanel API
   |
   v
Hosting Server

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The customer interacts with the client panel.&lt;/p&gt;

&lt;p&gt;The client panel handles the business logic.&lt;/p&gt;

&lt;p&gt;The automation layer communicates with cPanel.&lt;/p&gt;

&lt;p&gt;cPanel performs the actual server operation.&lt;/p&gt;

&lt;p&gt;This separation is important because I don't want my frontend directly communicating with the hosting server.&lt;/p&gt;

&lt;p&gt;Instead, all API communication goes through a controlled backend service.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding cPanel APIs
&lt;/h2&gt;

&lt;p&gt;cPanel provides APIs that allow applications to perform many operations programmatically.&lt;/p&gt;

&lt;p&gt;There are two important API levels:&lt;/p&gt;

&lt;h3&gt;
  
  
  UAPI
&lt;/h3&gt;

&lt;p&gt;UAPI is primarily used for account-level operations.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Email management&lt;/li&gt;
&lt;li&gt;Database management&lt;/li&gt;
&lt;li&gt;Domain management&lt;/li&gt;
&lt;li&gt;File-related operations&lt;/li&gt;
&lt;li&gt;Account information&lt;/li&gt;
&lt;li&gt;SSL-related operations&lt;/li&gt;
&lt;li&gt;Other cPanel account functions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  WHM API
&lt;/h3&gt;

&lt;p&gt;WHM API is used for server and account administration.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Creating hosting accounts&lt;/li&gt;
&lt;li&gt;Suspending accounts&lt;/li&gt;
&lt;li&gt;Unsuspending accounts&lt;/li&gt;
&lt;li&gt;Terminating accounts&lt;/li&gt;
&lt;li&gt;Managing packages&lt;/li&gt;
&lt;li&gt;Managing reseller accounts&lt;/li&gt;
&lt;li&gt;Server-level operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important thing to understand is that &lt;strong&gt;UAPI and WHM API solve different problems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If I need to create a new hosting account, I generally need WHM-level permissions.&lt;/p&gt;

&lt;p&gt;If I need to perform an operation inside an existing cPanel account, UAPI is often the appropriate choice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Getting API Access
&lt;/h2&gt;

&lt;p&gt;Before writing any automation code, I need an API token.&lt;/p&gt;

&lt;p&gt;On a cPanel/WHM server, API access can be configured through the appropriate management interface.&lt;/p&gt;

&lt;p&gt;The general process is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to WHM or cPanel.&lt;/li&gt;
&lt;li&gt;Open the API token management section.&lt;/li&gt;
&lt;li&gt;Create a dedicated API token.&lt;/li&gt;
&lt;li&gt;Give the token only the permissions it actually needs.&lt;/li&gt;
&lt;li&gt;Store the token securely.&lt;/li&gt;
&lt;li&gt;Use the token from the backend application.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The API token should be treated like a password.&lt;/p&gt;

&lt;p&gt;Never put it directly inside frontend JavaScript.&lt;/p&gt;

&lt;p&gt;Never expose it in HTML.&lt;/p&gt;

&lt;p&gt;Never commit it to GitHub.&lt;/p&gt;

&lt;p&gt;For example, this is a bad idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$apiToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"my-secret-api-token"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A better approach is to store sensitive credentials in environment variables or a secure configuration system.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$apiToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;getenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'CPANEL_API_TOKEN'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the secret outside the application source code.&lt;/p&gt;




&lt;h1&gt;
  
  
  Connecting PHP to cPanel
&lt;/h1&gt;

&lt;p&gt;Since much of my hosting automation work is backend-based, PHP is a natural choice for communicating with cPanel APIs.&lt;/p&gt;

&lt;p&gt;PHP's cURL support makes HTTP API communication relatively straightforward.&lt;/p&gt;

&lt;p&gt;A basic API client can look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;cpanelRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_init&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="nb"&gt;curl_setopt_array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="no"&gt;CURLOPT_URL&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="no"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="no"&gt;CURLOPT_CUSTOMREQUEST&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="no"&gt;CURLOPT_HTTPHEADER&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s2"&gt;"Authorization: cpanel &lt;/span&gt;&lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="no"&gt;CURLOPT_TIMEOUT&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="no"&gt;CURLOPT_CONNECTTIMEOUT&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;]);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="k"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;curl_setopt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLOPT_POSTFIELDS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;http_build_query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;curl_error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nv"&gt;$httpCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;curl_getinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;CURLINFO_HTTP_CODE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nb"&gt;curl_close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ch&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'status'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$httpCode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'body'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;json_decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't the entire automation system.&lt;/p&gt;

&lt;p&gt;It's simply the communication layer.&lt;/p&gt;

&lt;p&gt;The important idea is to create one reusable API client instead of writing separate cURL code everywhere.&lt;/p&gt;




&lt;h1&gt;
  
  
  Don't Repeat API Code Everywhere
&lt;/h1&gt;

&lt;p&gt;One mistake I see in automation projects is writing API calls directly inside every business function.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;contains cURL code.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;suspendAccount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;contains another cURL implementation.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;deleteAccount&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;contains another implementation.&lt;/p&gt;

&lt;p&gt;This becomes difficult to maintain.&lt;/p&gt;

&lt;p&gt;Instead, I prefer creating an API client.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CpanelClient&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$baseUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;__construct&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rtrim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$token&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="nv"&gt;$method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'GET'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="nv"&gt;$data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// API communication here&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the rest of the application doesn't need to know how authentication, HTTP requests, or JSON parsing work.&lt;/p&gt;

&lt;p&gt;It simply calls methods on the client.&lt;/p&gt;




&lt;h1&gt;
  
  
  Automating Hosting Account Creation
&lt;/h1&gt;

&lt;p&gt;One of the most useful automations is account provisioning.&lt;/p&gt;

&lt;p&gt;Imagine a customer purchases a hosting plan.&lt;/p&gt;

&lt;p&gt;The workflow can become:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment Successful
       |
       v
Create Hosting Account
       |
       v
Assign Package
       |
       v
Configure Domain
       |
       v
Create Database
       |
       v
Send Login Details

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without automation, an administrator might have to perform each step manually.&lt;/p&gt;

&lt;p&gt;With an API-driven system, the backend can trigger the process automatically.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'username'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'customer123'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'domain'&lt;/span&gt;   &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'example.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$generatedPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'package'&lt;/span&gt;  &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Business'&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$cpanel&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$account&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The actual API endpoint and parameters depend on the cPanel/WHM API version and your server configuration.&lt;/p&gt;

&lt;p&gt;That's important because blindly copying an API example from an old blog post can cause problems.&lt;/p&gt;

&lt;p&gt;Always verify the endpoint and parameters against the API documentation for the version you're running.&lt;/p&gt;




&lt;h1&gt;
  
  
  Automating Suspension and Unsuspension
&lt;/h1&gt;

&lt;p&gt;Another useful automation is account lifecycle management.&lt;/p&gt;

&lt;p&gt;For example, if a hosting invoice becomes overdue, your billing system can trigger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invoice Overdue
      |
      v
Check Grace Period
      |
      v
Suspend Account

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When payment is received:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Payment Received
      |
      v
Verify Payment
      |
      v
Unsuspend Account

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This eliminates a lot of manual work.&lt;/p&gt;

&lt;p&gt;However, I would not immediately suspend an account just because an API call says an invoice is overdue.&lt;/p&gt;

&lt;p&gt;The billing system should have its own rules.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invoice overdue
       ↓
Grace period
       ↓
Payment reminder
       ↓
Final warning
       ↓
Suspension

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The API should perform the server operation.&lt;/p&gt;

&lt;p&gt;It should not decide your entire business policy.&lt;/p&gt;




&lt;h1&gt;
  
  
  Automating Package Changes
&lt;/h1&gt;

&lt;p&gt;Suppose a customer upgrades from a basic hosting package to a business package.&lt;/p&gt;

&lt;p&gt;Instead of asking an administrator to log into WHM, find the account, select the new package, and save the changes, the application can call the relevant API.&lt;/p&gt;

&lt;p&gt;The workflow becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer Upgrade
       |
       v
Payment Confirmed
       |
       v
Update Hosting Package
       |
       v
Record API Result
       |
       v
Notify Customer

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes particularly powerful when connected to a billing platform. The same model can be useful for &lt;a href="https://puffxhost.com/services/reseller-hosting/" rel="noopener noreferrer"&gt;reseller hosting&lt;/a&gt;, where many customer cPanel accounts need to be provisioned and managed from a central system.&lt;/p&gt;

&lt;p&gt;The billing system handles the payment.&lt;/p&gt;

&lt;p&gt;The automation system handles the infrastructure.&lt;/p&gt;

&lt;p&gt;Each component has a clear responsibility.&lt;/p&gt;




&lt;h1&gt;
  
  
  Logging Is Extremely Important
&lt;/h1&gt;

&lt;p&gt;One of the biggest lessons I learned from automation is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An API call failing silently is worse than an API call failing loudly.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a customer pays for hosting.&lt;/p&gt;

&lt;p&gt;Your application tries to create the account.&lt;/p&gt;

&lt;p&gt;The API fails.&lt;/p&gt;

&lt;p&gt;But your application doesn't store the error.&lt;/p&gt;

&lt;p&gt;Now the billing system says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Order: Active

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;while the server says:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Account: Does not exist

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's a serious operational problem.&lt;/p&gt;

&lt;p&gt;Every important API operation should therefore be logged.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2026-08-25 10:32:10
Action: create_account
Domain: example.com
Username: customer123
Status: failed
HTTP Code: 403

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should also store useful information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request ID&lt;/li&gt;
&lt;li&gt;Action&lt;/li&gt;
&lt;li&gt;Server&lt;/li&gt;
&lt;li&gt;Account ID&lt;/li&gt;
&lt;li&gt;API response status&lt;/li&gt;
&lt;li&gt;Error message&lt;/li&gt;
&lt;li&gt;Timestamp&lt;/li&gt;
&lt;li&gt;Retry count&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But don't log sensitive information such as API tokens or customer passwords.&lt;/p&gt;




&lt;h1&gt;
  
  
  Handling API Errors
&lt;/h1&gt;

&lt;p&gt;Not every failed API request means the same thing.&lt;/p&gt;

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

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

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;could indicate an authentication or permission problem.&lt;/p&gt;

&lt;p&gt;A timeout could mean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Network problem

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A validation error could mean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid domain
Invalid username
Invalid package

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A server error could mean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Temporary infrastructure problem

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Therefore, I prefer to classify errors.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Authentication or permission issue&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Server-side failure&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'status'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;400&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Client/request error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application can then decide whether to retry the request or mark the operation as failed.&lt;/p&gt;




&lt;h1&gt;
  
  
  Retry Logic
&lt;/h1&gt;

&lt;p&gt;Retries are useful, but blindly retrying every failed request is a bad idea.&lt;/p&gt;

&lt;p&gt;For example, if an account creation request times out, you don't necessarily know whether the server created the account or not.&lt;/p&gt;

&lt;p&gt;If you immediately retry, you could potentially create a duplicate operation or get a confusing error.&lt;/p&gt;

&lt;p&gt;A safer strategy is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Request
    |
    v
Timeout
    |
    v
Check Account Status
    |
    +---- Account Exists ---&amp;gt; Mark Success
    |
    +---- Account Missing --&amp;gt; Retry

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one of the reasons idempotency and state verification are important in automation.&lt;/p&gt;




&lt;h1&gt;
  
  
  Security Considerations
&lt;/h1&gt;

&lt;p&gt;Automation gives you power.&lt;/p&gt;

&lt;p&gt;That also means a compromised automation system can cause serious damage.&lt;/p&gt;

&lt;p&gt;I follow several basic security principles.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Protect API tokens
&lt;/h3&gt;

&lt;p&gt;Never expose tokens to the frontend.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Use HTTPS
&lt;/h3&gt;

&lt;p&gt;API communication should always use encrypted connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use least privilege
&lt;/h3&gt;

&lt;p&gt;Don't give an application more permissions than necessary.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Validate input
&lt;/h3&gt;

&lt;p&gt;Never send raw customer input directly into server operations.&lt;/p&gt;

&lt;p&gt;Validate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domain names&lt;/li&gt;
&lt;li&gt;Usernames&lt;/li&gt;
&lt;li&gt;Package names&lt;/li&gt;
&lt;li&gt;Account IDs&lt;/li&gt;
&lt;li&gt;Database names&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Restrict internal endpoints
&lt;/h3&gt;

&lt;p&gt;If your application has an endpoint like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/create-account

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;don't leave it publicly accessible without authentication and authorization.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Log operations
&lt;/h3&gt;

&lt;p&gt;You need to know who triggered an infrastructure change.&lt;/p&gt;




&lt;h1&gt;
  
  
  Multi-Server Automation
&lt;/h1&gt;

&lt;p&gt;Once you start managing multiple servers, the architecture becomes even more interesting.&lt;/p&gt;

&lt;p&gt;Instead of hardcoding one server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"server1.example.com"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can maintain a server inventory.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server 1
- Location: India
- Provider: XYZ
- Status: Active

Server 2
- Location: Singapore
- Provider: XYZ
- Status: Active

Server 3
- Location: Germany
- Provider: ABC
- Status: Active

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your automation layer can then decide which server should receive a new hosting account.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New Order
   |
   v
Find Available Server
   |
   v
Check Resources
   |
   v
Provision Account

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much closer to a real hosting platform architecture than simply calling cPanel APIs. For example, a provider offering &lt;a href="https://puffxhost.com/services/vps-hosting/" rel="noopener noreferrer"&gt;VPS hosting&lt;/a&gt; can use the same infrastructure-management principles while keeping server-level automation separate from customer-facing billing logic.&lt;/p&gt;




&lt;h1&gt;
  
  
  Adding Resource Monitoring
&lt;/h1&gt;

&lt;p&gt;Another useful feature is resource monitoring.&lt;/p&gt;

&lt;p&gt;You can periodically retrieve information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Disk usage&lt;/li&gt;
&lt;li&gt;Bandwidth usage&lt;/li&gt;
&lt;li&gt;Account count&lt;/li&gt;
&lt;li&gt;Server load&lt;/li&gt;
&lt;li&gt;Available resources&lt;/li&gt;
&lt;li&gt;Service status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then display the information in your own admin panel.&lt;/p&gt;

&lt;p&gt;Instead of logging into multiple servers, an administrator can see everything in one place.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server Dashboard

Server 1
CPU:       42%
RAM:       61%
Disk:      48%
Accounts:  312

Server 2
CPU:       27%
RAM:       52%
Disk:      39%
Accounts:  198

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where API automation starts becoming genuinely useful. Instead of checking every server manually, the same approach can support different hosting environments, including &lt;a href="https://puffxhost.com/services/indian-cloud-hosting/" rel="noopener noreferrer"&gt;managed cloud hosting&lt;/a&gt;, from one administration layer.&lt;/p&gt;

&lt;p&gt;You're no longer just automating one button.&lt;/p&gt;

&lt;p&gt;You're building an infrastructure management layer.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building a Central Automation Layer
&lt;/h1&gt;

&lt;p&gt;Eventually, I found that the best approach is to keep cPanel-specific logic in one place.&lt;/p&gt;

&lt;p&gt;The rest of the application should communicate with something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HostingService
      |
      +-- createAccount()
      +-- suspendAccount()
      +-- unsuspendAccount()
      +-- changePackage()
      +-- terminateAccount()
      +-- getUsage()
      +-- createDatabase()

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally, &lt;code&gt;HostingService&lt;/code&gt; communicates with cPanel.&lt;/p&gt;

&lt;p&gt;This architecture makes it easier to change the underlying infrastructure later.&lt;/p&gt;

&lt;p&gt;For example, today you might use cPanel.&lt;/p&gt;

&lt;p&gt;Tomorrow you might add another control panel or a custom server management system.&lt;/p&gt;

&lt;p&gt;The billing application shouldn't need to change completely.&lt;/p&gt;




&lt;h1&gt;
  
  
  What I Would Improve in a Production System
&lt;/h1&gt;

&lt;p&gt;If I were building the system again from scratch, I would focus heavily on reliability.&lt;/p&gt;

&lt;p&gt;The API client should have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connection timeout&lt;/li&gt;
&lt;li&gt;Request timeout&lt;/li&gt;
&lt;li&gt;Structured errors&lt;/li&gt;
&lt;li&gt;Logging&lt;/li&gt;
&lt;li&gt;Retry handling&lt;/li&gt;
&lt;li&gt;Request IDs&lt;/li&gt;
&lt;li&gt;Authentication management&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;Permission checks&lt;/li&gt;
&lt;li&gt;Server health checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would also add a job queue.&lt;/p&gt;

&lt;p&gt;Instead of doing everything during a customer's HTTP request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer clicks Upgrade
        |
        v
Wait for API
        |
        v
Wait for server
        |
        v
Wait for backup
        |
        v
Return response

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I would use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Customer clicks Upgrade
        |
        v
Create Job
        |
        v
Queue
        |
        v
Worker
        |
        v
cPanel API

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much more reliable for long-running operations.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Biggest Lesson
&lt;/h1&gt;

&lt;p&gt;The biggest lesson from automating hosting management is that &lt;strong&gt;APIs aren't the difficult part&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Calling an API is relatively easy.&lt;/p&gt;

&lt;p&gt;The difficult part is designing what happens when something goes wrong.&lt;/p&gt;

&lt;p&gt;What happens if the API times out?&lt;/p&gt;

&lt;p&gt;What happens if the account was created but your application didn't receive the response?&lt;/p&gt;

&lt;p&gt;What happens if payment succeeds but provisioning fails?&lt;/p&gt;

&lt;p&gt;What happens if the customer upgrades twice?&lt;/p&gt;

&lt;p&gt;What happens if the server becomes unavailable?&lt;/p&gt;

&lt;p&gt;What happens if an administrator manually changes something in cPanel?&lt;/p&gt;

&lt;p&gt;These are the problems that matter in production.&lt;/p&gt;

&lt;p&gt;A good automation system isn't just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Request → Success

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Request
   ↓
Validate
   ↓
Authenticate
   ↓
Execute
   ↓
Verify
   ↓
Log
   ↓
Retry / Recover if required
   ↓
Update Application State

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the difference between a script and a production system.&lt;/p&gt;




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

&lt;p&gt;Automating cPanel with APIs completely changes how hosting infrastructure can be managed.&lt;/p&gt;

&lt;p&gt;Instead of manually performing repetitive operations, your application can handle provisioning, suspension, upgrades, monitoring, backups, and other workflows programmatically.&lt;/p&gt;

&lt;p&gt;The basic technology isn't complicated.&lt;/p&gt;

&lt;p&gt;PHP can communicate with cPanel APIs using HTTP requests and API tokens.&lt;/p&gt;

&lt;p&gt;The real engineering challenge is building a reliable layer around those APIs.&lt;/p&gt;

&lt;p&gt;If you're building a hosting platform, reseller hosting system, billing panel, or internal server management tool, I strongly recommend starting with a clean API abstraction instead of scattering cPanel API calls throughout your application. This is also useful for specialized products such as &lt;a href="https://puffxhost.com/services/wordpress-hosting/" rel="noopener noreferrer"&gt;WordPress hosting&lt;/a&gt;, where provisioning, backups, SSL, and account management can be connected to the same automation layer.&lt;/p&gt;

&lt;p&gt;Start small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API Client
    ↓
Create Account
    ↓
Suspend Account
    ↓
Unsuspend Account
    ↓
Change Package

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Logging
Monitoring
Retries
Queues
Multi-server support

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once those pieces are in place, you can build much more advanced automation on top of the same foundation.&lt;/p&gt;

&lt;p&gt;And that's the real advantage of API-driven infrastructure:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You stop managing servers manually and start managing infrastructure through software.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What are you automating with cPanel APIs?
&lt;/h2&gt;

&lt;p&gt;If you're building something similar, I'd be interested to know what you're automating—hosting provisioning, WHMCS integration, backups, server monitoring, or something else.&lt;/p&gt;

&lt;p&gt;Share your approach in the comments.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>api</category>
      <category>php</category>
      <category>automation</category>
    </item>
    <item>
      <title>Why Puffx Host Deserves a Look in 2026</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Tue, 04 Aug 2026 04:50:55 +0000</pubDate>
      <link>https://dev.to/nitinmehta/why-puffx-host-deserves-a-look-in-2026-54eh</link>
      <guid>https://dev.to/nitinmehta/why-puffx-host-deserves-a-look-in-2026-54eh</guid>
      <description>&lt;p&gt;When it comes to web hosting, most "best of" lists are dominated by the same big names — Hostinger, SiteGround, Bluehost, DigitalOcean. And for good reason, they're proven. But there's a growing list of smaller, India-focused hosting providers worth keeping an eye on, and one that's been popping up lately is &lt;strong&gt;&lt;a href="https://puffxhost.com" rel="noopener noreferrer"&gt;Puffx Host&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here's an honest look at what they offer, based on what's publicly available — not a paid promotion.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Puffx Host Offers
&lt;/h2&gt;

&lt;p&gt;Puffx Host is an India-based hosting provider offering SSD web hosting, cloud hosting, VPS hosting, and dedicated servers, positioned around 99.9% uptime. Their plan lineup covers the usual bases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared hosting (Mini/SMM Panel/Indian Cloud hosting tiers)&lt;/li&gt;
&lt;li&gt;WordPress hosting&lt;/li&gt;
&lt;li&gt;Reseller &amp;amp; Master Reseller hosting&lt;/li&gt;
&lt;li&gt;VPS / RDP&lt;/li&gt;
&lt;li&gt;A free hosting tier with limited bandwidth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A few things stand out on their spec sheet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NVMe SSD storage&lt;/strong&gt; on most plans&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free SSL certificates&lt;/strong&gt; across plans&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;cPanel&lt;/strong&gt; control panel (familiar territory if you've used other hosts)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Daily backups&lt;/strong&gt; and what they describe as enhanced security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free CDN&lt;/strong&gt; (branded as "Supersonic CDN")&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;24/7 live chat and phone support&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pricing &amp;amp; Guarantees
&lt;/h2&gt;

&lt;p&gt;Being India-focused, pricing is positioned as budget-friendly compared to international hosts — useful if you're building for an Indian audience and want servers physically closer to your users for lower latency. They also advertise a 7-day money-back guarantee and free website migration when switching from another host.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Caveat
&lt;/h2&gt;

&lt;p&gt;This is where I'd push back on any post that just lists a host's marketing points and calls it a day: &lt;strong&gt;check current reviews before committing.&lt;/strong&gt; Puffx Host's reviews online are mixed — some users report a genuinely good experience with responsive support, while others have raised complaints about billing or service issues. That's not unusual for a smaller/newer host (it happens with bigger names too), but it means you should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read recent reviews (not just the ones linked on their own site)&lt;/li&gt;
&lt;li&gt;Start with a lower-tier or monthly plan before committing to a yearly one&lt;/li&gt;
&lt;li&gt;Test their support responsiveness &lt;em&gt;before&lt;/em&gt; you have a production site depending on it&lt;/li&gt;
&lt;li&gt;Confirm uptime claims against an independent monitor once you're hosted with them&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who Might Want to Try It
&lt;/h2&gt;

&lt;p&gt;Puffx Host could make sense if you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building a project primarily for an Indian audience and want local server latency&lt;/li&gt;
&lt;li&gt;Looking for a budget alternative to test before scaling up&lt;/li&gt;
&lt;li&gt;OK being an early adopter with a newer provider, in exchange for potentially lower pricing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you need a long track record, enterprise SLAs, or you're hosting something business-critical from day one, sticking with an established provider (Hostinger, DigitalOcean, Cloudways, etc.) is still the safer bet.&lt;/p&gt;

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

&lt;p&gt;Puffx Host isn't going to dethrone the big names overnight, and it shouldn't be ranked above them without a real track record to back that up. But as a budget, India-based option worth testing for smaller or personal projects, it's a reasonable one to have on your radar in 2026 — just go in with eyes open and do your own due diligence first.&lt;/p&gt;

&lt;p&gt;Have you used Puffx Host or a similar regional hosting provider? Share your experience in the comments 👇&lt;/p&gt;

</description>
      <category>hosting</category>
      <category>webdev</category>
      <category>india</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Cheap Hosting vs Reliable Hosting: What I Learned Running My Own Company Tags: webdev, hosting, devops, startup</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Sat, 01 Aug 2026 05:58:46 +0000</pubDate>
      <link>https://dev.to/nitinmehta/cheap-hosting-vs-reliable-hosting-what-i-learned-running-my-own-company-tags-webdev-hosting-3eoc</link>
      <guid>https://dev.to/nitinmehta/cheap-hosting-vs-reliable-hosting-what-i-learned-running-my-own-company-tags-webdev-hosting-3eoc</guid>
      <description>&lt;p&gt;When I started out, I thought hosting was hosting — buy the cheapest plan, point your domain, done. A few crashed sites, angry clients, and 3 AM support tickets later, I learned that's not even close to true.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cheap Hosting Trap
&lt;/h2&gt;

&lt;p&gt;Every beginner developer goes through this phase. You find a plan for ₹99/month, it looks great on paper — "unlimited" storage, "unlimited" bandwidth, free SSL. But then reality hits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared servers packed with hundreds of other sites, so your site slows down during someone else's traffic spike&lt;/li&gt;
&lt;li&gt;Support tickets that take 24-48 hours to even get a first reply&lt;/li&gt;
&lt;li&gt;No real uptime monitoring — you find out your site was down only when a client calls you&lt;/li&gt;
&lt;li&gt;"Unlimited" resources that get throttled the moment you actually use them&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Real Example
&lt;/h2&gt;

&lt;p&gt;One of my early clients ran a small e-commerce store. Nothing huge — maybe 200-300 visitors a day. Their host was one of those "unlimited everything for ₹99" plans. The week before Diwali, they ran a sale post on Instagram. Traffic spiked to about 2,000 visitors in a few hours.&lt;/p&gt;

&lt;p&gt;The site went down. Completely. Not slow — down. I raised a support ticket immediately. First reply came 14 hours later, by which time the sale window had basically closed. The client lost real revenue over something that should have been a routine traffic spike, not an outage.&lt;/p&gt;

&lt;p&gt;That single incident taught me more about hosting than any blog post ever did: the price tag tells you nothing about what happens under load.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Actually Test a Host Before Buying
&lt;/h2&gt;

&lt;p&gt;Don't trust the sales page. Here's what I check now, and what any developer can check in a few minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ping and response time&lt;/strong&gt; — run a simple check from your terminal:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   curl &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"Connect: %{time_connect}s Total: %{time_total}s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; https://example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Anything consistently over 500ms for a basic page load is a red flag.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Uptime history&lt;/strong&gt; — use a free tool like UptimeRobot or StatusCake to monitor a host's demo/status page for a week before committing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Support response time&lt;/strong&gt; — open a pre-sales chat and ask a technical question (e.g. "what CPU/RAM isolation do you provide on shared plans?"). If they can't answer clearly or take hours to reply, that's your support experience after you pay too.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Resource isolation&lt;/strong&gt; — ask directly whether shared hosting plans use CloudLinux or similar CPU/RAM isolation. Hosts that don't often oversell the same physical server to too many accounts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Backup policy&lt;/strong&gt; — confirm backups are automated and how far back they go. "We have backups" without specifics usually means manual, occasional, or none.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What Actually Matters in Hosting
&lt;/h2&gt;

&lt;p&gt;After running dozens of client sites and eventually building my own infrastructure, here's the short list I now judge every host against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Real uptime guarantees — not just marketing copy, actual SLA numbers&lt;/li&gt;
&lt;li&gt;Server response time — test it yourself, don't trust the sales page&lt;/li&gt;
&lt;li&gt;Support that responds fast — live chat with real humans, not just ticket queues&lt;/li&gt;
&lt;li&gt;Resource isolation — so one noisy neighbor site doesn't kill your performance&lt;/li&gt;
&lt;li&gt;Automated backups — because things will break eventually&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why I Ended Up Building My Own Solution
&lt;/h2&gt;

&lt;p&gt;The more clients I onboarded, the more I realized I was troubleshooting other companies' infrastructure problems instead of building. So I started automating server provisioning, WHMCS + API integrations, and monitoring — basically solving my own pain points one at a time.&lt;/p&gt;

&lt;p&gt;That eventually became &lt;a href="https://puffxhost.com" rel="noopener noreferrer"&gt;Puffx Host&lt;/a&gt; — built specifically around the things I wished my old hosts had: fast support, honest resource limits, and infrastructure I actually understand end-to-end because I built the automation myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is cheap hosting always bad?&lt;/strong&gt;&lt;br&gt;
No — for a personal blog or portfolio with low traffic, a cheap plan is often fine. The problem is using it for anything client-facing or revenue-generating without testing it first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the single biggest red flag?&lt;/strong&gt;&lt;br&gt;
Slow or vague answers to technical pre-sales questions. If they can't answer clearly before you've paid, support won't improve after.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Should I always go with the most expensive plan?&lt;/strong&gt;&lt;br&gt;
Not necessarily. Price isn't the signal — isolation, uptime history, and support quality are. Some mid-priced hosts outperform "premium" ones on all three.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;If you're a developer choosing hosting for a client or your own project, don't just compare price tags. Test support response time, ask about real server specs, and check what happens under a traffic spike — because eventually, there will be one.&lt;/p&gt;

&lt;p&gt;What's your worst hosting horror story? Drop it in the comments 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>hosting</category>
      <category>devops</category>
      <category>startup</category>
    </item>
    <item>
      <title>I Tried Building a Money Earning App — Here’s What Actually Happened (No BS)</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Sun, 26 Apr 2026 05:09:44 +0000</pubDate>
      <link>https://dev.to/nitinmehta/i-tried-building-a-money-earning-app-heres-what-actually-happened-no-bs-4cm8</link>
      <guid>https://dev.to/nitinmehta/i-tried-building-a-money-earning-app-heres-what-actually-happened-no-bs-4cm8</guid>
      <description>&lt;h2&gt;
  
  
  💸 I Tried Building a Money Earning App — Here’s What Actually Happened
&lt;/h2&gt;

&lt;p&gt;Let’s cut the fantasy.&lt;/p&gt;

&lt;p&gt;“Money earning apps” look simple from the outside:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete tasks&lt;/li&gt;
&lt;li&gt;Earn money&lt;/li&gt;
&lt;li&gt;Withdraw instantly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build one myself and see how it actually works behind the scenes.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Original Plan (Sounds Perfect on Paper)
&lt;/h2&gt;

&lt;p&gt;The model was straightforward:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;User signs up
&lt;/li&gt;
&lt;li&gt;Completes tasks (clicks, ads, referrals)
&lt;/li&gt;
&lt;li&gt;Earns small rewards
&lt;/li&gt;
&lt;li&gt;Requests withdrawal
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Revenue source:&lt;br&gt;
👉 Ads + affiliate links  &lt;/p&gt;

&lt;p&gt;On paper, this looks like a self-running system.&lt;/p&gt;

&lt;p&gt;In reality, it breaks very fast.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ What I Actually Built
&lt;/h2&gt;

&lt;p&gt;I didn’t just make a UI. I built a working system:&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Modules:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Authentication (email + OTP)&lt;/li&gt;
&lt;li&gt;Task engine (daily tasks, cooldown system)&lt;/li&gt;
&lt;li&gt;Wallet system (credit/debit tracking)&lt;/li&gt;
&lt;li&gt;Withdrawal system (manual + auto)&lt;/li&gt;
&lt;li&gt;Admin panel (user control + fraud detection basics)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tech Stack:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Backend: PHP (custom APIs)&lt;/li&gt;
&lt;li&gt;Database: MySQL&lt;/li&gt;
&lt;li&gt;Frontend: Basic web dashboard&lt;/li&gt;
&lt;li&gt;Hosting: Shared server (cheap but enough to test)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything worked.&lt;/p&gt;

&lt;p&gt;Users could sign up, complete tasks, and see earnings.&lt;/p&gt;

&lt;p&gt;And that’s exactly when problems started.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Problem #1 — Bots &amp;amp; Exploits (Worse Than You Think)
&lt;/h2&gt;

&lt;p&gt;Within 48–72 hours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same IP → multiple accounts
&lt;/li&gt;
&lt;li&gt;Automated scripts hitting APIs
&lt;/li&gt;
&lt;li&gt;Fake task completions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;People weren’t using the app.&lt;/p&gt;

&lt;p&gt;They were trying to &lt;strong&gt;break it&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Tried:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rate limiting
&lt;/li&gt;
&lt;li&gt;IP tracking
&lt;/li&gt;
&lt;li&gt;Basic captcha
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Reality:
&lt;/h3&gt;

&lt;p&gt;👉 If money is involved, people WILL exploit your system.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Problem #2 — The Math Doesn’t Work
&lt;/h2&gt;

&lt;p&gt;This is the biggest lie in earning apps.&lt;/p&gt;

&lt;p&gt;Let’s break it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ad revenue per user ≈ ₹2–₹5
&lt;/li&gt;
&lt;li&gt;User expectation ≈ ₹20–₹50
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now multiply:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100 users → you earn maybe ₹300
&lt;/li&gt;
&lt;li&gt;But payout demand → ₹2000+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You are running at a loss from day 1.&lt;/p&gt;

&lt;p&gt;Unless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You scam users
&lt;/li&gt;
&lt;li&gt;Or you heavily restrict withdrawals
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There’s no middle ground.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Problem #3 — Trust Is Everything (And You Have None)
&lt;/h2&gt;

&lt;p&gt;Users don’t trust new platforms.&lt;/p&gt;

&lt;p&gt;Questions I got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“Payment proof?”
&lt;/li&gt;
&lt;li&gt;“Is this legit?”
&lt;/li&gt;
&lt;li&gt;“When will I get paid?”
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if your system is real…&lt;/p&gt;

&lt;p&gt;👉 Without reputation, users assume it's fake.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Problem #4 — Withdrawals Are a Nightmare
&lt;/h2&gt;

&lt;p&gt;This part is underrated.&lt;/p&gt;

&lt;p&gt;Handling real money means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment gateway fees
&lt;/li&gt;
&lt;li&gt;Fraud checks
&lt;/li&gt;
&lt;li&gt;Chargebacks
&lt;/li&gt;
&lt;li&gt;Manual verification
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even small payouts become complicated.&lt;/p&gt;

&lt;p&gt;One mistake = loss + angry users.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Problem #5 — Users Don’t Stay
&lt;/h2&gt;

&lt;p&gt;Even after all that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Users come for money
&lt;/li&gt;
&lt;li&gt;Not for product
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;👉 No loyalty&lt;br&gt;&lt;br&gt;
👉 No retention&lt;br&gt;&lt;br&gt;
👉 No real growth  &lt;/p&gt;

&lt;p&gt;They leave the moment earnings slow down.&lt;/p&gt;




&lt;h2&gt;
  
  
  💥 The Real Truth (No Sugarcoating)
&lt;/h2&gt;

&lt;p&gt;This is NOT a coding problem.&lt;/p&gt;

&lt;p&gt;It’s a &lt;strong&gt;broken business model&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Most “earning apps” survive because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They delay payments
&lt;/li&gt;
&lt;li&gt;They cap withdrawals
&lt;/li&gt;
&lt;li&gt;Or they are straight-up scams
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 What I Learned (Actual Lessons)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Code is the easiest part
&lt;/li&gt;
&lt;li&gt;Users exploit everything
&lt;/li&gt;
&lt;li&gt;Monetization matters more than features
&lt;/li&gt;
&lt;li&gt;Trust takes time, not UI
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 If I Had to Start Again
&lt;/h2&gt;

&lt;p&gt;I would NOT build an earning app.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Build SaaS tools
&lt;/li&gt;
&lt;li&gt;Solve real problems
&lt;/li&gt;
&lt;li&gt;Charge directly (simple model)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because:&lt;/p&gt;

&lt;p&gt;👉 Direct value &amp;gt; fake earning loop&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Final Advice (For Developers)
&lt;/h2&gt;

&lt;p&gt;If you're thinking:&lt;/p&gt;

&lt;p&gt;“I’ll build an earning app and make money”&lt;/p&gt;

&lt;p&gt;Stop.&lt;/p&gt;

&lt;p&gt;Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Where is the real revenue coming from?
&lt;/li&gt;
&lt;li&gt;Why would users trust you?
&lt;/li&gt;
&lt;li&gt;How will you prevent abuse?
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you don’t have answers…&lt;/p&gt;

&lt;p&gt;👉 Don’t build it.&lt;/p&gt;




&lt;h2&gt;
  
  
  📌 Conclusion
&lt;/h2&gt;

&lt;p&gt;I didn’t fail because I couldn’t code it.&lt;/p&gt;

&lt;p&gt;I failed because I understood how the system actually works.&lt;/p&gt;

&lt;p&gt;And honestly…&lt;/p&gt;

&lt;p&gt;That lesson is worth more than the app itself.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>startup</category>
      <category>beginners</category>
    </item>
    <item>
      <title>How I Built a Web Hosting Business at 16 (With Automation &amp; Zero Team)</title>
      <dc:creator>Nitin Mehta</dc:creator>
      <pubDate>Sun, 19 Apr 2026 08:21:21 +0000</pubDate>
      <link>https://dev.to/nitinmehta/how-i-built-a-web-hosting-business-at-16-with-automation-zero-team-4e7m</link>
      <guid>https://dev.to/nitinmehta/how-i-built-a-web-hosting-business-at-16-with-automation-zero-team-4e7m</guid>
      <description>&lt;h2&gt;
  
  
  🚀 How I Built a Web Hosting Business at 16 (With Automation &amp;amp; Zero Team)
&lt;/h2&gt;

&lt;p&gt;Most people think starting a hosting business needs a team, big investment, or advanced infrastructure.&lt;/p&gt;

&lt;p&gt;I started with none of that.&lt;/p&gt;

&lt;p&gt;Here’s exactly how I built my hosting platform — step by step.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎮 Step 1: Starting with Zero Income
&lt;/h2&gt;

&lt;p&gt;I didn’t start as a developer.&lt;/p&gt;

&lt;p&gt;I started as a gaming content creator (BGMI on YouTube).&lt;/p&gt;

&lt;p&gt;No income. No growth.&lt;/p&gt;

&lt;p&gt;But that phase taught me one thing — how the internet ecosystem works.&lt;/p&gt;




&lt;h2&gt;
  
  
  💰 Step 2: Discovering SMM Panels
&lt;/h2&gt;

&lt;p&gt;I entered the SMM panel space (selling followers, likes, views).&lt;/p&gt;

&lt;p&gt;At first, I was just a reseller.&lt;/p&gt;

&lt;p&gt;But I noticed something important:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The real money is in owning the system, not reselling it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 3: Learning the Backend
&lt;/h2&gt;

&lt;p&gt;I started learning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How domains &amp;amp; hosting work
&lt;/li&gt;
&lt;li&gt;How APIs connect services
&lt;/li&gt;
&lt;li&gt;Payment gateway integrations
&lt;/li&gt;
&lt;li&gt;Basic server management
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is where things changed.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔄 Step 4: Building Automation
&lt;/h2&gt;

&lt;p&gt;Instead of doing things manually, I focused on automation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API-based order processing
&lt;/li&gt;
&lt;li&gt;Auto account setup
&lt;/li&gt;
&lt;li&gt;Billing via WHMCS
&lt;/li&gt;
&lt;li&gt;Server control via cPanel/WHM
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Result:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Less manual work, more scalability.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🌐 Step 5: Launching Puffx Host
&lt;/h2&gt;

&lt;p&gt;I launched my platform (initially Puffx Live Host).&lt;/p&gt;

&lt;p&gt;Then improved it into Puffx Host.&lt;/p&gt;

&lt;p&gt;Services I focused on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shared hosting
&lt;/li&gt;
&lt;li&gt;Reseller hosting
&lt;/li&gt;
&lt;li&gt;SMM panel setup
&lt;/li&gt;
&lt;li&gt;Automation tools
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 What I Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Don’t depend on manual work → automate everything
&lt;/li&gt;
&lt;li&gt;Learn systems, not just tools
&lt;/li&gt;
&lt;li&gt;Start small, scale later
&lt;/li&gt;
&lt;li&gt;Real skill = solving problems, not watching tutorials
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Current Focus
&lt;/h2&gt;

&lt;p&gt;Now I’m working on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better server performance
&lt;/li&gt;
&lt;li&gt;Scalable infrastructure
&lt;/li&gt;
&lt;li&gt;Advanced automation systems
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;You don’t need a perfect plan.&lt;/p&gt;

&lt;p&gt;You need to start, learn, and build systems that scale.&lt;/p&gt;




&lt;p&gt;If you're building something similar or working on hosting/automation — let’s connect.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>programming</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
