About 18 months ago I was lucky enough to be attending Videobrains in London when George Buckenham gave this talk on Twitter bots. George makes various gamey things and is also responsible for a site called Cheap Bots Done Quick (CBDQ) which is a lovely tool enabling non-technical folks like me to make bots to spout drivel across other people’s Twitter timelines. After following several of the bots George talked about – and inspired by a few more later in the year at #Procjam – I decided to set about creating some of my own.
I tend to have a lot of ideas floating around for settings and characters, most of which are a bit too grandiose for me to fit into a one-person hobby development project. For a while I’d been toying with making a swashbuckling strategy game drawing on my love of old Sinbad movies, the early 90s cartoon Pirates of Darkwater, and the 1985 choose-your-own-adventure book Seas of Blood.
Seeing as I had a setting and theme but not much in the way of game-making resources, I decided this might be a good tableau on which to base my first big bot project. Most of my earliest attempts at bots were very much one-line jokes. There’s nothing inherently wrong with that but I wanted to try to make something a bit more earnest, because I had a set of imagery I wanted to paint with, and because it seemed like a little bit more of a challenge. I had already roughed out the idea in Twine as a sort of self-playing game, so I had a little bit of the content generated upfront.
Early on, I established a set of rules the bot would adhere to. The bot would refer to itself as “we”, indicating a group of voyagers on the same craft, and it would also speak in relatively simple language. I wanted to imply that the voyagers were naive about the world and to maybe make the reader feel like they were part of the “we”.
On February 21st, 2016 I wrote the only hand-written passage for Strange Voyage – the pinned tweet meant to give context to the overall journey and identify the main characters as refugees in strange waters. Here’s a rough introduction to the workflow I developed in the first few weeks of the project.
First I would rough out a few sentences as examples of the type of stuff I’d like the bot to be able to produce. I’d be doing this in the notes section of my phone, on the train home from work. This let me start with a desired end product, and then work backwards from there to work out which broader concepts/structures/themes I wanted @str_voyage to be drawing on.
At it’s topmost level, the “origin” phrases that the bot can pick from look simply like this:
“#fishingevent#”,
“#weathermoderate#.”,
“#weathermoderate#.”,
“#gathergoods#”,
“#machinespotting#”,
“#nocturnalevent#”,
“#environment#”,
“#environment#”,
“#environment#”,
“#environment#”,
“#environment# #environmentcliffs#”,
“#environmentcliffs#”,
“#memory#”,
“#weatherstorm#”,
“#weatherstorm#”,
“#weatherstorm# #environmentcliffs#”,
“#environmentreef#”,
“#environment# #rituals#”,
“#rituals#”,
“#weathermoderate#. #memory#”,
“#weathermoderate#. #environmentcliffs#”,
“#environment# #fishingevent#”
If you’re unfamiliar with how CBDQ works – or more specifically. the Tracery language it runs – each of the phrases above leads to a list of that name, and each of those lists can contain any number or words, phrases, sentences, or even links to other lists.
At the top level, the list above decides which kind of phrases can go with others within the same tweet. For example, fragments about bad weather should be kept away from fragments about play or joviality. Some of these categories ended up a lot broader than is suggested by their old names.
You might also have noticed a number of repetitions in the list above. The randomness in CBDQ is simple; one entry = one chance. This makes it quite easy to make an event rarer by adding more references to the phrases which should appear more regularly. I found this out early on when I introduced the concept of meeting other voyagers on different boats. It was just happening too often so I had to make some of the more desolate environmental imagery have a much greater chance of appearing. I would watch the feed for a day or two and then make adjustments like this.
In the first few months I would watch the bot’s output and self-favourite any tweets which seemed clunky. The two biggest issues I tended to notice were sentences where “a” would lead into a noun beginning with a vowel (e.g. “a archway”). I learned that nouns with vowels either need their own leading structures, or your text has to be structured in such a way that a/an is included in the noun entry.
I also found myself trying to reduce the complexity of some parts which were leading to long one-sentence tweets, where it was easy to lose sense before the end. Yeah, it’s nice the first time your bot tells you about the GREEN BIG GLOWING DIAMOND TREE, but once the novelty wears off you’ll realise it doesn’t really scan. One adjective is often enough.
For me, one of the really enjoyable moments in crafting a bot happens at the points where you’re able to feed new content back into your old passages. For example, a few months in I developed a concept of “treasure” including types of precious metal or stones. This was developed initial as something to be found in caves, or bartered with or for when meeting other crews. However, the descriptors that went into “treasure” eventually found themselves describing weaponry, and both weaponry and treasure would feature in the convoluted stories of the elders, and even descriptions of the sea itself. Sometimes, just scrolling through all the little bits that make up your bot so far can throw out interesting ideas about how you can link what’s already there, instead of constantly adding new stuff.