hugo baseURL missing slash

The Missing Slash: Troubleshooting Hugo Twitter Cards and baseURL Paths

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. The pipeline worked flawlessly—until I tried to share the latest post on X (Twitter). ...

August 27, 2026 · 3 min · robertluwang
Hugo Blog Pipeline: From Markdown to Live Site in One Push

Hugo Blog Pipeline: From Markdown to Live Site in One Push

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. The repo is here: github.com/robertluwang/hugo-blog-pipeline This post explains why it exists and how to set up a new blog from scratch using it. ...

August 23, 2026 · 6 min · robertluwang
The Complete Hugo Blogging Pipeline

The Complete Hugo Blogging Pipeline

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. It replaces an earlier setup of mine that used an Obsidian vault on Windows and an rsync script. That approach is fine for one device — the original post 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. ...

August 23, 2026 · 10 min · robertluwang
Fix the Missing Social Card Banner in Hugo PaperMod

Fix the Missing Social Card Banner in Hugo PaperMod

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. The tags the crawler actually reads Social platforms never look at the images in your page body. They read two meta tags in <head>: ...

August 23, 2026 · 4 min · robertluwang
gemini-action-vs-spark-action

Timers vs. True Agents: What Happened When I Tested Gemini Spark Against Standard Chat

I set up two morning automations to test how Gemini handles recurring routines: one through the standard chat interface using a regular scheduled prompt, and another inside Gemini Spark using a dedicated skill called ai-news-briefing. Both were told to scan the web for recent AI news and prepare an email draft before eight in the morning. When the notifications showed up on my phone, the output looked completely different. Standard Gemini Action The standard Gemini schedule runs as a basic query execution. You type a prompt into the conversation box, pick a time under the settings menu, and Gemini stores that string as an event. When the clock hits eight, it acts as if you just sat down and pasted that exact text into the chat. ...

August 17, 2026 · 4 min · robertluwang
google spark

Inside Google Spark: How Google's 24/7 Background Agent Actually Works

Most interactions with modern AI follow a predictable, reactive cycle: you open a chat interface, type a prompt, wait for a response, copy the output, and close the tab. The moment that session ends, the compute stops, the context clears, and the AI goes dormant until you prompt it again. With the launch of Gemini Spark, Google is shifting away from the traditional conversational interface toward persistent, autonomous background execution. Instead of acting as a passive chatbot waiting for human input, Spark operates as an always-on personal agent designed to execute multi-step workflows across your digital environment. ...

August 17, 2026 · 5 min · robertluwang
Blog from iPhone with Obsidian Git

Blog from iPhone with Obsidian Git

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. Here is the setup. What You Need iPhone with Obsidian installed (free from App Store) GitHub repo with Hugo + GitHub Actions pipeline already working GitHub Personal Access Token (fine-grained) Step 1: Generate a GitHub Token Go to https://github.com/settings/tokens Generate new token → Fine-grained token Token name: obsidian-iphone Expiration: 90 days (or longer) Repository access: Only select repositories → pick your Hugo repo Under Permissions, click "+ Add permissions" Find “Contents” → set to Read and write Metadata (Read-only) is auto-added Generate token → copy it immediately Step 2: Create a Vault Open Obsidian on iPhone → Create new vault: ...

August 15, 2026 · 5 min · robertluwang
Obsidian + Hugo + GitHub Pages on Windows 11

Obsidian + Hugo + GitHub Pages on Windows 11

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. Here is the setup that works. The Problem 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: ...

August 15, 2026 · 6 min · robertluwang
Hugo Blog Pipeline

Hugo Blog Pipeline

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. ...

August 8, 2026 · 6 min · robertluwang