<?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: Alex</title>
    <description>The latest articles on DEV Community by Alex (@alexhostatto).</description>
    <link>https://dev.to/alexhostatto</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%2F3989560%2F8a886102-cdf5-4a19-87e9-94b8438692b3.png</url>
      <title>DEV Community: Alex</title>
      <link>https://dev.to/alexhostatto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alexhostatto"/>
    <language>en</language>
    <item>
      <title>Why I Gave Up on Bootstrap and Created a Minimalist CSS Alternative</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Fri, 19 Jun 2026 16:16:30 +0000</pubDate>
      <link>https://dev.to/alexhostatto/why-i-gave-up-on-bootstrap-and-created-a-minimalist-css-alternative-2fkk</link>
      <guid>https://dev.to/alexhostatto/why-i-gave-up-on-bootstrap-and-created-a-minimalist-css-alternative-2fkk</guid>
      <description>&lt;p&gt;Bootstrap is a staple in web development, but it often becomes a bottleneck rather than a tool. I decided to abandon it because the framework’s opinionated nature frequently fights back against custom CSS. When you write a clean, standard CSS rule only to have it overwritten or ignored by Bootstrap’s deep specificity tree, you stop building and start debugging framework conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;​The Problem with Bloat&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;​Bootstrap complicates the HTML and CSS layer by forcing class-heavy markup. Why clutter your HTML with device-specific classes when you can handle layout constraints centrally in CSS?&lt;br&gt;
​Consider a standard centering container:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* style.css */&lt;/span&gt;
&lt;span class="nc"&gt;.fix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1024px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* mobile.css */&lt;/span&gt;
&lt;span class="k"&gt;@media&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max-width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;768px&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.fix&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100%&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;For a simple one-page site or a high-performance landing page, importing a massive library like Bootstrap is unnecessary overhead. This led me to create &lt;a href="https://hostatto.com/qcss/" rel="noopener noreferrer"&gt;qCSS&lt;/a&gt;, a minimalist set of styles designed to keep markup clean while remaining scalable enough for larger projects. I've used it to significantly improve load times for &lt;a href="https://aaa.hostatto.com/" rel="noopener noreferrer"&gt;online stores&lt;/a&gt; by removing the dependency on heavy external frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplicity in Practice&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;qCSS isn't about learning complex abstractions; it’s about readability. If you want to understand how a component works, you just open the &lt;a href="https://hostatto.com/qcss/css/style.css" rel="noopener noreferrer"&gt;CSS file&lt;/a&gt;.&lt;br&gt;
Here are a few quick examples of how you can manipulate layouts with ease:&lt;br&gt;
[&lt;a href="https://hostatto.com/qcss/blog/" rel="noopener noreferrer"&gt;a blog example&lt;/a&gt;]&lt;br&gt;
[&lt;a href="https://hostatto.com/qcss/landing/" rel="noopener noreferrer"&gt;a one-page website example&lt;/a&gt;]&lt;br&gt;
[&lt;a href="https://hostatto.com/qcss/dropdownmenu/" rel="noopener noreferrer"&gt;dropdown menu&lt;/a&gt;]&lt;br&gt;
[&lt;a href="https://hostatto.com/qcss/stickyfooter/" rel="noopener noreferrer"&gt;sticky footer&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Swap Sidebar Position&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you have a sidebar on the right and content on the left, swapping them is a matter of two simple rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.content&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;right&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.ss&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50px&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;&lt;strong&gt;Swapping Feature Blocks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Handling grid-like layouts without complex flex or grid wrappers is straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Swap first &amp;amp; second blocks:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.3333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-33.3333%&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;&lt;strong&gt;Swap first &amp;amp; third blocks:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;66.6666%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-66.6666%&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;&lt;strong&gt;Swap second &amp;amp; third blocks:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.3333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;-33.3333%&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;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;My approach to development has shifted significantly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write once, touch once: I structure the HTML layout, finalize it, and leave it alone.&lt;br&gt;
&lt;strong&gt;Centralized logic:&lt;/strong&gt; All visual and responsive adjustments happen in style.css and mobile.css.&lt;br&gt;
&lt;strong&gt;My goal is simple:&lt;/strong&gt; Don't complicate things. If you are tired of fighting your framework, consider whether you actually need it in the first place.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>bootstrap</category>
      <category>jquery</category>
    </item>
    <item>
      <title>How I Built a Multi-Tenant E-Commerce SaaS on Top of OpenCart 3 Using Gemini AI</title>
      <dc:creator>Alex</dc:creator>
      <pubDate>Wed, 17 Jun 2026 18:37:01 +0000</pubDate>
      <link>https://dev.to/alexhostatto/how-i-built-a-multi-tenant-e-commerce-saas-on-top-of-opencart-3-using-gemini-ai-500h</link>
      <guid>https://dev.to/alexhostatto/how-i-built-a-multi-tenant-e-commerce-saas-on-top-of-opencart-3-using-gemini-ai-500h</guid>
      <description>&lt;p&gt;How I Built a Multi-Tenant E-Commerce SaaS Platform Based on OpenCart 3 Using Gemini AI&lt;/p&gt;

&lt;p&gt;Hello Dev.to! My name is Alex. A few years ago, I moved to Slovakia. After spending several years working in factories and industrial plants, I grew tired of physically demanding work and decided to start working for myself. I wanted to put all of my experience in HTML/CSS, PHP, and Linux server administration into building my own product — the Hostatto.com e-commerce platform.&lt;/p&gt;

&lt;p&gt;After discovering that Gemini could write code, I decided to use it to create something that I had previously been unable to build on my own: a platform for creating online stores that could operate quickly, efficiently, and scale on a single server.&lt;/p&gt;

&lt;p&gt;I acted as the product manager, system architect, and quality assurance engineer, while Gemini generated code based on my technical requirements and specifications.&lt;/p&gt;

&lt;p&gt;Below, I’ll explain the technical architecture behind the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Multi-Tenant Architecture (Shared File System, Separate Database for Each Customer)
&lt;/h2&gt;

&lt;p&gt;The primary challenge when designing an e-commerce SaaS platform is achieving efficient scalability on a single VPS server without wasting resources. From the beginning, I rejected the approach of deploying a separate copy of the application files for every customer.&lt;/p&gt;

&lt;p&gt;Instead, the platform dynamically separates the environment in the following way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shared Application Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All online stores run on a single shared codebase. Whenever I release an update, optimize a system file, or fix a bug, the changes are instantly available to every store.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isolated Databases&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each store receives its own dedicated MySQL database. There are no shared tables with complex prefixes, ensuring complete data isolation and improved security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Process Isolation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stores do not share the same PHP execution process. Every customer receives an isolated PHP-FPM pool socket (php8.1-fpm-storeN.sock), strict open_basedir restrictions, and disabled potentially dangerous PHP functions, preventing cross-account access to data.&lt;/p&gt;

&lt;p&gt;The diagram below illustrates the overall architecture.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  2. Automated Store Provisioning System
&lt;/h2&gt;

&lt;p&gt;The time between user registration and a fully operational online store is only a few seconds and requires no manual intervention.&lt;/p&gt;

&lt;p&gt;When a user creates an account, a chain of automated background processes begins.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Process Initialization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A PHP script securely launches a set of background Bash utilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;File System Preparation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The platform creates the required store directories, mounts shared storage resources, and applies strict permissions based on the principle of least privilege.&lt;/p&gt;

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

&lt;p&gt;A prepared OpenCart 3 database dump is imported into a newly created database.&lt;/p&gt;

&lt;p&gt;A cryptographically secure random password is automatically generated for the database user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuration Generation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The platform automatically creates unique configuration files for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx virtual hosts;&lt;/li&gt;
&lt;li&gt;Dedicated PHP-FPM pools;&lt;/li&gt;
&lt;li&gt;Monit monitoring;&lt;/li&gt;
&lt;li&gt;Backup scheduling.&lt;/li&gt;
&lt;li&gt;Service Reload&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nginx, PHP-FPM, and Monit safely reload their configurations, system caches are cleared, and the new store becomes available immediately.&lt;/p&gt;

&lt;p&gt;The entire deployment process is fully automated and invisible to the customer.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Server-Level Performance Optimization
&lt;/h2&gt;

&lt;p&gt;To ensure maximum website performance, several key architectural decisions were implemented.&lt;/p&gt;

&lt;p&gt;Pure CSS Instead of Heavy Frameworks&lt;/p&gt;

&lt;p&gt;The storefront interface is completely free of Bootstrap, Tailwind, and other CSS frameworks.&lt;/p&gt;

&lt;p&gt;Using semantic HTML and lightweight CSS provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Minimal page size;&lt;/li&gt;
&lt;li&gt;Fast rendering performance;&lt;/li&gt;
&lt;li&gt;High GTmetrix scores immediately after deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Aggressive FastCGI Caching with Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nginx serves static resources and caches product catalog pages directly at the web server level.&lt;/p&gt;

&lt;p&gt;To ensure dynamic functionality works correctly, strict cache bypass rules were implemented. Caching is automatically disabled for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;POST requests;&lt;/li&gt;
&lt;li&gt;Shopping cart pages;&lt;/li&gt;
&lt;li&gt;Checkout pages;&lt;/li&gt;
&lt;li&gt;Logged-in users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Monitoring, Reliability, and Intelligent Backups
&lt;/h2&gt;

&lt;p&gt;As the sole operator of the infrastructure, I needed the platform to be resilient, automated, and self-healing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Monitoring with Monit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A background monitoring service continuously checks the health of individual PHP-FPM pool processes.&lt;/p&gt;

&lt;p&gt;If a process hangs or crashes, Monit automatically restarts the affected service, ensuring maximum uptime without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intelligent Cloud Backups&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every day, an automated script archives store files and databases before uploading backups to Google Drive using rclone.&lt;/p&gt;

&lt;p&gt;To avoid Google API rate limits when backing up hundreds of stores simultaneously, I implemented randomized Cron scheduling delays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hostatto.com/" rel="noopener noreferrer"&gt;Hostatto.com&lt;/a&gt; is a lightweight stack that leverages Nginx FastCGI caching, a shared OpenCart 3 core, and strict PHP-FPM pool isolation, enabling hundreds of lightning-fast online stores to run on a single server. Using Gemini as a true development partner allowed me to design, debug, and implement this entire complex infrastructure efficiently and successfully.&lt;br&gt;
In conclusion, I would like to thank Daniel Kerr for creating OpenCart, and Gemini for helping with code generation and the implementation of this online store builder.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>buildinpublic</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
