<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Development on homelab</title>
    <link>https://homelab.nbkelley.com/docs/development/</link>
    <description>Recent content in Development 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/docs/development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Git Push Authentication</title>
      <link>https://homelab.nbkelley.com/docs/development/git-push-authentication/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/development/git-push-authentication/</guid>
      <description>&lt;h1 id=&#34;git-push-authentication&#34;&gt;Git Push Authentication&lt;a class=&#34;anchor&#34; href=&#34;#git-push-authentication&#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;Patterns for resolving Git push authentication issues and handling divergent branches when working across multiple machines.&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;Multi-machine workflow&lt;/strong&gt;: Always &lt;code&gt;git pull&lt;/code&gt; before starting work; commit and push when done.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Divergent branch resolution&lt;/strong&gt;: When local and remote have diverged, use &lt;code&gt;git pull --no-rebase&lt;/code&gt; (merge) for safety or &lt;code&gt;git fetch origin &amp;amp;&amp;amp; git reset --hard origin/main&lt;/code&gt; to discard local commits for remote-only state.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;resolving-divergent-branches&#34;&gt;Resolving Divergent Branches&lt;a class=&#34;anchor&#34; href=&#34;#resolving-divergent-branches&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;symptom&#34;&gt;Symptom&lt;a class=&#34;anchor&#34; href=&#34;#symptom&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;hint: You have divergent branches and need to specify how to reconcile them.&#xA;fatal: Need to specify how to reconcile divergent branches.&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;option-1-merge-preserves-both-histories&#34;&gt;Option 1: Merge (preserves both histories)&lt;a class=&#34;anchor&#34; href=&#34;#option-1-merge-preserves-both-histories&#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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git pull --no-rebase&#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;# Or set as default:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config pull.rebase false&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;option-2-rebase-local-commits-on-top-of-remote&#34;&gt;Option 2: Rebase (local commits on top of remote)&lt;a class=&#34;anchor&#34; href=&#34;#option-2-rebase-local-commits-on-top-of-remote&#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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git pull --rebase&#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;# Or set as default:&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git config pull.rebase true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;option-3-discard-local-use-remote-only&#34;&gt;Option 3: Discard local, use remote only&lt;a class=&#34;anchor&#34; href=&#34;#option-3-discard-local-use-remote-only&#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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git fetch origin&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git reset --hard origin/main&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;option-4-fast-forward-only-fails-if-diverged&#34;&gt;Option 4: Fast-forward only (fails if diverged)&lt;a class=&#34;anchor&#34; href=&#34;#option-4-fast-forward-only-fails-if-diverged&#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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git pull --ff-only&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;multi-machine-workflow&#34;&gt;Multi-Machine Workflow&lt;a class=&#34;anchor&#34; href=&#34;#multi-machine-workflow&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;When working from multiple machines on the same repo:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo Git Submodule Extraction Pattern</title>
      <link>https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/</guid>
      <description>&lt;h1 id=&#34;hugo-git-submodule-extraction-pattern&#34;&gt;Hugo Git Submodule Extraction Pattern&lt;a class=&#34;anchor&#34; href=&#34;#hugo-git-submodule-extraction-pattern&#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;Hugo themes installed as Git submodules (e.g., &lt;code&gt;git submodule add &amp;lt;url&amp;gt; themes/theme-name&lt;/code&gt;)&#xA;carry their own Git history. When you want to customize the theme beyond configuration,&#xA;extracting the submodule into the main repository gives you full control over theme files&#xA;without managing a separate submodule repository.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-pattern&#34;&gt;The Pattern&lt;a class=&#34;anchor&#34; href=&#34;#the-pattern&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remove the submodule registration:&lt;/strong&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;git submodule deinit themes/theme-name&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git rm themes/theme-name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Re-add the theme as regular files:&lt;/strong&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;git clone &amp;lt;theme-url&amp;gt; /tmp/theme-temp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -r /tmp/theme-temp/* themes/theme-name/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git add themes/theme-name/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;git commit -m &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Extract theme-name from submodule into main repo&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; Theme files are now tracked directly in the main repository.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;when-to-use&#34;&gt;When to Use&lt;a class=&#34;anchor&#34; href=&#34;#when-to-use&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;You need to modify theme templates, layouts, or partials beyond what config allows&lt;/li&gt;&#xA;&lt;li&gt;The upstream theme is stable and you don&amp;rsquo;t need to pull updates&lt;/li&gt;&#xA;&lt;li&gt;You want simpler CI/CD without recursive submodule clones&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;when-not-to-use&#34;&gt;When Not to Use&lt;a class=&#34;anchor&#34; href=&#34;#when-not-to-use&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The theme receives frequent updates you want to track&lt;/li&gt;&#xA;&lt;li&gt;You only need CSS overrides (use &lt;code&gt;assets/&lt;/code&gt; or &lt;code&gt;static/&lt;/code&gt; instead)&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/administration/git-push-authentication/&#34;&gt;Git Push Authentication&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/web/ilmare-website/&#34;&gt;Ilmarë Website&lt;/a&gt;, &lt;a href=&#34;https://homelab.nbkelley.com/docs/services/cms-options/&#34;&gt;Self-Hosted CMS Options &amp;amp; Landscape&lt;/a&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>VS Code Live Server Path Configuration</title>
      <link>https://homelab.nbkelley.com/docs/development/vscode-liveserver-paths/</link>
      <pubDate>Mon, 31 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/development/vscode-liveserver-paths/</guid>
      <description>&lt;h1 id=&#34;vs-code-live-server-path-configuration&#34;&gt;VS Code Live Server Path Configuration&lt;a class=&#34;anchor&#34; href=&#34;#vs-code-live-server-path-configuration&#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;Resolved the &amp;ldquo;Cannot GET /page-name&amp;rdquo; error in VS Code Live Server by implementing a standardized project directory structure and correct relative pathing. The core fix involves ensuring the server root is set to the project root and using &lt;code&gt;../&lt;/code&gt; to traverse up from subdirectories.&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;Project Rooting&lt;/strong&gt;: Always open the top-level project folder in VS &lt;code&gt;Code&lt;/code&gt; rather than individual subfolders (like &lt;code&gt;html/&lt;/code&gt;). This allows Live Server to correctly resolve paths relative to the project root.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Directory Separation&lt;/strong&gt;: Adopted a structured hierarchy to separate assets, logic, and presentation.&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;project-structure&#34;&gt;Project Structure&lt;a class=&#34;anchor&#34; href=&#34;#project-structure&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;project-root/&#xA;├── Assets/&#xA;│   ├── icons/&#xA;│   └── images/&#xA;├── html/&#xA;│   ├── index.html&#xA;│   ├── about.html&#xA;│   └── contact.html&#xA;├── scripts/&#xA;│   └── main.js&#xA;└── Styles/&#xA;    └── style.css&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;pathing-rules-when-working-inside-html&#34;&gt;Pathing Rules (when working inside &lt;code&gt;html/&lt;/code&gt;)&lt;a class=&#34;anchor&#34; href=&#34;#pathing-rules-when-working-inside-html&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;When files are located within the &lt;code&gt;html/&lt;/code&gt; subdirectory, all links to external directories must use the &lt;code&gt;../&lt;/code&gt; prefix to exit the &lt;code&gt;html/&lt;/code&gt; folder first.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
