<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Automation on homelab</title>
    <link>https://homelab.nbkelley.com/tags/automation/</link>
    <description>Recent content in Automation on homelab</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Fri, 01 May 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://homelab.nbkelley.com/tags/automation/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>PowerShell Local PC Scripting Patterns</title>
      <link>https://homelab.nbkelley.com/docs/scripts/powershell-local-scripting/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/scripts/powershell-local-scripting/</guid>
      <description>&lt;h1 id=&#34;powershell-local-pc-scripting-patterns&#34;&gt;PowerShell Local PC Scripting Patterns&lt;a class=&#34;anchor&#34; href=&#34;#powershell-local-pc-scripting-patterns&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A collection of PowerShell scripting patterns for local PC automation tasks, including folder renaming from CSV data, and basic system administration.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;CSV-driven automation&lt;/strong&gt;: Use &lt;code&gt;Import-Csv&lt;/code&gt; with &lt;code&gt;Rename-Item&lt;/code&gt; for bulk folder renaming driven by spreadsheet data.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Path validation&lt;/strong&gt;: Always &lt;code&gt;Test-Path&lt;/code&gt; before operating to avoid errors on missing sources or existing destinations.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Error handling&lt;/strong&gt;: Wrap rename operations in conditional checks; log warnings rather than failing silently.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;folder-renaming-from-csv&#34;&gt;Folder Renaming from CSV&lt;a class=&#34;anchor&#34; href=&#34;#folder-renaming-from-csv&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;CSV format&lt;/strong&gt; (&lt;code&gt;folder_renaming.csv&lt;/code&gt;):&lt;/p&gt;</description>
    </item>
    <item>
      <title>PowerShell Local PC Scripting Patterns</title>
      <link>https://homelab.nbkelley.com/docs/scripts/powershell-local-pc-troubleshooting/</link>
      <pubDate>Thu, 30 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/scripts/powershell-local-pc-troubleshooting/</guid>
      <description>&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Standardized PowerShell commands for local file operations and MSI package management.&lt;/li&gt;&#xA;&lt;li&gt;A streamlined, linear pattern for automating software installation, execution, and uninstallation on local Windows hosts without over-engineering modular functions.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prefer &lt;code&gt;Get-ChildItem&lt;/code&gt; with wildcards (&lt;code&gt;C:\Users\*\Downloads\*.msi&lt;/code&gt;) for rapid file discovery over manual profile loops.&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;code&gt;Start-Process&lt;/code&gt; with &lt;code&gt;msiexec.exe&lt;/code&gt; for silent MSI installs (&lt;code&gt;/qn&lt;/code&gt;) to keep scripts concise for linear workflows.&lt;/li&gt;&#xA;&lt;li&gt;Simplified error handling and removed verbose logging for basic administrative tasks, reserving complex wrappers for larger automation frameworks.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration--patterns&#34;&gt;Current Configuration / Patterns&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration--patterns&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;file-listing--discovery&#34;&gt;File Listing &amp;amp; Discovery&lt;a class=&#34;anchor&#34; href=&#34;#file-listing--discovery&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# List files recursively, sorted newest first&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Get-ChildItem -Path &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Path&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;-File&lt;/span&gt; -Recurse | Sort-Object LastWriteTime -Descending&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Find first matching file across user profiles&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Get-ChildItem &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Users\*\Downloads\CleanUpTool.msi&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue | Select-Object -First &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;file-copying&#34;&gt;File Copying&lt;a class=&#34;anchor&#34; href=&#34;#file-copying&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Copy single file, force overwrite&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copy-Item -Path &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Source\File.ext&amp;#34;&lt;/span&gt; -Destination &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Target\&amp;#34;&lt;/span&gt; -Force&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# Copy entire directory tree&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Copy-Item -Path &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Source\*&amp;#34;&lt;/span&gt; -Destination &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;D:\Destination\&amp;#34;&lt;/span&gt; -Recurse&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;msi-install--run--uninstall-pattern&#34;&gt;MSI Install / Run / Uninstall Pattern&lt;a class=&#34;anchor&#34; href=&#34;#msi-install--run--uninstall-pattern&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;Requires&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;-RunAsAdministrator&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 1. Find and Install&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$cleanupPath = Get-ChildItem &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Users\*\Downloads\CleanUpTool.msi&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue | Select-Object -First &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($cleanupPath) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Start-Process &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;msiexec.exe&amp;#34;&lt;/span&gt; -ArgumentList &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/i &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;$($cleanupPath.FullName)&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; /qn&amp;#34;&lt;/span&gt; -Wait&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 2. Run (locate executable in Program Files)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $exePath = Get-ChildItem &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files\&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;C:\Program Files (x86)\&amp;#34;&lt;/span&gt; -Recurse -Filter &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*CleanUpTool*.exe&amp;#34;&lt;/span&gt; -ErrorAction SilentlyContinue | Select-Object -First &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($exePath) { Start-Process $exePath.FullName -Wait }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 3. Uninstall&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    $product = Get-WmiObject -Class Win32_Product | Where-Object { $_.Name &lt;span style=&#34;color:#f92672&#34;&gt;-like&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;*CleanUpTool*&amp;#34;&lt;/span&gt; }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; ($product) { $product.Uninstall() }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 4. Install Next Package&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$foxitPath = Join-Path $PSScriptRoot &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Foxit.msi&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; (Test-Path $foxitPath) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Start-Process &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;msiexec.exe&amp;#34;&lt;/span&gt; -ArgumentList &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/i &lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;$foxitPath&lt;span style=&#34;color:#ae81ff&#34;&gt;`&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; /qn&amp;#34;&lt;/span&gt; -Wait&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;historical-notes&#34;&gt;Historical Notes&lt;a class=&#34;anchor&#34; href=&#34;#historical-notes&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Conversation dated 2025-06-11. The simplified linear script approach was explicitly chosen over a modular function-based approach to reduce overhead for routine local PC tasks.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;Get-WmiObject -Class Win32_Product&lt;/code&gt; is a legacy enumeration method. While functional for basic scripts, it is known to trigger package repairs and is slow on large systems. Consider migrating to &lt;code&gt;Get-CimInstance -Class Win32_Product&lt;/code&gt; or querying &lt;code&gt;HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall&lt;/code&gt; for production use.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Does the local PC environment still rely on &lt;code&gt;Get-WmiObject&lt;/code&gt; for software inventory, or has it migrated to &lt;code&gt;Get-CimInstance&lt;/code&gt; / registry queries?&lt;/li&gt;&#xA;&lt;li&gt;Are there standardized locations for MSI installers beyond user Downloads and script root for future automation?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/scripts/powershell-cleanup-patterns.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/scripts/bulk-folder-rename-script.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;wiki/administration/powershell-administration-commands.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;sources&#34;&gt;Sources&lt;a class=&#34;anchor&#34; href=&#34;#sources&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/056-List Files in Folder Using PowerShell.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: &amp;ldquo;List Files in Folder Using PowerShell&amp;rdquo; (2025-06-11)&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>n8n</title>
      <link>https://homelab.nbkelley.com/docs/services/n8n/</link>
      <pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/n8n/</guid>
      <description>&lt;h1 id=&#34;n8n&#34;&gt;n8n&lt;a class=&#34;anchor&#34; href=&#34;#n8n&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;n8n is the automation and orchestration hub for the homelab. It runs as an LXC on Proxmox, connected to PostgreSQL for persistent workflow state and execution history. Community edition is sufficient for current use.&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment&#34;&gt;Deployment&lt;a class=&#34;anchor&#34; href=&#34;#deployment&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Detail&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;LXC host&lt;/td&gt;&#xA;          &lt;td&gt;n8n&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;IP&lt;/td&gt;&#xA;          &lt;td&gt;192.168.1.169&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Port&lt;/td&gt;&#xA;          &lt;td&gt;5678&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;URL&lt;/td&gt;&#xA;          &lt;td&gt;http://192.168.1.169:5678&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Version&lt;/td&gt;&#xA;          &lt;td&gt;2.15.1 (Self Hosted)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Installed via&lt;/td&gt;&#xA;          &lt;td&gt;tteck Proxmox helper scripts&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;OS&lt;/td&gt;&#xA;          &lt;td&gt;Debian 13 (unprivileged LXC)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Config file&lt;/td&gt;&#xA;          &lt;td&gt;/opt/n8n.env&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;configuration-optn8nenv&#34;&gt;Configuration (/opt/n8n.env)&lt;a class=&#34;anchor&#34; href=&#34;#configuration-optn8nenv&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_SECURE_COOKIE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;false&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_PORT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5678&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_PROTOCOL&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;http&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;N8N_HOST&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;192.168.1.169&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_TYPE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;postgresdb&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_HOST&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;192.168.1.57&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_PORT&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;5432&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_DATABASE&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;homelab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_USER&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;homelab&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;DB_POSTGRESDB_PASSWORD&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&amp;lt;password&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After editing: &lt;code&gt;systemctl restart n8n&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Book Discovery Pipeline</title>
      <link>https://homelab.nbkelley.com/docs/projects/book_discovery_pipeline/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/projects/book_discovery_pipeline/</guid>
      <description>&lt;h1 id=&#34;book-discovery-pipeline&#34;&gt;Book Discovery Pipeline&lt;a class=&#34;anchor&#34; href=&#34;#book-discovery-pipeline&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;h2 id=&#34;what-was-established&#34;&gt;What Was Established&lt;a class=&#34;anchor&#34; href=&#34;#what-was-established&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;A multi-agent, multi-node pipeline designed to identify high-prestige, upcoming literary works by analyzing critical reviews before they hit the mainstream.&lt;/p&gt;&#xA;&lt;h2 id=&#34;key-decisions&#34;&gt;Key Decisions&lt;a class=&#34;anchor&#34; href=&#34;#key-decisions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Architecture:&lt;/strong&gt; Two-tier agent system. Lightweight models (E4B) on the Orchestrator (T480) handle routing/filtering; heavier models (26B) on the Inference node (Pavilion) handle deep analysis.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tech Stack:&lt;/strong&gt; n8n (Orchestration), PostgreSQL (Data Storage), Hugo (Static Site Generation), Python/JS (Custom Logic).&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Data Sources:&lt;/strong&gt; RSS feeds (Literary Hub, etc.), Web Scraping (for indie blogs), and Goodreads API/Scraping for popularity comparison.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-configuration&#34;&gt;Current Configuration&lt;a class=&#34;anchor&#34; href=&#34;#current-configuration&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;the-pipeline-chain&#34;&gt;The Pipeline Chain&lt;a class=&#34;anchor&#34; href=&#34;#the-pipeline-chain&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ingestion:&lt;/strong&gt; n8n fetches RSS feeds and scrapes blogs.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Filtering (E4B):&lt;/strong&gt; Classifies content (Review vs. News). Discards non-reviews.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Extraction (26B):&lt;/strong&gt; Extracts title, author, publisher, and critical language.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Scoring (26B):&lt;/strong&gt; Analyates &amp;ldquo;prestige signals&amp;rdquo; (e.g., phrases like &amp;ldquo;formally ambitious&amp;rdquo;) and compares against Goodreads popularity.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Aggregation:&lt;/strong&gt; Aggregates data into PostgreSQL.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Publication:&lt;/strong&gt; n8n generates a Markdown file and commits it to a Hugo repository.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h3 id=&#34;data-schema-postgresql&#34;&gt;Data Schema (PostgreSQL)&lt;a class=&#34;anchor&#34; href=&#34;#data-schema-postgresql&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;sources&lt;/code&gt;: RSS metadata.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;articles&lt;/code&gt;: Raw ingested content.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;books&lt;/code&gt;: Normalized book records.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;reviews&lt;/code&gt;: Links articles to books + extracted critical language.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;prestige_scores&lt;/code&gt;: Historical scoring for trend tracking.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;open-questions&#34;&gt;Open Questions&lt;a class=&#34;anchor&#34; href=&#34;#open-questions&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How to effectively scrape Substack/paywalled content without high costs.&lt;/li&gt;&#xA;&lt;li&gt;Determining the optimal frequency for the pipeline run (Weekly vs. Bi-weekly).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-pages&#34;&gt;Related Pages&lt;a class=&#34;anchor&#34; href=&#34;#related-pages&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/open_webui_deployment/&#34;&gt;Open WebUI Deployment&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/services/ollama_config/&#34;&gt;Ollama Configuration&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/monitoring/pipeline/&#34;&gt;AI-Driven Monitoring Pipeline&lt;/a&gt;&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
