Decided to move my blogs from Ghost to using Hugo and generate a static website for the content. The reason for this was I don’t use all the fancy features of Ghost. I don’t do newsletters and Ghost requires an email account if people want to sign up for notifications. Plus I have to run a database for the content.

I started with creating an new directory and fired up Claude and started with this initial prompt.

would like to take my content from https://blog.geoffcorey.com and add it to this hugo project

Claude cranked through and setup Hugo and created all the posts. Next, I wanted all my image content local as well.

I would like all my image from blog.geoffcorey.com local and stored in static/images directory

Next I wanted to change the theme to use dream

I would like to use the Hugo theme “dream”

“dream” adds another piece of meta data to the posts and I wanted that updated as well

Update the posts with “cover” metadata with the feature image from the corresponding article from blog.geoffcorey.com

Next I needed to move the about page and patent page

I would create a page “about” from https://blog.geoffcorey.com/about-me/

and finally

I would like to create “patent” page from https://blog.geoffcorey.com/patents/

Next I generated the static site with hugo build and copy public directory to my caddy data directory as blog.geoffcorey.com and update Caddyfile. I also added redirects for the old URL from Ghost to Hugo since Hugo will be /posts/


geoffcorey.com {
 redir https://blog.geoffcorey.com
}

*.geoffcorey.com {
 tls {
  dns cloudflare <REDACTED>
 }
 @blog host blog.geoffcorey.com
 handle @blog {
  redir /amdgpu-ring-timeout-minecraft-workaround-using-mesa-zink/ /posts/amdgpu-ring-timeout-minecraft-workaround-using-mesa-zink/
  redir /neovim-ai-coding-assistant-w-avante/ /posts/neovim-ai-coding-assistant-w-avante/
  redir /best-business-books-for-inspiration/ /posts/best-business-books-for-inspiration/
  redir /lazyvim-neotest-mocha-and-overcoming-no-test-found/ /posts/lazyvim-neotest-mocha-and-overcoming-no-test-found/
  redir /caddy-wildcard-certs-and-ghost/ /posts/caddy-wildcard-certs-and-ghost/
  redir /lazyvim-setup-for-neotest-and-jest/ /posts/lazyvim-setup-for-neotest-and-jest/
  redir /setup-a-self-hosted-ghost-blog-with-docker-and-caddy/ /posts/setup-a-self-hosted-ghost-blog-with-docker-and-caddy/
  redir /coding-with-claude-ai/ /posts/coding-with-claude-ai/
  redir /lazyvim-setup-for-neotest-and-native-nodejs-test-runner/ /posts/lazyvim-setup-for-neotest-and-native-nodejs-test-runner/
  redir /snowflake-timestamp-ntz-to-utc-with-offset/ /posts/snowflake-timestamp-ntz-to-utc-with-offset/
  redir /gemini-coding/ /posts/gemini-coding/
  redir /linux-amdgpu-ring-gfx-timeout/ /posts/linux-amdgpu-ring-gfx-timeout/
  redir /migrating-from-ghost-to-hugo-using-claude/ /posts/migrating-from-ghost-to-hugo-using-claude/
  root * /data/blog.geoffcorey.com
  file_server
  encode zstd gzip
 }
}