<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Web-Development on homelab</title>
    <link>https://homelab.nbkelley.com/tags/web-development/</link>
    <description>Recent content in Web-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/tags/web-development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ilmarë Website</title>
      <link>https://homelab.nbkelley.com/docs/web/ilmare-website/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/web/ilmare-website/</guid>
      <description>&lt;h1 id=&#34;ilmarë-website&#34;&gt;Ilmarë Website&lt;a class=&#34;anchor&#34; href=&#34;#ilmar%c3%ab-website&#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;ul&gt;&#xA;&lt;li&gt;Static Hugo site hosted on Varda (&lt;code&gt;192.168.1.131&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Features CSS Grid layout, hamburger menu, and parallax hero.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;development-patterns&#34;&gt;Development Patterns&lt;a class=&#34;anchor&#34; href=&#34;#development-patterns&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;conditional-title-suffixes&#34;&gt;Conditional Title Suffixes&lt;a class=&#34;anchor&#34; href=&#34;#conditional-title-suffixes&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Append a suffix (e.g., &lt;code&gt;/home&lt;/code&gt;) to the page title only on the index page.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Implementation&lt;/strong&gt;: Leverage Hugo&amp;rsquo;s &lt;code&gt;.IsHome&lt;/code&gt; boolean within template conditionals.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Pattern&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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; .&lt;span style=&#34;color:#a6e22e&#34;&gt;IsHome&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Site&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}&lt;span style=&#34;color:#f92672&#34;&gt;/&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;home&lt;/span&gt;{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&lt;/span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;or using a variable for cleaner syntax:&#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-go&#34; data-lang=&#34;go&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;suffix&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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; .&lt;span style=&#34;color:#a6e22e&#34;&gt;IsHome&lt;/span&gt; }}{{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;suffix&lt;/span&gt; = &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/home&amp;#34;&lt;/span&gt; }}{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&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; .&lt;span style=&#34;color:#a6e22e&#34;&gt;IsHome&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Site&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}{{ &lt;span style=&#34;color:#960050;background-color:#1e0010&#34;&gt;$&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;suffix&lt;/span&gt; }}{{ &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; }}{{ .&lt;span style=&#34;color:#a6e22e&#34;&gt;Title&lt;/span&gt; }}{{ &lt;span style=&#34;color:#a6e22e&#34;&gt;end&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;Context&lt;/strong&gt;: Applied to &lt;code&gt;layouts/index.html&lt;/code&gt; or base templates to differentiate the root URL from inner pages.&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;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt;: Varda (&lt;code&gt;192.168.1.131&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Stack&lt;/strong&gt;: Hugo static site generation&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Template Engine&lt;/strong&gt;: Go templates&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&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-11-24. Pattern confirmed for Hugo static site generation.&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;None.&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;a href=&#34;https://homelab.nbkelley.com/docs/infrastructure/varda-server/&#34;&gt;Varda Server (Ubuntu)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/development/vscode-liveserver-paths/&#34;&gt;VS Code Live Server Path Configuration&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/&#34;&gt;Hugo Git Submodule Extraction Pattern&lt;/a&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/115-Adding -home to index page conditionally.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;</description>
    </item>
    <item>
      <title>Self-Hosted CMS Options &amp; Landscape</title>
      <link>https://homelab.nbkelley.com/docs/services/cms-options/</link>
      <pubDate>Fri, 01 May 2026 00:00:00 +0000</pubDate>
      <guid>https://homelab.nbkelley.com/docs/services/cms-options/</guid>
      <description>&lt;h1 id=&#34;self-hosted-cms-options--landscape&#34;&gt;Self-Hosted CMS Options &amp;amp; Landscape&lt;a class=&#34;anchor&#34; href=&#34;#self-hosted-cms-options--landscape&#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;ul&gt;&#xA;&lt;li&gt;User seeks a self-hosted CMS for an Ubuntu VM, explicitly rejecting WordPress due to business practices.&lt;/li&gt;&#xA;&lt;li&gt;Preference for tools respected by the web development and self-hosting communities.&lt;/li&gt;&#xA;&lt;li&gt;Exploration of CMS categories: Monolithic, Flat-file, Static Site Generators (SSG), Headless CMS, and Custom.&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;&lt;strong&gt;Rejected WordPress&lt;/strong&gt;: Cited business practices as a dealbreaker.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Favoring Developer-Respected Alternatives&lt;/strong&gt;: Leaned towards headless or modern flat-file CMS options.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Top Contenders Identified&lt;/strong&gt;: Directus (Headless), Strapi (Headless), Kirby (Flat-file), Payload CMS (Headless/TS), Ghost (Blogging).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;cms-landscape--options&#34;&gt;CMS Landscape &amp;amp; Options&lt;a class=&#34;anchor&#34; href=&#34;#cms-landscape--options&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;monolithic-cms&#34;&gt;Monolithic CMS&lt;a class=&#34;anchor&#34; href=&#34;#monolithic-cms&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;WordPress&lt;/strong&gt;: Dominant (60% market), huge ecosystem, but rejected by user.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Drupal&lt;/strong&gt;: Flexible, steep learning curve.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Joomla&lt;/strong&gt;: Balanced ease/power, smaller community.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;flat-file-cms-no-database&#34;&gt;Flat-file CMS (No Database)&lt;a class=&#34;anchor&#34; href=&#34;#flat-file-cms-no-database&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Grav&lt;/strong&gt;: Fast, simple, file-based.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Kirby&lt;/strong&gt;: Beautiful UI, file-based, commercial license (~$129), highly respected by designers/devs.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;static-site-generators-ssg&#34;&gt;Static Site Generators (SSG)&lt;a class=&#34;anchor&#34; href=&#34;#static-site-generators-ssg&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Jekyll&lt;/strong&gt;: GitHub Pages compatible.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hugo&lt;/strong&gt;: Blazing fast, Go-based.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Eleventy&lt;/strong&gt;: Flexible, JS-based.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Next.js&lt;/strong&gt;: React-based, hybrid.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;headless-cms-api-driven&#34;&gt;Headless CMS (API-Driven)&lt;a class=&#34;anchor&#34; href=&#34;#headless-cms-api-driven&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Directus&lt;/strong&gt;: Community favorite. Node.js/Vue.js. Provides REST/GraphQL APIs, beautiful admin UI. Excellent for full frontend control.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Strapi&lt;/strong&gt;: Most popular headless. Node.js/React. Strong plugin ecosystem.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Payload CMS&lt;/strong&gt;: Rising star. TypeScript-first, excellent DX.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Ghost&lt;/strong&gt;: Primarily for blogging/publishing. Markdown-native.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Contentful/Sanity&lt;/strong&gt;: Enterprise/Developer friendly, but often cloud-hosted (though self-hostable options exist).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;custom--build-your-own&#34;&gt;Custom / Build-Your-Own&lt;a class=&#34;anchor&#34; href=&#34;#custom--build-your-own&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;The Guardian&amp;rsquo;s &amp;ldquo;Composer&amp;rdquo;&lt;/strong&gt;: Fully custom-built in Scala/Play Framework. Not recommended for small projects.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Server-Side&lt;/strong&gt;: PHP includes, Python (Django/Flask), Node.js (Express).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;recommended-stack-for-ubuntu&#34;&gt;Recommended Stack for Ubuntu&lt;a class=&#34;anchor&#34; href=&#34;#recommended-stack-for-ubuntu&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;For Maximum Control &amp;amp; Flexibility&lt;/strong&gt;: Directus or Payload CMS.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;For Content-Focused Sites&lt;/strong&gt;: Kirby or Statamic.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;For API-Driven Projects&lt;/strong&gt;: Strapi.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Quick Start (Directus on Ubuntu)&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;curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sudo apt-get install -y nodejs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm create directus-project@latest my-cms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cd my-cms&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npm install&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;npx directus start&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&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 date: 2025-11-17.&lt;/li&gt;&#xA;&lt;li&gt;User explicitly stated a preference against WordPress due to business practices.&lt;/li&gt;&#xA;&lt;li&gt;Focus remains on self-hosted, developer-respected tools.&lt;/li&gt;&#xA;&lt;li&gt;Note: Directus and Strapi have evolved significantly since late 2025; verify current self-hosting requirements, licensing, and Docker compatibility for homelab deployment.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;hugo-specific-configuration&#34;&gt;Hugo-Specific Configuration&lt;a class=&#34;anchor&#34; href=&#34;#hugo-specific-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;myblog/&#xA;├── config.toml   -- Main configuration (baseURL, languageCode, title, theme)&#xA;├── content/      -- Blog posts in Markdown&#xA;├── themes/       -- Installed themes (git submodules)&#xA;├── static/       -- Static assets (images, JS, CSS)&#xA;└── public/       -- Generated static files (deployed to Nginx)&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;key-configtoml-settings&#34;&gt;Key config.toml Settings&lt;a class=&#34;anchor&#34; href=&#34;#key-configtoml-settings&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;baseURL&lt;/code&gt; — Domain URL (e.g., &lt;code&gt;https://blog.nbkelley.com&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;theme&lt;/code&gt; — Must match theme folder name in &lt;code&gt;themes/&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;buildDrafts&lt;/code&gt; — &lt;code&gt;true&lt;/code&gt; during development, &lt;code&gt;false&lt;/code&gt; for production&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;paginate&lt;/code&gt; — Posts per page&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;creating-posts&#34;&gt;Creating Posts&lt;a class=&#34;anchor&#34; href=&#34;#creating-posts&#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;hugo new posts/my-post.md  &lt;span style=&#34;color:#75715e&#34;&gt;# Draft in content/posts/&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo -D                     &lt;span style=&#34;color:#75715e&#34;&gt;# Build including drafts&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hugo                        &lt;span style=&#34;color:#75715e&#34;&gt;# Production build to public/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;deployment-options&#34;&gt;Deployment Options&lt;a class=&#34;anchor&#34; href=&#34;#deployment-options&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Manual rsync&lt;/strong&gt;: &lt;code&gt;rsync -avz --delete public/ user@server:/var/www/html/blog&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Git webhook&lt;/strong&gt;: Server-side script that &lt;code&gt;git pull &amp;amp;&amp;amp; hugo &amp;amp;&amp;amp; cp -r public /var/www/html/blog&lt;/code&gt; on push&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cloudflare Pages&lt;/strong&gt;: Push Hugo source to GitHub, Cloudflare builds and deploys automatically&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;comments-for-static-sites&#34;&gt;Comments for Static Sites&lt;a class=&#34;anchor&#34; href=&#34;#comments-for-static-sites&#34;&gt;#&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Utterances&lt;/strong&gt; — GitHub issues-based, no backend&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Disqus&lt;/strong&gt; — Traditional, JS-based&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Hyvor Talk&lt;/strong&gt; — Self-hostable alternative&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;a href=&#34;https://homelab.nbkelley.com/docs/services/hugo-cloudflare-pages/&#34;&gt;Hugo Deployment to Cloudflare Pages - Troubleshooting&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/development/hugo-git-submodule-pattern/&#34;&gt;Hugo Git Submodule Extraction Pattern&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://homelab.nbkelley.com/docs/services/web-server-stack/&#34;&gt;Web Server Stack (Nginx + Apache)&lt;/a&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/106-Beginner Guide to Building Websites with Ubuntu.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ingested/chats/036-Setting Up Self-Hosted Blogs with Nginx.md&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: &amp;ldquo;Self-Hosted Websites on Ubuntu Server&amp;rdquo; (historical)&lt;/li&gt;&#xA;&lt;li&gt;DeepSeek conversation: &amp;ldquo;Setting Up Self-Hosted Blogs with Nginx&amp;rdquo; (chat 036)&lt;/li&gt;&#xA;&lt;/ul&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>
