<?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>Forem: Aribu js</title>
    <description>The latest articles on Forem by Aribu js (@digital-abetka).</description>
    <link>https://forem.com/digital-abetka</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3897149%2F55f949da-66a5-4f44-955b-b459eca02820.png</url>
      <title>Forem: Aribu js</title>
      <link>https://forem.com/digital-abetka</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/digital-abetka"/>
    <language>en</language>
    <item>
      <title>Ethics of speed: minimalism and statics in development</title>
      <dc:creator>Aribu js</dc:creator>
      <pubDate>Sat, 23 May 2026 14:04:15 +0000</pubDate>
      <link>https://forem.com/digital-abetka/ethics-of-speed-minimalism-and-statics-in-development-2cko</link>
      <guid>https://forem.com/digital-abetka/ethics-of-speed-minimalism-and-statics-in-development-2cko</guid>
      <description>&lt;h2&gt;
  
  
  Ethics of Speed: Why Minimalism in Development and Static Sites are the Best Manifestation of Respect for the User
&lt;/h2&gt;

&lt;p&gt;Hello, bro! 👋 Let's be honest: modern &lt;strong&gt;web development&lt;/strong&gt; has gone astray. We've reached a technological absurdity where a browser is forced to download megabytes of code to load a simple text page, and a server has to make dozens of resource-intensive requests.&lt;/p&gt;

&lt;p&gt;For some reason, it has become the norm in the industry to use &lt;strong&gt;heavy JavaScript&lt;/strong&gt; and bloated frameworks where a simple HTML document would suffice. But have you ever thought about how much time, nerves, and battery charge your visitors waste every day on this digital chaos? ⏳&lt;/p&gt;

&lt;p&gt;Today, we're going to talk about what &lt;strong&gt;site speed ethics&lt;/strong&gt; are. You'll learn why &lt;strong&gt;digital minimalism in development&lt;/strong&gt; is not just a trendy fad or a geek's whim, but the only correct path to the future. We'll break down how returning to the roots (yes, those same &lt;strong&gt;static sites&lt;/strong&gt;) and uncompromising &lt;strong&gt;clean code&lt;/strong&gt; allow you to create lightning-fast projects that truly respect the user.&lt;/p&gt;

&lt;p&gt;Are you ready to change your approach to architecture and shed the unnecessary ballast from your projects? Then let's go! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  The Epidemic of Bloated Code: Why the Internet has Become Slow?
&lt;/h2&gt;

&lt;p&gt;Do you remember the times when sites opened instantly? Nowadays, to simply read some text, your browser often has to download several megabytes of code, parse &lt;strong&gt;heavy JavaScript&lt;/strong&gt;, and execute a bunch of background scripts. 🤯&lt;/p&gt;

&lt;p&gt;We've surrounded ourselves with frameworks that make development more convenient for the programmer, but unbearable for the user. Complex SPAs (Single Page Applications) force smartphone processors to work at full capacity, draining the battery. Instead of simply serving a ready-made document, the server generates it "on the fly," accesses databases, and waits for responses from third-party services.&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%2Fli1drb04dobiota8mop1.webp" 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%2Fli1drb04dobiota8mop1.webp" alt="Contrast between bloated modern web and clean speed of static sites" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But do we really need this cumbersome mechanism to convey information? Real &lt;strong&gt;loading speed optimization&lt;/strong&gt; starts not with compressing images or minifying CSS, but with removing the unnecessary at the project concept level.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/pressable-mcp-gemini-cli-linux/" rel="noopener noreferrer"&gt;Pressable MCP i Gemini CLI: AI-managed hosting in Linux&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  User Time is the Highest Value
&lt;/h2&gt;

&lt;p&gt;When someone clicks on your link, they trust you with their most valuable resource - time. Forcing them to watch a loading animation (spinner) is simply disrespect. 🛑&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;site speed ethics&lt;/strong&gt; come into play. It's a philosophy that says: the developer must take all complex calculations upon themselves so that the visitor gets the result instantly. The page must appear on the screen faster than a person can blink.&lt;/p&gt;

&lt;h2&gt;
  
  
  Static Sites and 11ty: A Breath of Fresh Air
&lt;/h2&gt;

&lt;p&gt;How do we return this lightning-fast speed? The answer lies in returning to common sense - &lt;strong&gt;static sites&lt;/strong&gt; and modern SSG generators like &lt;strong&gt;11ty&lt;/strong&gt; (Eleventy). ⚡&lt;/p&gt;

&lt;p&gt;Instead of using resource-intensive &lt;strong&gt;server-side rendering&lt;/strong&gt; (SSR) during each visit, 11ty assembles the entire project only once - at the build stage. When a visitor enters the blog, the server simply serves a ready, clean HTML file.&lt;/p&gt;

&lt;p&gt;Such &lt;strong&gt;clean architecture&lt;/strong&gt; makes your resource not only reactive but also absolutely secure. No database - nothing to hack! You get maximum protection and zero delay. 🛡️&lt;/p&gt;

&lt;h2&gt;
  
  
  Artificial Intelligence and the Web: Where is the Line of Reason?
&lt;/h2&gt;

&lt;p&gt;It's trendy now to attach AI to everything. Some developers go to the point of technical absurdity: they force the user's smartphone to make a heavy API request to a neural network with billions of parameters just to... recognize if a plastic cup in a photo is crushed. 🤦‍♂️&lt;/p&gt;

&lt;p&gt;They call this "ecological innovation." But let's think like engineers. Pushing megabytes of JSON data through the ocean to cloud clusters that burn kilowatts of electricity for a single trivial task is mockery - both of the planet and the user.&lt;/p&gt;

&lt;p&gt;This is what this contrast looks like at the code level:&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%2F8wed0s3rq96jf7og3e9d.webp" 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%2F8wed0s3rq96jf7og3e9d.webp" alt="Clean architecture: comparison of heavy API request and static generation on 11ty" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the first case, we have huge latency, network load, and a crazy carbon footprint. In the second - a clean, instant result.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/smm-turbo-instagram-editor/" rel="noopener noreferrer"&gt;SMM Turbo: Hybrid AI-editor for Instagram carousels&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Autonomous AI Agents: The Real Magic "Under the Hood"
&lt;/h2&gt;

&lt;p&gt;Does this mean we have to give up on the power of AI? Not at all! The secret lies in &lt;em&gt;where exactly&lt;/em&gt; this intelligence works. Respect for the visitor means that all heavy calculations are taken on by the developer.&lt;/p&gt;

&lt;p&gt;Instead of loading the user's browser, we use &lt;strong&gt;autonomous AI agents&lt;/strong&gt; (like our hybrid agent Hermes) in a closed loop. This digital worker does all the dirty work in the shadows: analyzes trends, writes code, forms SEO structure.&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%2Fn3wbq8177k8did2fk8w2.webp" 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%2Fn3wbq8177k8did2fk8w2.webp" alt="Autonomous AI agent Hermes works under the hood, leaving the frontend clean" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, the fast &lt;strong&gt;static site generator 11ty&lt;/strong&gt; comes into play. It takes the results of the AI's work and assembles them into perfectly optimized pages even before the user follows the link. The visitor doesn't wait for the neural network to "think" or for the database to load. They get the information at the speed of light. ⚡&lt;/p&gt;

&lt;p&gt;This is &lt;strong&gt;real code ecology&lt;/strong&gt; - zero load on the client device and maximum value. 🌿&lt;/p&gt;

&lt;h2&gt;
  
  
  Real UX Design is Imperceptible Speed
&lt;/h2&gt;

&lt;p&gt;We're used to thinking that cool &lt;strong&gt;UX design&lt;/strong&gt; is a lot of smooth animation, beautiful 3D effects, and interfaces that react to every micro-movement. But in reality, the best interface is one that doesn't make the user wait even a second. Instant page response gives a person a feeling of complete control.&lt;/p&gt;

&lt;p&gt;When your site weighs 20 kilobytes instead of 5 megabytes, it loads just as fast in the center of a metropolis with 5G as it does on the road with weak 3G connectivity. By practicing &lt;strong&gt;digital minimalism in development&lt;/strong&gt;, you create an inclusive web accessible to everyone, regardless of the power of their gadget.&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%2Fir64ggegukoxxfjttwuy.webp" 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%2Fir64ggegukoxxfjttwuy.webp" alt="Concept of digital ecology: clean code and load optimization" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember: every extra script you add to the frontend is a tax on the user's attention. Respect your audience, clean up interfaces from ballast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ecology They Don't Talk About
&lt;/h2&gt;

&lt;p&gt;Real &lt;strong&gt;code ecology&lt;/strong&gt; is measured not by beautiful slogans in social media, but by real milliwatts of saved energy. When millions of users open optimized static sites every day, the total savings in processor time on servers and smartphones becomes colossal.&lt;/p&gt;

&lt;p&gt;Clean, pre-compiled HTML doesn't force data center processors to heat up. It's simply served instantly through a CDN. This is what a responsible approach to development looks like in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manifesto of Clean Code: Instead of a Conclusion
&lt;/h2&gt;

&lt;p&gt;Bro, being a developer today is not just about being able to connect third-party APIs and copy ready-made solutions. It's about responsibility to those who will use your product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Artificial intelligence&lt;/strong&gt; gives us superpowers. It allows us to automate routine, write complex logic, and optimize processes. But don't let technology control your architecture. Carry the complexity on the server, leave the client with clean and transparent static content.&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%2F12ir2krf4mejwgnowvka.webp" 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%2F12ir2krf4mejwgnowvka.webp" alt="User gets instant page loading thanks to ethical development" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you write &lt;strong&gt;clean code&lt;/strong&gt;, refuse heavy JavaScript in favor of lightweight solutions, and build projects with respect for other people's time - you change the industry for the better. Make your web light, fast, and ethical. Your users will definitely appreciate it with lightning-fast loading!&lt;/p&gt;

&lt;p&gt;Maintain cleanliness in code and architecture. See you in the next materials! 💻🔥&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>cleancode</category>
      <category>automation</category>
    </item>
    <item>
      <title>Hermes Agent: Autonomous SEO engineer for 11ty</title>
      <dc:creator>Aribu js</dc:creator>
      <pubDate>Wed, 20 May 2026 07:59:37 +0000</pubDate>
      <link>https://forem.com/digital-abetka/hermes-agent-autonomous-seo-engineer-for-11ty-50g6</link>
      <guid>https://forem.com/digital-abetka/hermes-agent-autonomous-seo-engineer-for-11ty-50g6</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hermes-agent-2026-05-15"&gt;Hermes Agent Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built: The End of Manual SEO Era
&lt;/h2&gt;

&lt;p&gt;Let's be honest: we all love the speed and security of the Jamstack architecture. Writing articles in Markdown for generators like Eleventy (11ty) is a pleasure. But there's one thing that every developer-blogger hates. It's routine. 😩&lt;/p&gt;

&lt;p&gt;Writing an article is only 50% of the work. Then hell begins: you need to come up with the perfect &lt;code&gt;title&lt;/code&gt;, squeeze the essence into 150 characters of &lt;code&gt;description&lt;/code&gt; for the Google snippet, and write a short &lt;code&gt;ai_summary&lt;/code&gt;. And what if you have hundreds of them? &lt;/p&gt;

&lt;p&gt;That's why I decided to go beyond the usual ChatGPT assistants. I created an &lt;strong&gt;autonomous digital worker&lt;/strong&gt; based on the Hermes framework. 🤖 &lt;/p&gt;

&lt;p&gt;My script doesn't just "generate text" in a browser window. It's deeply integrated into my workflow "in a meaningful way". This agent:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scans the local directory with hundreds of Markdown files on its own.&lt;/li&gt;
&lt;li&gt;Analyzes the content of each article.&lt;/li&gt;
&lt;li&gt;Generates perfectly structured JSON with missing SEO metadata.&lt;/li&gt;
&lt;li&gt;Directly overwrites the &lt;code&gt;Front Matter&lt;/code&gt; in files, breaking nothing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Demo: Autonomy in Action
&lt;/h2&gt;

&lt;p&gt;Instead of building heavy and unnecessary graphical interfaces (GUI) that only consume resources, my demo project is a clean, lightning-fast console automation. It's an invisible back-office worker that manages content right in your terminal. &lt;/p&gt;

&lt;p&gt;When you launch the agent, it scans the entire blog in milliseconds, detects "problematic" articles without meta tags, connects to cloud intelligence, and autonomously closes all SEO gaps. The work that previously took hours of manual copy-paste is now done in one click.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Below in the article, we will detail the terminal logs and the final result, but for now, let's take a look under the hood of this system).&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code: Architecture and Technology Stack
&lt;/h2&gt;

&lt;p&gt;The entire project is built on the principles of &lt;strong&gt;idempotence&lt;/strong&gt; and &lt;strong&gt;fault tolerance&lt;/strong&gt;. This means that the script can be run as many times in a row as you like: it will never create duplicate content, spoil existing tags, or simply continue working from where it left off.&lt;/p&gt;

&lt;p&gt;Here is the complete source code and showcase repository for this challenge: &lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://github.com/bodikinf/hermes-jamstack-showcase" rel="noopener noreferrer"&gt;Hermes Jamstack Showcase Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To better understand how a local file on your computer communicates with the cloud, take a look at this architectural scheme:&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhermes-architecture-schema.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhermes-architecture-schema.webp" title="Hermes Agent Architecture" alt="Hybrid architecture of the Hermes AI agent for Eleventy" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My Tech Stack: Why These Tools?
&lt;/h3&gt;

&lt;p&gt;To create Hermes, I chose the lightest, but time-tested development technologies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Node.js (Runtime):&lt;/strong&gt; A Scandinavian hammer for working with the file system and asynchronous requests. Provides instant directory scanning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eleventy (11ty):&lt;/strong&gt; Our favorite, super-fast static site generator. Since it works with pure Markdown, it became an ideal environment for automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gray-Matter (Parser):&lt;/strong&gt; A special library that can break down a Markdown file into two parts: an object with metadata (Front Matter) and pure article text. Without it, the AI would simply get tangled up in markup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 2.5 Flash API (Cloud Brain):&lt;/strong&gt; The new generation of models from Google. I chose the &lt;strong&gt;Flash&lt;/strong&gt; version because it has phenomenal generation speed, strict adherence to prompt instructions, and a penny's worth of request cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Used Hermes Agent: Three Pillars of Autonomy
&lt;/h2&gt;

&lt;p&gt;To integrate the agent into the workflow "in a meaningful way", I had to solve three main engineering problems. I didn't want the script to just chatter - I needed a predictable digital worker. &lt;/p&gt;

&lt;p&gt;Here are the three pillars that my Hermes Agent stands on.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Structured Data (Taming Chaos)
&lt;/h3&gt;

&lt;p&gt;The main problem with all LLMs is that they love to "talk". If you ask an AI to write an SEO description, it might respond: &lt;em&gt;"Of course, here's your description: ..."&lt;/em&gt;. For an automated system, such text is a failure and a broken site build.&lt;/p&gt;

&lt;p&gt;So I used strict prompt engineering, forcing Gemini 2.5 Flash to return a strictly typed &lt;strong&gt;JSON object&lt;/strong&gt;. &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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fjson-prompt-snippet.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fjson-prompt-snippet.webp" title="JSON Prompt for Hermes Agent" alt="JavaScript code that forces Gemini AI to return strictly structured JSON data" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see in the code above, we're not just asking for JSON, we're also additionally cleaning the response from markdown markup (&lt;code&gt;&lt;/code&gt;`&lt;code&gt;json&lt;/code&gt;), which neural networks love to add. This guarantees that the &lt;code&gt;JSON.parse()&lt;/code&gt; method will work without errors. 🎯&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Idempotence: The Main Rule of a Doctor - "Do No Harm"
&lt;/h3&gt;

&lt;p&gt;Imagine that you accidentally ran the script twice. A bad script would generate duplicates or spoil your manual work. My autonomous agent adheres to the principle of &lt;strong&gt;idempotence&lt;/strong&gt;. 🛡️&lt;/p&gt;

&lt;p&gt;Before wasting API credits, Hermes uses &lt;code&gt;gray-matter&lt;/code&gt; to parse the Markdown file and check for the presence of SEO fields:&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsafe-file-update-snippet.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsafe-file-update-snippet.webp" title="Safe Front Matter Update" alt="Idempotent Node.js script that safely updates Front Matter in Markdown files using gray-matter" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent works like a smart filter. If an article already has a perfect &lt;code&gt;description&lt;/code&gt; and generated &lt;code&gt;ai_summary&lt;/code&gt; - it instantly skips it. If the fields are empty or too short (less than 50 characters) - it precisely fills them in, assembles the file back, and safely saves it to disk.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/pressable-mcp-gemini-cli-linux/" rel="noopener noreferrer"&gt;Pressable MCP i Gemini CLI: AI-managed hosting in Linux&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3. Fault Tolerance: API Error Handling
&lt;/h3&gt;

&lt;p&gt;During a massive audit of hundreds of files, I encountered the fact that even Google servers sometimes can't handle the load and return a &lt;code&gt;503 Service Unavailable&lt;/code&gt; error. &lt;/p&gt;

&lt;p&gt;An ordinary script would "fall" at this point, and the developer would have to search for which file exactly broke. But I have an autonomous agent! It must survive. 🦾&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Ffault-tolerance-loop.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Ffault-tolerance-loop.webp" title="Error Handling and Emergency Pauses" alt="Block diagram of fault tolerance showing the emergency pause protocol for handling API 503 errors" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I added a &lt;code&gt;try...catch&lt;/code&gt; block directly inside the processing cycle. If Hermes receives a refusal from the servers, it doesn't stop the entire program. It outputs a red warning to the console, understands that the servers are overloaded, makes an &lt;strong&gt;emergency pause for 15 seconds&lt;/strong&gt; (so the API can "breathe"), and calmly moves on to the next file. &lt;/p&gt;

&lt;p&gt;This makes the architecture absolutely fault-tolerant. You can run the script on 1000 articles, go drink coffee, and be sure that it will complete the work. ☕&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/smm-turbo-instagram-editor/" rel="noopener noreferrer"&gt;SMM Turbo: Hybrid AI editor for Instagram carousels&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Final: Mass SEO Audit in Action
&lt;/h2&gt;

&lt;p&gt;This is what the real triumph of automation looks like. When I run the &lt;code&gt;node hermes.js&lt;/code&gt; command in the terminal, my autonomous SEO engineer comes to life. &lt;/p&gt;

&lt;p&gt;It scans the entire blog directory in milliseconds. Pay attention to the log: it recognizes articles where SEO is already set up and outputs a &lt;code&gt;[SKIP]&lt;/code&gt; message. But as soon as it finds a file with an empty description or missing &lt;code&gt;ai_summary&lt;/code&gt;, it connects to cloud intelligence, generates JSON, and writes it.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhermes-terminal-success.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhermes-terminal-success.webp" title="Mass Audit and SEO Generation" alt="VS Code terminal showing a successful mass SEO audit and injection of ai_summary and description fields" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The yellow letters &lt;strong&gt;M&lt;/strong&gt; (Modified) in the left panel of VS Code are the best proof that the script actually physically overwrote files on disk. No manual copy-paste between browser tabs. No broken tags in Front Matter. Just pure efficiency. ✨&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Delegate Processes, Not Tasks
&lt;/h2&gt;

&lt;p&gt;Creating this project for the Hermes Agent Challenge completely changed my understanding of artificial intelligence. We are moving from the era of "AI as a chatbot" to the era of "AI as an autonomous employee". 🚀&lt;/p&gt;

&lt;p&gt;You no longer need to spend hours filling in meta tags manually. You can delegate AI an entire &lt;em&gt;process&lt;/em&gt;, creating such fault-tolerant local scripts. Your Jamstack blog can live its own life and autonomously optimize itself for search engines.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ready to launch your first agent? 🤖🚀&lt;/strong&gt;&lt;br&gt;
Jump to the official &lt;strong&gt;Hermes Agent Framework&lt;/strong&gt; page. Explore the documentation, download the source code, and join the autonomous open AI revolution!&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://hermes-agent.nousresearch.com/" rel="noopener noreferrer"&gt;OPEN OFFICIAL HERMES WEBSITE&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you want to feel more automation magic, be sure to test our free &lt;strong&gt;SMM Turbo&lt;/strong&gt; service. It's a hybrid AI editor that takes over the routine of creating viral Instagram carousels! 🔥&lt;/p&gt;

&lt;p&gt;And how do you use AI in your Jamstack projects? Are you ready to give an autonomous agent access to your local files? Write your thoughts in the comments, it'll be cool to discuss this with the community! 👇&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>webdev</category>
    </item>
    <item>
      <title>The End of Chatbots: Why Autonomous Agents are the Future of Dev</title>
      <dc:creator>Aribu js</dc:creator>
      <pubDate>Mon, 18 May 2026 16:53:14 +0000</pubDate>
      <link>https://forem.com/digital-abetka/the-end-of-chatbots-why-autonomous-agents-are-the-future-of-dev-4h84</link>
      <guid>https://forem.com/digital-abetka/the-end-of-chatbots-why-autonomous-agents-are-the-future-of-dev-4h84</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/devteam/join-the-hermes-agent-challenge-1000-in-prizes-13cd"&gt;Hermes Agent Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Chatbots to Digital Workers: The Anatomy of Autonomy with Hermes Agent
&lt;/h2&gt;

&lt;p&gt;Let's be honest: modern AI tools have reached their ceiling. We're used to the "write a prompt - get text" format. It was cool in 2023, but today developers need more. &lt;/p&gt;

&lt;p&gt;We need not just "conversationalists" that generate code or articles. We need &lt;strong&gt;digital workers&lt;/strong&gt; that can go online on their own, read documentation, run a script in the terminal, and fix their own mistakes. &lt;/p&gt;

&lt;p&gt;And that's where &lt;strong&gt;autonomous agents&lt;/strong&gt;, such as the Hermes framework, come in. They change the rules of the game. Instead of blindly guessing the answer, they can plan, reflect, and use external tools. &lt;/p&gt;

&lt;p&gt;In this article, we'll break down the anatomy of AI agents. You'll learn how they differ from classic large language models (LLM) and how this technology will impact the future of development. Are you ready to take a look under the hood of the new generation of intelligence? Then let's go! &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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhermes-agent-cover_AI.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhermes-agent-cover_AI.webp" title="Hermes Agent: Autonomous AI" alt="A cybernetic hand controls digital nodes on a dark background, symbolizing an autonomous AI agent" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Ordinary LLM vs Agents: What's the Difference?
&lt;/h2&gt;

&lt;p&gt;To understand the power of frameworks like Hermes, let's compare two approaches. Classic large language models (like basic ChatGPT) work like a very smart, but "blind" encyclopedia. &lt;/p&gt;

&lt;p&gt;You give it a prompt - the model generates text based on what it learned months ago. It can't check the weather, run a script on your computer, or fix a bug in the generated code on its own. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autonomous agents&lt;/strong&gt; work differently. This is a superstructure over the language model that gives it "hands" and "eyes". The agent gets access to external tools (API, search engines, terminal) and can interact with the real world. &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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fai-vs-agent.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fai-vs-agent.webp" title="LLM vs Autonomous Agents" alt="Scheme: Old approach of ordinary LLM vs new agent-based approach using tools" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why &lt;strong&gt;Hermes Agent&lt;/strong&gt; specifically? There are heavy solutions like AutoGPT on the market, but they often consume too many resources and are complicated to set up. Hermes offers a lightweight, flexible architecture that a developer can fully control and adapt to their needs. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/smm-turbo-instagram-editor/" rel="noopener noreferrer"&gt;SMM Turbo: Hybrid AI Editor for Instagram Carousels&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Multi-Stage Thinking: How an AI Agent Makes Decisions
&lt;/h2&gt;

&lt;p&gt;The real magic of autonomy is hidden in a process called the &lt;strong&gt;Reasoning Loop&lt;/strong&gt;. Instead of giving an instant answer, the agent "thinks". &lt;/p&gt;

&lt;p&gt;When a user sets a complex task, Hermes launches a continuous cycle that consists of several steps:&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fagent-reasoning-loop.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fagent-reasoning-loop.webp" title="AI Agent's Reasoning Loop" alt="AI agent's reasoning loop from query to result analysis" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Thought:&lt;/strong&gt; The agent analyzes the query and decides what exactly it needs to do. For example: &lt;em&gt;"I need to find the latest web design trends"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action:&lt;/strong&gt; The agent chooses the right tool from its arsenal (e.g., Google search).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Observation:&lt;/strong&gt; The agent receives the search results, reads them, and makes conclusions. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If there's enough information - it forms a final answer. If not - the cycle repeats again, but with a new understanding of the context. This allows the system to correct its own mistakes in real-time! &lt;/p&gt;

&lt;h2&gt;
  
  
  The Magic of Tools: How AI Gets "Hands"
&lt;/h2&gt;

&lt;p&gt;Ordinary models are locked in their training dataset. Agents use &lt;strong&gt;Tools&lt;/strong&gt;. These are special functions that allow AI to safely interact with the outside world and your computer. &lt;/p&gt;

&lt;p&gt;How does it work under the hood? When an agent decides it needs additional information, it generates a special JSON request. It records its thought, chooses the right action, and passes search parameters:&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fagent-json-action.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fagent-json-action.webp" title="Tool Call via JSON" alt="JSON format of a tool call by an autonomous agent" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The best part is that expanding Hermes Agent's capabilities is extremely simple. You don't need to be an expert in machine learning. &lt;/p&gt;

&lt;p&gt;The developer simply writes a standard JavaScript or TypeScript function (e.g., accessing a database or searching local files) and registers it in the system. Then the AI itself understands when and how to apply it. &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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fagent-register-tool.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fagent-register-tool.webp" title="Code for Registering a Tool" alt="Registration of a new tool for Hermes Agent in JavaScript code" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Hybrid Architecture: Autonomy for Weak PCs
&lt;/h2&gt;

&lt;p&gt;Now about the most interesting thing - real hardware. Running a heavy open model (even with 7-8 billion parameters) on a laptop with 8 GB of RAM is a real pain for a developer. &lt;/p&gt;

&lt;p&gt;Your operating system (e.g.,Linux Fedora, not to mention Windows😁) will start to slow down, and the code editor will constantly "freeze". But we have an elegant and efficient solution - &lt;strong&gt;hybrid architecture&lt;/strong&gt;. &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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhybrid-architecture.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fhybrid-architecture.webp" title="Hermes Hybrid Architecture" alt="Hybrid architecture of an AI agent with a local script and cloud API" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The essence of the approach is geniusly simple. The Hermes Agent script itself (which weighs a few megabytes) runs &lt;strong&gt;locally&lt;/strong&gt; on your computer. It has full access to the terminal and monitors your file system.&lt;/p&gt;

&lt;p&gt;But to "think" and make decisions, it instantly turns to super-fast &lt;strong&gt;cloud models&lt;/strong&gt; (e.g., Groq or Gemini API) via API. &lt;/p&gt;

&lt;p&gt;This gives an ideal combination: zero load on your RAM, cosmic speed of the cloud, and full, secure control over local processes.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/pressable-mcp-gemini-cli/" rel="noopener noreferrer"&gt;Pressable MCP i Gemini CLI: AI-Managed Hosting in Linux&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion: The Era of Open Agents
&lt;/h2&gt;

&lt;p&gt;We are on the threshold of fundamental changes in development. Open frameworks like Hermes democratize artificial intelligence. They turn ordinary "conversationalists" into full-fledged digital engineers. &lt;/p&gt;

&lt;p&gt;Instead of spending hours on routine coding or writing automation scripts, you can delegate this to an autonomous system. The future belongs to those who learn to manage agents, not just write them prompts. &lt;/p&gt;

&lt;p&gt;Want to experiment with this technology firsthand and launch your first agent? Visit the official &lt;a href="https://hermes-agent.nousresearch.com/" rel="noopener noreferrer"&gt;Hermes Agent&lt;/a&gt; website. &lt;br&gt;
Read the documentation and join the open AI revolution! &lt;/p&gt;

&lt;p&gt;And what do you think, can such autonomous agents completely replace junior developers in the next two years? Share your thoughts in the comments below!👇&lt;/p&gt;

</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SMM Turbo: Hybrid AI Instagram Editor via Gemma 4</title>
      <dc:creator>Aribu js</dc:creator>
      <pubDate>Sat, 16 May 2026 20:25:25 +0000</pubDate>
      <link>https://forem.com/digital-abetka/smm-turbo-hybrid-ai-instagram-editor-via-gemma-4-5d7o</link>
      <guid>https://forem.com/digital-abetka/smm-turbo-hybrid-ai-instagram-editor-via-gemma-4-5d7o</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/google-gemma-2026-05-06"&gt;Gemma 4 Challenge: Build with Gemma 4&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I developed &lt;strong&gt;SMM Turbo&lt;/strong&gt; - a blazing-fast, completely free graphic editor for creating Instagram carousels that works directly in the browser. &lt;/p&gt;

&lt;p&gt;Instead of traditional &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt;, SMM Turbo uses a DOM-based architecture with Svelte 5 runes for state management. But its real superpower is the &lt;strong&gt;Hybrid AI Co-Pilot&lt;/strong&gt;, which combines local in-browser neural networks (for background removal) and cloud-based LLMs to completely automate the SMM workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Live Project: &lt;a href="https://smm.shcho-i-yak.pp.ua" rel="noopener noreferrer"&gt;https://smm.shcho-i-yak.pp.ua&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;GitHub Repository: &lt;a href="https://github.com/bodikinf/smm-turbo-open" rel="noopener noreferrer"&gt;https://github.com/bodikinf/smm-turbo-open&lt;/a&gt; &lt;em&gt;(Make sure to open it!)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;To create a truly intelligent "SMM Strategist", I integrated the &lt;strong&gt;Gemma 4 31B&lt;/strong&gt; model via the Google Generative Language API. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Gemma 4 31B?&lt;/strong&gt; Generating a cohesive, conversion-focused 5-slide marketing carousel (Hook, Pain, Solution, Proof, CTA) requires deep reasoning and high context retention. Smaller models often lose the marketing context, but the 31B model handles complex instructional prompts flawlessly, delivering ready-to-publish strategies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technical Challenge Overcome:&lt;/strong&gt;&lt;br&gt;
Because the 31B model takes around 12-15 seconds to generate a highly detailed marketing structure, it consistently hit the strict 10-second serverless timeout limit on my hosting (resulting in 502 Bad Gateway errors). &lt;/p&gt;

&lt;p&gt;To solve this, I bypassed heavy official SDKs and implemented a native &lt;code&gt;fetch&lt;/code&gt; request within an &lt;strong&gt;Edge Function&lt;/strong&gt; (&lt;code&gt;runtime: 'edge'&lt;/code&gt;). This extended the timeout limit to 30 seconds and drastically reduced the memory footprint, allowing the Gemma 4 31B model to unleash its full reasoning capabilities without timeouts.&lt;/p&gt;



&lt;p&gt;&lt;em&gt;But let's start from the beginning. Here is the full story of how SMM Turbo was born and how it works under the hood...&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Hello. 👋 If you work in marketing, run your own business, or develop your personal brand, you know how much time creating visual content takes. Photoshop is too "heavy", expensive, and complicated for daily tasks. And popular online services like Canva are becoming increasingly overloaded with unnecessary features and require a paid subscription for the simplest tools.&lt;/p&gt;

&lt;p&gt;That's why I decided to take matters into my own hands. I developed my own &lt;strong&gt;graphic editor for creating Instagram carousels&lt;/strong&gt;, which works directly in the browser, uses the power of artificial intelligence, and is completely free. &lt;/p&gt;

&lt;p&gt;Today, I'll tell you the story of creating &lt;strong&gt;SMM Turbo&lt;/strong&gt;. We'll take a look "under the hood", explore the magic of the latest Svelte 5, break down in-browser artificial intelligence, and learn how to create a cool tool for SMM specialists from scratch. Let's go. 🚀&lt;/p&gt;
&lt;h2&gt;
  
  
  🛠 Why I decided to write my own graphic editor for creating Instagram carousels?
&lt;/h2&gt;

&lt;p&gt;Creating carousels for Instagram is a very specific task. You need to keep the overall visual style in mind, seamlessly move elements between slides, and quickly export everything in the correct format with optimized weight. &lt;/p&gt;

&lt;p&gt;Most existing solutions didn't give me the speed I needed. So, I formed &lt;strong&gt;three main requirements&lt;/strong&gt; for my future product:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Lightning-fast speed.&lt;/strong&gt; No long uploads or lags when dragging layers. The interface must respond instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI assistant at hand.&lt;/strong&gt; I wanted AI to not just be "for show", but really help generate ideas, texts, and cut out the background right on the canvas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free and accessible.&lt;/strong&gt; The tool must work in any browser without installing "heavy" software on a PC.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To implement this ambitious plan, I chose the &lt;strong&gt;SvelteKit&lt;/strong&gt; framework (with the latest Svelte 5). Its compiled nature and new reactive "runes" allowed me to create an extremely complex interface without losing productivity.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/svelte-5-ecosystem-review/" rel="noopener noreferrer"&gt;Overview of the Svelte 5 ecosystem: What's new and why you should switch&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🏗 Architecture: DOM instead of Canvas
&lt;/h2&gt;

&lt;p&gt;If you've ever been interested in developing graphic editors, you know that the standard approach is to use HTML5 &lt;code&gt;&amp;lt;canvas&amp;gt;&lt;/code&gt; or special libraries like Fabric.js or Konva. But I took a different, somewhat rebellious path 🐧.&lt;/p&gt;

&lt;p&gt;In &lt;strong&gt;SMM Turbo&lt;/strong&gt;, the working area is ordinary HTML elements (&lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;) that are positioned absolutely using &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; coordinates. &lt;/p&gt;

&lt;p&gt;Why so? Because &lt;strong&gt;CSS is a superpower!&lt;/strong&gt; 🦸‍♂️ &lt;/p&gt;

&lt;p&gt;Rendering through DOM allowed me to implement incredibly complex typography in just a few lines of code, instead of writing complex math for drawing pixels on Canvas. &lt;/p&gt;

&lt;p&gt;Here's what regular CSS gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gradient text:&lt;/strong&gt; Using &lt;code&gt;-webkit-background-clip: text&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stroke (outline):&lt;/strong&gt; Works through &lt;code&gt;-webkit-text-stroke&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shadows and glow:&lt;/strong&gt; Elementary &lt;code&gt;drop-shadow&lt;/code&gt; and &lt;code&gt;text-shadow&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text bending along a circle:&lt;/strong&gt; Implemented by breaking the text into separate &lt;code&gt;&amp;lt;span&amp;gt;&lt;/code&gt; elements using &lt;code&gt;transform: rotate(...) translateY(...)&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But how do you save the finished picture then? That's where the &lt;code&gt;html-to-image&lt;/code&gt; library comes in.&lt;/p&gt;

&lt;p&gt;Here's what my script for exporting to &lt;code&gt;+page.svelte&lt;/code&gt; looks like, which takes a "screenshot" of the DOM node, packs the slides into an archive using &lt;code&gt;JSZip&lt;/code&gt;, and converts them "on the fly":&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
    &lt;span class="na"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvasWidth&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;canvasHeight&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;transform&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;scale(1)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transformOrigin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top left&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; 
    &lt;span class="na"&gt;pixelRatio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
    &lt;span class="na"&gt;cacheBust&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="c1"&gt;// Draw Canvas from DOM&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;toCanvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;node&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;// Save in the selected format (WebP/JPEG) with the desired quality&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toDataURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exportFormat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;qualityDecimal&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;capturedImages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataUrl&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Pack all slides into a ZIP archive&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;zip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;JSZip&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;capturedImages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;base64Data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;,&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nx"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`smm-slide-&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.webp`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;base64Data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;base64&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;zip&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generateAsync&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;blob&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks to this, we get perfect text quality, flexibility of CSS filters, and fast export of the entire carousel.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-editor-interface.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-editor-interface.webp" title="SMM Turbo working area: flexible typography settings and layers" alt="SMM Turbo editor interface with tools" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🌍 Multilingualism with Runes: On-the-Fly Localization
&lt;/h2&gt;

&lt;p&gt;As the project expanded, there was a need to add an English version of the interface and landing page to attract an international audience. In the React or Vue ecosystem, you'd typically install heavy libraries like &lt;code&gt;i18next&lt;/code&gt; for this. But in Svelte 5, we can do it much more elegantly thanks to "runes".&lt;/p&gt;

&lt;p&gt;I created a simple localization service based on the reactive &lt;code&gt;$state&lt;/code&gt;, which instantly repaints the entire interface when the language changes, without resetting any unsaved changes on the carousel canvas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// src/lib/i18n/i18n.svelte.ts&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;I18nService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$state&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;uk&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Reactive language state&lt;/span&gt;

    &lt;span class="nf"&gt;t&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;translations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nf"&gt;setLocale&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newLocale&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newLocale&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;localStorage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setItem&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;smm_lang&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newLocale&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;i18n&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;I18nService&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because &lt;code&gt;locale&lt;/code&gt; is a &lt;code&gt;$state&lt;/code&gt;, any component using &lt;code&gt;i18n.t('key')&lt;/code&gt; will instantly update as soon as the language changes. This also made it painless to set up automatic language detection: if a person enters the editor from an English or German browser, the script immediately reads &lt;code&gt;navigator.language&lt;/code&gt; and automatically turns on the English version of the interface.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-i18n-runes.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-i18n-runes.webp" title="Implementation of reactive multilingualism using Svelte 5 runes" alt="Svelte 5 localization service code" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🪄 AI Magic: In-Browser background removal
&lt;/h2&gt;

&lt;p&gt;A cool graphic editor for creating Instagram carousels in 2026 can't exist without built-in artificial intelligence. &lt;/p&gt;

&lt;p&gt;Usually, services ask for money for background removal, because they send your photo to remote powerful servers with GPU. I decided to make this process local and free!&lt;/p&gt;

&lt;p&gt;I used the incredible &lt;code&gt;@imgly/background-removal&lt;/code&gt; library. This is a real revolution! The neural network is loaded in WebAssembly (WASM) format directly into your browser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handleRemoveBackground&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;isRemovingBg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;imgly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@imgly/background-removal&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;removeBg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;imgly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;removeBackground&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;// AI works directly on the user's device&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;imageBlob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;removeBg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageBlob&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;selected&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;alert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Failed to remove background.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;finally&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;isRemovingBg&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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You just select a photo, click the "Remove Background" button, and your computer perfectly cuts out the main object in a couple of seconds. No limits, subscriptions, or transferring confidential photos to third-party servers.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/integrate-ai-groq-api/" rel="noopener noreferrer"&gt;How to integrate AI into your web application using Groq API&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🤖 Hybrid AI Co-Pilot: Combining Gemma 4 and Llama 3.1
&lt;/h2&gt;

&lt;p&gt;In addition to working with images, I added a powerful text AI assistant. But during development, I faced a classic problem: quick tasks (like idea generation) require minimal latency, while deep analytics (strategy development) require powerful "heavy" models that take longer to think.&lt;/p&gt;

&lt;p&gt;Therefore, I created a &lt;strong&gt;Hybrid Engine&lt;/strong&gt; that automatically routes requests:&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-hybrid-ai-interface.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-hybrid-ai-interface.webp" title="AI Co-Pilot interface with mode selection and model status" alt="Hybrid AI Co-Pilot interface" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🧙‍♂️ &lt;strong&gt;Alchemist&lt;/strong&gt;, 🎨 &lt;strong&gt;Artist&lt;/strong&gt;, and 💬 &lt;strong&gt;To Canvas&lt;/strong&gt; (Cloud Fast Mode) run through the ultra-fast API from &lt;strong&gt;Groq&lt;/strong&gt; powered by the &lt;strong&gt;Llama 3.1 8B&lt;/strong&gt; model. This model is perfect for micro-tasks. You ask for a clickbait headline, the AI instantly gives you 3 options, and you add the text directly to the current slide with one click.&lt;/li&gt;
&lt;/ol&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-fast-cloud-llama.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-fast-cloud-llama.webp" title="To Canvas mode result: fast headline generation" alt="Fast generation by Llama 3.1" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🧠 &lt;strong&gt;SMM Strategist&lt;/strong&gt; (Cloud Reasoning Mode) is our "heavy artillery". It works directly through the &lt;strong&gt;Google API&lt;/strong&gt; powered by the cutting-edge &lt;strong&gt;Gemma 4 31B&lt;/strong&gt; model. This mode conducts a deep analysis of the topic and provides a ready-made 5-slide carousel structure (Hook, Pain, Solution, Proof, CTA).&lt;/li&gt;
&lt;/ol&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fgemma-4-smm-strategist-result.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fgemma-4-smm-strategist-result.webp" title="Carousel structure generated by the Gemma 4 31B model" alt="SMM Strategist result" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bypassing Free Server Limits (Edge Functions)
&lt;/h3&gt;

&lt;p&gt;To give the "Strategist" enough time to think so the Netlify server wouldn't drop the connection due to the standard 10-second timeout (the infamous 502 Bad Gateway error), I moved this API route to the &lt;strong&gt;Edge architecture&lt;/strong&gt;, which allows up to 30 seconds for execution. I also completely abandoned the "heavy" official SDKs in favor of native &lt;code&gt;fetch&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Here is the real backend code (&lt;code&gt;src/routes/api/ai/+server.ts&lt;/code&gt;) that drives this hybrid magic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;json&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@sveltejs/kit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;GROQ_API_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;GOOGLE_AI_API_KEY&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;$env/static/private&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 

&lt;span class="c1"&gt;// Switching to Edge runtime to bypass Netlify's 10-second limit&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;edge&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;POST&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
        &lt;span class="c1"&gt;// 🧠 STRATEGIST MODE: Direct call to Gemma 4 31B&lt;/span&gt;
        &lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;strategist&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;systemInstruction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`You are a Senior SMM Strategist. Create a detailed 5-slide Instagram carousel structure based on the user's topic: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;".\nFormat:\nSlide 1 (Hook): [Headline &amp;amp; Visual]\nSlide 2 (Pain): [Problem]\nSlide 3 (Solution): [How to solve]\nSlide 4 (Proof): [Benefits]\nSlide 5 (CTA): [Action]\nLanguage: English. Be concise.`&lt;/span&gt;
                &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Ти — Senior SMM-стратег. Розроби структуру Instagram-каруселі на 5 слайдів для теми: "&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;".\nФормат:\nСлайд 1 (Гачок): [Заголовок та візуал]\nСлайд 2 (Біль): [Проблема]\nСлайд 3 (Рішення): [Як вирішити]\nСлайд 4 (Докази/Користь): [Переваги]\nСлайд 5 (Заклик): [Дія]\nВідповідай ВИКЛЮЧНО українською. Будь лаконічним.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;googleRes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://generativelanguage.googleapis.com/v1beta/models/gemma-4-31b-it:generateContent?key=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;GOOGLE_AI_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                    &lt;span class="na"&gt;contents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;systemInstruction&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
                    &lt;span class="na"&gt;generationConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;maxOutputTokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;googleRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Google API Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;googleRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;googleData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;googleRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;googleData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;candidates&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
        &lt;span class="c1"&gt;// ⚡ FAST MODES: Lightning-fast Llama 3.1 via Groq&lt;/span&gt;
        &lt;span class="c1"&gt;// ==========================================&lt;/span&gt;
        &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;systemMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;systemMessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;locale&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`You are a creative copywriter. Generate exactly 3 short text options. Start each with 🔹. No intro! Language: English.`&lt;/span&gt;
                &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Надай рівно 3 коротких варіанти тексту. Кожен починається з 🔹. Без вступних слів! Мова: українська.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt; 
        &lt;span class="c1"&gt;// ... (additional configurations for other modes)&lt;/span&gt;

        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groqRes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[https://api.groq.com/openai/v1/chat/completions](https://api.groq.com/openai/v1/chat/completions)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;GROQ_API_KEY&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;llama-3.1-8b-instant&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;messages&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="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;system&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;systemMessage&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
                    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;role&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;user&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
                &lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="na"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1024&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="nx"&gt;groqRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&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;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Groq API Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;groqRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;groqData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;groqRes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;result&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;groqData&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Failed to generate response.&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="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;Additionally, the editor has a convenient help section that transparently explains to users how this hybrid system works, and how they can activate Edge AI (local execution) for maximum privacy:&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-ai-info-modal.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsmm-turbo-ai-info-modal.webp" title="Help modal window describing AI modes" alt="Hybrid intelligence help" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🔄 State Management: Svelte 5 Magic
&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges in developing a graphic editor is state management (State Management). We need to store the position of each element, manage the active slide, and implement the undo/redo function.&lt;/p&gt;

&lt;p&gt;Thanks to the new runes in Svelte 5 (&lt;code&gt;$state&lt;/code&gt;), creating such a global storage has become incredibly elegant. I created a &lt;code&gt;state.svelte.ts&lt;/code&gt; file, where I described the &lt;code&gt;editor&lt;/code&gt; object:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;createEditorState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$state&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;carousel&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;canvasFormat&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1:1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;currentSlides&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="na"&gt;elements&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="na"&gt;backgroundOverlay&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt;
        &lt;span class="na"&gt;activeSlideIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;selectedId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;history&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
        &lt;span class="na"&gt;historyIndex&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

        &lt;span class="kd"&gt;get&lt;/span&gt; &lt;span class="nf"&gt;activeSlide&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentSlides&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activeSlideIndex&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;

        &lt;span class="nf"&gt;saveState&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c1"&gt;// Logic for saving steps for Undo/Redo&lt;/span&gt;
            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;historyIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;historyIndex&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentSlides&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
            &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;historyIndex&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="nf"&gt;undo&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="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;historyIndex&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;historyIndex&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currentSlides&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;history&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;historyIndex&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createEditorState&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every time an element's coordinates change (Drag &amp;amp; Drop), &lt;code&gt;editor.saveState()&lt;/code&gt; is called, which adds a new snapshot of the data to the history array. Now the user can safely press &lt;code&gt;Ctrl+Z&lt;/code&gt;, and the system will instantly revert the changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Storage and Integration with Stocks
&lt;/h2&gt;

&lt;p&gt;So that users don't lose their masterpieces after closing the tab, I connected a backend based on &lt;strong&gt;Supabase&lt;/strong&gt; (PostgreSQL + Auth + Storage). &lt;/p&gt;

&lt;p&gt;Authorization takes a few seconds. After that, all your projects are automatically saved to the cloud database. To upload your own images, I use &lt;em&gt;Supabase Storage&lt;/em&gt;, generating unique file names so they don't overwrite each other.&lt;/p&gt;

&lt;p&gt;I also integrated the free photo stock &lt;strong&gt;Pixabay&lt;/strong&gt;. The user can directly in the editor enter a search query in English (e.g., &lt;em&gt;dark space, aesthetic coffee&lt;/em&gt;), get a grid of results through the Pixabay API, and with one click set the image as the slide background or add it as a separate element.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/wordpress-com-design-global-styles-css/" rel="noopener noreferrer"&gt;Full design control on WordPress.com: Global Styles and custom CSS&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Creating your own technical product is always a challenge, but it's an incredible experience. &lt;strong&gt;SMM Turbo&lt;/strong&gt; grew from a simple idea for personal needs into a full-fledged &lt;strong&gt;graphic editor for creating Instagram carousels&lt;/strong&gt;, capable of closing 90% of a marketer's or developer's daily tasks.&lt;/p&gt;

&lt;p&gt;A lightning-fast interface on Svelte 5, powerful artificial intelligence "under the hood", seamless background removal, and complete freedom of action (without annoying watermarks or limits) make it a great alternative to paid monopolists.&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;Want to try this magic for yourself?&lt;/strong&gt; My editor is completely free and already available for testing. Go to the platform and create your first conversion carousels faster than AI! &lt;/p&gt;

&lt;p&gt;And if you want to support the project, you can always treat me to a coffee through the link in the editor itself. 😉&lt;/p&gt;




&lt;blockquote&gt;
&lt;h3&gt;
  
  
  🚀 Try SMM Turbo right now
&lt;/h3&gt;

&lt;p&gt;No subscriptions, payments, or hidden fees. Experience the speed of Svelte 5 and the intelligence of Gemma 4.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://smm.shcho-i-yak.pp.ua" rel="noopener noreferrer"&gt;👉 Open SMM Turbo Editor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Gemma 4 and Pressable MCP: safe AI hosting in Linux terminal</title>
      <dc:creator>Aribu js</dc:creator>
      <pubDate>Wed, 13 May 2026 07:37:13 +0000</pubDate>
      <link>https://forem.com/digital-abetka/gemma-4-and-pressable-mcp-safe-ai-hosting-in-linux-terminal-5aj9</link>
      <guid>https://forem.com/digital-abetka/gemma-4-and-pressable-mcp-safe-ai-hosting-in-linux-terminal-5aj9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Transparency:&lt;/strong&gt; this article contains affiliate links. If you purchase hosting through my link, I will receive a small commission at no additional cost to you.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/gemma4"&gt;Gemma 4 Challenge: Write About Gemma 4&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: My Tokens Are Flying to Google Cloud
&lt;/h2&gt;

&lt;p&gt;A few weeks ago, I shared how I set up &lt;strong&gt;Gemini CLI for managing Pressable servers&lt;/strong&gt; directly from the Fedora terminal: no browser, no extra clicks - just commands, and the server infrastructure obeys.&lt;/p&gt;

&lt;p&gt;But the euphoria quickly turned into a question: "Where are my confidential tokens being processed?"&lt;/p&gt;

&lt;p&gt;The access key to the production server was flying to Google Cloud. Logs, PHP versions, site structure - everything was passing through someone else's data center. It's like giving your apartment keys to your neighbors: they might be decent people, but it's more peaceful when the keys are only with you. 😎&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt; I switched to &lt;strong&gt;Gemma 4&lt;/strong&gt; - an open model from Google with an Apache 2.0 license, which gives full control over the data. And I found a hybrid approach for those whose laptop physically can't handle 32 GB of RAM: I run Gemma 4 through Google AI Studio, getting all the power of the model without expensive hardware.&lt;/p&gt;




&lt;h2&gt;
  
  
  Gemini CLI vs Gemma 4: Comparison for DevOps
&lt;/h2&gt;

&lt;p&gt;Before diving into the terminal, let's put the dots over the "i". Here are the key criteria that influenced my choice:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Gemini (Cloud)&lt;/th&gt;
&lt;th&gt;Gemma 4 (API / Local)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Confidentiality&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data is transmitted to Google servers 😟&lt;/td&gt;
&lt;td&gt;Data does not leave the perimeter. Even through the Google AI Studio API, it is not used for training 🛡️&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;License&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Proprietary 🔒&lt;/td&gt;
&lt;td&gt;Apache 2.0 - free commercial use, modification, distribution 🔓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Context Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Up to 1 million tokens 🚀&lt;/td&gt;
&lt;td&gt;128K tokens - enough for analyzing large server logs ✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Advanced Thinking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes 💡&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;thinking: true&lt;/code&gt; - models 26B and 31B have a thinking mode, ideal for diagnostics 🧠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Paid after limits are exhausted 💸&lt;/td&gt;
&lt;td&gt;Free tier in AI Studio 🆓&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Autonomy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires internet ☁️&lt;/td&gt;
&lt;td&gt;Can work fully offline on your own server 🏠&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Customization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited ⛔&lt;/td&gt;
&lt;td&gt;Full freedom: fine-tuning, running on your own hardware ⚙️&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For managing WordPress hosting through &lt;strong&gt;Pressable MCP&lt;/strong&gt;, I chose &lt;strong&gt;Gemma 4 31B (Dense)&lt;/strong&gt; - the most powerful model in the lineup with &lt;code&gt;thinking: true&lt;/code&gt;, capable of analyzing complex API responses and making informed decisions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/pressable-mcp-gemini-cli-linux" rel="noopener noreferrer"&gt;AI WordPress Hosting Management via Linux CLI&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Step 1: Creating an API Key for Gemma 4 in Google AI Studio
&lt;/h2&gt;

&lt;p&gt;Any path begins with the first step. We will receive the access key not in Google Cloud, but in &lt;strong&gt;Google AI Studio&lt;/strong&gt; - this is free and does not require a bank card.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;aistudio.google.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;In the left menu, select &lt;strong&gt;API Keys&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create API key&lt;/strong&gt; and select a project (or create a new one, for example, &lt;code&gt;Pressable Gemma 4 Agent&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Copy the generated key&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;IMPORTANT:&lt;/strong&gt; the key will be shown only once. Save it immediately.&lt;/p&gt;
&lt;/blockquote&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%2Fgzu1yplp4hoq8cbk2vn7.webp" 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%2Fgzu1yplp4hoq8cbk2vn7.webp" alt="Screenshot of Google AI Studio with the selection of the Pressable Gemma 4 Agent project" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, export the key to an environment variable in the Fedora terminal:&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;export &lt;/span&gt;&lt;span class="nv"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"AIzaSy...your_new_key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 2: First Run of Gemma 4 in the Linux Terminal
&lt;/h2&gt;

&lt;p&gt;The most interesting moment - checking if the model responds. We use &lt;code&gt;gemini-cli&lt;/code&gt;, explicitly specifying the model through the &lt;code&gt;--model&lt;/code&gt; parameter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini &lt;span class="nt"&gt;--model&lt;/span&gt; models/gemma-4-31b-it &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Say hello from Gemma 4 31B"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello! Gemma 4 31B here. How can I help you today?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model works! 🤖&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%2Frx7g83ditvg94ky6ghc7.webp" 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%2Frx7g83ditvg94ky6ghc7.webp" alt="Terminal with a successful first run of Gemma 4 31B" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Connecting Pressable MCP to Gemma 4
&lt;/h2&gt;

&lt;p&gt;Now, the main thing: connect Gemma 4 to &lt;strong&gt;Pressable MCP&lt;/strong&gt;, so that the model can directly manage hosting through the &lt;strong&gt;Model Context Protocol&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1. Removing the Old Configuration
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini mcp remove pressable
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2. Adding the Pressable MCP Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini mcp add pressable https://mcp.pressable.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3. Specifying the Authorization Token
&lt;/h3&gt;

&lt;p&gt;Open the configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /mnt/DATA/pressable-mcp-project/.gemini/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add the Pressable Access Token to the &lt;code&gt;headers&lt;/code&gt; section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pressable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://mcp.pressable.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_PRESSABLE_ACCESS_TOKEN"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.4. Checking the Connection Status
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini mcp list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We see the desired green status - &lt;strong&gt;Connected!&lt;/strong&gt; 🟢&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%2Frejlfwzlhfua8mosr1f9.webp" 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%2Frejlfwzlhfua8mosr1f9.webp" alt="Successful connection of Pressable MCP to Gemma 4 in the terminal" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Gemma 4 as an AI Administrator of the Server
&lt;/h2&gt;

&lt;p&gt;Launch an interactive chat with Gemma 4:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini chat &lt;span class="nt"&gt;-m&lt;/span&gt; models/gemma-4-31b-it
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give a combat task (in English - this is how the API works most accurately):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; Please list all the sites on my Pressable account
  and tell me the PHP version of shchoiyak-sandbox.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, the magic of the &lt;strong&gt;Model Context Protocol&lt;/strong&gt; happens: Gemma 4 understands that it needs the &lt;code&gt;search_sites&lt;/code&gt; tool and requests permission to execute it. Choose &lt;strong&gt;Allow once&lt;/strong&gt; or &lt;strong&gt;Allow all server tools for this session&lt;/strong&gt;.&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%2Fw0lx4g52x5607ygkd70b.webp" 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%2Fw0lx4g52x5607ygkd70b.webp" alt="Gemma 4 requests permission to use the search_sites tool through Pressable MCP" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The model receives raw JSON from the Pressable API, analyzes it thanks to the &lt;code&gt;thinking: true&lt;/code&gt; mode, and provides a clear response:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Domain&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;     &lt;span class="s"&gt;shchoiyak-sandbox.mystagingwebsite.com&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;PHP Version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8.5&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;State&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;       &lt;span class="s"&gt;live&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;Datacenter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;BUR (Burbank, CA)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Ft05d0olc8mdphun2w8z4.webp" 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%2Ft05d0olc8mdphun2w8z4.webp" alt="Gemma 4's response with detailed information about the site on Pressable" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; without any browser and login to the control panel - all critical information is right in the terminal.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion: Why Gemma 4 for DevOps is the Right Choice
&lt;/h2&gt;

&lt;p&gt;Switching from Gemini CLI to &lt;strong&gt;Gemma 4 + Pressable MCP&lt;/strong&gt; is not just a model replacement. It's a fundamental change in approach to &lt;strong&gt;security and control over data&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Confidential tokens do not leave your perimeter&lt;/li&gt;
&lt;li&gt;✅ Apache 2.0 license - complete freedom for commercial projects&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;thinking: true&lt;/code&gt; mode for deep analysis of server logs&lt;/li&gt;
&lt;li&gt;✅ Free access through Google AI Studio&lt;/li&gt;
&lt;li&gt;✅ Ability to work fully offline on your own server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, running &lt;strong&gt;Gemma 4 31B&lt;/strong&gt; locally requires a powerful server. But even through Google AI Studio, it's free, secure, and preserves the main thing - openness and independence.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try Pressable for Your WordPress Projects
&lt;/h2&gt;

&lt;p&gt;Want to manage servers like a real AI-ninja? Refuse routine clicking and switch to infrastructure created by the same people who write the WordPress core.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://automattic.pxf.io/c/6341363/3864277/22744" rel="noopener noreferrer"&gt;Try AI management from Pressable today&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if you need fast and stylish creatives for your new site's social media - use the free graphic editor &lt;strong&gt;&lt;a href="https://smm.shcho-i-yak.pp.ua" rel="noopener noreferrer"&gt;SMM Turbo&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>AI WordPress Hosting Management via Linux CLI</title>
      <dc:creator>Aribu js</dc:creator>
      <pubDate>Sat, 02 May 2026 07:25:46 +0000</pubDate>
      <link>https://forem.com/digital-abetka/ai-wordpress-hosting-management-via-linux-cli-1gh6</link>
      <guid>https://forem.com/digital-abetka/ai-wordpress-hosting-management-via-linux-cli-1gh6</guid>
      <description>&lt;p&gt;Hello DEV community! 👋 I'll start with the most important thing (and mandatory for transparency): &lt;em&gt;this article contains affiliate links. If you decide to buy hosting through my link, I'll receive a small commission that will help support this blog, and you'll get an incredibly powerful platform. Win-win!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you're a professional developer, a WordPress agency owner, or just a geek who loves maximum automation, you definitely know this pain: endless tab switching. You write code in the terminal, then jump into the browser, log in to the hosting control panel, find the necessary site, check the PHP version, look at the logs... It's horribly disrupting your flow.&lt;/p&gt;

&lt;p&gt;But what if your terminal became smart? What if you could just ask the AI to make infrastructure changes? The Pressable company has just rolled out a real technological bomb - &lt;strong&gt;AI-powered hosting management from Pressable&lt;/strong&gt; through the innovative Model Context Protocol (MCP).&lt;/p&gt;

&lt;p&gt;Today, I'll share my real, "battle-tested" experience of setting up this feature. This will be a deep, practical guide: from deploying a test site to connecting Gemini CLI in the Fedora Linux console, with a detailed analysis of typical errors and their elegant workarounds. Let's go! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;h2&gt;What is Pressable and what's Automattic got to do with it?&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;Before diving into the terminal, it's worth understanding what we're working with. If you've been in web development for a long time, you know the company &lt;strong&gt;Automattic&lt;/strong&gt;. They're the giants behind &lt;strong&gt;&lt;a href="https://automattic.pxf.io/EEARXD" rel="noopener noreferrer"&gt;WordPress.com&lt;/a&gt;&lt;/strong&gt;, WooCommerce, Tumblr, and Jetpack.&lt;/p&gt;

&lt;p&gt;Pressable is their premium platform for &lt;strong&gt;Managed WordPress Hosting&lt;/strong&gt;. It's not just another "piece of server", it's an elite infrastructure created by the same people who write the WordPress core. There's no traditional cPanel; instead, the platform offers a custom, ultra-fast architecture, Edge Caching, and unprecedented stability, making it an ideal choice for large WooCommerce stores and high-load agencies.&lt;/p&gt;

&lt;p&gt;And now, this infrastructure has received native AI support.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;h2&gt;What is MCP and why is it a game-changer?&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; is an open standard with open-source code. It allows AI to securely and standardizedly connect to external databases, APIs, and tools.&lt;/p&gt;

&lt;p&gt;Pressable has integrated this protocol directly into their server architecture. Now, you can manage your WordPress sites through Claude Desktop, ChatGPT, or local AI terminals (like Gemini CLI), using ordinary human language.&lt;/p&gt;

&lt;p&gt;That's why this is critically important for modern workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No context-switching:&lt;/strong&gt; Ask for logs, create backups, change PHP versions, and manage plugins without leaving your favorite AI tool.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open standard:&lt;/strong&gt; This is not a closed "proprietary" magic that binds you to one service. You choose which AI to use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free for all:&lt;/strong&gt; This powerful AI integration is available on all Pressable plans without any additional fees.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/posts/svelte-5-ecosystem-review/" rel="noopener noreferrer"&gt;Review of the Svelte 5 ecosystem: What's new and why you should switch&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;h2&gt;Step 1: Preparing the platform and creating an API&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;Any experiment starts with a testing ground. After logging in to the Pressable panel, I created a new site - &lt;code&gt;shchoiyak-sandbox&lt;/code&gt; - in a matter of seconds. This is an ideal environment for testing scripts without risking the main project.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-sandbox-creation.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-sandbox-creation.webp" title="Deploying a test WordPress environment in Pressable" alt="Creating a test site shchoiyak-sandbox in the Pressable panel" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, we need a key for access. We go to the &lt;strong&gt;API Applications&lt;/strong&gt; section in the profile settings. There, I generated a &lt;strong&gt;Client ID&lt;/strong&gt; and &lt;strong&gt;Client Secret&lt;/strong&gt;. These keys will become our digital bridge between the local terminal and Automattic's servers.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-api-keys.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-api-keys.webp" title="Obtaining Client ID and Client Secret for API access" alt="Generating API Application keys in the Pressable panel" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;h2&gt;Step 2: Setting up the Linux environment and Google keys&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;For this case, I'm using the Fedora distribution with the KDE Plasma shell. To avoid cluttering the system with global packages, I follow the isolation rule: we create a separate workspace on the &lt;code&gt;DATA&lt;/code&gt; disk specifically for our AI assistant.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /mnt/DATA/pressable-mcp-project
&lt;span class="nb"&gt;cd&lt;/span&gt; /mnt/DATA/pressable-mcp-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, I encountered the first interesting nuance, which is worth warning about. To run Gemini CLI, you need an API key from Google. I had an old key generated in Google Cloud (with a &lt;em&gt;Free trial&lt;/em&gt; status). And it gave me an &lt;code&gt;API Error: Content generator not initialized&lt;/code&gt; error.&lt;/p&gt;

&lt;p&gt;Why? Because when the 90-day trial in Cloud ends, Google "freezes" access. The secret lies in generating a key directly in the &lt;a href="https://aistudio.google.com/app/apikey" rel="noopener noreferrer"&gt;&lt;strong&gt;Google AI Studio&lt;/strong&gt;&lt;/a&gt; (with a &lt;em&gt;Free tier&lt;/em&gt; status), which is completely free and doesn't require a bank card.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-google-keys.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-google-keys.webp" title="It's essential to use the correct Free tier key from AI Studio" alt="Comparing the status of Free trial and Free tier keys in Google AI Studio" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After obtaining the correct key, I saved it in the system so it wouldn't get lost during sessions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini config &lt;span class="nb"&gt;set &lt;/span&gt;api_key &lt;span class="s2"&gt;"AIzaSy...working_key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;h2&gt;Step 3: Pitfall 1 - 404 Error and npm&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;Next, we initialize the bridge. The idea was simple: add the MCP server via the &lt;code&gt;npx&lt;/code&gt; package manager, as described in the platform's early documentation.&lt;/p&gt;

&lt;p&gt;I entered the command:&lt;br&gt;
&lt;code&gt;gemini mcp add pressable npx -y @pressable/mcp-server&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And immediately got a red text in the terminal: &lt;strong&gt;&lt;code&gt;npm error 404 Not Found&lt;/code&gt;&lt;/strong&gt;. The package simply disappeared from the official registry! As it turned out, Pressable's developers are rapidly evolving; they've updated the security architecture, and this old method of package distribution is no longer supported.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-npm-error.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-npm-error.webp" title="Typical error of outdated documentation: package not found" alt="404 error when trying to install the outdated @pressable/mcp-server package" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/posts/integrate-ai-groq-api/" rel="noopener noreferrer"&gt;How to integrate AI into your web application using the Groq API&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  &lt;h2&gt;Step 4: Pitfall 2 - OAuth and stdio issue&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;Searching for an up-to-date workaround, I found their new utility &lt;code&gt;mcp-remote&lt;/code&gt;. This approach uses modern, secure OAuth authorization (like logging in through Google or Facebook).&lt;/p&gt;

&lt;p&gt;I ran the command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; mcp-remote@latest &lt;span class="o"&gt;[&lt;/span&gt;https://mcp.pressable.com/sse]&lt;span class="o"&gt;(&lt;/span&gt;https://mcp.pressable.com/sse&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The system worked incredibly smartly: it launched a local server on port &lt;code&gt;25181&lt;/code&gt;, automatically opened my browser, asked me to confirm access to my Pressable account (Authorize), successfully saved the access token, and... the MCP server still showed a &lt;code&gt;Disconnected&lt;/code&gt; status in Gemini CLI!&lt;/p&gt;

&lt;p&gt;Why did this magic end in disappointment? Because terminal agents (like our Gemini CLI) communicate with MCP servers through an extremely strict &lt;code&gt;stdio&lt;/code&gt; protocol. They expect an ideally clean data stream in JSON format. And the &lt;code&gt;mcp-remote&lt;/code&gt; script during authorization prints human-readable text ("Opening browser...", "Port 25181...") to the terminal, which completely "pollutes" and breaks the communication channel for the AI.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-disconnected.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-disconnected.webp" title="Conflict between stdio protocol and browser authorization script" alt="Disconnected MCP server status due to stdio protocol conflict" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;h2&gt;Step 5: The correct solution - Direct connection via SSE&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;In fact, Pressable's engineers have anticipated this scenario. They've created an ideal option specifically for terminal bots - &lt;strong&gt;direct connection via SSE&lt;/strong&gt; (Server-Sent Events), which doesn't require any crutches like npm packages or browser openings.&lt;/p&gt;

&lt;p&gt;Here's my tested step-by-step plan to get it working from the first try:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Log in to the &lt;strong&gt;&lt;a href="https://automattic.pxf.io/c/6341363/3864277/22744" rel="noopener noreferrer"&gt;my.pressable.com&lt;/a&gt;&lt;/strong&gt; panel.&lt;/li&gt;
&lt;li&gt;Go to the &lt;strong&gt;Tools → Pressable MCP&lt;/strong&gt; section and generate a new, single &lt;strong&gt;Access Token&lt;/strong&gt; (a long string of characters).&lt;/li&gt;
&lt;li&gt;In your terminal (while in the isolated project folder), add the server directly:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gemini mcp add pressable &lt;span class="o"&gt;[&lt;/span&gt;https://mcp.pressable.com]&lt;span class="o"&gt;(&lt;/span&gt;https://mcp.pressable.com&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nt"&gt;--transport&lt;/span&gt; sse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you need to securely "feed" your Access Token to the AI agent. Gemini CLI stores its local settings in a hidden file &lt;code&gt;.gemini/settings.json&lt;/code&gt;. Open it with any editor (e.g., &lt;code&gt;nano&lt;/code&gt; or &lt;code&gt;kate&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano .gemini/settings.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And add your token to the &lt;code&gt;headers&lt;/code&gt; block with the mandatory &lt;code&gt;Bearer&lt;/code&gt; prefix. The file should look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"pressable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"[https://mcp.pressable.com](https://mcp.pressable.com)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer YOUR_LONG_ACCESS_TOKEN_HERE"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="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;Save the file, check the status with the command &lt;code&gt;gemini mcp list&lt;/code&gt;, and finally see the desired green &lt;strong&gt;Connected&lt;/strong&gt; indicator! Our bridge between AI and hosting is officially built.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-connected-success.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-connected-success.webp" title="Green light: direct SSE connection works perfectly" alt="Successful connection of the MCP server with a Connected status" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;h2&gt;Step 6: AI-Sysadmin in action - Site management&lt;/h2&gt;
&lt;/h2&gt;

&lt;p&gt;Now, the most delicious part. We launch the interactive chat with the command &lt;code&gt;gemini chat&lt;/code&gt; and give our agent a task in ordinary, natural English (the API works best with it):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;gt; Please list all the sites on my Pressable account and tell me the PHP version of shchoiyak-sandbox.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here, another cool feature of the MCP protocol itself is vividly demonstrated. The AI doesn't silently "take control" of your servers. It analyzes the request, understands that it needs the &lt;code&gt;get_account_site_counts&lt;/code&gt; tool from Pressable, and &lt;strong&gt;asks for your permission&lt;/strong&gt; to execute it (Action Required). I choose the option "Allow all server tools for this session" to give it a carte blanche for the current session.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-action-required.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-action-required.webp" title="AI always asks for confirmation before accessing the hosting API" alt="Gemini CLI request for permission to use server tools" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The agent receives raw, complex machine JSON from the Pressable API, filters it with its "brains" in milliseconds, and outputs a beautiful, structured response directly to the terminal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domain:&lt;/strong&gt; &lt;a href="https://shchoiyak-sandbox.mystagingwebsite.com" rel="noopener noreferrer"&gt;shchoiyak-sandbox.mystagingwebsite.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP Version:&lt;/strong&gt; 8.5&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State:&lt;/strong&gt; live&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Datacenter:&lt;/strong&gt; BUR (Burbank, CA)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-final-result.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fpressable-mcp-final-result.webp" title="MCP magic: human-readable response based on complex infrastructure data" alt="Successful output of PHP version and site data in the console" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Without opening a browser, without passwords, and without navigating through the control panel menu, I got all the critical infrastructure information right in my command line!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/posts/smm-turbo-instagram-editor/" rel="noopener noreferrer"&gt;SMM Turbo: How I created my own editor for Instagram carousels&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;It's essential to understand the realities: Pressable's MCP technology doesn't replace a full-fledged visual hosting control panel for some complex or specific tasks. This is not a "magic button" that will launch your business for you.&lt;/p&gt;

&lt;p&gt;But it's a &lt;strong&gt;groundbreaking tool for optimizing your workflow&lt;/strong&gt; as a developer. The ability to delegate routine tasks (log checks, mass PHP version updates, staging environment deployments, backup management) directly from your IDE or terminal, where you write code, is a savings of dozens of hours of focused time per month. This is the end of the context-switching era.&lt;/p&gt;

&lt;p&gt;🔥 &lt;strong&gt;Want to take your WordPress projects to a radically new level of speed?&lt;/strong&gt;&lt;br&gt;
Ditch the routine and start managing your servers like a true AI ninja.&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;A quick tip from the author:&lt;/strong&gt; If you choose an annual plan, Pressable gives you 2 months absolutely free (you get 12 months of premium hosting for the price of 10). It's by far the smartest way to migrate to elite infrastructure!&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://automattic.pxf.io/c/6341363/3864277/22744" rel="noopener noreferrer"&gt;Try AI hosting management by Pressable today&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And if you need fast, stylish creatives for your website's social media, don't forget to use my free graphic editor &lt;strong&gt;&lt;a href="https://smm.shcho-i-yak.pp.ua" rel="noopener noreferrer"&gt;SMM Turbo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
      <category>ai</category>
      <category>linux</category>
    </item>
    <item>
      <title>Svelte 5 Ecosystem: What's New &amp; Why Switch</title>
      <dc:creator>Aribu js</dc:creator>
      <pubDate>Mon, 27 Apr 2026 09:38:09 +0000</pubDate>
      <link>https://forem.com/digital-abetka/svelte-5-ecosystem-whats-new-why-switch-33m</link>
      <guid>https://forem.com/digital-abetka/svelte-5-ecosystem-whats-new-why-switch-33m</guid>
      <description>&lt;p&gt;Hello DEV community! 👋 If you're a frontend developer, you've probably noticed how quickly trends are changing. Just yesterday, we were arguing about what's better - React or Vue, and today more and more developers are choosing alternative paths. In my previous article, I talked about how I created my own graphic editor, and mentioned that "under the hood" it uses the latest Svelte.&lt;/p&gt;

&lt;p&gt;Today, I want to take a deep &lt;strong&gt;look at the Svelte 5 ecosystem&lt;/strong&gt;. We'll figure out what's changed, where the old compiler "magic" has gone, what runes (Runes) are, and most importantly, &lt;strong&gt;why you should switch&lt;/strong&gt; to this framework right now. Let's go. 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  Why is the Svelte 5 ecosystem the new standard?
&lt;/h2&gt;

&lt;p&gt;For a long time, Svelte 4 was my favorite. It compiled code into vanilla JavaScript, didn't have a virtual DOM, and worked extremely fast. But it had its own "childhood diseases". &lt;/p&gt;

&lt;p&gt;Reactivity was based on the &lt;code&gt;let&lt;/code&gt; keyword and reactive blocks &lt;code&gt;$:&lt;/code&gt;. It looked magical, but as soon as your application became more complex (like my graphic editor), this magic started to confuse. The Svelte 5 ecosystem solved this problem radically.&lt;/p&gt;

&lt;p&gt;The main feature of the fifth version is &lt;strong&gt;Fine-grained reactivity&lt;/strong&gt; based on signals. Now the framework updates only the parts of the DOM that have actually changed, without checking the entire component.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/smm-turbo-instagram-editor/" rel="noopener noreferrer"&gt;SMM Turbo: How I created my own editor for Instagram carousels&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Magic of Runes (Runes): Goodbye, old syntax
&lt;/h2&gt;

&lt;p&gt;The biggest shock for framework veterans is the emergence of runes. The creators of Svelte 5 abandoned the old &lt;code&gt;let&lt;/code&gt; behavior in favor of explicit state indicators.&lt;/p&gt;

&lt;p&gt;What are runes? These are special functions that tell the compiler: "Here we have reactive data". &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;$state()&lt;/code&gt;&lt;/strong&gt; - replacement for the usual &lt;code&gt;let&lt;/code&gt; for reactive variables.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;$derived()&lt;/code&gt;&lt;/strong&gt; - replacement for &lt;code&gt;$:&lt;/code&gt;, used for computed values.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;$effect()&lt;/code&gt;&lt;/strong&gt; - a combination of life cycles (onMount, afterUpdate) that responds to changes in dependencies.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;$props()&lt;/code&gt;&lt;/strong&gt; - replacement for &lt;code&gt;export let&lt;/code&gt;, now props are received as an object.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsvelte-5-runes-code.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsvelte-5-runes-code.webp" title="Comparison of syntax: Svelte 4 vs Svelte 5" alt="Code snippet with Svelte 5 runes" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Look how elegant the code has become. Now reactivity is not tied to &lt;code&gt;.svelte&lt;/code&gt; files. You can extract &lt;code&gt;$state&lt;/code&gt; into a regular &lt;code&gt;.svelte.ts&lt;/code&gt; file (like I did for managing the history of Undo/Redo in SMM Turbo) and import it anywhere. This is a Game Changer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What else is new under the hood?
&lt;/h2&gt;

&lt;p&gt;In addition to runes, the developers have significantly reworked other aspects of the framework to make it more predictable for large enterprise projects.&lt;/p&gt;

&lt;p&gt;Here are the key changes, why it's worth switching to the new version:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Snippets (Snippets):&lt;/strong&gt; Instead of old &lt;code&gt;&amp;lt;slot&amp;gt;&lt;/code&gt;, snippets &lt;code&gt;{#snippet name()}&lt;/code&gt; are now used. This allows you to pass pieces of markup as functions. Much more convenient for creating reusable UI components.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event Handlers:&lt;/strong&gt; Goodbye &lt;code&gt;on:click&lt;/code&gt; directives. Now we use standard &lt;code&gt;onclick={handler}&lt;/code&gt; attributes, like in React. This improves typing and simplifies integration with TypeScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightning speed:&lt;/strong&gt; Thanks to signals under the hood, memory usage has decreased, and rendering speed of complex lists has increased many times.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/wordpress-com-plugins-all-paid-plans/" rel="noopener noreferrer"&gt;Revolution on WordPress.com: 50,000+ plugins now available on all paid plans&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How Svelte 5 helped me create SMM Turbo
&lt;/h2&gt;

&lt;p&gt;When I designed the architecture of SMM Turbo, I needed a framework that could handle hundreds of DOM nodes (layers of text, images, backgrounds) on one screen, and at the same time not slow down during Drag &amp;amp; Drop.&lt;/p&gt;

&lt;p&gt;Thanks to the Svelte 5 ecosystem, I was able to create a global &lt;code&gt;editorState&lt;/code&gt; based on &lt;code&gt;$state&lt;/code&gt; and &lt;code&gt;$derived&lt;/code&gt;. When you drag a title onto the canvas, only the &lt;code&gt;x&lt;/code&gt; and &lt;code&gt;y&lt;/code&gt; coordinates of a specific element are updated. The rest of the interface doesn't even suspect changes and doesn't waste resources on redrawing.&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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsvelte-5-architecture-smm.webp" 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%2Fshcho-i-yak.pp.ua%2Fimages%2Fuploads%2Fsvelte-5-architecture-smm.webp" title="File structure of SMM Turbo and work with global state" alt="Architecture of the application on Svelte 5" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And the transition to &lt;code&gt;onclick&lt;/code&gt; and normal event handling allowed me to easily attach global keyboard listeners (for shortcuts like &lt;code&gt;Ctrl+C&lt;/code&gt; / &lt;code&gt;Ctrl+V&lt;/code&gt;), without creating "crutches".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;We also recommend reading:&lt;/strong&gt; &lt;a href="https://shcho-i-yak.pp.ua/en/posts/integrate-ai-groq-api/" rel="noopener noreferrer"&gt;How to integrate AI into your web application using Groq API&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Conclusion: Is it worth updating?
&lt;/h2&gt;

&lt;p&gt;My verdict is unequivocal - yes. The &lt;strong&gt;Svelte 5 ecosystem&lt;/strong&gt; has become more mature, predictable, and powerful. The transition to runes may seem unusual at first, but as soon as you feel the freedom to extract state beyond components, you'll never want to go back to the old compiler magic. &lt;/p&gt;

&lt;p&gt;If you're looking for a lightweight, fast, and modern tool for your next pet project or startup - this is the perfect choice.&lt;/p&gt;

&lt;p&gt;And to see what this framework is really capable of in the real world, check out my project, which is completely built on the new architecture.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Try SMM Turbo - built on Svelte 5
&lt;/h3&gt;

&lt;p&gt;Free AI editor for Instagram carousels, working lightning-fast right in the browser.&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://smm.shcho-i-yak.pp.ua" rel="noopener noreferrer"&gt;Open SMM Turbo Editor (Free)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>svelte</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
