<?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: Mehul Bhardwaj</title>
    <description>The latest articles on DEV Community by Mehul Bhardwaj (@mehul_bhardwaj_8a2d2aaecb).</description>
    <link>https://dev.to/mehul_bhardwaj_8a2d2aaecb</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%2F3846065%2F82f75bb2-e3aa-447c-a6c6-bc2bda5f04e0.png</url>
      <title>DEV Community: Mehul Bhardwaj</title>
      <link>https://dev.to/mehul_bhardwaj_8a2d2aaecb</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mehul_bhardwaj_8a2d2aaecb"/>
    <language>en</language>
    <item>
      <title>Can OpenClaw Read Your Files? Here's What's Actually True.</title>
      <dc:creator>Mehul Bhardwaj</dc:creator>
      <pubDate>Tue, 14 Apr 2026 04:23:44 +0000</pubDate>
      <link>https://dev.to/mehul_bhardwaj_8a2d2aaecb/can-openclaw-read-your-files-heres-whats-actually-true-2pkg</link>
      <guid>https://dev.to/mehul_bhardwaj_8a2d2aaecb/can-openclaw-read-your-files-heres-whats-actually-true-2pkg</guid>
      <description>&lt;p&gt;A colleague who runs a consulting practice told me he'd read something online suggesting that OpenClaw would read all his data and that client information could end up in the wrong hands. He wanted to know whether he needed to do some kind of data cleanup before running it, and whether his clients' information was safe.&lt;/p&gt;

&lt;p&gt;The answer is no cleanup needed, and yes the data is safe. But the reason matters, because "trust us, it's fine" is not an answer for a professional who carries liability for their clients' information. Here is the actual mechanism.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Vessel is a separate computer
&lt;/h2&gt;

&lt;p&gt;When you run OpenClaw through Vessel, it does not run on your machine. It runs inside a dedicated virtual machine in the cloud. That VM is the Vessel.&lt;/p&gt;

&lt;p&gt;Your laptop and the Vessel are two distinct computers. They do not share a file system, they do not share memory, and there is no network path between them except the one you open when you visit the Vessel dashboard in your browser. Your Documents folder, your client files, your financial records, your desktop: none of these are on the Vessel. They are on your machine. The Vessel has never seen them and has no way to reach them.&lt;/p&gt;

&lt;p&gt;This is not a permissions setting. It is not a policy. It is a physical separation. The agent lives in the cloud. Your files live on your hardware. Those are two different computers.&lt;/p&gt;

&lt;p&gt;So the question "will OpenClaw read my files" has a simple answer when you run it on Vessel: it cannot, because your files are not there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What OpenClaw can access
&lt;/h2&gt;

&lt;p&gt;The Vessel contains OpenClaw and the connections you have explicitly authorized. That is the full inventory of what the agent can see.&lt;/p&gt;

&lt;p&gt;If you connect your Gmail account, it can read and send email from that account. If you connect Slack, it can read and send messages in the channels you permit. If you connect your calendar, it can read your schedule. These connections go through standard authorization flows, the same ones you use when you allow any application to connect to Google or Slack. You approve each one. You define the scope.&lt;/p&gt;

&lt;p&gt;That list is the entire perimeter. Nothing on your laptop is inside it. Nothing you have not explicitly connected is inside it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens if someone hacks the Vessel
&lt;/h2&gt;

&lt;p&gt;This is the second question worth answering directly, because "separate computer" raises an obvious follow-up: what if someone gets into that computer?&lt;/p&gt;

&lt;p&gt;Each Vessel is an isolated virtual machine. The isolation is enforced at the hardware level by the cloud infrastructure it runs on. One VM cannot read the memory of another VM. One VM cannot access the disk of another VM. This is not a software promise, it is how the underlying hardware virtualization works. Google Cloud Platform's hypervisor enforces it at the physical level.&lt;/p&gt;

&lt;p&gt;This matters for two reasons.&lt;/p&gt;

&lt;p&gt;First, if someone compromised your Vessel, they would get a Linux box running OpenClaw, plus whatever services you had connected via OAuth. They would not get your local files, because those are on your machine, not the Vessel. The blast radius is bounded.&lt;/p&gt;

&lt;p&gt;Second, if someone compromised any Vessel, they would not be able to cross into another customer's Vessel. Each one is walled off from every other one at the hardware level. This is structurally different from shared container hosting, where a container escape can put an attacker on the host machine that other containers share. On dedicated VMs, that path does not exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare: running OpenClaw on your laptop
&lt;/h2&gt;

&lt;p&gt;Running OpenClaw locally is not the data disaster people imagine, but it does create a different risk worth understanding.&lt;/p&gt;

&lt;p&gt;The agent still cannot read arbitrary files it was not given access to. That part is the same. What changes is that your agent is now running on the same machine as everything sensitive you own. Your client contracts, your financial records, your saved credentials: all on the same hardware as the agent process. If something goes wrong with the software, you are dealing with it on the machine that holds everything.&lt;/p&gt;

&lt;p&gt;Running on a dedicated Vessel means those two things never share a machine. Something going wrong on the Vessel stays contained to the Vessel. Your laptop remains what it was before: a separate computer that the agent has no access to.&lt;/p&gt;

&lt;h2&gt;
  
  
  The LLM API question
&lt;/h2&gt;

&lt;p&gt;One more concern worth addressing: when OpenClaw processes a request, it sends a prompt to the AI model you have configured (Anthropic, OpenAI, or Google Gemini) through their API. That conversation does travel to their servers. This is not hidden and it is not unique to OpenClaw. It is exactly the same data flow as pasting a document into Claude or ChatGPT yourself.&lt;/p&gt;

&lt;p&gt;All three major providers are explicit that paid API traffic is not used for model training.&lt;/p&gt;

&lt;p&gt;Anthropic: "We will not use your chats or coding sessions to train our models, unless you choose to participate in our Development Partner Program." (&lt;a href="https://privacy.claude.com/en/articles/7996885-how-do-you-use-personal-data-in-model-training" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;OpenAI: "Data sent to the OpenAI API is not used to train or improve OpenAI models (unless you explicitly opt in to share data with us)." (&lt;a href="https://openai.com/enterprise-privacy" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Google Gemini: "When you use Paid Services, Google doesn't use your prompts or responses to improve our products." (&lt;a href="https://ai.google.dev/gemini-api/terms" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;One caveat: Google's free Gemini API tier operates under different terms and does use content for product improvement. Vessel uses the paid API tier, so the above applies.&lt;/p&gt;

&lt;p&gt;The practical point in all three cases is the same: the data that travels to the model is only the content you put into the conversation. It is not a background sweep of your files. It is not ambient collection. It is a deliberate API call with the context you chose to include.&lt;/p&gt;

&lt;p&gt;The memory and context that OpenClaw builds over time, the knowledge it accumulates about how you work, stays on the Vessel. On shared hosting, that server belongs to someone else. On a dedicated Vessel, it belongs to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  No cleanup needed, and here is why
&lt;/h2&gt;

&lt;p&gt;My colleague asked whether he needed to sanitize his systems before running an AI agent. The reason the answer is no: the agent is not on his systems. It is on a separate computer in the cloud that has never seen his local files and cannot reach them.&lt;/p&gt;

&lt;p&gt;The question worth asking before you start is not "what is on my machine that the agent might find." It is "what services am I going to connect to this agent, and am I comfortable with it acting on my behalf in those places." That is a much narrower question, and it is entirely in your control.&lt;/p&gt;

&lt;p&gt;Make a short list of the connections you plan to authorize. Gmail, Slack, calendar, whatever is relevant to the work you want it to do. That list is the perimeter. Everything outside it remains exactly where it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  The structural answer
&lt;/h2&gt;

&lt;p&gt;The privacy guarantee here is not a promise made in a terms of service. It is a consequence of architecture. The Vessel is a separate computer. Your files are on a different machine. Hardware-level VM isolation means no other customer's Vessel can see yours, and yours cannot see theirs.&lt;/p&gt;

&lt;p&gt;For a professional who carries accountability to clients, that distinction matters. "We promise not to look" is a policy. "There is no path from that machine to your files" is a structure.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm building &lt;a href="https://vesselofone.com" rel="noopener noreferrer"&gt;Vessel&lt;/a&gt;, dedicated private hosting for OpenClaw agents. Each agent runs on its own isolated server in the cloud. More on how the isolation works: &lt;a href="https://vesselofone.com/platform/security" rel="noopener noreferrer"&gt;vesselofone.com/platform/security&lt;/a&gt; and &lt;a href="https://vesselofone.com/why/isolation" rel="noopener noreferrer"&gt;vesselofone.com/why/isolation&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>security</category>
      <category>openclaw</category>
      <category>virtualmachine</category>
    </item>
    <item>
      <title>What Self-Hosting OpenClaw Actually Costs (It's Not Just the VPS)</title>
      <dc:creator>Mehul Bhardwaj</dc:creator>
      <pubDate>Sun, 05 Apr 2026 06:30:40 +0000</pubDate>
      <link>https://dev.to/mehul_bhardwaj_8a2d2aaecb/what-self-hosting-openclaw-actually-costs-its-not-just-the-vps-353o</link>
      <guid>https://dev.to/mehul_bhardwaj_8a2d2aaecb/what-self-hosting-openclaw-actually-costs-its-not-just-the-vps-353o</guid>
      <description>&lt;p&gt;Every deployment guide says self-hosting OpenClaw costs $5-20/mo. I believed that too, until I started tracking where my time actually went.&lt;/p&gt;

&lt;p&gt;The VPS was the cheapest part of the whole operation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Everyone Budgets
&lt;/h2&gt;

&lt;p&gt;You find a deployment guide. It walks you through spinning up a VPS, pulling the Docker image, setting up a reverse proxy. At the end, you do the math: maybe $7 on Hetzner, $48 if you want DigitalOcean's SLA. Add a domain, Let's Encrypt, your own API keys. Call it $20-100/mo depending on how fancy you get.&lt;/p&gt;

&lt;p&gt;For reference, here's what a 4 vCPU / 8 GB instance actually costs in 2026:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Monthly&lt;/th&gt;
&lt;th&gt;The catch&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Contabo&lt;/td&gt;
&lt;td&gt;~$5&lt;/td&gt;
&lt;td&gt;Oversold shared vCPUs. Performance varies.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVH&lt;/td&gt;
&lt;td&gt;~$6.50&lt;/td&gt;
&lt;td&gt;Free daily backups. Honest value.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner&lt;/td&gt;
&lt;td&gt;~$9&lt;/td&gt;
&lt;td&gt;No SLA. US regions get 1 TB transfer, not 20 TB. Price increased Apr 2026.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP (1yr commit)&lt;/td&gt;
&lt;td&gt;~$37&lt;/td&gt;
&lt;td&gt;On-demand is $49. Add $3-5 for disk.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;$40&lt;/td&gt;
&lt;td&gt;Straightforward. No surprises.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;$56&lt;/td&gt;
&lt;td&gt;Best SLA. Best marketplace. Price reflects it.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Feels reasonable. You pick a provider, provision the box, get the agent running. Whole thing takes an evening.&lt;/p&gt;

&lt;p&gt;And then the month starts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 1: The Patch
&lt;/h2&gt;

&lt;p&gt;OpenClaw ships patches 2-3 times a month. Not feature releases. Security patches. The kind you can't ignore because the last round of CVEs included a pre-auth remote code execution.&lt;/p&gt;

&lt;p&gt;So Tuesday morning, I see the release. Pull the new image. Read the changelog to make sure nothing breaks. Restart the container. Verify the agent comes back and the skills still load.&lt;/p&gt;

&lt;p&gt;45 minutes. Fine. That's the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 2: The Key I Forgot About
&lt;/h2&gt;

&lt;p&gt;Routine API key rotation. I open the docker-compose file and there it is. The OpenAI key, hardcoded directly in the environment block. Not pulled from &lt;code&gt;.env&lt;/code&gt;. Just sitting there in plaintext, committed to a private repo I haven't thought about since setup day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# How it was (bad)&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;openclaw&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;OPENAI_API_KEY=sk-proj-abc123...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# How it should have been&lt;/span&gt;
&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;openclaw&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;env_file&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;.env&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I know better than this. Everyone knows better than this. But setup day was three weeks ago, and setup day me was in a hurry to see the agent respond to a message. Setup day me cut a corner and moved on.&lt;/p&gt;

&lt;p&gt;Rotated the key. Fixed the compose file. Tested everything. 50 minutes, plus the quiet dread of wondering how long that key was sitting there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 3: The Silent Failure
&lt;/h2&gt;

&lt;p&gt;This one cost me three hours and some trust.&lt;/p&gt;

&lt;p&gt;The agent had been silently disconnecting from the gateway every six hours or so. No error in the container logs. No alert. Nothing in the dashboard. From my side, everything looked fine.&lt;/p&gt;

&lt;p&gt;From the user's side, they'd open the chat and get nothing. Just silence. For how long before I noticed? I don't actually know. That's the part that bothered me.&lt;/p&gt;

&lt;p&gt;The fix was a health check I should have written on day one:&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;#!/bin/bash&lt;/span&gt;
&lt;span class="nv"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; http://localhost:18789/health&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$response&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;"200"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;docker restart openclaw-agent
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;: Agent restarted"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /var/log/openclaw-health.log
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# crontab: every 5 minutes&lt;/span&gt;
&lt;span class="k"&gt;*&lt;/span&gt;/5 &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="k"&gt;*&lt;/span&gt; /opt/openclaw/health-check.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three hours of debugging. The silent part was worse than the broken part. An agent that crashes loudly is annoying. An agent that fails quietly erodes confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Week 4: Sunday Night
&lt;/h2&gt;

&lt;p&gt;11pm on a Sunday. A skill tried to load a large PDF into context. The container hit its memory ceiling. The kernel OOM-killed it. No graceful shutdown, no notification, no restart. Just gone.&lt;/p&gt;

&lt;p&gt;I found out Monday morning when I saw a client message that had gone unanswered for nine hours.&lt;/p&gt;

&lt;p&gt;90 minutes to set up memory limits and alerting. The kind of work that feels urgent at 7am on a Monday, standing in the kitchen, coffee not yet made, reading a notification that should have woken me up at 11pm but didn't because the alerting didn't exist yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding It Up
&lt;/h2&gt;

&lt;p&gt;Here's what the month cost:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Hours&lt;/th&gt;
&lt;th&gt;What happened&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Security patching&lt;/td&gt;
&lt;td&gt;~1 hr&lt;/td&gt;
&lt;td&gt;One patch cycle. Some months it's two.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential rotation&lt;/td&gt;
&lt;td&gt;~1 hr&lt;/td&gt;
&lt;td&gt;Plus the cold sweat of finding a hardcoded key.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring + debugging&lt;/td&gt;
&lt;td&gt;~3 hrs&lt;/td&gt;
&lt;td&gt;The silent WebSocket failure.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unplanned incident&lt;/td&gt;
&lt;td&gt;~1.5 hrs&lt;/td&gt;
&lt;td&gt;Sunday night OOM kill.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~6.5 hrs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Call it 4-7 hours in a typical month. Some months less. Some months the WebSocket thing happens and it's more.&lt;/p&gt;

&lt;p&gt;Now put a number on your time. If you bill $100/hr (and if you're running an AI agent for professional work, your rate is probably higher), that's $400-700/mo in time. On top of whatever you pay for the VPS.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Infra cost&lt;/th&gt;
&lt;th&gt;+ Time (4 hrs × $100)&lt;/th&gt;
&lt;th&gt;What you actually pay&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner&lt;/td&gt;
&lt;td&gt;~$9&lt;/td&gt;
&lt;td&gt;$400&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$409/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OVH&lt;/td&gt;
&lt;td&gt;~$7&lt;/td&gt;
&lt;td&gt;$400&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$407/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vultr&lt;/td&gt;
&lt;td&gt;~$48&lt;/td&gt;
&lt;td&gt;$400&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$448/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;~$56&lt;/td&gt;
&lt;td&gt;$400&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$456/mo&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pick any provider. The VPS is a rounding error. You're paying $400/mo no matter where the box lives.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Isn't Like Self-Hosting Plex
&lt;/h2&gt;

&lt;p&gt;I've self-hosted plenty of things. Nextcloud. Plex. Home Assistant. Gitea. None of them cost me this much time per month.&lt;/p&gt;

&lt;p&gt;AI agents are a different animal. External API keys that expire on different schedules. A patch cadence of 2-3 times a month because the security surface is still being mapped (14 CVEs in four months, and counting). Third-party skills that run arbitrary code inside your agent. 800+ malicious skills found on ClawHub in a single audit.&lt;/p&gt;

&lt;p&gt;And the stakes are different. Plex going down means someone can't watch a movie. Your AI agent going down means a client message goes unanswered for nine hours. The data inside it isn't your media library. It's documents, API keys, conversation history. Potentially client data.&lt;/p&gt;

&lt;p&gt;The operational weight is structurally heavier than most self-hosted software. That's not a temporary problem. That's the nature of what this software does.&lt;/p&gt;

&lt;h2&gt;
  
  
  When Self-Hosting Is Still the Right Call
&lt;/h2&gt;

&lt;p&gt;If you're learning how AI agents work under the hood, self-host. It's the best way to understand what's actually happening. If you need to modify the runtime itself, self-host. If infrastructure is your hobby and your homelab is where you unwind on weekends, self-host and enjoy it. If you already have an ops team managing servers, the marginal cost of one more container is low.&lt;/p&gt;

&lt;p&gt;For all of those cases, Hetzner at ~$9/mo is hard to beat. OVH's free backups are a nice touch. Go for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  When It Isn't
&lt;/h2&gt;

&lt;p&gt;If infrastructure time is a cost, not recreation, the math is hard to argue with.&lt;/p&gt;

&lt;p&gt;The VPS costs $9-56. Your time costs $400. The total is $409-448/mo, and it doesn't matter which provider you pick because your time dwarfs the infrastructure line.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://vesselofone.com" rel="noopener noreferrer"&gt;Vessel&lt;/a&gt; because I didn't want to be the one reading that Monday notification. &lt;a href="https://vesselofone.com/why/isolation" rel="noopener noreferrer"&gt;Dedicated GCP VM&lt;/a&gt;, Cloudflare Tunnel, &lt;a href="https://vesselofone.com/platform/security" rel="noopener noreferrer"&gt;patches and security hardening&lt;/a&gt; applied. Your time costs more than that.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openclaw</category>
      <category>devops</category>
      <category>infrastructure</category>
    </item>
    <item>
      <title>220,000+ OpenClaw Instances Are Exposed. Here's How to Check Yours.</title>
      <dc:creator>Mehul Bhardwaj</dc:creator>
      <pubDate>Sat, 28 Mar 2026 12:15:18 +0000</pubDate>
      <link>https://dev.to/mehul_bhardwaj_8a2d2aaecb/220000-openclaw-instances-are-exposed-heres-how-to-check-yours-1f7o</link>
      <guid>https://dev.to/mehul_bhardwaj_8a2d2aaecb/220000-openclaw-instances-are-exposed-heres-how-to-check-yours-1f7o</guid>
      <description>&lt;p&gt;Security researchers have been scanning for exposed OpenClaw instances since January 2026. The numbers vary by methodology: Penligent found over 220,000, SecurityScorecard identified 135,000, Censys tracked growth from 1,000 to 21,000+ in a single week. Microsoft's security blog concluded that "for most environments, the appropriate decision may be not to deploy it."&lt;/p&gt;

&lt;p&gt;Most of these instances are running without TLS. Many are still vulnerable to ClawJacked (CVE-2026-25253, CVSS 8.8), which allowed any webpage you visited to silently brute-force the gateway token over localhost with no rate limiting.&lt;/p&gt;

&lt;p&gt;I've been reviewing public configs and deployment guides. Three misconfigs show up in the majority of them, and they're all fixable in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exposure surface
&lt;/h2&gt;

&lt;p&gt;OpenClaw's default config binds the gateway to &lt;code&gt;0.0.0.0:18789&lt;/code&gt;. If you install it on a VPS and don't touch the network settings, the gateway is public. There's no warning during setup. The docs mention it, but not where people look.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gateway token brute-force.&lt;/strong&gt; ClawJacked (CVE-2026-25253, CVSS 8.8) allowed any webpage you visited to brute-force the gateway token. No rate limiting. No CORS. Patched in v2026.1.24-1, but the fix requires updating. Persistent services that nobody actively maintains tend to drift.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Unencrypted traffic.&lt;/strong&gt; Without TLS, everything between the browser and the agent travels in plaintext. API keys, model responses, user data. On a shared network, that's trivial to intercept.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Supply chain.&lt;/strong&gt; ClawHavoc in January 2026: researchers found 824 malicious skills on ClawHub out of roughly 10,700 total. Clawdex, the main community scanner, was catching under 10% of them (Oathe's independent audit confirmed this). If your instance auto-installs recommended skills, you're trusting a supply chain that has already been compromised.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The three configs most people get wrong
&lt;/h2&gt;

&lt;p&gt;I've reviewed hundreds of &lt;code&gt;openclaw.json&lt;/code&gt; files from public repos, Docker Compose setups, and deployment guides. Three misconfigs show up in the majority of them.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Gateway binding
&lt;/h3&gt;

&lt;p&gt;Default: binds to all interfaces (&lt;code&gt;0.0.0.0:18789&lt;/code&gt;)&lt;br&gt;
What it should be: &lt;code&gt;loopback&lt;/code&gt; (127.0.0.1 only)&lt;/p&gt;

&lt;p&gt;If you're running behind a reverse proxy or tunnel, the gateway should never be reachable directly. The &lt;code&gt;bind&lt;/code&gt; key accepts &lt;code&gt;loopback&lt;/code&gt;, &lt;code&gt;lan&lt;/code&gt;, &lt;code&gt;tailnet&lt;/code&gt;, or &lt;code&gt;custom&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gateway"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"bind"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"loopback"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"port"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18789&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. The three proxy/tunnel flags
&lt;/h3&gt;

&lt;p&gt;If you're running behind a reverse proxy or Cloudflare Tunnel, you need three flags under &lt;code&gt;gateway.controlUi&lt;/code&gt;. Not at the root level. Not as dot-notation keys. Nested JSON only.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"gateway"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"controlUi"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dangerouslyDisableDeviceAuth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"dangerouslyAllowHostHeaderOriginFallback"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"allowInsecureAuth"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Most guides mention two of these. The third, &lt;code&gt;dangerouslyDisableDeviceAuth&lt;/code&gt;, is the one that causes the &lt;code&gt;disconnected (1000): no reason&lt;/code&gt; error in the browser. It disables CLI-based device pairing, which only works with local machine access. Behind a proxy, there's no local CLI, so the auth loop times out silently.&lt;/p&gt;

&lt;p&gt;The flag names sound dangerous. They're not, if you have a proxy handling auth in front. Without a proxy, don't set them.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. TLS termination
&lt;/h3&gt;

&lt;p&gt;If your reverse proxy handles TLS (it should), the gateway can run without its own certificate. But the connection between proxy and gateway must stay on loopback. If the proxy runs on a different host than the gateway, you need TLS on both hops.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Browser] →HTTPS→ [Proxy (TLS)] →HTTP→ [Gateway (127.0.0.1:18789)]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This only works when proxy and gateway share the same host. Most single-VPS setups qualify.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check yours
&lt;/h2&gt;

&lt;p&gt;Run these checks on any instance:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Port exposure check:&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="c"&gt;# From outside your network&lt;/span&gt;
nmap &lt;span class="nt"&gt;-p&lt;/span&gt; 18789 your-server-ip
&lt;span class="c"&gt;# If it shows "open", your gateway is public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Config audit:&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="c"&gt;# On the server&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; ~/.openclaw/openclaw.json | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"bind|dangerously|allowInsecure"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;3. Version check:&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 &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# Anything before v2026.1.24-1 is vulnerable to ClawJacked&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also built a free scanner that runs these checks and a few more (skill supply chain, known CVE patterns, config analysis): &lt;a href="https://vesselofone.com/tools/security-check" rel="noopener noreferrer"&gt;https://vesselofone.com/tools/security-check&lt;/a&gt;. It runs against your instance URL and returns a report. No data stored, no signup required.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Set &lt;code&gt;gateway.bind&lt;/code&gt; to &lt;code&gt;"loopback"&lt;/code&gt;, not the default (all interfaces)&lt;/li&gt;
&lt;li&gt;Set the three &lt;code&gt;gateway.controlUi&lt;/code&gt; flags if behind a proxy or tunnel&lt;/li&gt;
&lt;li&gt;TLS terminate at the proxy, keep gateway on loopback&lt;/li&gt;
&lt;li&gt;Update to v2026.1.24-1 or later (ClawJacked fix)&lt;/li&gt;
&lt;li&gt;Audit installed skills (ClawHavoc found 824 malicious ones on ClawHub)&lt;/li&gt;
&lt;li&gt;Run a port scan from outside your network to verify nothing is exposed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of these take five minutes. The gap between "it works" and "it's not actively exploitable" is three config lines.&lt;/p&gt;

</description>
      <category>openclaw</category>
      <category>security</category>
      <category>ai</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
