In “Post-Completion Notes for datafox,” I proudly introduced how I used JSON-LD for AI-SEO, how I embedded Person Schema into extend_head.html to help Perplexity recognize me, and how I made AI search engines understand my technical boundaries. At the time, I thought I was doing something quite remarkable.

Approximately two months later, I opened Google Analytics and discovered a problem.

My traffic almost entirely came from my own promotion. Every time I posted → shared on LinkedIn → shared in groups → traffic would spike briefly → then disappear.

Organic search? Almost zero. Damn, I was so frustrated. Before, when I posted on Medium, I could attract organic traffic, but here, there was almost none. Pathetic.


I. What Exactly Did I Miss?

This made me feel a bit ashamed, because an SEO article I wrote previously was, in a way, teaching others how to do SEO. But I overlooked a huge problem: I implemented “advanced SEO for the AI era” while skipping the most fundamental steps.

For example, my article URLs looked like this:

https://datafox.tw/posts/260303_2222/

This string of numbers is meaningless to Google. Google doesn’t know what this article is about, so it can’t push it out when someone searches for relevant keywords. One reason Medium articles are searchable is that Medium’s URLs look like this:

https://datafox-tw.medium.com/datafox-竣工後記-2026-個人網站實戰指南-從-想要一個網站-到真正上線-3ae9d5a615b7

At a glance, you know what it’s about.

Then there’s the article’s description. I checked, and 17 out of 25 articles had a blank description.

description: ""

This means when Google crawled my articles, it didn’t know what summary to display in the search results. It could only guess. What it guessed usually didn’t look very good, and naturally, the click-through rate wasn’t high.

Furthermore, I never actively told Google that my website existed. I had robots.txt, and I had a sitemap, but I never submitted them to Google Search Console. I only knew about GA4 before, but I didn’t go to GSC, which made my organic traffic almost non-existent, especially since this task only takes about three minutes to complete.

II. Four Things I Did Today

2.1 Make URLs Human-Readable

Added slug to the front matter of each article to make the new canonical URL include keywords:

slug: verbose-ai-agent-financial-risk

slug is the new URL, and aliases automatically redirects the old date-based URL, preventing 404 errors.

To avoid manually crafting each one, I wrote a script that had Gemini read article titles, automatically generate 3-6 English word slugs, and then batch-write them into the front matter.

2.2 Complete the Description

Also a script. It had Gemini read the first 800 characters of each article to generate a meta description of 40-120 Chinese characters, which included keywords and didn’t sound as stiff as a machine-generated summary.

This text is the description displayed below the title in search results. Its impact on click-through rates is greater than most people imagine.

2.3 Submit to Google Search Console

Went to Search Console to verify the domain (I used GoDaddy DNS verification) and then submitted the sitemap:

https://datafox.tw/sitemap.xml

The system reported: Success, 67 pages discovered.

I hadn’t done this step before, meaning Google was entirely crawling on its own, which was very inefficient and slow. Now, at least Google knows I exist.

2.4 Add Open Graph Cover Image

Without an OG image, when articles are shared on LinkedIn or LINE groups, the preview card is just blank (or randomly picks up a strange image).

Added a line in hugo.yaml:

params:
  images: ["images/Open_graph_image.png"]

This image is used as the default for the entire site. Later, if a specific article needs a different image, just override it in the front matter using cover.image.


III. Reflections: “Looking Impressive” vs “Fundamentals”

When I was working on JSON-LD and Person Schema, I had a strange sense of accomplishment. Those things looked professional, very AI-native, very “2026 SEO.”

But I skipped description, URL slug, and Google Search Console—things that seemed boring and were written about everywhere.

I think this is probably a typical bias: because something felt “too basic,” I assumed I had already done it. Then I went around in circles doing advanced things, only to realize later that the foundation wasn’t built properly.

It wasn’t entirely a waste. JSON-LD is indeed useful for AI search engines, and tools like Perplexity reference schema when crawling structured data. But these are “bonus points,” not “foundational requirements.”

If the foundational requirements aren’t met, bonus points are just being added in a place no one sees.


Doing SEO is like writing code: first, make it work; then, make it work well.


If you’re also running a personal website with Hugo + GitHub Pages, the four things mentioned above are the most worthwhile items to check first. I’ve put the scripts in scripts/gen_descriptions.py and scripts/gen_slugs.py; feel free to refer to them and adapt them if needed. (Please find the source code on GitHub)