<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>OpenClaw Deploy</title><link>http://tardigrde.github.io/openclaw-deploy/</link><description>Recent content on OpenClaw Deploy</description><generator>Hugo</generator><language>en</language><atom:link href="http://tardigrde.github.io/openclaw-deploy/index.xml" rel="self" type="application/rss+xml"/><item><title>Backup &amp; Restore</title><link>http://tardigrde.github.io/openclaw-deploy/operations/backup-restore/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/operations/backup-restore/</guid><description>&lt;p&gt;Backups run daily at &lt;strong&gt;03:00 UTC&lt;/strong&gt; via systemd timer and are stored in &lt;code&gt;~/backups/&lt;/code&gt; on the VPS.&lt;/p&gt;
&lt;h2 id="make-targets"&gt;Make Targets&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make backup-now &lt;span style="color:#75715e"&gt;# Trigger backup immediately&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make backup-pull &lt;span style="color:#75715e"&gt;# Download latest backup archive locally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make restore &lt;span style="color:#75715e"&gt;# List available backups (dry-run — safe)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make restore EXECUTE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; BACKUP&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# Restore from backup&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;make restore&lt;/code&gt; without &lt;code&gt;EXECUTE=1&lt;/code&gt; is always safe — it just lists available backups.&lt;/p&gt;</description></item><item><title>Private Fork</title><link>http://tardigrde.github.io/openclaw-deploy/configuration/private-fork/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/configuration/private-fork/</guid><description>&lt;p&gt;For a long-lived production setup, the recommended pattern is a &lt;strong&gt;private fork&lt;/strong&gt; — tracking this repo as &lt;code&gt;upstream&lt;/code&gt; and keeping credentials, personal config, and extensions in your fork. This lets you pull upstream improvements with minimal friction while keeping your private files out of the public repo.&lt;/p&gt;
&lt;h2 id="repo-layout"&gt;Repo layout&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repo&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw-deploy&lt;/code&gt; (this repo)&lt;/td&gt;
&lt;td&gt;Public template — source of truth for all shared files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;your-private-fork&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Your production deployment — credentials, overrides, extensions&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;All shared infrastructure changes should be made in &lt;code&gt;openclaw-deploy&lt;/code&gt; first, then pulled into your fork — never the reverse.&lt;/p&gt;</description></item><item><title>Agents &amp; Sessions</title><link>http://tardigrde.github.io/openclaw-deploy/guides/agents/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/guides/agents/</guid><description>&lt;h1 id="agents"&gt;Agents&lt;/h1&gt;
&lt;p&gt;OpenClaw supports multiple isolated agents, each with their own workspace and model. Define them in &lt;code&gt;openclaw.json&lt;/code&gt; under &lt;code&gt;agents.list&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="adding-an-agent"&gt;Adding an Agent&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;13
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;14
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;15
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;16
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;agents&amp;#34;&lt;/span&gt;: {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;list&amp;#34;&lt;/span&gt;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;main&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;workspace&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;~/.openclaw/workspace&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;default&amp;#34;&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;id&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;researcher&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;workspace&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;~/.openclaw/workspace-researcher&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;model&amp;#34;&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;anthropic/claude-haiku-4-5&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then deploy:&lt;/p&gt;</description></item><item><title>CI/CD Setup</title><link>http://tardigrde.github.io/openclaw-deploy/operations/cicd/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/operations/cicd/</guid><description>&lt;h1 id="cicd"&gt;CI/CD&lt;/h1&gt;
&lt;p&gt;The built-in CI &lt;strong&gt;validates and tests&lt;/strong&gt; Terraform (&lt;code&gt;terraform fmt&lt;/code&gt;, &lt;code&gt;terraform validate&lt;/code&gt;, &lt;code&gt;tflint&lt;/code&gt;, &lt;code&gt;terraform test&lt;/code&gt;). Ansible is never run in CI — all &lt;code&gt;make bootstrap&lt;/code&gt; / &lt;code&gt;make deploy&lt;/code&gt; operations are local only.&lt;/p&gt;
&lt;p&gt;Example workflows for &lt;code&gt;terraform plan&lt;/code&gt; (on PRs) and &lt;code&gt;terraform apply&lt;/code&gt; (manual dispatch) are included as &lt;code&gt;.example.yml&lt;/code&gt; files — copy them to enable (see &lt;a href="#required-github-secrets"&gt;Required Secrets&lt;/a&gt; below).&lt;/p&gt;
&lt;p&gt;An optional GitOps deployment workflow is also included — copy &lt;code&gt;.github/workflows/deploy.yml.example&lt;/code&gt; to &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt; to enable automatic Ansible-based deployments on push. See &lt;a href="http://tardigrde.github.io/openclaw-deploy/operations/gitops-auto-deploy/"&gt;GitOps auto-deploy&lt;/a&gt; for setup instructions.&lt;/p&gt;</description></item><item><title>Installation</title><link>http://tardigrde.github.io/openclaw-deploy/getting-started/installation/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/getting-started/installation/</guid><description>&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Terraform&lt;/strong&gt; &amp;gt;= 1.5 (&lt;a href="https://developer.hashicorp.com/terraform/install"&gt;install&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ansible&lt;/strong&gt; (&lt;a href="https://docs.ansible.com/projects/ansible/latest/installation_guide/intro_installation.html"&gt;install&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;age&lt;/strong&gt; and &lt;strong&gt;sops&lt;/strong&gt; — required for secret encryption (&lt;code&gt;make secrets-encrypt&lt;/code&gt;). Install via your package manager or &lt;a href="https://github.com/FiloSottile/age/releases"&gt;age releases&lt;/a&gt; / &lt;a href="https://github.com/getsops/sops/releases"&gt;sops releases&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;jq&lt;/strong&gt; — required for &lt;code&gt;make validate&lt;/code&gt;. Install via your package manager.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hetzner Cloud account&lt;/strong&gt; with API token (&lt;a href="https://console.hetzner.cloud/"&gt;console&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSH key&lt;/strong&gt; uploaded to Hetzner Cloud. Default path: &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;. Override with &lt;code&gt;SSH_KEY&lt;/code&gt; env var.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;(Optional)&lt;/em&gt; &lt;strong&gt;Remote Terraform state&lt;/strong&gt; — the default is local (no setup needed). For GCS or other remote backends, see &lt;a href="http://tardigrde.github.io/openclaw-deploy/operations/remote-state/"&gt;Remote State Backend&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="1-clone"&gt;1. Clone&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/tardigrde/openclaw-deploy.git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd openclaw-deploy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="2-configure-infrastructure-secrets"&gt;2. Configure infrastructure secrets&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp secrets/inputs.example.sh secrets/inputs.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim secrets/inputs.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Required: &lt;code&gt;HCLOUD_TOKEN&lt;/code&gt;, &lt;code&gt;TF_VAR_ssh_key_fingerprint&lt;/code&gt; (from &lt;a href="https://console.hetzner.cloud/"&gt;Hetzner Console&lt;/a&gt; → Security → SSH Keys). See &lt;a href="http://tardigrde.github.io/openclaw-deploy/configuration/secrets/"&gt;Secrets Reference&lt;/a&gt; for the full variable reference and Tailscale-specific notes.&lt;/p&gt;</description></item><item><title>OpenClaw Configuration</title><link>http://tardigrde.github.io/openclaw-deploy/configuration/openclaw-config/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/configuration/openclaw-config/</guid><description>&lt;h1 id="openclaw-configuration"&gt;OpenClaw Configuration&lt;/h1&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Configuration lives in &lt;code&gt;openclaw.json&lt;/code&gt; (gitignored — create from &lt;code&gt;openclaw.example.json&lt;/code&gt;) and is deployed via &lt;code&gt;make deploy&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="agent-defaults"&gt;Agent Defaults&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;userTimezone&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;UTC&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Proper time context for scheduling, logs, heartbeat&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timeFormat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;European 24h format&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;imageMaxDimensionPx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;800&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Downscale images before vision API — saves ~30% tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;contextTokens&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;180000&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Safety margin below 200k model limit&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="telegram-channel"&gt;Telegram Channel&lt;/h2&gt;
&lt;h3 id="retry-logic"&gt;Retry Logic&lt;/h3&gt;
&lt;p&gt;Resilience for transient network errors (outbound &lt;code&gt;sendMessage&lt;/code&gt;, &lt;code&gt;editMessage&lt;/code&gt;, &lt;code&gt;sendChatAction&lt;/code&gt;):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;retry&amp;#34;&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;attempts&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;minDelayMs&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;400&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;maxDelayMs&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;30000&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;jitter&amp;#34;&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id="access-control"&gt;Access Control&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DM policy:&lt;/strong&gt; &lt;code&gt;pairing&lt;/code&gt; (default) + &lt;code&gt;allowFrom&lt;/code&gt; restriction&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;allowFrom&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;[&amp;quot;&amp;lt;YOUR_TELEGRAM_ID&amp;gt;&amp;quot;]&lt;/code&gt; — restricts DM access (extra layer beyond pairing)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;groupAllowFrom&lt;/code&gt;:&lt;/strong&gt; &lt;code&gt;[&amp;quot;&amp;lt;USER_ID_1&amp;gt;&amp;quot;, &amp;quot;&amp;lt;USER_ID_2&amp;gt;&amp;quot;]&lt;/code&gt; — global group sender restriction&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Security model:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Security Hardening</title><link>http://tardigrde.github.io/openclaw-deploy/security/hardening/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/security/hardening/</guid><description>&lt;h1 id="security-hardening"&gt;Security Hardening&lt;/h1&gt;
&lt;p&gt;Overview of all security controls applied to the OpenClaw VPS.&lt;/p&gt;
&lt;h2 id="firewall"&gt;Firewall&lt;/h2&gt;
&lt;p&gt;Two firewall layers run in series.&lt;/p&gt;
&lt;h3 id="hetzner-cloud-firewall-network-level"&gt;Hetzner Cloud Firewall (network-level)&lt;/h3&gt;
&lt;p&gt;Managed in Terraform (&lt;code&gt;terraform/modules/hetzner-vps/main.tf&lt;/code&gt;). Applied at the hypervisor — traffic is dropped before it reaches the OS.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Direction&lt;/th&gt;
&lt;th&gt;Protocol&lt;/th&gt;
&lt;th&gt;Port&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;&lt;code&gt;ssh_allowed_cidrs&lt;/code&gt; variable&lt;/td&gt;
&lt;td&gt;Always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inbound&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;41641&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0.0.0/0&lt;/code&gt;, &lt;code&gt;::/0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only if Tailscale on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;TCP&lt;/td&gt;
&lt;td&gt;1–65535&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0.0.0/0&lt;/code&gt;, &lt;code&gt;::/0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;UDP&lt;/td&gt;
&lt;td&gt;1–65535&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0.0.0/0&lt;/code&gt;, &lt;code&gt;::/0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Outbound&lt;/td&gt;
&lt;td&gt;ICMP&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.0.0.0/0&lt;/code&gt;, &lt;code&gt;::/0&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Always&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;code&gt;ssh_allowed_cidrs&lt;/code&gt; defaults to &lt;code&gt;[&amp;quot;0.0.0.0/0&amp;quot;]&lt;/code&gt;. For tighter access, set it to specific IPs in &lt;code&gt;secrets/inputs.sh&lt;/code&gt;, or set it to &lt;code&gt;[]&lt;/code&gt; to block public SSH entirely (Tailscale-only mode).&lt;/p&gt;</description></item><item><title>Weather Report</title><link>http://tardigrde.github.io/openclaw-deploy/addons/weather-report/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/addons/weather-report/</guid><description>&lt;h1 id="morning-weather-report"&gt;Morning Weather Report&lt;/h1&gt;
&lt;p&gt;A lightweight daily weather summary sent to Telegram each morning. Uses &lt;code&gt;wttr.in&lt;/code&gt; and the Telegram Bot API — no LLM involved, zero token cost.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Format:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Good morning! 2026-03-05, Wednesday
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Now: 8°C (feels like 5°C)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Max: 12°C / Min: 3°C | Rain: 40% (2.4 mm)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Rain line only appears when chance &amp;gt;= 20%.&lt;/p&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;Add to &lt;code&gt;secrets/.env&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Sandbox Configuration</title><link>http://tardigrde.github.io/openclaw-deploy/guides/sandboxing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/guides/sandboxing/</guid><description>&lt;h1 id="sandbox-configuration-guide"&gt;Sandbox Configuration Guide&lt;/h1&gt;
&lt;p&gt;This guide explains how to enable agent sandboxing in OpenClaw. Sandboxing isolates tool execution from the host system, providing an extra layer of security.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This guide is for the openclaw-deploy repository. For the full OpenClaw sandboxing documentation, see &lt;a href="https://docs.openclaw.ai/gateway/sandboxing"&gt;Gateway Sandboxing&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="why-enable-sandboxing"&gt;Why Enable Sandboxing?&lt;/h2&gt;
&lt;p&gt;Without sandboxing, agent tool execution (file operations, shell commands) runs directly on your VPS. If the agent is compromised or makes a mistake, the blast radius is your entire server.&lt;/p&gt;</description></item><item><title>ACP + Claude Code</title><link>http://tardigrde.github.io/openclaw-deploy/addons/acp-claude-code/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/addons/acp-claude-code/</guid><description>&lt;h1 id="acp--claude-code"&gt;ACP + Claude Code&lt;/h1&gt;
&lt;p&gt;Use Claude Code (and other AI coding harnesses) from your messaging platform — no SSH required. Runs inside the Gateway container via &lt;a href="https://agentclientprotocol.com/"&gt;ACP (Agent Client Protocol)&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Telegram/Discord → OpenClaw Gateway → ACP runtime → acpx → Claude Code CLI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;You send a message like &lt;em&gt;&amp;ldquo;review this PR with Claude Code&amp;rdquo;&lt;/em&gt; and OpenClaw spawns an ACP session. Claude Code does the work, results stream back to your chat.&lt;/p&gt;</description></item><item><title>Deployment &amp; Bootstrap</title><link>http://tardigrde.github.io/openclaw-deploy/getting-started/bootstrap/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/getting-started/bootstrap/</guid><description>&lt;p&gt;Continues from &lt;a href="http://tardigrde.github.io/openclaw-deploy/getting-started/installation/"&gt;Installation&lt;/a&gt;. Run &lt;code&gt;source secrets/inputs.sh&lt;/code&gt; before any make target that touches the VPS.&lt;/p&gt;
&lt;h2 id="5-provision-the-vps"&gt;5. Provision the VPS&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;source secrets/inputs.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make plan
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make apply
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="6-configure-container-secrets"&gt;6. Configure container secrets&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp secrets/.env.example secrets/.env
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim secrets/.env
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Required: &lt;code&gt;OPENCLAW_GATEWAY_TOKEN&lt;/code&gt;, &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; (or leave empty for subscription auth), &lt;code&gt;TELEGRAM_BOT_TOKEN&lt;/code&gt;. See &lt;a href="http://tardigrde.github.io/openclaw-deploy/configuration/secrets/"&gt;Secrets Reference&lt;/a&gt; for the full variable reference.&lt;/p&gt;</description></item><item><title>GitOps Auto-Deploy</title><link>http://tardigrde.github.io/openclaw-deploy/operations/gitops-auto-deploy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/operations/gitops-auto-deploy/</guid><description>&lt;h1 id="gitops-auto-deploy"&gt;GitOps Auto-Deploy&lt;/h1&gt;
&lt;p&gt;A GitHub Actions pipeline can automatically deploy to the VPS on every push to &lt;code&gt;main&lt;/code&gt;. This is &lt;strong&gt;optional&lt;/strong&gt; — if you don&amp;rsquo;t configure the secrets below, the workflow won&amp;rsquo;t run and you can continue deploying manually with &lt;code&gt;make deploy&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="what-it-does"&gt;What It Does&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Triggered by changes to &lt;code&gt;openclaw.json&lt;/code&gt;, &lt;code&gt;docker/&lt;/code&gt;, &lt;code&gt;docker-compose.yml&lt;/code&gt;, &lt;code&gt;ansible/&lt;/code&gt;, or &lt;code&gt;secrets/.env.enc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Connects to the VPS via an ephemeral Tailscale node (no public SSH required)&lt;/li&gt;
&lt;li&gt;Decrypts &lt;code&gt;secrets/.env.enc&lt;/code&gt; using SOPS + age key from GitHub Secrets&lt;/li&gt;
&lt;li&gt;If &lt;code&gt;docker/&lt;/code&gt; or &lt;code&gt;docker-compose.yml&lt;/code&gt; changed: runs &lt;code&gt;make deploy REBUILD=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Otherwise: runs &lt;code&gt;make deploy&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A manual &lt;strong&gt;rollback workflow&lt;/strong&gt; is also included (&lt;code&gt;.github/workflows/rollback.yml&lt;/code&gt;) — trigger it from the GitHub Actions UI with any previous git SHA. It also decrypts secrets with SOPS before deploying.&lt;/p&gt;</description></item><item><title>Lossless Context</title><link>http://tardigrde.github.io/openclaw-deploy/guides/lossless-claw/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/guides/lossless-claw/</guid><description>&lt;h1 id="lossless-claw--lossless-context-management"&gt;lossless-claw — Lossless Context Management&lt;/h1&gt;
&lt;h2 id="what"&gt;What&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/Martian-Engineering/lossless-claw"&gt;lossless-claw&lt;/a&gt; is an OpenClaw plugin that replaces the built-in sliding-window compaction with a DAG-based summarization system. Instead of truncating older messages when context fills up, it:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Persists every message&lt;/strong&gt; in a SQLite database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Summarizes chunks&lt;/strong&gt; of older messages into compressed nodes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Condenses summaries&lt;/strong&gt; into higher-level nodes as they accumulate (forming a DAG)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Assembles context&lt;/strong&gt; each turn by combining summaries + recent raw messages&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Provides agent tools&lt;/strong&gt; (&lt;code&gt;lcm_grep&lt;/code&gt;, &lt;code&gt;lcm_describe&lt;/code&gt;, &lt;code&gt;lcm_expand&lt;/code&gt;) so the agent can search and recall details from compacted history&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="why-we-install-it"&gt;Why we install it&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;The problem:&lt;/strong&gt; Without LCM, OpenClaw&amp;rsquo;s default compaction simply drops older messages when context fills up. In long conversations (multi-hour sessions, daily check-ins), context gets lost — the agent forgets decisions made hours or days ago.&lt;/p&gt;</description></item><item><title>Secrets Reference</title><link>http://tardigrde.github.io/openclaw-deploy/configuration/secrets/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/configuration/secrets/</guid><description>&lt;h1 id="secrets-reference"&gt;Secrets Reference&lt;/h1&gt;
&lt;p&gt;Two secret files are required. Neither is ever committed to git.&lt;/p&gt;
&lt;h2 id="secretsinputssh--infrastructure-config"&gt;&lt;code&gt;secrets/inputs.sh&lt;/code&gt; — Infrastructure config&lt;/h2&gt;
&lt;p&gt;Sourced by the Makefile at parse time (and re-exported for Terraform). Contains deployment-level config, not runtime secrets.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cp secrets/inputs.example.sh secrets/inputs.sh
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vim secrets/inputs.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Required&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;HCLOUD_TOKEN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Hetzner Cloud API token — &lt;a href="https://console.hetzner.cloud/"&gt;console.hetzner.cloud&lt;/a&gt; → Security → API Tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SSH_KEY_FINGERPRINT&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Fingerprint of your SSH key uploaded to Hetzner — console → Security → SSH Keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SERVER_IP&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tailscale only&lt;/td&gt;
&lt;td&gt;Set to &lt;code&gt;openclaw-prod&lt;/code&gt; (MagicDNS) after locking down SSH. Leave unset to auto-detect from Terraform output.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;TAILSCALE_AUTH_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tailscale only&lt;/td&gt;
&lt;td&gt;Reusable pre-authorized key from &lt;a href="https://login.tailscale.com/admin/settings/keys"&gt;login.tailscale.com/admin/settings/keys&lt;/a&gt;. Must be set before &lt;code&gt;make bootstrap&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SSH_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Path to SSH private key. Defaults to &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Makefile auto-sources &lt;code&gt;inputs.sh&lt;/code&gt; for Terraform vars. For SSH-based targets (&lt;code&gt;make ssh&lt;/code&gt;, &lt;code&gt;make deploy&lt;/code&gt;, etc.), &lt;code&gt;SERVER_IP&lt;/code&gt; must resolve — either auto-detected from Terraform output or explicitly set.&lt;/p&gt;</description></item><item><title>Security Policy</title><link>http://tardigrde.github.io/openclaw-deploy/security/policy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/security/policy/</guid><description>&lt;h1 id="security-policy"&gt;Security Policy&lt;/h1&gt;
&lt;h2 id="reporting-a-vulnerability"&gt;Reporting a Vulnerability&lt;/h2&gt;
&lt;p&gt;If you discover a security vulnerability in this project, please report it responsibly:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Do NOT&lt;/strong&gt; open a public GitHub issue&lt;/li&gt;
&lt;li&gt;Use &lt;a href="../../security/advisories/new"&gt;GitHub Security Advisories&lt;/a&gt; to report vulnerabilities privately&lt;/li&gt;
&lt;li&gt;Include:
&lt;ul&gt;
&lt;li&gt;Description of the vulnerability&lt;/li&gt;
&lt;li&gt;Steps to reproduce&lt;/li&gt;
&lt;li&gt;Potential impact&lt;/li&gt;
&lt;li&gt;Suggested fix (if you have one)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We aim to respond to security reports within 48 hours and will work with you to understand and address the issue.&lt;/p&gt;
&lt;h2 id="supported-versions"&gt;Supported Versions&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Version&lt;/th&gt;
&lt;th&gt;Supported&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;main&lt;/td&gt;
&lt;td&gt;:white_check_mark:&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&amp;lt; 1.0&lt;/td&gt;
&lt;td&gt;:x:&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="security-considerations"&gt;Security Considerations&lt;/h2&gt;
&lt;h3 id="infrastructure-security"&gt;Infrastructure Security&lt;/h3&gt;
&lt;p&gt;This project deploys cloud infrastructure. Please be aware of:&lt;/p&gt;</description></item><item><title>Remote State</title><link>http://tardigrde.github.io/openclaw-deploy/operations/remote-state/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/operations/remote-state/</guid><description>&lt;h1 id="remote-state-backend"&gt;Remote State Backend&lt;/h1&gt;
&lt;p&gt;By default Terraform uses a &lt;strong&gt;local backend&lt;/strong&gt; (&lt;code&gt;terraform.tfstate&lt;/code&gt; on disk). This requires zero setup and works fine for solo use. For team workflows or CI/CD, a remote backend gives you shared state, versioning, and locking.&lt;/p&gt;
&lt;h2 id="choosing-a-backend"&gt;Choosing a Backend&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;terraform/envs/prod/backend.tf&lt;/code&gt; (copied from &lt;code&gt;backend.tf.example&lt;/code&gt;) controls the backend:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 5
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 6
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 7
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 8
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt; 9
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;10
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;11
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Option A — Local (default, no setup required)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;backend&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;local&amp;#34;&lt;/span&gt; {}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Option B — GCS (recommended for teams / CI)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;terraform&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;backend&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;gcs&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; bucket &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;your-project-tfstate&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; prefix &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;openclaw/prod&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Terraform supports other backends too (S3, Azure Blob, Terraform Cloud). Any Terraform-compatible backend works — update &lt;code&gt;backend.tf&lt;/code&gt; accordingly. Note that S3 requires a separate DynamoDB table for state locking, whereas GCS locks natively.&lt;/p&gt;</description></item><item><title>Skills &amp; Tools</title><link>http://tardigrde.github.io/openclaw-deploy/guides/skills/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/guides/skills/</guid><description>&lt;h1 id="skills"&gt;Skills&lt;/h1&gt;
&lt;p&gt;OpenClaw is extended via skills — slash commands, hooks, templates, and tool definitions. &lt;code&gt;docker/skills-manifest.txt&lt;/code&gt; lists which skills are auto-installed at container startup via &lt;code&gt;clawhub install&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="adding-a-clawhub-skill"&gt;Adding a ClawHub Skill&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://clawhub.ai/"&gt;ClawHub&lt;/a&gt; is the community skill registry.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Find the skill at &lt;a href="https://clawhub.ai/"&gt;clawhub.ai&lt;/a&gt; (e.g. &lt;code&gt;pdf&lt;/code&gt;, &lt;code&gt;jira&lt;/code&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add it to &lt;code&gt;docker/skills-manifest.txt&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pdf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Rebuild and deploy (the manifest is baked into the image):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make deploy REBUILD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="included-skills"&gt;Included Skills&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;yt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;YouTube transcript fetching and video search&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;agent-browser&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Headless browser for JS-heavy/paywalled pages&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;system-monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;CPU/RAM/GPU status check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;conventional-commits&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Format commit messages per convention&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;github&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;GitHub issues, PRs, CI runs via gh CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;summarize&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Summarize URLs, PDFs, images, audio, YouTube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;weather&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Weather lookup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>Version Management</title><link>http://tardigrde.github.io/openclaw-deploy/configuration/versions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/configuration/versions/</guid><description>&lt;h1 id="version-management"&gt;Version Management&lt;/h1&gt;
&lt;p&gt;All dependencies are pinned in their respective config files. Renovate Bot opens
weekly PRs when updates are available (see &lt;code&gt;renovate.json&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="where-versions-live"&gt;Where versions live&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dependency&lt;/th&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenClaw&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker/Dockerfile&lt;/code&gt; (&lt;code&gt;ARG OPENCLAW_VERSION&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Never auto-merged — check release notes + run &lt;code&gt;make backup-now&lt;/code&gt; first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js base image&lt;/td&gt;
&lt;td&gt;&lt;code&gt;docker/Dockerfile&lt;/code&gt; (&lt;code&gt;FROM node:...&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terraform CLI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;terraform/envs/prod/main.tf&lt;/code&gt; (&lt;code&gt;required_version&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Also enforced in CI via &lt;code&gt;hashicorp/setup-terraform&lt;/code&gt; input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hcloud provider&lt;/td&gt;
&lt;td&gt;&lt;code&gt;terraform/envs/prod/main.tf&lt;/code&gt; (&lt;code&gt;version =&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ansible-core&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/workflows/*.yml&lt;/code&gt; (&lt;code&gt;pip install&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Range constraint — bump minor manually&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub Actions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;.github/workflows/*.yml&lt;/code&gt; (&lt;code&gt;uses:&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Auto-merged by Renovate&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="auto-update-policy"&gt;Auto-update policy&lt;/h2&gt;
&lt;p&gt;Renovate runs weekly and opens PRs grouped by ecosystem:&lt;/p&gt;</description></item><item><title>Headless Browser</title><link>http://tardigrde.github.io/openclaw-deploy/guides/headless-browser/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/guides/headless-browser/</guid><description>&lt;h1 id="headless-browser"&gt;Headless Browser&lt;/h1&gt;
&lt;p&gt;OpenClaw includes a built-in browser powered by &lt;a href="https://github.com/nicedoc/agent-browser"&gt;agent-browser&lt;/a&gt; running inside the gateway container. Chromium and its dependencies are installed at Docker build time via &lt;code&gt;agent-browser install --with-deps&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;No sidecar container is needed — the browser runs in-process within the OpenClaw gateway.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How It Works&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;agent-browser&lt;/code&gt; npm package manages a local Chromium installation and exposes browser automation capabilities to OpenClaw skills. The gateway configures it automatically.&lt;/p&gt;
&lt;h2 id="verifying-the-installation"&gt;Verifying the Installation&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make exec CMD&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;npx agent-browser --version&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The browser is ready when the gateway logs show &lt;code&gt;agent-browser&lt;/code&gt; initialization complete.&lt;/p&gt;</description></item><item><title>Workspace Git Sync</title><link>http://tardigrde.github.io/openclaw-deploy/guides/workspace-git-sync/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/guides/workspace-git-sync/</guid><description>&lt;h1 id="workspace-git-sync"&gt;Workspace Git Sync&lt;/h1&gt;
&lt;p&gt;Back up &lt;code&gt;~/.openclaw/workspace&lt;/code&gt; to a private GitHub repo automatically. Runs as a native cron job on the VPS, pushing to a configurable branch (default: &lt;code&gt;auto&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;Add to &lt;code&gt;secrets/.env&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GIT_WORKSPACE_REPO=your-username/openclaw-workspace
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GIT_WORKSPACE_BRANCH=auto
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GIT_WORKSPACE_TOKEN=ghp_your_personal_access_token
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GIT_WORKSPACE_SYNC_SCHEDULE=0 4 * * *
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;The cron job auto-enables when &lt;code&gt;GIT_WORKSPACE_REPO&lt;/code&gt; is set. Deploy with &lt;code&gt;make deploy&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="operations"&gt;Operations&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;div style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;
&lt;table style="border-spacing:0;padding:0;margin:0;border:0;"&gt;&lt;tr&gt;&lt;td style="vertical-align:top;padding:0;margin:0;border:0;"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;1
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;2
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;3
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;4
&lt;/span&gt;&lt;span style="white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style="vertical-align:top;padding:0;margin:0;border:0;;width:100%"&gt;
&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Trigger sync immediately&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make workspace-sync
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Disable: remove or clear GIT_WORKSPACE_REPO from .env and redeploy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make deploy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="logs"&gt;Logs&lt;/h2&gt;
&lt;p&gt;The cron job writes to &lt;code&gt;~/openclaw/logs/workspace-sync.log&lt;/code&gt; on the VPS:&lt;/p&gt;</description></item><item><title>Tailscale</title><link>http://tardigrde.github.io/openclaw-deploy/tailscale/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>http://tardigrde.github.io/openclaw-deploy/tailscale/</guid><description>&lt;h1 id="tailscale"&gt;Tailscale&lt;/h1&gt;
&lt;p&gt;OpenClaw uses Tailscale for private networking: SSH access from tailnet devices only, and HTTPS access to the gateway via Tailscale Serve.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Terraform&lt;/strong&gt; manages the OAuth-generated pre-auth key, tailnet settings, and MagicDNS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ansible&lt;/strong&gt; installs Tailscale on the VPS, registers the node, and deploys the serve config.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;make bootstrap&lt;/code&gt;&lt;/strong&gt; runs both automatically — no manual Tailscale console steps after initial setup.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;make deploy&lt;/code&gt;&lt;/strong&gt; re-applies the serve config if it changed (idempotent, skipped before Tailscale is installed).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="serve-config"&gt;Serve config&lt;/h2&gt;
&lt;p&gt;The gateway is exposed over Tailscale Serve via a JSON config file deployed by Ansible to &lt;code&gt;/etc/tailscale/serve.json&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>