My Own Blog Generator
I’m a big fan of having my own blog. Not “owned” in the sense of “a huge blogging machinery gives me some sort of license rights to my entries,” nor in the sense of “I can write blog posts there without having read 20 pages of lawyerly English about what the provider can do with them.” Also not “I get rich by blogging, even if my users reveal all their data without knowing it.” No. A blog of my own. On a fair web host.
The provider of my choice is neocities. Yes, like geocities back in the day. Good old internet feeling.
But: Neocities only has a pretty awful HTML editor. In this blog, I describe how, in 30 minutes, you can get a tool that makes blogging there easy. Well, almost.
Attention, this is going to be quite a specific and technical post. You’ve been warned.
Requirements
Yep, hefty requirements. I used Cursor + Claude Sonnet 4.5. Presumably, other LLM-agentic development environments like Claude Code or Gemini CLI also work.
That’s a bit lame and costs money.
Another explanation
My blog is German/English. I write in German, and I want the AI to automatically produce the English version.
Off we go. The prompt.
Not an easy task – read sample HTML, transfer Markdown text to HTML that works the same, update a bilingual index.html, and above all, call ChatGPT so that it translates the German text into English. And a bunch of small details.
This is the original prompt. It looks ugly here, but I am trying to keep it exactly as it was, incl. (missing) line breaks.
Create an app that creates a new entry for my personal blog based on a markdown file. # details on the blog My blog is hosted on neocities. All blog entries come in two languages - in my original language, German, and in English. The URL for the index file is: https://agsteiner.neocities.org/Blog/index_en.html and https://agsteiner.neocities.org/Blog/index_de.html. Blog entries all use the same style file: https://agsteiner.neocities.org/Blog/style.css All blog entries use a common structure with the same header and footer. Look at https://agsteiner.neocities.org/Blog/001_mcp_en.html and https://agsteiner.neocities.org/Blog/001_mcp_de.html for examples. # your task You create an app that takes a markdown file as input along with original files from my blog and creates two new HTML files, one for the English version and one for the German version of the blog entry. The app should also create an updated index_de.html and index_en.html. All your updates are local in the current directory. I will upload the files to neocities myself. The app first reads index_en.html and index_de.html from the blog page. In the file it notes the number of the biggest prefix of any blog entry, e.g. 004_mistral_again_en.html” -> 4 Then it reads the local file - default: entry.md - and performs a remote call to ChatGPT o1 to translate it from German to English. You may assume there is a .env file with a property OPENAI_ACCESS_TOKEN that contains the token to access ChatGPT. Then the app converts the markdown for the German and English version to HTML with file name <number>_<converted_english_title>.html where <number> is a three-digit number of the biggest number + 1, in our example 005. <converted_english_title> is the English title, with all letters lowercase and all special characters and whitespace converted to an underscore. Then it adds a single line to the German and the English index.html for the new entry. It does not perform any other change to index_en.html and index_de.html. The app can be a simple script without any UI. You can freely choose to use node.js / JS or python. Use no other language. Refrain from using bloated additional frameworks. Use only libraries that are absolutely necessary. # environment The app runs on this PC. Python and node.js are installed and in the path. The PC is a Windows 11 PC with normal backslash file conventions. Powershell is installed (fairly old version)
And the AI Gets to Work.
Once I had to interrupt it because it somehow got stuck in a curl command.
After that, it was ready. Tested it out. Doesn't work. Strange error. WHAT? NOT PERFECT? I copy the entire error message into the chat, the LLM realizes that probably an outdated OpenAI version was installed, changes that. Then the machine wants to know exactly what's going on, tries out the app, checks if it works, looks whether the result is correct in both languages. Checks if the index_de/en.html are correct.
When the AI says "Done," it's done.
Almost.
What Works and What Doesn’t.
Okay, I admit, I lied to ChatGPT back when I registered. Over there, my name is "Karl Stein." And so ChatGPT promptly uses Karl Stein as my name in the translated text. Strangely enough, even in the Python file, which was actually generated by Claude Sonnet, not ChatGPT. Did I fib there as well?
I changed that manually, even though I have practically no Python knowledge.
And the order of the entries in index.html is wrong. The AI is actually right about that: new entries belong at the top, not the bottom.
Actually for this text, it confused the index.html more and put the new entry in the wrong place. Hm. So I've moved on and am now adding single lines to index.html
But otherwise, everything is correct. Basic, but correct - if I want images, I still have to work with the HTML. Also the preformatted code above was added later.
Result
15 minutes of writing the spec, 15 minutes working with the AI until the script was done, plus a few post-edits. Works. Now I have a Python program that takes the work off my hands. All I have to do is write a blog entry in Markdown, and I get two HTML files in correct formatting + new index files. Fine.
Do you want something like that too? Ideally for neocities? Write me.
Ps five minutes later the AI has enhanced the tool. When the HTML files are generated, they are fed into ChatGPT5 which adds reasonable hyperlinks for common products etc. Nice.