<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Privacy on RevoluGame</title><link>http://revolugame.com/tags/privacy/</link><description>Recent content in Privacy on RevoluGame</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Wed, 11 Nov 2026 10:00:00 +0100</lastBuildDate><atom:link href="http://revolugame.com/tags/privacy/index.xml" rel="self" type="application/rss+xml"/><item><title>How I Use an LLM With Home Assistant Without Oversharing</title><link>http://revolugame.com/p/how-i-use-an-llm-with-home-assistant-without-oversharing/</link><pubDate>Wed, 11 Nov 2026 10:00:00 +0100</pubDate><guid>http://revolugame.com/p/how-i-use-an-llm-with-home-assistant-without-oversharing/</guid><description>&lt;img src="http://revolugame.com/p/how-i-use-an-llm-with-home-assistant-without-oversharing/cover-image.png" alt="Featured image of post How I Use an LLM With Home Assistant Without Oversharing" /&gt;&lt;p&gt;Before I change a Home Assistant automation, I often need to answer: &lt;em&gt;what else depends on this helper?&lt;/em&gt; An LLM is good at tracing YAML across files. My config also describes presence, cameras, alarms, and routines, so I built a boundary around what the model can see before asking it for help.&lt;/p&gt;&#10;&lt;p&gt;Why two repositories? &lt;code&gt;home-assistant-config&lt;/code&gt; is my actual Home Assistant config folder, tracked in Git with some files ignored; it records what Home Assistant runs. &lt;code&gt;ha-mcp-analyse&lt;/code&gt; holds the read-only MCP server, which I can test and change independently to control what the LLM sees. This keeps AI tooling out of the Home Assistant config folder. The privacy boundary comes from the server&amp;rsquo;s policy, not the repository split.&lt;/p&gt;&#10;&lt;h2 id="privacy-first"&gt;Privacy first&#10;&lt;/h2&gt;&lt;p&gt;The server uses a default-deny file policy. I choose the paths it may read; explicit denials override allows. A small policy might expose only automations and scripts:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;/path/to/home-assistant-config&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;allow&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="l"&gt;automations.yaml, scripts.yaml]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;deny&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="l"&gt;secrets.yaml, .storage/**, backups/**]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Git-ignored files and the MCP policy solve different problems. Ignoring a file keeps it out of Git; the MCP policy decides whether the assistant can read it locally. The server also rejects paths outside the checkout, redacts sensitive values, and has no write tools or connection to Home Assistant&amp;rsquo;s live API.&lt;/p&gt;&#10;&lt;p&gt;For example, a simplified &lt;code&gt;read_config_file&lt;/code&gt; result for a made-up automation could look like this:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;span class="lnt"&gt;6&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;automations.yaml&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;redacted&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;content&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="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; alias: Example notification&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; api_key: [REDACTED]&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; recipient: [REDACTED_EMAIL]&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;The file path, automation name, and other non-redacted text are still visible. I use cloud LLMs, so approved tool results can leave my machine for the model provider. The allowlist limits which files can contribute to those results; it does not make the shared text private to my machine.&lt;/p&gt;&#10;&lt;p&gt;This small allowlist is enough for the helper traced below: its references in my checked-in YAML are in &lt;code&gt;automations.yaml&lt;/code&gt;. It is not a complete view of every Home Assistant setup. My &lt;code&gt;configuration.yaml&lt;/code&gt; also includes &lt;code&gt;templates.yml&lt;/code&gt; and &lt;code&gt;scenes.yaml&lt;/code&gt;, which this example policy cannot search. If a dependency lives in another file, I must explicitly allow that file before the assistant can find it; UI-managed configuration in &lt;code&gt;.storage&lt;/code&gt; stays outside this workflow.&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; Q[My question] --&gt; L[LLM]&#10; L --&gt;|MCP request| M[ha-mcp-analyse]&#10; C[home-assistant-config] --&gt;|approved files| M&#10; P[Allow / deny policy] --&gt; M&#10; M --&gt;|redacted result| L&#10; subgraph Excluded[Not connected]&#10; H[Live states, history, cameras]&#10; end&lt;/pre&gt;&lt;p&gt;This still needs judgment: automation names and templates can reveal routines, and pattern-based redaction can miss unusual secrets. I review the policy and the output I share.&lt;/p&gt;&#10;&lt;h2 id="what-i-use-it-for"&gt;What I use it for&#10;&lt;/h2&gt;&lt;p&gt;I might ask: “Trace &lt;code&gt;input_boolean.home_occupied&lt;/code&gt;. What sets it, and what reacts when it changes?” The assistant can use &lt;code&gt;find_references&lt;/code&gt;, &lt;code&gt;list_automations&lt;/code&gt;, and redacted file reads to build a dependency map:&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; P[Two person entities] --&gt; U[Update home occupied]&#10; U --&gt; H[input_boolean.home_occupied]&#10; H --&gt; T[Nighttime test notification]&#10; P --&gt; A[Everyone believed to be out test]&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;Presence - Update home occupied&lt;/code&gt; automation sets the helper when either person is home. It clears the helper only when both person states are outside &lt;code&gt;home&lt;/code&gt;, &lt;code&gt;unknown&lt;/code&gt;, and &lt;code&gt;unavailable&lt;/code&gt;. The &lt;code&gt;Test - possible sleep when phones disconnect&lt;/code&gt; automation watches for the helper to stay &lt;code&gt;off&lt;/code&gt; for five minutes at night and sends a test notification. A separate &lt;code&gt;Test - everyone believed to be out&lt;/code&gt; automation reads the person states directly rather than using the helper. That distinction matters before changing an away or sleep rule: what happens when a phone stops reporting, and which automation actually depends on the helper?&lt;/p&gt;&#10;&lt;p&gt;The answer describes &lt;em&gt;static configuration&lt;/em&gt;, not what happened last night. I review any edit as a Git diff, validate the YAML, then check the configuration and behavior in Home Assistant. The LLM helps me find the dependency; I decide what the house does.&lt;/p&gt;&#10;&lt;h2 id="what-comes-next"&gt;What comes next&#10;&lt;/h2&gt;&lt;p&gt;The read-only workflow already helps me trace dependencies. A next step could be a tool that returns a proposed diff against &lt;code&gt;home-assistant-config&lt;/code&gt; without writing files. I would review and apply it through my normal Git workflow, then run Home Assistant&amp;rsquo;s checks. The MCP server would remain read-only.&lt;/p&gt;&#10;</description></item></channel></rss>