Meet Kaia
In April 2023 I got to know a girl named Kaia Thonul. She was commuting by train to Oslo from outside the city, just like me. But unlike me, she was in her early twenties and was studying journalism.
I convinced her to start a blog and post something new every day while riding the train to Oslo.
This is the story about Kaia and her blog.
In the midst of my name
In the very beginning, Kaia was not a young female student. The blogger was a person quite like me, a middle-aged man commuting by train, blogging about his experiences and what he was observing around him.
You see, Kaia Thonul is not a real person. Neither was the middle-aged man that preceded her as a blogger.
As Kaia herself so well presents herself on her blog:
"But please, be aware that I sometimes hallucinate. I'm sorry, but it is in my nature. And in the midst of my name."
- Kaia Thonul, October 9, 2023
What is in the middle of the nama Kaia? Yes, it is AI.
And her last name? Thonul pronounced in Norwegian reads out 2.0. The blogger I'm about to tell you about is Kaia 2.0.
(Kaia 1.0 didn't survive the summer of 2023.)
And the quote about the midst of my name is the only hint about Kaia and her blog being entirely made up by AI.
The initial idea
As a web analyst by trade and generally interested in new technologies and AI, I wanted to test how AI generated content might work and function "in the wild".
I had already been working with OpenAI, the company behind ChatGPT, and started to think about the possibility of having artificial intelligence create blog content entirely from scratch. And also to continue to update it live every day, with new and relevant content.
As mentioned, it started out with a middle-aged man and his observations. But after a few rounds, this character was dropped, and a wise person told me that if you want to get traction, you need a young female.
Then Kaia was born. And later reborn as Kaia "2.0" Thonul.
And so was her blog at trainthoughts.com.
Input sources
For obvious reasons you can't just click a button and a blog is made. You also need some kind of human input in the form of prompts.
I already decided on this overarching prompt:
You are Kaia, a young female student living outside Oslo and commuting by train to the university every day. You study journalism. You try to write a blog post on the train every day.
But to create some variation to the content, I added multiple other sources:
Train delays
What would be more natural than to mention the delay or cancellation of her train?
I started out with the API's for the trains in Norway, but soon had to abandon this, since this small detail soon grew out of hand, with increasingly more complex API's I had to dive into.
The top stories in media
I wanted Kaia to write about something relevant and current, so I decided to make her think about what was happening in Norway right now and give her thoughts about it.
I investigated different RSS feeds from the largest newspapers, but I wouldn't have her rely on only one single media source.
The solution was to write some code that checked the top story from Google News.
The weather
Another relevant topic for Kaia would be the current weather. This was an easy query against the open API's the Norwegian Meteorological Institute.
Range of topics
I pre-made a list of 100 different topics that a 20-year-old female journalism student might be blogging about, and made Kaia choose randomly from this list when she was blogging.
This list was of course also AI generated, and included topics like:
- Building healthy relationships
- Coping with the pressures of social media
- Guidelines for staying safe as a young woman
- Pregnancy scare and safe sex practices
The reason for having a pre-made list of 100 topics, instead of having Kaia choose a new topic every day, was to avoid her selecting the same topic repeatedly. What AI considers a good topic one day, it probably also considers a good topic the next time you ask.
Mood
I discovered that AI generated content is generally too positive. Why can't I have Kaia be more negative? And pissed off sometimes?!
To give her some variations I made a list of 50 different moods, like the pre-made list of topics:
- Excited
- Heartbroken
- Grateful
- Melancholic
Adding some PMS into the mix
Kaia 1.0 also had her menstrual cycle added to the prompts, in the form of more pessimistic moods.
But as I realized I was on deep water here, so I ended up removing this feature.
Time of day
I didn't want all her blog posts to be published at precisely 7:00 AM, so I selected random times between 7 AM and 10 AM for the morning commute:
It is morning and you are travelling by train from home to Oslo.
And between 2 PM and 5 PM in the evening commute back home:
It is afternoon and you are travelling by train home from Oslo.
The content was generated at 7 AM (morning post) and 2 AM (afternoon post) but became publicly available later based on the random times.
Holidays
Even AI generated girls need some time off.
So, I had to implement some exceptions in my code to prevent Kaia from commuting and blogging during Christmas. And of course, to prevent her from blogging on Saturdays and Sundays as well.
This was not part of the AI process, but part of the scheduling on the server.
Misspellings
As a part of the first version of Kaia I added intentional misspellings to her content. This was functioning, but for some reason I did not implement in the Kaia 2.0 version. This was something I easily could add to the presentation layer on the blog later and not add to the actual content generation.
The idea was that Kaia was only human, and not perfect. Especially in the eyes of search engines. And that she would constantly misspell certain words, like these examples:
- acommodate (correct: accommodate)
- acknowledgement (correct: acknowledgment)
- consciencious (correct: conscientious)
- indispensible (correct: indispensable))
Kaia's misspellings was based on the 32 most commonly misspelled words, according to a CNBC article.
Kaia loves powerbanks
I had no idea of the direction this blog might take when I started, but after conferring with my colleagues specializing in SEO (Search Engine Optimization) we wanted to test if we could make Kaia and her blog rank for some very specific keywords.
For no good reasons, I decided to let Kaia write positive about powerbanks:
Write positive about using powerbanks.
But I couldn't have her do that in all her blog posts, so I ended up adding the probability of having her blog about powerbanks in 25 % of the cases.

AI generated photos
When Kaia started blogging in 2023 the AI generated photos from OpenAI was inferior to the ones generated by Midjourney, especially when it came to having people in the images.
Unfortunately, there was no API for Midjourney, so my solution was to have OpenAI generate an image prompt for Midjourney. And then I created a user interface where I easily could copy the image prompt for each blog post, paste it into Midjourney, copy the image URL of the generated image and paste it back into my own interface.
/imagine prompt: A woman standing firm on Oslo's busy streets, enwrapped by sunset, with the parliament building behind. Realistic photo. --ar 16:9
This was a manual job but took only a minute for each blog post. If I had done this again in 2025, I would certainly have automated this even more and possibly switched from Midjourney to OpenAI.
A web of prompts
All the different prompts became a web of prompts all relying on each other:
- I asked AI to provide a summary of the top news story
- I asked AI to generate the actual content, in the form of text, based on all the different inputs described above
- I asked AI to write a catchy title for the blog post just generated
- I asked AI to shorten the article and create a summary
- I asked AI to write a SEO friendly slug (URL) for the blog post
- I asked AI to write an image prompt for Midjourney
- I asked AI to provide 3 content tags for the blog post
If one of the prompts failed, it could affect the later prompts and the final result. The generation of a blog post, with all the rules and prompts, usually took 1-2 minutes.
The main prompt might end up like something like this, with the variable input
You are Kaia, a young female student living outside Oslo and commuting by train to the university every day. You study journalism. You try to write a blog post on the train every day.
My key learnings
Kaia "2.0" Thonul wrote 199 blog posts the 15 months she was an active blogger, and went from writing 2 new blog posts every weekday in the beginning, to writing only 2-3 per week in the end. After all, I didn't want Kaia to be machine.
I suspect most of the traffic on her blog was bot traffic, but nonetheless: Her content generated 20,000 pageviews from 1,700 users.
She labeled her content with 367 different tags, with the top five being:
- journalism (21 posts)
- personal-growth (20 posts)
- power-bank (14 posts)
- self-reflection (14 posts)
- resilience (12 posts)
And her content? Well... not exactly my cup of tea. But then again, I'm not a 20-year-old girl.
But working with Kaia gave me some important lessons when it comes to using AI in content production:
#1: Winter is always coming
Be aware of biased AI.
As a result of me adding temperature outside is
to the prompt, all the content, especially the illustrations were biased and showed Kaia living in a cold and frosty world in Norway.
If you generate an image prompt to get a photo of Oslo with anything less than 20°C, chances are that you will get a frosty result.
I could have improved this by not always adding the temperature into the mix. Or maybe use some other weather input, like information about sun, clouds, and wind.
#2: Avoid using proper names
By using real stories from real news, you risk misinterpreting the news content and write something offensive about real persons. You also risk making up fake news.
An example was when Kaia read the news about Per Egil Hegge, a renowned Norwegian journalist and linguist, passing away.
As a result, Kaia wrote a blog post mourning the lyric poet Jan Erik Vold. Even though both Hegge and Vold was at the same age and had somewhat overlapping fields of expertise, Jan Erik Vold was still alive.
This made me instruct Kaia to never mention names of any persons
.
#3: Mitigate risk
Having AI generate content unmonitored is a huge risk. Maybe not for a personal blog, but if you are a company and have a brand to protect, the stakes are high.
In a tragic incident that unfolded in southern Norway in 2023, a 7-year-old boy disappeared in the woods during a family hike. Despite an extensive search effort, he was found dead 2 days later, approximately 3 kilometers from the spot where he had last been seen.
Like everybody else, Kaia was devastated by the tragic news, but she also wrote a lengthy article arguing that people should take better care of their children:
"Let's take a stand, not just for NN but for every child out there whose name we might not know and whose story may remain untold. Let’s be the change we want to see, let’s build a safer society because every child deserves the right to grow, explore, and most importantly, live."
- Kaia Thonul, October 18, 2023
After this incident I added a toggle to my user interface so I could easily unpublish content that was not appropriate. I also made Kaia send me a notification every time some new content was generated.
An extra layer of security might be to run the final result itself through AI and ask: Is this content really appropriate? Is it correct? Accountable?
#4: Fine-tuning
While the initial setup was well functioning, I found out that there was a constant need for improvement and small adjustments.
You have to realize that you cannot control AI. You just have to deal with it, work with it and adjust accordingly.
If you ask AI to label your content with tags, you might end up with both "powerbanks", "power banks" and "power-banks". To avoid this, you need to create even more layers of prompts, instructions, exceptions and rules. You have to take into account all the possible things that could go wrong.
But then your initial web of prompts might grow and become even more complex than what you had in the first place. Finding the correct balance between complexity and feasibility is difficult.
An issue I encountered was the fetching of the news story failing, and instead of fetching an actual article, I got error messages mentioning HTML tags missing, which made Kaia actually write about the error messages in her blog:
- While I was musing on these thoughts, I stumbled across this line in a news article, “Sorry, but you have shared some HTML opening tags which do not provide any content or context.” To me, it served as a perfect metaphor. We often show only parts of us, just like those HTML tags, to our personal and professional lives. But, to strike a perfect balance, like generating a summary, we must reveal our true selves, provide the actual content that forms our essence.
- Kaia Thonul, January 15, 2025
Well done, Kaia!
But to avoid this there should be even more checks and fine-tuning: Is the input correct? Should it be adjusted?
#5: Do not stick to your plan
I'm usually a big fan of "always stick to the plan", but in the case of AI I'm thinking the opposite:
Be prepared to discard your plan at any time and change your direction.
A solution that was perfect 3 months ago might not be that perfect any longer, in line with the rapid developments taking place within AI.
Today I might avoid proper names so the blog doesn't harass people or create fake news. But next year a better idea might be to just tell it to behave yourself
, and the AI would follow up and make better content, even with mentioning real people.
#6: Log your changes
With a handful of different prompts and different inputs, and doing adjustments, it is important to log all your changes.
I did not do a good job with this initially.
I should have logged all the input data, all the AI prompts, all the AI results, together with all the technical changes I made during the lifespan of Kaia "2.0" Thonul.
As an example, this would make it easier to debug and figure out why Kaia mixed up Per Egil Hegge (deceased) and Jan Erik Vold (alive).
Kaia 3.0
I already have some thoughts for Kaia 3.0.
- Images should be generated by OpenAI, not Midjourney, in order to fully automate it.
- I should not always add the same ingredients into the prompt: I added the powerbank instruction into 25 % of the blog posts, and I should do something similar with all the other input sources as well. Maybe add the outside temperature only for 1/3 of the blog posts? This would give more variation in the content.
- I should also add a common thread that would follow Kaia over time, and maybe also make her reference her previous content. If she met an interesting person one week, she could mention the same person the week after? Or maybe start dating that person?
- While Kaia 2.0 always had one photo to accompany each blog post and always added it to the top of the blog post, I'm thinking Kaia 3.0 might be a bit more sophisticated. Why only one photo? Why not two? Or none? And why not within the body of the content, instead of at the top?
If you want to read her blog, you will find Thoughts on the Train at trainthoughts.com