<?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>Configuration on OpenClaw Deploy</title><link>http://tardigrde.github.io/openclaw-deploy/configuration/</link><description>Recent content in Configuration on OpenClaw Deploy</description><generator>Hugo</generator><language>en</language><atom:link href="http://tardigrde.github.io/openclaw-deploy/configuration/index.xml" rel="self" type="application/rss+xml"/><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>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>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>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></channel></rss>