<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: AK DevCraft</title>
    <description>The latest articles on DEV Community by AK DevCraft (@akdevcraft).</description>
    <link>https://dev.to/akdevcraft</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%2F554959%2F58372a5a-61ca-4837-9390-42e925e9d3f6.jpeg</url>
      <title>DEV Community: AK DevCraft</title>
      <link>https://dev.to/akdevcraft</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/akdevcraft"/>
    <language>en</language>
    <item>
      <title>Installing OpenClaw on Linux - 0$ Personal Agentic AI Assistant - Part 4</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Mon, 01 Jun 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/akdevcraft/installing-openclaw-on-linux-0-personal-agentic-ai-assistant-part-4-1f0</link>
      <guid>https://dev.to/akdevcraft/installing-openclaw-on-linux-0-personal-agentic-ai-assistant-part-4-1f0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Part 4 of the Zero Dollar AI Assistant series- Installing OpenClaw on Linux — Avoiding Every Trap. &lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;Part 1&lt;/a&gt; covers the architecture. &lt;a href="https://dev.to/akdevcraft/personal-ai-assistant-setting-up-free-cloud-server-the-complete-guide-b65"&gt;Part 2&lt;/a&gt; covers Oracle Cloud setup. &lt;a href="https://dev.to/akdevcraft/0-personal-agentic-ai-assistant-running-local-llm-part-3-4k2l"&gt;Part 3&lt;/a&gt; covers Ollama and model selection.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;OpenClaw's documentation assumes a Mac. The install script works on Linux, but several things that work automatically on Mac require manual intervention on a Linux server. This article documents every one of them, the right user to install as, the systemd service traps, the config file quirks, and the silent background token drain that will surprise you on day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install as the Right User
&lt;/h2&gt;

&lt;p&gt;This sounds trivial. It isn't.&lt;/p&gt;

&lt;p&gt;The OpenClaw installer sets up a systemd &lt;strong&gt;user&lt;/strong&gt; service, a service that runs under a specific user account, not as root. If you install as root, the systemd user service won't work correctly, the gateway won't auto-start on boot, and you'll spend time debugging problems that don't exist on a proper install.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always install as a non-root user.&lt;/strong&gt; On Oracle Cloud, that user is &lt;code&gt;ubuntu&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Verify before installing:&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;whoami&lt;/span&gt;
&lt;span class="c"&gt;# Must show: ubuntu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're currently root, exit and SSH back in directly as ubuntu:&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;exit&lt;/span&gt;  &lt;span class="c"&gt;# if su'd to root&lt;/span&gt;
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_rsa ubuntu@YOUR_PUBLIC_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Switching via &lt;code&gt;su - ubuntu&lt;/code&gt; from a root session isn't sufficient; the systemd user session won't be properly initialized, and you'll get "systemd user services unavailable" errors during setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# use tmux — install may take several minutes&lt;/span&gt;
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; openclaw
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://openclaw.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The installer will launch the onboarding wizard automatically on completion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Onboarding Wizard
&lt;/h2&gt;

&lt;p&gt;Work through each step. Key selections for this stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI Provider:&lt;/strong&gt; Ollama&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ollama host:&lt;/strong&gt; &lt;code&gt;http://localhost:11434&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; Select &lt;code&gt;ollama/llama3.2:3b&lt;/code&gt; from the browse list — look for the entry showing &lt;code&gt;(ctx 128K)&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Search provider:&lt;/strong&gt; Skip for now — or select a provider if you have a key. Tavily has a free tier at &lt;a href="https://tavily.com" rel="noopener noreferrer"&gt;tavily.com&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Secret provider:&lt;/strong&gt; No, secrets stored in &lt;code&gt;openclaw.json&lt;/code&gt; directly is fine for a personal server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Skills:&lt;/strong&gt; Skip all for now. Add after verifying the core setup works. One gotcha: the GitHub skill tries to install via Homebrew, which doesn't exist on Linux; skip it here and install the GitHub CLI via &lt;code&gt;apt&lt;/code&gt; afterward.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hooks:&lt;/strong&gt; Skip&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hatch:&lt;/strong&gt; Select "Hatch in terminal". This verifies that the gateway starts correctly before you exit the wizard&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ On first hatch, OpenClaw reads BOOTSTRAP.md from the workspace and prompts you to have a setup conversation with the agent to define its identity and personality. This is intentional — but with a local 3B model, it's very slow. Skip it by creating the files manually (covered below).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Skip the Bootstrap Conversation
&lt;/h2&gt;

&lt;p&gt;The bootstrap flow is designed for interactive use; it has a conversation with you to set the agent's name, personality, and preferences. With a local 3B model, this takes 10-15 minutes of slow back-and-forth.&lt;/p&gt;

&lt;p&gt;Create the required files manually instead:&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="c"&gt;# Create SOUL.md - agent personality and preferences&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.openclaw/workspace/SOUL.md &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
# Soul

## Identity
- Name: Claw
- Vibe: Casual, helpful, direct
- Emoji: 🦞

## User
- Preferred responses: Concise, no fluff
- Direct answers preferred

## Preferences
- Keep responses brief
- No unnecessary preamble
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Create IDENTITY.md&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.openclaw/workspace/IDENTITY.md &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
# Identity
- Name: Claw
- Nature: AI assistant
- Vibe: Casual and helpful
- Emoji: 🦞
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Create USER.md&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.openclaw/workspace/USER.md &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
# User
- Name: Your name here
- Preferred address: Your name
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;# Delete the bootstrap file to clear the pending state&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; ~/.openclaw/workspace/BOOTSTRAP.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Customise the files with your actual name and preferences. Once &lt;code&gt;BOOTSTRAP.md&lt;/code&gt; is deleted, the gateway proceeds normally.&lt;/p&gt;

&lt;h2&gt;
  
  
  Post-Install Configuration
&lt;/h2&gt;

&lt;p&gt;We don’t have to configure all the settings during onboarding; we can pick and configure as we go. That way, we don’t have to worry about having all the information that is needed, like api key or bot token, during onboarding.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create a Telegram Bot and Configure the Channel
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Create your bot via BotFather:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Telegram → search &lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/botfather"&gt;@botfather&lt;/a&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Send &lt;code&gt;/newbot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose a display name (e.g., &lt;code&gt;My AI Assistant&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Choose a username — must end in &lt;code&gt;bot&lt;/code&gt; (e.g., &lt;code&gt;myassistant_bot&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;BotFather replies with your token: &lt;code&gt;12346789:AAFxxx...&lt;/code&gt; — save this&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Add the channel to OpenClaw via the wizard:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw channels add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The wizard walks you through selecting Telegram, entering your bot token, and setting access policies. A few things to watch for during setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When asked about a secret provider — select &lt;strong&gt;No&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;When asked about DM access policy — select &lt;strong&gt;pairing&lt;/strong&gt; (only your approved accounts can talk to the agent)&lt;/li&gt;
&lt;li&gt;When asked to bind accounts to agents — select &lt;strong&gt;Yes&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ The wizard may ask to install the Telegram plugin from npm — this may fail. Telegram is a bundled plugin. If you see this error, run &lt;code&gt;openclaw plugins enable telegram&lt;/code&gt; first, then retry &lt;code&gt;openclaw channels add&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  2. Add Gemini Fallback
&lt;/h3&gt;

&lt;p&gt;Add the Gemini API key you obtained in Part 3 to the systemd service:&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;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/Environment=OPENCLAW_SERVICE_KIND=gateway/a Environment=GEMINI_API_KEY=your_gemini_key_here'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.config/systemd/user/openclaw-gateway.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure Ollama as primary with Gemini as fallback:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;agents.defaults.model.primary &lt;span class="s2"&gt;"ollama/llama3.2:3b"&lt;/span&gt;
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;agents.defaults.model.fallbacks &lt;span class="s1"&gt;'["gemini/gemini-2.5-flash-lite"]'&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;

&lt;span class="c"&gt;# Add available model list&lt;/span&gt;
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;agents.defaults.models &lt;span class="s1"&gt;'{"ollama/llama3.2:1b": {}, "google/gemini-2.5-flash-lite": {}}'&lt;/span&gt; &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Enable Ollama Auto-Discovery
&lt;/h3&gt;

&lt;p&gt;This tells OpenClaw to automatically detect all locally running Ollama models:&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'export OLLAMA_API_KEY=ollama-local'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc

&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/Environment=OPENCLAW_SERVICE_KIND=gateway/a Environment=OLLAMA_API_KEY=ollama-local'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.config/systemd/user/openclaw-gateway.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Disable mDNS
&lt;/h3&gt;

&lt;p&gt;Oracle Cloud doesn't support mDNS/Bonjour, leaving it enabled causes repeated crash-restart cycles:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway stop
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;discovery.mdns.mode off
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;discovery.wideArea.enabled &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Apply Low-Power Optimizations
&lt;/h3&gt;

&lt;p&gt;These reduce startup time and memory overhead:&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; /var/tmp/openclaw-compile-cache
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export OPENCLAW_NO_RESPAWN=1'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc

&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/Environment=OLLAMA_API_KEY/a Environment=NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.config/systemd/user/openclaw-gateway.service
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'/Environment=NODE_COMPILE_CACHE/a Environment=OPENCLAW_NO_RESPAWN=1'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  ~/.config/systemd/user/openclaw-gateway.service

&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Add Gateway Token to CLI
&lt;/h3&gt;

&lt;p&gt;The CLI needs the gateway token to authenticate against the running service:&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="c"&gt;# Get your token&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import json; import os;d=json.load(open(os.path.expanduser('~/.openclaw/openclaw.json'))); print(d['gateway']['auth']['token'])"&lt;/span&gt;

&lt;span class="c"&gt;# Add to bashrc&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export OPENCLAW_TOKEN=your_token_here'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Reload and Restart
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nt"&gt;--user&lt;/span&gt; daemon-reload
openclaw gateway start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Silent Token Drain
&lt;/h2&gt;

&lt;p&gt;This is the most important thing in this article.&lt;/p&gt;

&lt;p&gt;OpenClaw has a background process that runs every 30 minutes — &lt;code&gt;sweepStaleRunContexts&lt;/code&gt; which cleans up expired agent sessions. On a fresh install with default settings, this sweep triggers a Claude API call each time it runs via the &lt;code&gt;startupContext&lt;/code&gt; feature, which loads daily memory on every session reset.&lt;/p&gt;

&lt;p&gt;The result: if you're using the Anthropic API (not Ollama), you'll see API calls every 30 minutes even when nobody is using the assistant. Left overnight, this consumed $2-3 in API credits silently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disable startup context to prevent this:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway stop
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;agents.defaults.contextInjection.startupContext.enabled &lt;span class="nb"&gt;false
&lt;/span&gt;openclaw gateway start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;ℹ️ If you're using Ollama as your primary model with Gemini as a fallback (as set up in this series), this is less of a concern — the sweep uses your local model at zero cost. But if you ever switch to an Anthropic API key as primary, disable this first.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Verifying the Installation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1. Check gateway status:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A healthy output shows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connectivity probe: ok
Capability: read-only
Runtime: running
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;2. Check if the Ollama model has been discovered:
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;/div&gt;



&lt;p&gt;Should show &lt;code&gt;ollama/llama3.2:3b&lt;/code&gt; as configured.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3. Check logs in real time:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw logs &lt;span class="nt"&gt;--follow&lt;/span&gt;

&lt;span class="c"&gt;# You can update logging level as below&lt;/span&gt;
openclaw config &lt;span class="nb"&gt;set &lt;/span&gt;logging.level &lt;span class="s2"&gt;"info"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;systemd user services unavailable&lt;/strong&gt;&lt;br&gt;
You installed as root or switched via &lt;code&gt;su&lt;/code&gt;. Exit completely and SSH back in directly as the &lt;code&gt;ubuntu&lt;/code&gt; user. A proper login session is required for systemd user services.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gateway starts, but Telegram is not connecting&lt;/strong&gt;&lt;br&gt;
The bot token isn't in the config, or the IPv6 issue is causing timeouts. Verify:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; telegram ~/.openclaw/openclaw.json
curl &lt;span class="nt"&gt;-4&lt;/span&gt; https://api.telegram.org/botYOUR_TOKEN/getMe
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CIAO PROBING CANCELLED crash&lt;/strong&gt;&lt;br&gt;
mDNS is not disabled. Follow step 4 in the post-install configuration above.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Config changes disappear after gateway restart&lt;/strong&gt;&lt;br&gt;
The gateway rewrites &lt;code&gt;openclaw.json&lt;/code&gt; on startup. Always stop the gateway before editing the config:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway stop
&lt;span class="c"&gt;# make edits&lt;/span&gt;
openclaw gateway start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Model times out in agent mode but works in &lt;code&gt;ollama run&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
OpenClaw's agent mode adds tool context, memory, and session history to every request — significantly heavier than a bare model call. Switch to &lt;code&gt;llama3.2:3b&lt;/code&gt; if using a larger model, or add Gemini as a fallback to catch timeouts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;HTTP 401 on CLI commands&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;OPENCLAW_TOKEN&lt;/code&gt; environment variable isn't set. Add it to &lt;code&gt;~/.bashrc&lt;/code&gt; (see step 6 above).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Gateway running, Telegram configured, Ollama as primary, Gemini as fallback — all the pieces are in place.&lt;/p&gt;

&lt;p&gt;Part 5 and the final part cover pairing your Telegram account, testing the end-to-end flow, and making the whole setup production-ready for daily use.&lt;/p&gt;

&lt;p&gt;This article is the fourth in a five-part series:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;$0 Personal Agentic AI Assistant - Architecture&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/personal-ai-assistant-setting-up-free-cloud-server-the-complete-guide-b65"&gt;Setting Up Free Cloud Server&lt;/a&gt; — VCN, ARM instances, static IPs, the gotchas &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/0-personal-agentic-ai-assistant-running-local-llm-part-3-4k2l"&gt;Running Ollama on ARM&lt;/a&gt; — model selection, disk management, CPU inference, reality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Installing OpenClaw on Linux&lt;/strong&gt; — avoiding every trap ← you are here&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Complete Setup&lt;/strong&gt; — Telegram, end-to-end testing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stay tuned, all links will be updated as articles are published.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached this point, I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf"&gt;“Skills” in Claude Aren’t About Prompts — They’re About Context Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Trying MCP for the First Time — What Stood Out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents: The Building Block of Agentic AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openclaw</category>
      <category>ai</category>
      <category>llm</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Running Local LLM - 0$ Personal Agentic AI Assistant - Part 3</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Mon, 25 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/akdevcraft/0-personal-agentic-ai-assistant-running-local-llm-part-3-4k2l</link>
      <guid>https://dev.to/akdevcraft/0-personal-agentic-ai-assistant-running-local-llm-part-3-4k2l</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Part 3 of the Zero Dollar personal AI Assistant series, running Local LLMs on a Free Cloud Server — What Actually Works. &lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;Part 1&lt;/a&gt; covers the architecture. &lt;a href="https://dev.to/akdevcraft/personal-ai-assistant-setting-up-free-cloud-server-the-complete-guide-b65"&gt;Part 2&lt;/a&gt; covers free Oracle Cloud setup.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Running a language model locally sounds straightforward until you try it. Download a model, point your app at it, done. In practice, there are real constraints: RAM limits, disk-space surprises, and CPU inference-speed walls that most tutorials gloss over.&lt;/p&gt;

&lt;p&gt;This article is honest about all of it. What works on a free Oracle ARM instance, what doesn't, and how a hybrid local + free API fallback makes the whole thing practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CPU Inference Reality Check
&lt;/h2&gt;

&lt;p&gt;Before picking a model, understand what you're getting into.&lt;/p&gt;

&lt;p&gt;Your Oracle ARM instance has no GPU. Every token generated by a language model runs on CPU cores. This matters because modern LLMs were designed to run on a GPU, the parallel processing architecture that makes inference fast. On the CPU, that parallelism doesn't exist in the same way.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What this means in practice:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model size&lt;/th&gt;
&lt;th&gt;RAM needed&lt;/th&gt;
&lt;th&gt;Tokens/sec on 4 ARM CPUs&lt;/th&gt;
&lt;th&gt;Response time (100 tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;3B parameters&lt;/td&gt;
&lt;td&gt;~2GB&lt;/td&gt;
&lt;td&gt;15-25 tok/s&lt;/td&gt;
&lt;td&gt;4-7 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8B parameters&lt;/td&gt;
&lt;td&gt;~5GB&lt;/td&gt;
&lt;td&gt;5-10 tok/s&lt;/td&gt;
&lt;td&gt;10-20 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14B parameters&lt;/td&gt;
&lt;td&gt;~9GB&lt;/td&gt;
&lt;td&gt;2-5 tok/s&lt;/td&gt;
&lt;td&gt;20-50 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70B parameters&lt;/td&gt;
&lt;td&gt;~40GB&lt;/td&gt;
&lt;td&gt;Won't fit&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a personal assistant responding to Telegram messages, 4-7 seconds for a short response is acceptable. You send a message, put your phone down, and pick it up to respond. Different mental model from a real-time chat UI, but workable.&lt;/p&gt;

&lt;p&gt;The mistake to avoid: pulling a 70B model because it benchmarks well. It needs 40GB RAM minimum and simply won't run on your instance. I learned this the hard way: a partial 42GB download filled the disk before the model even ran.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Ollama
&lt;/h2&gt;

&lt;p&gt;Ollama is the runtime that downloads and runs open-source models locally. Think of it as the music player; the models are the music it plays.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always use tmux before long-running commands:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;If your SSH session drops mid-install, reconnect and &lt;code&gt;tmux attach -t setup&lt;/code&gt; to pick up exactly where you left off. Not using tmux for a bigger size model download is how you end up restarting from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install Ollama:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it's running:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Ollama installs as a systemd service and starts automatically on boot, no manual management needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model Selection
&lt;/h2&gt;

&lt;p&gt;This is where most guides give you a benchmark table and call it done. What actually matters for your use case is the RAM-to-quality tradeoff on CPU hardware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The models that make sense for this stack:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Llama 3.2:3B — The Speed Choice
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull llama3.2:3b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAM:&lt;/strong&gt; ~2GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; 15-25 tokens/second — fastest option&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality:&lt;/strong&gt; Good for everyday tasks, struggles with complex reasoning&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Made by:&lt;/strong&gt; Meta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Quick responses, simple Q&amp;amp;A, drafting short content&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Llama 3.1:8B — The Quality Choice
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull llama3.1:8b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAM:&lt;/strong&gt; ~5GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; 5-10 tokens/second&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality:&lt;/strong&gt; Significantly better reasoning, handles nuanced tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Made by:&lt;/strong&gt; Meta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; More complex tasks where quality matters more than speed&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Phi-4:14B — The Reasoning Choice
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull phi4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAM:&lt;/strong&gt; ~9GB&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed:&lt;/strong&gt; 2-5 tokens/second — noticeably slower&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality:&lt;/strong&gt; Strong reasoning and instruction following, punches above its weight&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Made by:&lt;/strong&gt; Microsoft&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Tasks requiring careful reasoning, analysis, and structured output&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The recommendation for this stack: &lt;code&gt;llama3.2:3b&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not because it's the best model, it isn't. But because OpenClaw's agent mode wraps every model call with tool context, memory, session history, and system prompts. What feels fast in a bare &lt;code&gt;ollama run&lt;/code&gt; test becomes significantly slower when the agent layer adds 2-3KB of context to every request. With that overhead, the 3B model stays within acceptable response times. The 8B model starts hitting timeout issues in agent mode on the CPU.&lt;/p&gt;

&lt;p&gt;If you want better quality and can accept 30-90 second response times for complex queries, &lt;code&gt;llama3.1:8b&lt;/code&gt; is worth trying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disk Space Management
&lt;/h2&gt;

&lt;p&gt;Model files are large. Managing disk space proactively saves painful cleanup sessions later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check your current disk usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="nb"&gt;du&lt;/span&gt; &lt;span class="nt"&gt;-sh&lt;/span&gt; /usr/share/ollama/.ollama/models/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;List downloaded models:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Remove a model you no longer need:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama &lt;span class="nb"&gt;rm&lt;/span&gt; &amp;lt;modelname&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The gotcha with partial downloads:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a download fails or you cancel it, Ollama leaves a partial file in the blobs directory. These can be gigabytes in size and won't show up in &lt;code&gt;ollama list&lt;/code&gt;. Check and clean manually:&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="c"&gt;# Stop Ollama first&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl stop ollama

&lt;span class="c"&gt;# Remove as ollama user (files are owned by this user)&lt;/span&gt;
&lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt; ollama &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /usr/share/ollama/.ollama/models/blobs/&lt;span class="k"&gt;*&lt;/span&gt;

&lt;span class="c"&gt;# Restart&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;If the disk fills&lt;/strong&gt; and &lt;code&gt;growpart&lt;/code&gt; fails with "no space left on device", you need to free space before the partition can be extended, even growing the volume requires temp space. Remove partial downloads first, then retry growpart.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hybrid Architecture: Local + Gemini Fallback
&lt;/h2&gt;

&lt;p&gt;Here's the truth about local-only inference for an AI assistant: it works, but has a quality ceiling. The 3B model handles most everyday tasks fine. But occasionally, a complex question, a nuanced writing task, something that requires real reasoning, either produces a weak response or times out entirely.&lt;/p&gt;

&lt;p&gt;The solution: use the local model as the primary and Google's Gemini API as a free fallback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Gemini free tier works here:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;250K Tokens Per Minute (TPM) on the free tier — more than enough for one person&lt;/li&gt;
&lt;li&gt;No credit card required&lt;/li&gt;
&lt;li&gt;Gemini 2.5 Flash lite responds in 1-2 seconds&lt;/li&gt;
&lt;li&gt;When the local model times out, Gemini catches it automatically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The flow:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Your message
     ↓
Ollama llama3.2:3b (primary)
     ↓ if timeout or failure
Gemini 2.5 Flash (fallback) ← free, fast, no card needed
     ↓
Response to Telegram
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most responses come from the local model at zero cost. Complex queries or timeouts fall through to Gemini, also at zero cost. The experience from your phone is just: you send a message, you get a response.&lt;/p&gt;

&lt;h3&gt;
  
  
  Get Your Gemini API Key
&lt;/h3&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;Click &lt;strong&gt;Get API Key&lt;/strong&gt; → &lt;strong&gt;Create API key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copy the key — it may start with &lt;code&gt;AIza...&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No credit card, no billing setup. Takes two minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying Everything Works
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Check RAM usage while model is loaded:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;llama3.2:3b&lt;/code&gt; loaded, you should see ~2-3GB used out of 24GB, plenty of headroom for OpenClaw and everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check Ollama has auto-started:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl status ollama
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should show &lt;code&gt;active (running)&lt;/code&gt;. The model itself loads into RAM only when first called and then stays resident for subsequent calls, which is why the first response after a reboot takes longer than subsequent ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Ollama directly:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama run llama3.2:3b &lt;span class="s2"&gt;"Just Reply OKAY!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Should respond in under 10 seconds. If it takes longer, something is wrong with the Ollama service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test Gemini Model API Call&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-lite:generateContent"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'X-goog-api-key: API_KEY'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "contents": [
      {
        "parts": [
          {
            "text": "Just! Reply OKAY"
          }
        ]
      }
    ]
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;HTTP Response status code should be 200 along with response text, and you should see the call log in your &lt;a href="https://aistudio.google.com/logs" rel="noopener noreferrer"&gt;Google Studio - Logs&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;model requires more system memory than is available&lt;/strong&gt;
You pulled a model too large for your RAM. &lt;code&gt;llama3.3&lt;/code&gt; requires 40GB — it will never run on a 24GB instance. Remove it and pull a smaller model:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama &lt;span class="nb"&gt;rm &lt;/span&gt;llama3.3
ollama pull llama3.2:3b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Disk full during model download&lt;/strong&gt;&lt;br&gt;
The download filled your boot volume. Stop Ollama, remove partial files as the ollama user (not root), free space, then extend the partition if needed via Oracle Console → Boot Volume resize.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ollama slow after reboot&lt;/strong&gt;&lt;br&gt;
The first call after a reboot loads the model into RAM, expected. Subsequent calls are faster since the model stays resident.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;With Ollama running and your hybrid local + Gemini fallback configured, the AI layer is ready.&lt;/p&gt;

&lt;p&gt;Part 4 will cover installing OpenClaw on Linux — the right user, systemd service setup, the config file traps, and every mistake worth avoiding so you don't have to make them yourself.&lt;/p&gt;

&lt;p&gt;This article is the third in a five-part series:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;$0 Personal Agentic AI Assistant - Architecture&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/personal-ai-assistant-setting-up-free-cloud-server-the-complete-guide-b65"&gt;Setting Up Free Cloud Server&lt;/a&gt; — VCN, ARM instances, static IPs, the gotchas &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Running Ollama on ARM&lt;/strong&gt; — model selection, disk management, CPU inference, reality ← you are here&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/installing-openclaw-on-linux-0-personal-agentic-ai-assistant-part-4-1f0"&gt;Installing OpenClaw on Linux&lt;/a&gt; — avoiding every trap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Complete Setup&lt;/strong&gt; — Telegram, Gemini fallback, end-to-end testing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stay tuned, all links will be updated as articles are published.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached this point, I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf"&gt;“Skills” in Claude Aren’t About Prompts — They’re About Context Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Trying MCP for the First Time — What Stood Out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents: The Building Block of Agentic AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>openclaw</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Setting Up Free Cloud Server - $0 Personal Agentic AI Assistant - Part 2</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Mon, 18 May 2026 14:00:00 +0000</pubDate>
      <link>https://dev.to/akdevcraft/personal-ai-assistant-setting-up-free-cloud-server-the-complete-guide-b65</link>
      <guid>https://dev.to/akdevcraft/personal-ai-assistant-setting-up-free-cloud-server-the-complete-guide-b65</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;This is &lt;em&gt;Part 2 of the Zero Dollar AI Assistant series. &lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;Part 1 - Running a Personal AI Assistant for $0 - Architecture&lt;/a&gt; covers the full stack and why it works.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;AWS, Google Cloud, and Azure have a free tier. However, they all have one thing in common: a clock ticking. Twelve months, then the bill starts.&lt;/p&gt;

&lt;p&gt;Oracle Cloud is different. Their &lt;strong&gt;Always Free Tier&lt;/strong&gt; has no expiry date. The server you provision today will still be running and free, as long as your account stays active. The benefit also includes the block storage capacity and its free tier. That's the foundation this entire stack is built on.&lt;/p&gt;

&lt;p&gt;This article walks you through setting up that foundation: creating a properly configured Oracle Cloud account, provisioning an ARM instance with the right specs, and solving every gotcha along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Oracle's Always Free Tier
&lt;/h2&gt;

&lt;p&gt;Before touching the console, know what you're getting into:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always Free compute:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Up to &lt;strong&gt;4 ARM CPU cores&lt;/strong&gt; and &lt;strong&gt;24GB RAM&lt;/strong&gt; total across ARM instances — permanently free&lt;/li&gt;
&lt;li&gt;2x &lt;code&gt;VM.Standard.E2.1.Micro&lt;/code&gt; (1 OCPU, 1GB RAM each) — also permanently free x86 instances, &lt;strong&gt;but avoid these for this stack — 1GB RAM is far too tight for Ollama&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;These are not trial credits. They don't expire.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Always Free storage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;200GB total block storage&lt;/li&gt;
&lt;li&gt;Enough for your server's boot volume with room to spare&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What costs money:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Going beyond 4 OCPU / 24GB RAM on ARM&lt;/li&gt;
&lt;li&gt;Reserved public IPs that aren't attached to a running instance&lt;/li&gt;
&lt;li&gt;Outbound data beyond 10TB/month — in practice, a personal AI assistant will never get close to this&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The shape you want is &lt;code&gt;VM.Standard.A1.Flex&lt;/code&gt; — Oracle's ARM instance. Use the full free allocation: &lt;strong&gt;4 OCPU and 24GB RAM&lt;/strong&gt;. This gives Ollama maximum headroom and keeps the system responsive under load.&lt;/p&gt;

&lt;h2&gt;
  
  
  Account Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Free Tier vs Pay As You Go
&lt;/h3&gt;

&lt;p&gt;Start by creating an Oracle Cloud account at &lt;a href="https://cloud.oracle.com" rel="noopener noreferrer"&gt;cloud.oracle.com&lt;/a&gt;. You'll be on the Free Tier by default.&lt;/p&gt;

&lt;p&gt;Here's the catch: &lt;strong&gt;ARM capacity on the free tier is frequently exhausted.&lt;/strong&gt; You'll often see "Out of Capacity" errors across all availability domains. The fix is upgrading to &lt;strong&gt;Pay As You Go (PAYG)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PAYG&lt;/strong&gt; sounds alarming, but it isn't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Always Free resources remain free — your ARM instance still costs $0&lt;/li&gt;
&lt;li&gt;You only pay if you exceed free tier limits&lt;/li&gt;
&lt;li&gt;Oracle places a &lt;strong&gt;temporary $100 authorization hold&lt;/strong&gt; on your card when you upgrade — this is a verification hold, not a charge, and disappears within 3-5 business days&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Upgrade via: &lt;strong&gt;Billing → Upgrade and Manage Payment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set a budget alert immediately after upgrading:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Billing → Budgets → Create Budget&lt;/li&gt;
&lt;li&gt;Amount: $1&lt;/li&gt;
&lt;li&gt;Alert at 50% and 100%&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This ensures you're notified before any real spend happens. In practice, for this setup, you'll never see the alert trigger. Below is the screenshot of the cost incurred for May for my account, which is $0.&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%2Fj3f3qd2d1b90bev1rwg7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj3f3qd2d1b90bev1rwg7.png" alt="may-billing" width="800" height="252"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the VCN
&lt;/h2&gt;

&lt;p&gt;Before launching an instance, you need a Virtual Cloud Network (VCN) with internet connectivity. This is where most people hit their first obstacle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The critical mistake to avoid:&lt;/strong&gt; Don't use the blue "Create VCN" button on the VCN list page. It creates a bare VCN with nothing attached — no subnets, no internet gateway, no routing. You'll end up with an instance that has no public IP and no way to SSH in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The correct path — VCN Wizard:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Option A — From the Console home page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Look for &lt;strong&gt;"Set up a network with a wizard"&lt;/strong&gt; in the build section&lt;/li&gt;
&lt;li&gt;Click it&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Option B — From the VCN list page:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hamburger (☰) → &lt;strong&gt;Networking&lt;/strong&gt; → &lt;strong&gt;Virtual Cloud Networks&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Look for &lt;strong&gt;"Start VCN Wizard"&lt;/strong&gt; — it's separate from the "Create VCN" button&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Either way, select &lt;strong&gt;"Create VCN with Internet Connectivity"&lt;/strong&gt; and proceed. Give it a name (e.g., &lt;code&gt;openclaw-vcn&lt;/code&gt; works), leave CIDR defaults, and click through.&lt;/p&gt;

&lt;p&gt;The wizard automatically creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Public subnet with internet routing&lt;/li&gt;
&lt;li&gt;Private subnet&lt;/li&gt;
&lt;li&gt;Internet Gateway&lt;/li&gt;
&lt;li&gt;NAT Gateway&lt;/li&gt;
&lt;li&gt;Route tables and security lists — all pre-wired&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Add SSH Access
&lt;/h3&gt;

&lt;p&gt;After the VCN is created:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go into your VCN → &lt;strong&gt;Subnets&lt;/strong&gt; → click the &lt;strong&gt;Public Subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Default Security List&lt;/strong&gt; → &lt;strong&gt;Add Ingress Rules&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Add:

&lt;ul&gt;
&lt;li&gt;Source CIDR: &lt;code&gt;0.0.0.0/0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Protocol: TCP&lt;/li&gt;
&lt;li&gt;Destination port: &lt;code&gt;22&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Provisioning the Instance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hamburger (☰) → Compute → Instances → Create Instance&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Work through each section:&lt;/p&gt;

&lt;h3&gt;
  
  
  Image
&lt;/h3&gt;

&lt;p&gt;Click &lt;strong&gt;Change Image&lt;/strong&gt; and look carefully. Oracle lists ARM and x86 variants of Ubuntu side by side with nearly identical names:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Canonical Ubuntu 24.04&lt;/code&gt; → x86 ❌&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Canonical Ubuntu 24.04 Minimal aarch64&lt;/code&gt; → ARM ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;aarch64&lt;/code&gt; or &lt;code&gt;Minimal aarch64&lt;/code&gt; variant is what you want. Selecting the wrong one produces an "incompatible settings" error when combined with the ARM shape.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommended:&lt;/strong&gt; &lt;code&gt;Canonical Ubuntu 24.04 Minimal aarch64&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The Minimal image strips unnecessary packages — smaller attack surface, less memory overhead, cleaner slate. Install any tools you need explicitly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shape
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shape: &lt;code&gt;VM.Standard.A1.Flex&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;OCPUs: &lt;strong&gt;4&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Memory: &lt;strong&gt;24GB&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you see "Out of Capacity":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Try each availability domain (AD-1, AD-2, AD-3)&lt;/li&gt;
&lt;li&gt;Set fault domain to "No preference."&lt;/li&gt;
&lt;li&gt;Try a different region&lt;/li&gt;
&lt;li&gt;If all else fails, this is the primary reason to upgrade to PAYG — capacity is significantly more available&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Networking
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Select your &lt;code&gt;openclaw-vcn&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;public subnet&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Check &lt;strong&gt;"Assign a public IPv4 address"&lt;/strong&gt; ← easy to miss, critical&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Boot Volume
&lt;/h3&gt;

&lt;p&gt;Check &lt;strong&gt;"Specify a custom boot volume size"&lt;/strong&gt; and set it to &lt;strong&gt;100GB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The default 46.6GB disappears quickly once Ubuntu, Node.js, Ollama, and a 5GB model are installed. 100GB stays well within your 200GB free storage allocation.&lt;/p&gt;

&lt;p&gt;Leave &lt;strong&gt;in-transit encryption&lt;/strong&gt; and &lt;strong&gt;confidential computing&lt;/strong&gt; unchecked — both add overhead with no meaningful benefit for this use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  SSH Keys
&lt;/h3&gt;

&lt;p&gt;Generate a key pair or upload your existing public key. Alternatively, you can download and save the private key — you'll need it every time you SSH in.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create&lt;/strong&gt; and wait 2-3 minutes for provisioning.🕛&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Server Configuration
&lt;/h2&gt;

&lt;p&gt;Use the previously configured SSH key to SSH into the Oracle cloud server you just provisioned. SSH from your laptop. Get the &lt;strong&gt;Public IP&lt;/strong&gt; from your instance provisioned.&lt;/p&gt;

&lt;p&gt;SSH in:&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;chmod &lt;/span&gt;400 ~/.ssh/id_rsa
ssh &lt;span class="nt"&gt;-i&lt;/span&gt; ~/.ssh/id_rsa ubuntu@YOUR_INSTANCE_PUBLIC_IP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOTE: Run these steps in order — don't skip them&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  System Update
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;sudo &lt;/span&gt;apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; build-essential curl wget tmux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install &lt;code&gt;tmux&lt;/code&gt; immediately — you'll use it for every long-running command. Starting a download without tmux and having SSH disconnect is a painful lesson.&lt;/p&gt;

&lt;h3&gt;
  
  
  Disable IPv6
&lt;/h3&gt;

&lt;p&gt;Oracle Cloud's network doesn't support IPv6 for outbound connections in most configurations. OpenClaw's Telegram integration will repeatedly timeout and fail if IPv6 is active:&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.ipv6.conf.all.disable_ipv6 = 1'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/sysctl.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.ipv6.conf.default.disable_ipv6 = 1'&lt;/span&gt; | &lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; /etc/sysctl.conf
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it worked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-6&lt;/span&gt; https://api.telegram.org 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-3&lt;/span&gt;
&lt;span class="c"&gt;# Should fail immediately — that's correct&lt;/span&gt;
curl &lt;span class="nt"&gt;-4&lt;/span&gt; https://api.telegram.org 2&amp;gt;&amp;amp;1 | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-3&lt;/span&gt;
&lt;span class="c"&gt;# Should succeed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Node.js
&lt;/h3&gt;

&lt;p&gt;OpenClaw requires Node.js 22+. Install via NVM for flexibility:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
nvm &lt;span class="nb"&gt;install &lt;/span&gt;22
nvm use 22
nvm &lt;span class="nb"&gt;alias &lt;/span&gt;default 22
node &lt;span class="nt"&gt;--version&lt;/span&gt;  &lt;span class="c"&gt;# should show v22.x.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also install system-level Node (used by OpenClaw's systemd service):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_22.x | &lt;span class="nb"&gt;sudo&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; bash -
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Useful Aliases
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"alias clearmem=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;sudo sh -c 'sync &amp;amp;&amp;amp; echo 3 &amp;gt; /proc/sys/vm/drop_caches'&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;clearmem&lt;/code&gt; clears the page cache when memory gets tight. You'll use it occasionally, even on 18GB RAM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verifying the Setup
&lt;/h2&gt;

&lt;p&gt;Before moving on to Ollama and OpenClaw installation, confirm everything is healthy:&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="c"&gt;# Verify ARM architecture&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;span class="c"&gt;# Expected: aarch64&lt;/span&gt;

&lt;span class="c"&gt;# Verify disk space&lt;/span&gt;
&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;
&lt;span class="c"&gt;# /dev/sda1 should show ~96GB available&lt;/span&gt;

&lt;span class="c"&gt;# Verify Node.js&lt;/span&gt;
node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Should show v22.x.x&lt;/span&gt;

&lt;span class="c"&gt;# Verify IPv6 is disabled&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; /proc/sys/net/ipv6/conf/all/disable_ipv6
&lt;span class="c"&gt;# Should show: 1&lt;/span&gt;

&lt;span class="c"&gt;# Verify internet connectivity&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://api.telegram.org | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-3&lt;/span&gt;
&lt;span class="c"&gt;# Should respond&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If all five pass, your foundation is set up. You're ready for Part 3 — installing Ollama and picking the right model for your hardware.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Issues and Fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;This instance has incompatible settings&lt;/strong&gt;&lt;br&gt;
You selected the x86 Ubuntu image with the ARM shape. Go back to image selection and choose the &lt;code&gt;aarch64&lt;/code&gt; variant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Out of Capacity for VM.Standard.A1.Flex&lt;/strong&gt;&lt;br&gt;
Try all three ADs, set fault domain to "No preference", and consider upgrading to PAYG. Capacity is the single most common blocker for new Oracle free-tier accounts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instance created but no public IP showing&lt;/strong&gt;&lt;br&gt;
The public subnet wasn't selected during creation, or "Assign a public IPv4 address" wasn't checked. Easiest fix: terminate and recreate with the correct networking settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SSH connection refused&lt;/strong&gt;&lt;br&gt;
The SSH ingress rule wasn't added to the security list. Go to VCN → Public Subnet → Default Security List → add TCP ingress on port 22.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;SSH times out after a few minutes of inactivity&lt;/strong&gt;&lt;br&gt;
Add to &lt;code&gt;~/.ssh/config&lt;/code&gt; on your local machine:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;Host&lt;/span&gt; *
  &lt;span class="k"&gt;ServerAliveInterval&lt;/span&gt; &lt;span class="m"&gt;60&lt;/span&gt;
  &lt;span class="k"&gt;ServerAliveCountMax&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;With your Oracle Cloud instance running, IPv6 disabled, and Node.js installed, the infrastructure layer is done.&lt;/p&gt;

&lt;p&gt;Part 3 of this zero-dollar AI Assistant series will cover installing Ollama on ARM, choosing the right model for CPU inference, managing disk space with large model files, and the hybrid local + Gemini fallback architecture that makes the whole thing actually usable.&lt;/p&gt;

&lt;p&gt;This article is the second in a five-part series:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;$0 Personal Agentic AI Assistant - Architecture&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setting Up Free Cloud Server&lt;/strong&gt; — VCN, ARM instances, static IPs, the gotchas ← you are here&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/0-personal-agentic-ai-assistant-running-local-llm-part-3-4k2l"&gt;Running Ollama on ARM&lt;/a&gt; — model selection, disk management, CPU inference reality&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/installing-openclaw-on-linux-0-personal-agentic-ai-assistant-part-4-1f0"&gt;Installing OpenClaw on Linux&lt;/a&gt; — avoiding every trap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Complete Setup&lt;/strong&gt; — Telegram, Gemini fallback, end-to-end testing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stay tuned, all links will be updated as articles are published.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached this point, I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf"&gt;“Skills” in Claude Aren’t About Prompts — They’re About Context Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Trying MCP for the First Time — What Stood Out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents: The Building Block of Agentic AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openclaw</category>
      <category>llm</category>
      <category>oracle</category>
      <category>ai</category>
    </item>
    <item>
      <title>$0 Personal Agentic AI Assistant - Architecture - Part 1</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Mon, 11 May 2026 14:30:00 +0000</pubDate>
      <link>https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45</link>
      <guid>https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;A productivity tool that promised to change everything, charged monthly, and quietly became background noise. AI assistants are going the same way — another tab, another login, another $20/month for something you open twice a week. Probably, most of us regret the subscription that we have today. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Welp! What if you didn't have to?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In today’s world, the infrastructure exists to run a capable, always-on personal AI assistant, one that lives in your day-to-day regular apps like Telegram or WhatsApp, remembers you, browses the web, and handles real tasks — for exactly zero dollars a month. Not a trial. Not a teaser. Permanently free, on infrastructure you control.&lt;/p&gt;

&lt;p&gt;This article explains the architecture that makes it possible and why each piece matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Subscription Trap
&lt;/h2&gt;

&lt;p&gt;Most people's AI setup looks like this: Claude.ai, ChatGPT, or any other AI providers in a browser tab or mobile app, opened when needed, closed when done. Conversations are saved, and you can go back to what you discussed last time if you're in the same thread. But it's passive history, not active memory. You have to go and find it. And across that whole time, it couldn't reach out, take action, or do anything unless you opened it first.&lt;/p&gt;

&lt;p&gt;That's not an assistant. That's a very smart search box.&lt;/p&gt;

&lt;p&gt;A real assistant is always on. It knows who you are. It operates in the apps you already use. It can take actions, not just generate text, and it doesn't charge you for existing.&lt;/p&gt;

&lt;p&gt;Until recently, building that required either paying cloud AI bills or owning serious hardware. Both most likely out of reach for most people. However, that can be changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Shifts That Can Make This Possible
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Open-weight models are now genuinely capable
&lt;/h3&gt;

&lt;p&gt;Meta's Llama, Google's Gemma, and others have closed the gap with proprietary models significantly over the past few years. A 3-8 billion parameter model running locally can handle the majority of everyday tasks like summarising, drafting, answering questions, and light reasoning, that people actually use AI assistants for day-to-day.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Cloud providers offer permanently free compute
&lt;/h3&gt;

&lt;p&gt;Oracle Cloud's Always Free tier gives you up to 4 ARM CPU cores and 24GB of RAM — permanently, with no expiry date. Not a 12-month trial like AWS. Not credits that run out. A real server running 24/7 at zero cost, forever, as long as you keep the account active.&lt;/p&gt;

&lt;p&gt;That's enough to run Ollama with a capable local model.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Free API tiers have become genuinely useful
&lt;/h3&gt;

&lt;p&gt;Google's Gemini 2.5 Flash-Lite is generally capped at 250K Tokens Per Minute (TPM) on the free tier with no credit card required. For a personal assistant handling one person's queries, that's more than enough headroom. When a local model is too slow or too limited for a task, Gemini catches it — for free.&lt;/p&gt;

&lt;p&gt;Put these three things together, and the economics change completely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture - Tech Stack
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Oracle Cloud ARM Instance&lt;/strong&gt; — your always-on server. 4 CPU cores, 24 GB RAM, permanently free. Hosts everything. Never sleeps, never charges.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ollama&lt;/strong&gt; — runs open-source language models locally on your server. No API calls, no cost, no data leaving your machine. The primary brain is for most tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gemini API (free tier)&lt;/strong&gt; — Google's fallback for when the local model is too slow or hits a complex task. 1,000 free requests per day—no credit card.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenClaw&lt;/strong&gt; — The agent layer that ties everything together. Connects to Telegram, maintains memory across conversations, runs scheduled tasks, and routes requests between local and cloud models intelligently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tavily&lt;/strong&gt; - Native AI search engine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP&lt;/strong&gt; - Model Context Protocol server, bridge to fetch data from backend service/engine&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What It Can Actually Do
&lt;/h2&gt;

&lt;p&gt;This isn't just a toy setup. On this stack, you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Telegram access&lt;/strong&gt; — message your agent from your phone, anywhere, like texting a person&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Persistent memory&lt;/strong&gt; — it remembers your preferences, ongoing projects, and past conversations&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web search&lt;/strong&gt; — real-time search via Tavily's free tier integrated directly into responses&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;File operations&lt;/strong&gt; — read, write, and summarise documents on the server&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub integration&lt;/strong&gt; — search issues, review code, summarise pull requests&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scheduled tasks&lt;/strong&gt; — set reminders, recurring summaries, automated workflows&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Custom agents&lt;/strong&gt; — define specialised subagents for specific tasks (code review, research, writing)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it can't do as well as a paid service: complex multi-step reasoning at speed, very long document analysis, and tasks that push the limits of a 3B parameter model. For those, the Gemini fallback steps in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Honest Tradeoffs
&lt;/h2&gt;

&lt;p&gt;Zero cost doesn't mean zero compromise. Know what you're getting into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speed&lt;/strong&gt; — local CPU inference is slower than cloud APIs. A response that takes a few seconds on Claude.ai might take &amp;gt; 30 seconds locally. With Gemini as a fallback, complex tasks are fast. Simple tasks on the local model are slow but free.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Quality ceiling&lt;/strong&gt; — a 3B local model is noticeably less capable than Claude Sonnet or GPT-4. For writing, summarisation, and Q&amp;amp;A, it's fine. For nuanced reasoning or complex code, it shows limitations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setup effort&lt;/strong&gt; — this is not a five-minute install. There are VCN configurations, systemd services, API keys, and model downloads involved. It takes an afternoon to set up correctly. Once running, it requires minimal maintenance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Oracle ARM capacity&lt;/strong&gt; — Oracle's free ARM instances are in high demand. You may need to retry provisioning multiple times or upgrade to Pay As You Go (which still costs $0 for Always Free resources) to get reliable access.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Who This Is For
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;It makes sense if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You're comfortable with a terminal and basic Linux&lt;/li&gt;
&lt;li&gt;You want AI infrastructure you actually control&lt;/li&gt;
&lt;li&gt;You're experimenting and don't want ongoing costs&lt;/li&gt;
&lt;li&gt;You're comfortable with slower responses in exchange for zero cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;It doesn't make sense if:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need production-grade reliability&lt;/li&gt;
&lt;li&gt;Response speed is critical&lt;/li&gt;
&lt;li&gt;You want a turnkey experience with no configuration&lt;/li&gt;
&lt;li&gt;You'd rather pay $10-20/month for something that just works&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the right person, this is the most interesting AI setup you can build right now. Not because it beats the paid alternatives on any individual metric, but because it's yours — running on your server, with your data, on your terms, for nothing, and most importantly, your private data on your laptop is far away from accidentally being exposed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This article is the first in a five-part series:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Architecture&lt;/strong&gt; ← you are here&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/personal-ai-assistant-setting-up-free-cloud-server-the-complete-guide-b65"&gt;Setting Up Free Cloud Server&lt;/a&gt; — VCN, ARM instances, static IPs, the gotchas&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/0-personal-agentic-ai-assistant-running-local-llm-part-3-4k2l"&gt;Running Ollama on ARM&lt;/a&gt; — model selection, disk management, CPU inference reality&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/akdevcraft/installing-openclaw-on-linux-0-personal-agentic-ai-assistant-part-4-1f0"&gt;Installing OpenClaw on Linux&lt;/a&gt; — avoiding every trap&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Complete Setup&lt;/strong&gt; — Telegram, Gemini fallback, end-to-end testing&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stay tuned, all links will be updated as articles are published.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached this point, I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf"&gt;“Skills” in Claude Aren’t About Prompts — They’re About Context Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Trying MCP for the First Time — What Stood Out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents: The Building Block of Agentic AI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openclaw</category>
      <category>llm</category>
      <category>machinelearning</category>
      <category>ai</category>
    </item>
    <item>
      <title>Subagents: The Building Block of Agentic AI</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Mon, 27 Apr 2026 14:30:00 +0000</pubDate>
      <link>https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo</link>
      <guid>https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo</guid>
      <description>&lt;h2&gt;
  
  
  Problem to Solve
&lt;/h2&gt;

&lt;p&gt;Most developers' first encounter with AI is a single prompt, a single response. It feels powerful — until the task gets complex. Ask an AI to research three competitors, synthesize the findings, and format them as a report, and a single context window starts to feel very small. This is the problem subagents solve.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before you move forward - Here is my new article on my agentic setup &lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;Running a Personal AI Assistant for $0 - Part 1 - Architecture&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;blockquote&gt;
&lt;p&gt;In the demo above, I'm invoking the agent explicitly by name. In orchestrated workflows, Claude can invoke multiple agents like this automatically — in parallel or sequentially — based on the task structure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Skills GitHub Repo - &lt;a href="https://github.com/an1meshk/claude-chat-cli/blob/main/.claude/agents/code-quality-reviewer.md" rel="noopener noreferrer"&gt;.claude/agents/code-quality-reviewer.md&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;A subagent is an AI instance invoked by an orchestrating AI to handle a specific subtask within a larger workflow. In multi-agent systems broadly — whether built on Claude, GPT, Gemini, or open-source models — the core pattern is the same: rather than a single model doing everything sequentially, an orchestrator breaks work into pieces and delegates them. Much like a technical lead assigning work to specialists rather than writing every function themselves.&lt;/p&gt;

&lt;p&gt;According to Anthropic's Claude Agent SDK documentation, subagents serve two core purposes: &lt;strong&gt;parallelization&lt;/strong&gt; (running multiple tasks simultaneously) and &lt;strong&gt;context isolation&lt;/strong&gt; (each subagent uses its own context window, returning only relevant results to the orchestrator rather than its full context).[^1]&lt;/p&gt;

&lt;p&gt;Within their assigned scope, subagents are active execution units — they can browse the web, execute code, read and write files, and call external APIs. They don't just reason; they act.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a Subagent Workflow Works
&lt;/h2&gt;

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

&lt;p&gt;The orchestrator doesn't do the heavy lifting — it coordinates. Each subagent receives a focused prompt with a clear objective, output format, and tool access, then returns a concise result. The orchestrator aggregates those results into the final deliverable.&lt;/p&gt;

&lt;p&gt;Anthropic's internal research system uses exactly this pattern: a lead agent spawns subagents to explore different aspects of a query in parallel, then compiles their findings into a coherent answer. Their evaluations found this approach outperformed a single Claude Opus 4 by &lt;strong&gt;90.2%&lt;/strong&gt; on internal research benchmarks.[^2]&lt;/p&gt;

&lt;h2&gt;
  
  
  Orchestration Patterns
&lt;/h2&gt;

&lt;p&gt;Not all subagent workflows are structured the same way. Three patterns cover most real-world cases:&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%2Fz1vlkfnprrqa5ri7hy3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1vlkfnprrqa5ri7hy3w.png" width="800" alt="parallel pipeline" height="392"&gt;&lt;/a&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%2Fbnbjpdrdaqq8ugaa2a24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbnbjpdrdaqq8ugaa2a24.png" width="412" alt="Sequential-pipeline" height="1044"&gt;&lt;/a&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%2Ftzju1t7ouvbm5k73sgh0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftzju1t7ouvbm5k73sgh0.png" width="800" alt="Hierarchical-delegation" height="782"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Parallel fan-out&lt;/strong&gt; — Independent subtasks launch simultaneously. Best for tasks like analyzing multiple documents at once.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequential pipeline&lt;/strong&gt; — Each subagent's output feeds the next. Best when there's a dependency chain (research → draft → edit → format).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hierarchical delegation&lt;/strong&gt; — A subagent itself becomes an orchestrator for deeper subtasks. Powerful, but adds coordination complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choosing the wrong pattern is a common mistake. Parallelizing a sequential task adds overhead without benefit; sequentializing an independent task wastes time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating Subagents with Claude Code CLI
&lt;/h2&gt;

&lt;p&gt;Claude Code gives you two ways to create subagents: interactively via the &lt;code&gt;/agents&lt;/code&gt; command, or manually as markdown files. Both result in the same thing — a &lt;code&gt;.md&lt;/code&gt; file in a &lt;code&gt;.claude/agents/&lt;/code&gt; directory.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Interactive Way
&lt;/h3&gt;



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

&lt;/div&gt;



&lt;p&gt;This walks you through a guided setup: name, description, tools, model, and scope. At the end, it saves the file, and the agent is available immediately.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Manual Way
&lt;/h3&gt;

&lt;p&gt;Create a markdown file directly — the frontmatter defines behavior, the body is the system prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;security-reviewer&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Expert&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;security&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;reviewer.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Use&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;PROACTIVELY&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;after&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;any&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;changes&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;auth,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;handling,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;or&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;API&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;endpoints."&lt;/span&gt;
&lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Read, Grep, Glob&lt;/span&gt;
&lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;haiku&lt;/span&gt;
&lt;span class="na"&gt;permissionMode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;plan&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

You are a senior security engineer reviewing code for vulnerabilities.
When invoked:
&lt;span class="p"&gt;1.&lt;/span&gt; Identify recently changed files
&lt;span class="p"&gt;2.&lt;/span&gt; Analyze for OWASP Top 10 vulnerabilities
&lt;span class="p"&gt;3.&lt;/span&gt; Check for secrets, SQL injection, and hardcoded credentials
&lt;span class="p"&gt;4.&lt;/span&gt; Report findings with severity levels and remediation steps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Where the File Lives
&lt;/h3&gt;

&lt;p&gt;Subagent scope is determined by which directory the file is placed in:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Scope&lt;/th&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;When to use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Project&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;.claude/agents/&lt;/code&gt; in project root&lt;/td&gt;
&lt;td&gt;Team-shared agents, commit to version control&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;~/.claude/agents/&lt;/code&gt; in home dir&lt;/td&gt;
&lt;td&gt;Personal agents available across all projects&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Project scope is the recommended default — it makes subagent definitions shareable via version control. Use user scope for general-purpose agents you want available everywhere, regardless of which repo you're in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Best Practices
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Write descriptions that trigger correctly.&lt;/strong&gt; Claude uses the &lt;code&gt;description&lt;/code&gt; field to decide when to invoke a subagent automatically. Be specific and include &lt;code&gt;PROACTIVELY&lt;/code&gt; if you want it auto-triggered — for example: &lt;em&gt;"Use PROACTIVELY after any changes to authentication or data handling."&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restrict tools intentionally.&lt;/strong&gt; The &lt;code&gt;tools&lt;/code&gt; field restricts what the agent can do — a security auditor only needs &lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Grep&lt;/code&gt;, and &lt;code&gt;Glob&lt;/code&gt;, and has no business writing files. That restriction is worth being explicit about.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Match model to task complexity.&lt;/strong&gt; Route subagent exploration to cheaper, faster models like Haiku and reserve Opus for genuine architectural reasoning. A read-only code scanner doesn't need the same model as an agent writing production code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Keep system prompts focused.&lt;/strong&gt; A subagent with a narrow, well-defined role outperforms a generalist one. If the prompt starts covering many different concerns, split it into two agents.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Practical Challenge: Context Management
&lt;/h2&gt;

&lt;p&gt;Each subagent starts fresh with no shared memory. This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The orchestrator must craft every subagent prompt with all the context it needs to succeed&lt;/li&gt;
&lt;li&gt;Subagent outputs must be concise enough to fit back into the orchestrator's context alongside everything else&lt;/li&gt;
&lt;li&gt;If outputs are large, the orchestrator must summarize before aggregating&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Good subagent design is largely information architecture: what does each agent need to know, what must it produce, and how does that output flow back into the whole.&lt;/p&gt;

&lt;h2&gt;
  
  
  Safety Considerations
&lt;/h2&gt;

&lt;p&gt;When subagents can take real-world actions, safety boundaries matter more than in single-agent systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Least privilege&lt;/strong&gt; — Give each subagent only the tools it actually needs. A research agent doesn't need write access to a production database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Output validation&lt;/strong&gt; — Don't blindly pass subagent outputs downstream. Even lightweight sanity-checking reduces blast radius.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection&lt;/strong&gt; — Subagents that browse the web or read external files can encounter content designed to manipulate their behavior. This is a real attack surface in agentic systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  When to Use Subagents
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use subagents when…&lt;/th&gt;
&lt;th&gt;Avoid subagents when…&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Task has clearly separable subtasks&lt;/td&gt;
&lt;td&gt;Task is straightforward for one agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parallel execution saves meaningful time&lt;/td&gt;
&lt;td&gt;Subtasks share too much state to delegate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total work exceeds one context window&lt;/td&gt;
&lt;td&gt;Coordination overhead exceeds the benefit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Different subtasks need different tools&lt;/td&gt;
&lt;td&gt;You're still prototyping — stay simple first&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with a single-agent approach and introduce orchestration when it genuinely starts to strain. Complexity has a cost.&lt;/p&gt;

&lt;h2&gt;
  
  
  Subagents vs. Skills: A Quick Note
&lt;/h2&gt;

&lt;p&gt;These two terms sometimes get conflated, but they operate at completely different layers. A &lt;strong&gt;skill&lt;/strong&gt; is a passive instruction document — a markdown file Claude reads before a task to understand best practices, available libraries, and output conventions. A &lt;strong&gt;subagent&lt;/strong&gt; is an active execution unit that runs, uses tools, and returns results.&lt;/p&gt;

&lt;p&gt;The honest relationship: a subagent might read a skill before doing its work. One shapes knowledge; the other executes.&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%2F88ezy9b6fqpq5dcv4bxg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88ezy9b6fqpq5dcv4bxg.png" alt="skills-subagent" width="799" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;The broader Claude stack can be conceptualized as five layers: MCP for connectivity, Skills for task-specific knowledge, Agent as the primary worker, Subagents as parallel independent workers, and Agent Teams for coordination.[^3] These building blocks are shipping in rapid succession, and the pattern is maturing fast.&lt;/p&gt;

&lt;p&gt;For developers just entering this space: don't need to build full orchestration systems on day one. But understanding the pattern — how delegation works, what subagents can and can't do, where the sharp edges are — will shape how you think about AI architecture from the start.&lt;/p&gt;

&lt;p&gt;Subagents aren't a feature. There's a shift in how we think about what AI can be tasked with doing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have also shared my experience with MCP client-server project, here is the article &lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Working with MCP: What Stood Out&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[^1]: Anthropic Engineering. &lt;em&gt;Building agents with the Claude Agent SDK.&lt;/em&gt; -&amp;gt; &lt;a href="https://www.anthropic.com/engineering/building-agents-with-the-claude-agent-sdk" rel="noopener noreferrer"&gt;https://www.anthropic.com/engineering/building-agents-with-the-claude-agent-sdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[^2]: Anthropic Engineering. &lt;em&gt;How we built our multi-agent research system.&lt;/em&gt; -&amp;gt; &lt;a href="https://www.anthropic.com/engineering/multi-agent-research-system" rel="noopener noreferrer"&gt;https://www.anthropic.com/engineering/multi-agent-research-system&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[^3]: Winbuzzer. &lt;em&gt;Anthropic Shows How to Scale Claude Code with Subagents and MCP.&lt;/em&gt; -&amp;gt; &lt;a href="https://winbuzzer.com/2026/03/24/anthropic-claude-code-subagent-mcp-advanced-patterns-xcxwbn/" rel="noopener noreferrer"&gt;https://winbuzzer.com/2026/03/24/anthropic-claude-code-subagent-mcp-advanced-patterns-xcxwbn/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;[^4]: Anthropic. &lt;em&gt;Create custom subagents — Claude Code Docs.&lt;/em&gt; -&amp;gt; &lt;a href="https://code.claude.com/docs/en/sub-agents" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/sub-agents&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached this point, I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf"&gt;“Skills” in Claude Aren’t About Prompts — They’re About Context Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/never-use-spring-restclient-default-implementation-in-production-100g"&gt;To Avoid Performance Impact Never Use Spring RestClient Default Implementation in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/modern-devsecops-requires-more-than-one-tool-a-practical-sdlc-security-strategy-4d74"&gt;Modern DevSecOps Needs More Than One Tool: A Practical Secure SDLC Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/when-resilience-backfires-retry-and-circuit-breaker-in-spring-boot-10m"&gt;When Resilience Backfires: Retry and Circuit Breaker in Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>machinelearning</category>
      <category>agents</category>
    </item>
    <item>
      <title>“Skills” in Claude Aren’t About Prompts — They’re About Context Design</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Mon, 13 Apr 2026 16:58:59 +0000</pubDate>
      <link>https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf</link>
      <guid>https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;When I first came across “Skills” in Claude Code, it looked like just another abstraction over prompts. I kept repeating the same instructions to Claude — code review rules, API patterns, formatting — across multiple sessions.&lt;/p&gt;

&lt;p&gt;But after spending some time with it, the interesting part wasn’t what skills are, but what problem it's trying to solve.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before you move forward - Here is my new article on my agentic setup &lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;Running a Personal AI Assistant for $0 - Part 1 - Architecture&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;blockquote&gt;
&lt;p&gt;In the demo above, a &lt;code&gt;code-review&lt;/code&gt; skill is defined. When I ask Claude to “review modified files”, it automatically matches the request to the skill and executes it — without needing explicit invocation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Skills GitHub Repo&lt;/strong&gt; - &lt;a href="https://github.com/an1meshk/claude-chat-cli/tree/main/.claude/skills/code-review" rel="noopener noreferrer"&gt;.claude/skills/code-review&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Window Challenge
&lt;/h2&gt;

&lt;p&gt;One of the biggest challenges with LLM usage in real workflows is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Context keeps growing&lt;/li&gt;
&lt;li&gt;Instructions get repeated&lt;/li&gt;
&lt;li&gt;Conversations lose focus over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most people try to fix this by writing better prompts or adding more context. However, that approach doesn’t scale. As more context/prompt is provided, more of the context window will be consumed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Definition
&lt;/h2&gt;

&lt;p&gt;First, let’s go over the official definition of Skills.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Skills are folders of instructions and resources that Claude Code can discover and use to handle tasks more accurately. Each skill lives in a SKILL.md file with at least a name and description in its frontmatter.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  A little more about Skills
&lt;/h2&gt;

&lt;p&gt;Skills can be created in different locations based on the user's or the project's settings. At the end of the day, skill is created at &lt;code&gt;.claude/skills/code-review/SKILL.md&lt;/code&gt;. Only difference is where the &lt;code&gt;.claude&lt;/code&gt; directory is created.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User's personal skill: Create &lt;code&gt;.claude&lt;/code&gt; directory in your home directory, e.g., &lt;code&gt;~/.claude/skills/code-review/SKILL.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Project-specific skill: create &lt;code&gt;.claude&lt;/code&gt; directory in the root of the project, e.g., &lt;code&gt;project/.claude/skills/code-review/SKILL.md&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apart from the user and project, skills can be stored at the Enterprise and plugin levels. And if you have the same skill with the same description in all locations (not a desire approach, but hypothetically), then the skill is applied based on the following precedence order:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1. Enterprise — managed settings, highest priority. All users in your organization.&lt;/li&gt;
&lt;li&gt;2. Personal — your home directory (&lt;code&gt;~/.claude/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;). All your projects.&lt;/li&gt;
&lt;li&gt;3. Project — the &lt;code&gt;.claude/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt; directory inside a repository. A particular project only.&lt;/li&gt;
&lt;li&gt;4. Plugins — installed plugins &lt;code&gt;&amp;lt;plugin&amp;gt;/skills/&amp;lt;skill-name&amp;gt;/SKILL.md&lt;/code&gt;, lowest priority. Where the plugin is enabled.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Skills Flow Diagram
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User Request
     ↓
[Skill Description Match]
     ↓
[Skill Loaded]
     ↓
[Context Applied]
     ↓
Claude Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What Skills Actually Change
&lt;/h2&gt;

&lt;p&gt;At a surface level, skills look simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reusable instructions that Claude can apply&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the real shift is deeper:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Skills separate “when to use context” from “what the context is.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s a big deal, instead of loading everything up front or manually injecting instructions. You define a trigger (description) and a payload (instructions).&lt;/p&gt;

&lt;p&gt;Skills work best for specialized knowledge that applies to specific tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code review standards&lt;/li&gt;
&lt;li&gt;Commit message formats&lt;/li&gt;
&lt;li&gt;Debugging checklists for a project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude handles the rest.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When you find yourself repeating again and again, then most likely you need a skill.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Most Important Part: Description
&lt;/h2&gt;

&lt;p&gt;If there’s one thing that matters more than anything else:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Your Skills description is the entry point to your system&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is effectively a semantic matcher and routing mechanism. In practice, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two skills with similar descriptions will conflict&lt;/li&gt;
&lt;li&gt;A vague description won’t trigger&lt;/li&gt;
&lt;li&gt;An overly broad one will trigger at the wrong time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You’re not just writing instructions — you’re designing intent matching&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills as a Context Control Mechanism
&lt;/h2&gt;

&lt;p&gt;What changed my thinking was this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Skills are not a convenience feature&lt;/li&gt;
&lt;li&gt;They are a context management strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because they are lazy-loaded only when needed, scopes are not always present, and multiple composable components can activate together.&lt;/p&gt;

&lt;p&gt;This directly impacts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Response quality&lt;/li&gt;
&lt;li&gt;Token usage&lt;/li&gt;
&lt;li&gt;System predictability&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Designing Skills (What Actually Matters)
&lt;/h2&gt;

&lt;p&gt;Let's see how we can design the Skills to harvest the best out of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Skill Schema (Only Important Ones)
&lt;/h3&gt;

&lt;p&gt;The skills open standard supports many fields in the &lt;code&gt;SKILL.md&lt;/code&gt; frontmatter. However, only two fields are required:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;name (required)&lt;/strong&gt; — Identifies your skill. Use lowercase letters, numbers, and hyphens only. Maximum 64 characters. Should match your directory name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;description (required)&lt;/strong&gt; — Tells Claude when to use the skill. Maximum 1,024 characters. This is the most important field because Claude uses it for matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;allowed-tools (optional)&lt;/strong&gt; — Restricts which tools Claude can use when the skill is active.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;model (optional)&lt;/strong&gt; — Specifies which Claude model to use for the skill.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Keep the core small
&lt;/h3&gt;

&lt;p&gt;Don’t treat a skill like a knowledge dump. Keep instructions focused and push details to supporting files.&lt;br&gt;
Think of this as an entry point, not an encyclopedia.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Use constraints intentionally
&lt;/h3&gt;

&lt;p&gt;Parameters like tool restrictions aren’t just configuration. They’re guardrails.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Read-only analysis skills&lt;/li&gt;
&lt;li&gt;Restricted execution environments&lt;/li&gt;
&lt;li&gt;Safer automation workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Structure for scale, not just usage
&lt;/h3&gt;

&lt;p&gt;The real challenge isn’t creating a skill — it’s managing many of them.&lt;/p&gt;

&lt;p&gt;Things that start to matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Naming clarity&lt;/li&gt;
&lt;li&gt;Description uniqueness&lt;/li&gt;
&lt;li&gt;Conflict avoidance&lt;/li&gt;
&lt;li&gt;Ownership (personal vs project vs org)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This becomes closer to system design than prompt design&lt;/p&gt;

&lt;h2&gt;
  
  
  Skills vs Everything Else
&lt;/h2&gt;

&lt;p&gt;A common mistake is trying to use skills for everything. But each feature solves a different problem. Claude Code has several ways to customize behavior. Skills are unique because they're automatic and task-specific. Here's a quick comparison:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;CLAUDE.md&lt;/strong&gt; file is loaded into every conversation. If you want Claude to always use a certain file formatting, that goes in CLAUDE.md.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Skills&lt;/strong&gt; load on demand when they match your request. Claude only loads the name and description initially, so they don't fill up your entire context window. Your code review checklist doesn't need to be in context when you're debugging — it loads when you actually ask for a review.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subagents&lt;/strong&gt; run in isolated execution contexts — use them for delegated work. Skills add knowledge to your current conversation. Here is the article 🔗 for more information about the &lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hooks&lt;/strong&gt; are event-driven (fire on some event like file saves). Skills are request-driven (activate based on what you're asking Claude to act)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;MCP servers&lt;/strong&gt; provide external tools and integrations — a different category entirely from skills. Here is the article 🔗 for more information about the &lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Working with MCP&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Slash commands&lt;/strong&gt; require you to explicitly type them. Skills don't. Claude applies them when it recognizes the situation.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How does this shift thinking
&lt;/h2&gt;

&lt;p&gt;Without Skills, we were thinking in terms of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do I write better prompts?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now it’s more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“How do I design context that shows up at the right time?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That’s a different level of control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Takeaways
&lt;/h2&gt;

&lt;p&gt;If you’re starting out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t create many skills — create one good one&lt;/li&gt;
&lt;li&gt;Spend more time on the description than the instructions&lt;/li&gt;
&lt;li&gt;Keep skills narrow and intentional&lt;/li&gt;
&lt;li&gt;Treat conflicts as a design problem, not a bug&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;👉 If context is growing uncontrollably, skills are probably the penetrating layer.&lt;/p&gt;

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

&lt;p&gt;👉 “Skills are not a feature. They’re a shift in how you structure AI systems.”&lt;/p&gt;

&lt;p&gt;But the idea behind them is bigger:&lt;/p&gt;

&lt;p&gt;👉 Moving from prompt writing → to context system design&lt;/p&gt;

&lt;p&gt;And that’s where LLM usage starts becoming predictable, not just powerful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I have also shared my experience with Subagent, here is my article &lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents: The Building block of Agentic AI&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you have reached here, then I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Working with MCP — What Stood Out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/never-use-spring-restclient-default-implementation-in-production-100g"&gt;To Avoid Performance Impact Never Use Spring RestClient Default Implementation in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/modern-devsecops-requires-more-than-one-tool-a-practical-sdlc-security-strategy-4d74"&gt;Modern DevSecOps Needs More Than One Tool: A Practical Secure SDLC Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⁠&lt;a href="https://dev.to/akdevcraft/playwright-and-cucumber-are-the-best-tools-for-end-to-end-testing-a28"&gt;Supercharge Your E2E Tests with Playwright and Cucumber Integration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/when-resilience-backfires-retry-and-circuit-breaker-in-spring-boot-10m"&gt;When Resilience Backfires: Retry and Circuit Breaker in Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>machinelearning</category>
      <category>llm</category>
      <category>agentskills</category>
    </item>
    <item>
      <title>Working with MCP: What Stood Out</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Mon, 30 Mar 2026 18:40:40 +0000</pubDate>
      <link>https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451</link>
      <guid>https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451</guid>
      <description>&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I spent some time exploring the Model Context Protocol (MCP). Not a deep dive—just a hands-on attempt to understand how it actually works.&lt;/p&gt;

&lt;p&gt;So I built a minimal client + server setup:&lt;br&gt;
👉 &lt;a href="https://github.com/an1meshk/claude-chat-cli" rel="noopener noreferrer"&gt;https://github.com/an1meshk/claude-chat-cli&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In a real-world project, we will build client and server separately; however, as this was just a demo project, everything was built in the same project&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A few things stood out more than I expected.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before you move forward - Here is my new article on my agentic setup &lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;Part 1- Running a Personal AI Assistant for $0 - Architecture&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

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

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

&lt;h2&gt;
  
  
  🧠 Context
&lt;/h2&gt;

&lt;p&gt;The goal wasn’t to learn everything about MCP. It was to answer a simpler question:&lt;br&gt;
How hard is it to actually build something with it?&lt;/p&gt;

&lt;p&gt;Before moving further, here is a quick MCP client and server architecture diagram:&lt;br&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%2Fdep2g2jppr883gj7e7jj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdep2g2jppr883gj7e7jj.png" alt="mcp architecture" width="800" height="485"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚙️ What I Tried
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Went through the MCP intro course - &lt;a href="https://anthropic.skilljar.com/introduction-to-model-context-protocol" rel="noopener noreferrer"&gt;course link&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Built a minimal client and server in Python using the course’s startup kit&lt;/li&gt;
&lt;li&gt;Connected it to a simple CLI chat client that already came with the startup kit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing complex—but enough to see how things fit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  💡 What Stood Out
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Setup Is Simpler Than Expected
&lt;/h3&gt;

&lt;p&gt;I was expecting some heavy setup. But, instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic server setup was straightforward&lt;/li&gt;
&lt;li&gt;The Python MCP library abstracts most of the complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It felt closer to:&lt;br&gt;
“Define a few handlers, and you’re up.”&lt;/p&gt;

&lt;p&gt;than:&lt;/p&gt;

&lt;p&gt;“Learn a new framework.”&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Real Concept Is Context Flow
&lt;/h3&gt;

&lt;p&gt;The interesting part wasn’t the server setup. It was understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How context flows&lt;/li&gt;
&lt;li&gt;How tools are exposed&lt;/li&gt;
&lt;li&gt;Exposing resources&lt;/li&gt;
&lt;li&gt;How the model interacts with them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s where the mental shift is.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 What Helped Me Understand It
&lt;/h2&gt;

&lt;p&gt;This simple mental model made things click:&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%2Fbkhjrxfxbo3rlrqg4v8v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbkhjrxfxbo3rlrqg4v8v.png" alt="mcp sequence diagram" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;image credit Anthropic academy course&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Client → MCP Server → Tool → Response → Client&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client sends a request&lt;/li&gt;
&lt;li&gt;MCP server routes it&lt;/li&gt;
&lt;li&gt;The tool executes logic&lt;/li&gt;
&lt;li&gt;Response flows back&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once this clicked, everything else made more sense&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ If You Want to Try It
&lt;/h2&gt;

&lt;p&gt;The setup is intentionally minimal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basic MCP server using Python&lt;/li&gt;
&lt;li&gt;A simple tool&lt;/li&gt;
&lt;li&gt;CLI client to trigger it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s enough to understand the core idea&lt;/p&gt;

&lt;p&gt;Repo:&lt;br&gt;
&lt;a href="https://github.com/an1meshk/claude-chat-cli" rel="noopener noreferrer"&gt;https://github.com/an1meshk/claude-chat-cli&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You will need an Anthropic API key, as this project uses Claude&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  ⚙️ One More Thing That Helped
&lt;/h2&gt;

&lt;p&gt;Project uses &lt;code&gt;uv&lt;/code&gt; for dependency management. That helps in a few ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast installs&lt;/li&gt;
&lt;li&gt;Clean environment setup&lt;/li&gt;
&lt;li&gt;Minimal friction&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It removes a lot of the usual setup overhead&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚠️ What I Haven’t Explored Yet
&lt;/h2&gt;

&lt;p&gt;This was just a first pass. Still curious about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structuring tools cleanly&lt;/li&gt;
&lt;li&gt;Scaling MCP servers&lt;/li&gt;
&lt;li&gt;Real production use cases&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 Initial Take
&lt;/h2&gt;

&lt;p&gt;My early impression:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MCP isn’t hard to start with&lt;/li&gt;
&lt;li&gt;But the real value is in how you design interactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The setup is easy.&lt;br&gt;
The thinking is where the work is.&lt;/p&gt;

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

&lt;p&gt;Sometimes the best way to understand a new concept is:&lt;br&gt;
Build the simplest possible version of it&lt;/p&gt;

&lt;p&gt;This was one of those cases.&lt;/p&gt;

&lt;p&gt;If you have reached this point, I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf"&gt;“Skills” in Claude Aren’t About Prompts — They’re About Context Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents: The Building Block of Agentic AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/shift-left-performance-testing-in-spring-boot-stability-through-control-5e01"&gt;Shift-Left Performance Testing in Spring Boot: Engineering Stability Before Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/never-use-spring-restclient-default-implementation-in-production-100g"&gt;To Avoid Performance Impact Never Use Spring RestClient Default Implementation in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⁠&lt;a href="https://dev.to/akdevcraft/playwright-and-cucumber-are-the-best-tools-for-end-to-end-testing-a28"&gt;Supercharge Your E2E Tests with Playwright and Cucumber Integration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/when-resilience-backfires-retry-and-circuit-breaker-in-spring-boot-10m"&gt;When Resilience Backfires: Retry and Circuit Breaker in Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>claude</category>
      <category>llm</category>
    </item>
    <item>
      <title>Git Commands Workflow</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Sun, 29 Mar 2026 06:11:00 +0000</pubDate>
      <link>https://dev.to/akdevcraft/git-commands-workflow-5co8</link>
      <guid>https://dev.to/akdevcraft/git-commands-workflow-5co8</guid>
      <description>&lt;h2&gt;
  
  
  ⚡ Git Commands Workflow
&lt;/h2&gt;

&lt;p&gt;When I started using Git, I tried to learn as many commands as possible.&lt;/p&gt;

&lt;p&gt;But over time, I realized something:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You don’t need to know everything.&lt;br&gt;
You need to master the workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most of my day-to-day work revolves around a small set of commands—used repeatedly in different contexts.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Real Git Workflow
&lt;/h2&gt;

&lt;p&gt;At a high level, Git revolves around three stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Working directory → where you make changes&lt;/li&gt;
&lt;li&gt;Staging area → where you prepare changes&lt;/li&gt;
&lt;li&gt;Repository → where changes are committed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding this flow matters more than memorizing commands.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔄 1. Starting Work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git pull
git checkout &lt;span class="nt"&gt;-b&lt;/span&gt; feature/my-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What this does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sync latest code&lt;/li&gt;
&lt;li&gt;Create a new branch&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is usually how I start my day.&lt;/p&gt;

&lt;h3&gt;
  
  
  ✍️ 2. Making Changes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git status
git add &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;git status&lt;/code&gt; → shows what changed&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git add&lt;/code&gt; → stages changes for commit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 I check the status a lot more than I expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  💾 3. Saving Work
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Add feature X"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Creates a snapshot of your changes&lt;/li&gt;
&lt;li&gt;Helps track history over time &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Good commit messages matter more than the command itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 4. Syncing with Remote
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push
git pull
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;push&lt;/code&gt; → sends your changes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pull&lt;/code&gt; → brings latest updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is where most conflicts show up.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌿 5. Working with Branches
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git branch
git checkout main
git merge feature/my-feature
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Branching helps isolate work&lt;/li&gt;
&lt;li&gt;Merging brings changes together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Simple concept—but causes most real-world issues.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧰 6. Commands I Started Using Later
&lt;/h3&gt;

&lt;p&gt;These didn’t make sense early on—but became useful over time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git stash
git log
git diff
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;stash&lt;/code&gt; → save work temporarily&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;log&lt;/code&gt; → view history&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;diff&lt;/code&gt; → see changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 These are workflow boosters, not essentials.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚠️ What Actually Matters (Not the Commands)
&lt;/h3&gt;

&lt;p&gt;Over time, I realized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git problems are rarely about commands&lt;/li&gt;
&lt;li&gt;They’re about understanding state and flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most issues come from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Not knowing what’s staged&lt;/li&gt;
&lt;li&gt;Working on the wrong branch&lt;/li&gt;
&lt;li&gt;Pulling at the wrong time&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧠 What I’d Do Differently
&lt;/h2&gt;

&lt;p&gt;If I were starting again:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Focus on workflow, not commands&lt;/li&gt;
&lt;li&gt;Learn:

&lt;ul&gt;
&lt;li&gt;status&lt;/li&gt;
&lt;li&gt;add&lt;/li&gt;
&lt;li&gt;commit&lt;/li&gt;
&lt;li&gt;branch&lt;/li&gt;
&lt;li&gt;merge&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 That’s enough for most real work.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⚡ Practical Takeaways
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You don’t need 50 Git commands&lt;/li&gt;
&lt;li&gt;Master the core workflow first&lt;/li&gt;
&lt;li&gt;Use advanced commands only when needed&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Git feels complex when you try to learn everything.&lt;/p&gt;

&lt;p&gt;It becomes simple when you think in terms of:&lt;br&gt;
“Where are my changes right now?”&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached here, then I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/shift-left-performance-testing-in-spring-boot-stability-through-control-5e01"&gt;Shift-Left Performance Testing in Spring Boot: Engineering Stability Before Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/never-use-spring-restclient-default-implementation-in-production-100g"&gt;To Avoid Performance Impact Never Use Spring RestClient Default Implementation in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/modern-devsecops-requires-more-than-one-tool-a-practical-sdlc-security-strategy-4d74"&gt;Modern DevSecOps Needs More Than One Tool: A Practical Secure SDLC Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⁠&lt;a href="https://dev.to/akdevcraft/playwright-and-cucumber-are-the-best-tools-for-end-to-end-testing-a28"&gt;Supercharge Your E2E Tests with Playwright and Cucumber Integration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/when-resilience-backfires-retry-and-circuit-breaker-in-spring-boot-10m"&gt;When Resilience Backfires: Retry and Circuit Breaker in Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/setup-graphql-mock-server-32fc"&gt;Setup GraphQL Mock Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/cracking-software-engineer-interview-mp3"&gt;Cracking Software Engineering Interviews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>git</category>
      <category>github</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>JMeter vs Gatling: Comparison for Modern Performance Testing</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Sun, 22 Mar 2026 05:45:13 +0000</pubDate>
      <link>https://dev.to/akdevcraft/jmeter-vs-gatling-comparison-for-modern-performance-testing-57a1</link>
      <guid>https://dev.to/akdevcraft/jmeter-vs-gatling-comparison-for-modern-performance-testing-57a1</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Performance testing has been around for a long time. And if you’ve worked in this space, chances are you’ve used &lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;Apache JMeter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It’s popular.&lt;br&gt;
It’s reliable.&lt;br&gt;
And it has served the industry well.&lt;/p&gt;

&lt;p&gt;But is it still the best way to approach performance testing today?&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Shift: From Tooling → Engineering
&lt;/h2&gt;

&lt;p&gt;Traditional performance testing tools like &lt;a href="https://jmeter.apache.org/" rel="noopener noreferrer"&gt;Apache JMeter&lt;/a&gt; are largely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI-driven&lt;/li&gt;
&lt;li&gt;Configuration-heavy&lt;/li&gt;
&lt;li&gt;File-based (XML test plans)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This works… until it doesn’t.&lt;/p&gt;

&lt;p&gt;As systems become more complex and teams move toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;Version-controlled infrastructure&lt;/li&gt;
&lt;li&gt;“Everything as Code”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Performance testing needs to evolve, too.&lt;/p&gt;

&lt;p&gt;That’s where &lt;a href="https://gatling.io/" rel="noopener noreferrer"&gt;Gatling&lt;/a&gt; starts to stand out.&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚔️ JMeter vs Gatling — Key Differences
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 🧩 Configuration vs Code
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test plans are GUI-driven&lt;/li&gt;
&lt;li&gt;Stored as .jmx files&lt;/li&gt;
&lt;li&gt;Harder to review in pull requests&lt;/li&gt;
&lt;li&gt;Merge conflicts are painful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully code-based (Scala/Java/Kotlin)&lt;/li&gt;
&lt;li&gt;Lives naturally in your codebase&lt;/li&gt;
&lt;li&gt;Easy to version, review, and refactor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This is the biggest shift:&lt;/p&gt;

&lt;p&gt;Gatling treats performance tests like real software, not configuration.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. 🚀 Learning Curve &amp;amp; Developer Experience
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Requires learning the tool + UI&lt;/li&gt;
&lt;li&gt;Debugging can be unintuitive&lt;/li&gt;
&lt;li&gt;Configuration becomes overhead over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses familiar programming languages&lt;/li&gt;
&lt;li&gt;Easier for developers to adopt&lt;/li&gt;
&lt;li&gt;Better IDE support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You’re not learning a tool—you’re applying existing skills.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 🔄 CI/CD Integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integration is possible, but not seamless&lt;/li&gt;
&lt;li&gt;Often requires additional scripting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fits naturally into build pipelines&lt;/li&gt;
&lt;li&gt;Works like any other test suite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This aligns perfectly with modern DevOps practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 📊 Reporting &amp;amp; Insights
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provides reports, but often requires interpretation&lt;/li&gt;
&lt;li&gt;User ramp-up behavior isn’t always obvious&lt;/li&gt;
&lt;li&gt;Some level of “guesswork” is involved&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rich, interactive HTML reports out of the box&lt;/li&gt;
&lt;li&gt;Clear visualization of:

&lt;ul&gt;
&lt;li&gt;Active users&lt;/li&gt;
&lt;li&gt;Ramp-up patterns&lt;/li&gt;
&lt;li&gt;Response time distribution&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 Observability is significantly better.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. ⚙️ Maintainability at Scale
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;JMeter&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large test plans become difficult to manage&lt;/li&gt;
&lt;li&gt;Reusability is limited&lt;/li&gt;
&lt;li&gt;Refactoring is cumbersome&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Gatling&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modular, reusable code&lt;/li&gt;
&lt;li&gt;Easier to scale scenarios&lt;/li&gt;
&lt;li&gt;Cleaner structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 This becomes critical in large systems.&lt;/p&gt;

&lt;p&gt;Here is a quick comparison:&lt;br&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%2Frecf2yyyabkn3dgn3rg3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frecf2yyyabkn3dgn3rg3.png" alt="comparison" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🏁 So… Is JMeter Still Relevant?
&lt;/h2&gt;

&lt;p&gt;Absolutely.&lt;/p&gt;

&lt;p&gt;Apache JMeter is still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mature&lt;/li&gt;
&lt;li&gt;Widely adopted&lt;/li&gt;
&lt;li&gt;Backed by a strong community&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Quick testing&lt;/li&gt;
&lt;li&gt;Non-developer teams&lt;/li&gt;
&lt;li&gt;Legacy setups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It still does the job very well.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 My Take
&lt;/h3&gt;

&lt;p&gt;If your team is moving toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microservices&lt;/li&gt;
&lt;li&gt;CI/CD pipelines&lt;/li&gt;
&lt;li&gt;Engineering-driven quality&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;👉 Gatling feels like the natural next step&lt;/p&gt;

&lt;p&gt;Not because JMeter is bad…&lt;br&gt;
…but because the way we build software has changed.&lt;/p&gt;

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

&lt;p&gt;We’ve already embraced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Infrastructure as Code&lt;/li&gt;
&lt;li&gt;Tests as Code&lt;/li&gt;
&lt;li&gt;Pipelines as Code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Performance testing as code is the next logical step.&lt;/p&gt;

&lt;p&gt;And in that world, &lt;a href="https://gatling.io/" rel="noopener noreferrer"&gt;Gatling&lt;/a&gt; has a clear edge.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached here, then I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/shift-left-performance-testing-in-spring-boot-stability-through-control-5e01"&gt;Shift-Left Performance Testing in Spring Boot: Engineering Stability Before Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea"&gt;Practical Tips When Working with AI Coding Assistants&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/never-use-spring-restclient-default-implementation-in-production-100g"&gt;To Avoid Performance Impact Never Use Spring RestClient Default Implementation in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/modern-devsecops-requires-more-than-one-tool-a-practical-sdlc-security-strategy-4d74"&gt;Modern DevSecOps Needs More Than One Tool: A Practical Secure SDLC Strategy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⁠&lt;a href="https://dev.to/akdevcraft/playwright-and-cucumber-are-the-best-tools-for-end-to-end-testing-a28"&gt;Supercharge Your E2E Tests with Playwright and Cucumber Integration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/when-resilience-backfires-retry-and-circuit-breaker-in-spring-boot-10m"&gt;When Resilience Backfires: Retry and Circuit Breaker in Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/setup-graphql-mock-server-32fc"&gt;Setup GraphQL Mock Server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/cracking-software-engineer-interview-mp3"&gt;Cracking Software Engineering Interviews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>java</category>
      <category>performance</category>
      <category>api</category>
      <category>backend</category>
    </item>
    <item>
      <title>Practical Tips When Working with AI Coding Assistants</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Sat, 14 Mar 2026 22:22:13 +0000</pubDate>
      <link>https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea</link>
      <guid>https://dev.to/akdevcraft/practical-tips-when-working-with-ai-coding-assistants-1pea</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Modern AI coding assistants like Claude, GitHub Copilot, and ChatGPT can dramatically accelerate development. Recently, while working on a feature update, I had to modify an existing API to fetch data from a new system while maintaining backward compatibility.&lt;/p&gt;

&lt;p&gt;The migration was gradual. Some clients would continue using the old system for a while, while others would start using the new one. Because of that, the implementation had to support both behaviors during the transition period.&lt;/p&gt;

&lt;p&gt;Like many developers today, I used an AI coding assistant to speed up the implementation.&lt;/p&gt;

&lt;p&gt;At first, it seemed straightforward.&lt;/p&gt;

&lt;p&gt;But the process turned out to be more interesting than expected.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Before you move forward - Here is my new article on my agentic setup &lt;a href="https://dev.to/akdevcraft/running-a-personal-ai-assistant-for-0-part-1-architecture-3j45"&gt;$0 Personal Agentic AI Assistant for $0 - Architecture - Part 1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The First Iteration Looked Correct… But Wasn't Ideal
&lt;/h2&gt;

&lt;p&gt;The AI-generated code worked functionally. It handled the new system integration, preserved backward compatibility, and integrated with the existing service.&lt;/p&gt;

&lt;p&gt;But after reviewing the code carefully, a few issues surfaced:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extra conditional branches that were unnecessary&lt;/li&gt;
&lt;li&gt;Redundant logic left over from earlier iterations&lt;/li&gt;
&lt;li&gt;Code paths that technically worked but were not optimal&lt;/li&gt;
&lt;li&gt;Some defensive checks that were never needed for the actual use case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the code worked, but it wasn't clean.&lt;/p&gt;

&lt;p&gt;It took multiple iterations and careful review before the implementation reached a version that was both correct and maintainable.&lt;/p&gt;

&lt;p&gt;This experience reinforced something important.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Accelerates Coding — Not Thinking
&lt;/h2&gt;

&lt;p&gt;AI assistants are excellent at generating working code quickly. They help remove boilerplate, explore possible implementations, and reduce the time spent writing repetitive logic.&lt;/p&gt;

&lt;p&gt;However, they do not fully understand the context of your system.&lt;/p&gt;

&lt;p&gt;They don't know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The long-term architecture decisions&lt;/li&gt;
&lt;li&gt;The migration strategy&lt;/li&gt;
&lt;li&gt;The constraints of your system&lt;/li&gt;
&lt;li&gt;What future developers will have to maintain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because of this, AI often generates code that is technically correct but contextually imperfect.&lt;/p&gt;

&lt;p&gt;And that is where code review becomes critical.&lt;/p&gt;

&lt;h2&gt;
  
  
  In the AI Era, Code Review Becomes a Core Skill
&lt;/h2&gt;

&lt;p&gt;When development speed increases, the risk of suboptimal code entering the codebase also increases.&lt;/p&gt;

&lt;p&gt;If developers accept AI-generated code in the first iteration, teams may gradually accumulate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unnecessary abstractions&lt;/li&gt;
&lt;li&gt;Redundant logic&lt;/li&gt;
&lt;li&gt;Hidden technical debt&lt;/li&gt;
&lt;li&gt;Dead code paths&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over time, these small issues compound, making systems harder to maintain.&lt;/p&gt;

&lt;p&gt;This means developers must become even better reviewers than before.&lt;/p&gt;

&lt;p&gt;Good code review is no longer just about catching bugs. It is about evaluating whether the code truly fits the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions We Should Now Ask During Code Review
&lt;/h2&gt;

&lt;p&gt;When reviewing AI-assisted code, now intentionally ask a few additional questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Does the code solve the problem exactly, or more than necessary?
&lt;/h3&gt;

&lt;p&gt;AI often introduces extra flexibility that the use case does not require.&lt;br&gt;
Extra flexibility today can easily become unnecessary complexity tomorrow.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Is there redundant or leftover logic?
&lt;/h3&gt;

&lt;p&gt;Because AI suggestions often evolve across multiple prompts, some intermediate logic can remain even after the final version is generated.&lt;br&gt;
This can result in code paths that are never actually used.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Is the implementation optimal for the system architecture?
&lt;/h3&gt;

&lt;p&gt;AI may suggest patterns that work in general but do not align with your system's architecture.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Introducing unnecessary abstractions&lt;/li&gt;
&lt;li&gt;Overusing defensive checks&lt;/li&gt;
&lt;li&gt;Adding layers that increase complexity without real benefit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Will the code still make sense to the next developer?
&lt;/h3&gt;

&lt;p&gt;Maintainability matters.&lt;br&gt;
Even if the code works, the question remains:&lt;/p&gt;

&lt;p&gt;Would another engineer understand this logic six months from now?&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Changes the Development Workflow
&lt;/h2&gt;

&lt;p&gt;One interesting shift I’ve noticed is that development is starting to look more like collaboration between a developer and an AI assistant.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Developer defines the intent&lt;/li&gt;
&lt;li&gt;AI generates an implementation&lt;/li&gt;
&lt;li&gt;Developer reviews and refines&lt;/li&gt;
&lt;li&gt;AI proposes improvements&lt;/li&gt;
&lt;li&gt;Developer validates architecture and constraints&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The developer's role shifts slightly from writing every line of code to evaluating, refining, and validating generated code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Skill Shift for Engineers
&lt;/h2&gt;

&lt;p&gt;As AI becomes more capable at writing code, the value of engineers will increasingly come from their ability to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Review code critically&lt;/li&gt;
&lt;li&gt;Evaluate trade-offs&lt;/li&gt;
&lt;li&gt;Optimize implementations&lt;/li&gt;
&lt;li&gt;Ensure architectural alignment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words, the skill of thinking about code becomes even more important than writing code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Development Flow Diagram
&lt;/h2&gt;

&lt;p&gt;Here is a quick comparison between Traditional and AI-Assistent development flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Traditional Development
&lt;/h3&gt;

&lt;p&gt;Developer&lt;br&gt;
   ↓&lt;br&gt;
Write Code&lt;br&gt;
   ↓&lt;br&gt;
Code Review&lt;br&gt;
   ↓&lt;br&gt;
Merge&lt;/p&gt;

&lt;h3&gt;
  
  
  AI-Assisted Development
&lt;/h3&gt;

&lt;p&gt;Developer Idea&lt;br&gt;
      ↓&lt;br&gt;
AI Generates Code&lt;br&gt;
      ↓&lt;br&gt;
Developer Reviews &amp;amp; Refines&lt;br&gt;
      ↓&lt;br&gt;
AI Iteration&lt;br&gt;
      ↓&lt;br&gt;
Code Review&lt;br&gt;
      ↓&lt;br&gt;
   Merge&lt;/p&gt;

&lt;p&gt;AI accelerates code generation, but developers are still responsible for validating the architecture, reducing unnecessary complexity, and ensuring maintainability.&lt;/p&gt;

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

&lt;p&gt;AI tools are powerful accelerators for software development. They can help teams move faster and explore solutions more quickly.&lt;/p&gt;

&lt;p&gt;But speed should not come at the cost of quality.&lt;/p&gt;

&lt;p&gt;If anything, the rise of AI in development makes strong code review practices more important than ever.&lt;/p&gt;

&lt;p&gt;Ultimately, AI can generate code, but engineers are still responsible for the systems they build.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have reached here, then I have made a satisfactory effort to keep you reading. Please be kind enough to leave any comments or share any corrections.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Other Blogs:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/skills-in-claude-arent-about-prompts-theyre-about-context-design-46hf"&gt;“Skills” in Claude Aren’t About Prompts — They’re About Context Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/trying-mcp-for-the-first-time-what-stood-out-1451"&gt;Trying MCP for the First Time — What Stood Out&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/subagents-the-building-block-of-agentic-ai-4ngo"&gt;Subagents: The Building Block of Agentic AI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;⁠&lt;a href="https://dev.to/akdevcraft/playwright-and-cucumber-are-the-best-tools-for-end-to-end-testing-a28"&gt;Supercharge Your E2E Tests with Playwright and Cucumber Integration&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/never-use-spring-restclient-default-implementation-in-production-100g"&gt;To Avoid Performance Impact Never Use Spring RestClient Default Implementation in Production&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/shift-left-performance-testing-in-spring-boot-stability-through-control-5e01"&gt;Shift-Left Performance Testing in Spring Boot: Engineering Stability Before Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/when-resilience-backfires-retry-and-circuit-breaker-in-spring-boot-10m"&gt;When Resilience Backfires: Retry and Circuit Breaker in Spring Boot&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/akdevcraft/cracking-software-engineer-interview-mp3"&gt;Cracking Software Engineering Interviews&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>softwareengineering</category>
      <category>claude</category>
    </item>
    <item>
      <title>☁️ Private Cloud vs Public Cloud — still one of the most misunderstood topics in cloud computing.
Many discussions focus only on cost or control, but the real differences go deeper</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Thu, 12 Mar 2026 05:37:00 +0000</pubDate>
      <link>https://dev.to/akdevcraft/private-cloud-vs-public-cloud-still-one-of-the-most-misunderstood-topics-in-cloud-computing-21a2</link>
      <guid>https://dev.to/akdevcraft/private-cloud-vs-public-cloud-still-one-of-the-most-misunderstood-topics-in-cloud-computing-21a2</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/akdevcraft/private-vs-public-cloud-computing-5b74" class="crayons-story__hidden-navigation-link"&gt;Private vs Public Cloud: Key Differences, Architecture, and Cloud Service Models&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/akdevcraft" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F554959%2F58372a5a-61ca-4837-9390-42e925e9d3f6.jpeg" alt="akdevcraft profile" class="crayons-avatar__image" width="800" height="457"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/akdevcraft" class="crayons-story__secondary fw-medium m:hidden"&gt;
              AK DevCraft
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                AK DevCraft
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-924090" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/akdevcraft" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F554959%2F58372a5a-61ca-4837-9390-42e925e9d3f6.jpeg" class="crayons-avatar__image" alt="" width="800" height="457"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;AK DevCraft&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/akdevcraft/private-vs-public-cloud-computing-5b74" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 12 '21&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/akdevcraft/private-vs-public-cloud-computing-5b74" id="article-link-924090"&gt;
          Private vs Public Cloud: Key Differences, Architecture, and Cloud Service Models
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloud"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloud&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cloudcomputing"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cloudcomputing&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/containers"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;containers&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/akdevcraft/private-vs-public-cloud-computing-5b74" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/akdevcraft/private-vs-public-cloud-computing-5b74#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>cloud</category>
      <category>cloudcomputing</category>
      <category>containers</category>
      <category>docker</category>
    </item>
    <item>
      <title>Do you know how to stream Kubernetes log from multiple pods concurrently?</title>
      <dc:creator>AK DevCraft</dc:creator>
      <pubDate>Fri, 27 Feb 2026 05:14:43 +0000</pubDate>
      <link>https://dev.to/akdevcraft/do-you-know-how-to-stream-kubernetes-log-from-multiple-pods-concurrently-43c8</link>
      <guid>https://dev.to/akdevcraft/do-you-know-how-to-stream-kubernetes-log-from-multiple-pods-concurrently-43c8</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/akdevcraft/streaming-logs-from-all-pods-at-once-1kh7" class="crayons-story__hidden-navigation-link"&gt;Streaming Kubernetes logs of more than one pod concurrently&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/akdevcraft" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F554959%2F58372a5a-61ca-4837-9390-42e925e9d3f6.jpeg" alt="akdevcraft profile" class="crayons-avatar__image" width="800" height="457"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/akdevcraft" class="crayons-story__secondary fw-medium m:hidden"&gt;
              AK DevCraft
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                AK DevCraft
                &lt;a href="/++"&gt;&lt;img alt="Subscriber" class="subscription-icon" src="https://assets.dev.to/assets/subscription-icon-805dfa7ac7dd660f07ed8d654877270825b07a92a03841aa99a1093bd00431b2.png" width="166" height="102"&gt;&lt;/a&gt;
              
              &lt;div id="story-author-preview-content-1316688" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/akdevcraft" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F554959%2F58372a5a-61ca-4837-9390-42e925e9d3f6.jpeg" class="crayons-avatar__image" alt="" width="800" height="457"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;AK DevCraft&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/akdevcraft/streaming-logs-from-all-pods-at-once-1kh7" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jan 3 '23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/akdevcraft/streaming-logs-from-all-pods-at-once-1kh7" id="article-link-1316688"&gt;
          Streaming Kubernetes logs of more than one pod concurrently
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kubernetes"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kubernetes&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/containers"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;containers&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/akdevcraft/streaming-logs-from-all-pods-at-once-1kh7" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;4&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/akdevcraft/streaming-logs-from-all-pods-at-once-1kh7#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>kubernetes</category>
      <category>containers</category>
      <category>docker</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
