<?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>Hugo on Artark AI</title><link>https://robertluwang.github.io/artark-ai/tags/hugo/</link><description>Recent content in Hugo on Artark AI</description><generator>Hugo</generator><language>en</language><lastBuildDate>Thu, 27 Aug 2026 05:57:00 -0400</lastBuildDate><atom:link href="https://robertluwang.github.io/artark-ai/tags/hugo/index.xml" rel="self" type="application/rss+xml"/><item><title>The Missing Slash: Troubleshooting Hugo Twitter Cards and baseURL Paths</title><link>https://robertluwang.github.io/artark-ai/posts/2026-08-27-hugo-baseurl-missing-slash/</link><pubDate>Thu, 27 Aug 2026 05:57:00 -0400</pubDate><guid>https://robertluwang.github.io/artark-ai/posts/2026-08-27-hugo-baseurl-missing-slash/</guid><description>&lt;p&gt;I recently finalized a pretty neat automation for my static blog. I built a custom Gemini skill that takes my Obsidian drafts and automatically generates wobbly, hand-drawn-style cover banners and spot illustrations. The workflow is entirely frictionless: I write in Obsidian, sync via the iOS Git plugin, and GitHub Actions takes over to build the Hugo site.&lt;/p&gt;
&lt;p&gt;The pipeline worked flawlessly—until I tried to share the latest post on X (Twitter).&lt;/p&gt;</description></item><item><title>Hugo Blog Pipeline: From Markdown to Live Site in One Push</title><link>https://robertluwang.github.io/artark-ai/posts/2026-08-23-hugo-blog-pipeline/</link><pubDate>Sun, 23 Aug 2026 14:40:00 -0400</pubDate><guid>https://robertluwang.github.io/artark-ai/posts/2026-08-23-hugo-blog-pipeline/</guid><description>&lt;p&gt;I open-sourced the tooling I use to run this blog. It is a set of scripts that sit on top of Hugo and GitHub Pages, handling the things Hugo does not: scaffolding posts correctly, validating front matter before deploy, fitting banner images for social cards, and keeping two devices in sync through git alone.&lt;/p&gt;
&lt;p&gt;The repo is here: &lt;a href="https://github.com/robertluwang/hugo-blog-pipeline"&gt;github.com/robertluwang/hugo-blog-pipeline&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This post explains why it exists and how to set up a new blog from scratch using it.&lt;/p&gt;</description></item><item><title>The Complete Hugo Blogging Pipeline</title><link>https://robertluwang.github.io/artark-ai/posts/2026-08-23-hugo-pipeline/</link><pubDate>Sun, 23 Aug 2026 09:58:00 -0400</pubDate><guid>https://robertluwang.github.io/artark-ai/posts/2026-08-23-hugo-pipeline/</guid><description>&lt;p&gt;This is the whole pipeline I use to write and publish a Hugo blog from Linux (including WSL on Windows 11): repo layout, scaffolding, banner handling, a validation gate in CI, and one command to publish. It also covers writing from an iPhone, because the moment a second device exists most of the interesting failures appear.&lt;/p&gt;
&lt;p&gt;It replaces an earlier setup of mine that used an Obsidian vault on Windows and an &lt;code&gt;rsync&lt;/code&gt; script. That approach is fine for one device — &lt;a href="https://robertluwang.github.io/artark-ai/posts/2026-08-15-obsidian-hugo-pipeline/"&gt;the original post&lt;/a&gt; still stands if that is you — but it silently deleted a section from a published post once I added a phone. That failure shaped everything below.&lt;/p&gt;</description></item><item><title>Fix the Missing Social Card Banner in Hugo PaperMod</title><link>https://robertluwang.github.io/artark-ai/posts/2026-08-23-hugo-social-card/</link><pubDate>Sun, 23 Aug 2026 06:56:59 -0400</pubDate><guid>https://robertluwang.github.io/artark-ai/posts/2026-08-23-hugo-social-card/</guid><description>&lt;p&gt;You share a post link on X or LinkedIn and the card comes up as a bare title with no banner. The image is right there on the page, so the obvious guess is that the crawler cannot find it. That guess sends most people down the wrong path.&lt;/p&gt;
&lt;h2 id="the-tags-the-crawler-actually-reads"&gt;The tags the crawler actually reads&lt;/h2&gt;
&lt;p&gt;Social platforms never look at the images in your page body. They read two meta tags in &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Blog from iPhone with Obsidian Git</title><link>https://robertluwang.github.io/artark-ai/posts/2026-08-15-iphone-obsidian-git/</link><pubDate>Sat, 15 Aug 2026 18:17:00 -0400</pubDate><guid>https://robertluwang.github.io/artark-ai/posts/2026-08-15-iphone-obsidian-git/</guid><description>&lt;p&gt;You can write and publish blog posts from your iPhone using Obsidian and the Obsidian Git community plugin. No computer needed — write a post on the train, push to GitHub, and your Hugo site updates automatically.&lt;/p&gt;
&lt;p&gt;Here is the setup.&lt;/p&gt;
&lt;h3 id="what-you-need"&gt;What You Need&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;iPhone with Obsidian installed (free from App Store)&lt;/li&gt;
&lt;li&gt;GitHub repo with Hugo + GitHub Actions pipeline already working&lt;/li&gt;
&lt;li&gt;GitHub Personal Access Token (fine-grained)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="step-1-generate-a-github-token"&gt;Step 1: Generate a GitHub Token&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://github.com/settings/tokens"&gt;https://github.com/settings/tokens&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generate new token → Fine-grained token&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Token name:&lt;/strong&gt; &lt;code&gt;obsidian-iphone&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Expiration:&lt;/strong&gt; 90 days (or longer)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repository access:&lt;/strong&gt; Only select repositories → pick your Hugo repo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Permissions&lt;/strong&gt;, click &lt;strong&gt;&amp;quot;+ Add permissions&amp;quot;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;Find &lt;strong&gt;&amp;ldquo;Contents&amp;rdquo;&lt;/strong&gt; → set to &lt;strong&gt;Read and write&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metadata&lt;/strong&gt; (Read-only) is auto-added&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Generate token → copy it immediately&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="step-2-create-a-vault"&gt;Step 2: Create a Vault&lt;/h3&gt;
&lt;p&gt;Open Obsidian on iPhone → &lt;strong&gt;Create new vault&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Obsidian + Hugo + GitHub Pages on Windows 11</title><link>https://robertluwang.github.io/artark-ai/posts/2026-08-15-obsidian-hugo-pipeline/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><guid>https://robertluwang.github.io/artark-ai/posts/2026-08-15-obsidian-hugo-pipeline/</guid><description>&lt;p&gt;Obsidian is a beautiful markdown editor. Hugo is a fast static site generator. GitHub Pages is free hosting with CI/CD. The challenge is wiring them together on Windows 11 where Obsidian runs natively but Hugo and git live in WSL.&lt;/p&gt;
&lt;p&gt;Here is the setup that works.&lt;/p&gt;
&lt;h3 id="the-problem"&gt;The Problem&lt;/h3&gt;
&lt;p&gt;Obsidian is a Windows desktop app. Hugo and git run in WSL (Ubuntu). They need to read and write the same markdown files. The obvious answers all fail:&lt;/p&gt;</description></item><item><title>Hugo Blog Pipeline</title><link>https://robertluwang.github.io/artark-ai/posts/2026-08-08-hugo-blog/</link><pubDate>Sat, 08 Aug 2026 16:27:40 -0400</pubDate><guid>https://robertluwang.github.io/artark-ai/posts/2026-08-08-hugo-blog/</guid><description>&lt;p&gt;I got tired of WordPress. Not because it crashed or ran slow — it worked fine — but because every time I sat down to write, I was fighting the editor instead of writing. The block system turns a simple paragraph into a drag-and-drop puzzle. I wanted a blogging pipeline where I write a markdown file, push it to git, and the post goes live. That is it. No block picker, no sidebar toggles, no plugin updates, no database.&lt;/p&gt;</description></item></channel></rss>