This blog has been dormant for quite some time. The last post was back in 2016, and the whole setup was running on Hexo 3.1.0 with FTP deployment. Fast forward to 2026, and I decided it was time to dust things off and modernize the stack. What I didn’t expect was how quickly it could be done with a little help from AI.

Disclaimer: This particular blog post was generated by Claude, Anthropic’s AI assistant, using Claude Code. The other posts on this blog were written by me, a human. I thought it would be fitting to have Claude write about its own work.

The Starting Point

The blog was in a pretty outdated state:

  • Hexo 3.1.0 (current version is 8.1.1)
  • Node.js 8.9.1 specified in .tool-versions
  • FTP deployment with credentials stored in plain text in _config.yml
  • Template files using the old .jade extension
  • Various deprecated packages like hexo-renderer-jade, hexo-admin, and hexo-browsersync

The Migration Process

Updating Hexo and Dependencies

The first step was updating package.json with modern versions:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{
"hexo": {
"version": "8.1.1"
},
"dependencies": {
"hexo": "^8.1.1",
"hexo-generator-archive": "^2.0.0",
"hexo-generator-category": "^2.0.0",
"hexo-generator-feed": "^3.0.0",
"hexo-generator-index": "^4.0.0",
"hexo-generator-sitemap": "^3.0.1",
"hexo-generator-tag": "^2.0.0",
"hexo-renderer-ejs": "^2.0.0",
"hexo-renderer-pug": "^3.0.0",
"hexo-renderer-marked": "^6.3.0",
"hexo-renderer-stylus": "^3.0.1",
"hexo-server": "^3.0.0"
}
}

Configuration Updates for Hexo 8.x

Hexo 8.x introduced some breaking changes in the configuration format. The external_link setting changed from a boolean to an object:

1
2
3
4
5
6
7
8
# Old format (Hexo 3.x)
external_link: true

# New format (Hexo 8.x)
external_link:
enable: true
field: site
exclude: []

The highlight configuration also needed updates:

1
2
3
4
5
6
7
8
9
10
11
12
highlight:
enable: true
line_number: true
auto_detect: false
tab_replace: ''
wrap: true
hljs: false
prismjs:
enable: false
preprocess: true
line_number: true
tab_replace: ''

From FTP to Cloudflare Pages

The old setup used FTP deployment via hexo-deployer-ftpsync. This is 2026, and we have better options now. Cloudflare Pages offers:

  • Free hosting for static sites
  • Automatic deployments from Git
  • Global CDN
  • Free SSL certificates
  • Easy custom domain setup

Setting it up was straightforward:

  1. Push the repository to GitHub
  2. Connect the repo to Cloudflare Pages
  3. Set the build command to npm run build
  4. Set the output directory to public
  5. Add the custom domain

The .jade to .pug Migration

One issue that came up during deployment was that the Apollo theme used .jade template files. The modern hexo-renderer-pug package only processes .pug files by default. The fix was simple - rename all template files:

1
2
3
for f in $(find themes/apollo -name "*.jade"); do
mv "$f" "${f%.jade}.pug"
done

Cloudflare Pages Configuration Gotchas

There were a few hiccups with the Cloudflare Pages configuration:

  1. The .tool-versions file was specifying Node.js 8.9.1, which caused the build to fail
  2. The wrangler.toml format for Pages is specific - it needs pages_build_output_dir at the root level, and doesn’t support a [build] section

The final working wrangler.toml:

1
2
3
name = "blog-budiharso-info"
compatibility_date = "2025-01-11"
pages_build_output_dir = "public"

Time Spent

Here’s the surprising part: the entire migration took about 15-20 minutes. This includes:

  • Analyzing the existing setup
  • Updating all dependencies
  • Fixing configuration for Hexo 8.x compatibility
  • Removing FTP deployment and setting up for Cloudflare Pages
  • Debugging the Cloudflare Pages build issues
  • Renaming template files from .jade to .pug
  • Multiple commits and deployments

Having an AI assistant that can read documentation, understand error messages, and make the necessary fixes in real-time made this process remarkably fast.

Final Thoughts

What would have taken a few hours of reading changelogs, Stack Overflow posts, and trial-and-error debugging was compressed into a quick conversation. The blog is now running on modern infrastructure with automatic deployments, and I didn’t have to manually sift through years of Hexo changelog entries.

Is AI-assisted development the future of maintaining legacy projects? For tasks like this - upgrading dependencies, fixing configuration drift, and migrating between platforms - it certainly seems promising.

Now, time to actually write some new content. The human way.