#NaBoMaMo: The First 15 Bots

Poetry, Rambles

I am, absurdly, trying to make 30 Twitterbots in 30 days, as part of the great collaborative endurance drafting celebration that is #NaXxXxMo. I’ll write at more length about it all, but here are some rough thoughts on the first 15 days, and details on the first 15 bots. These are all first or early drafts rather than complete works, but I’m happy.

Why I Love Twitterbots

1. Twitterbots are a wonderful form for sketching out artistic ideas. This is because procedural art makes sketching out a lot of results very quickly (this bot took under an hour to make), and also because Twitter is the sketchbook and commonplace book of the world. That is, it’s a social spae where everyone is sketching out very rough ideas, early thoughts, first drafts, messy poems, little doodles, and sharing them with each other. It allows process to exist in a casual social space. And it also allows that process to be infinite: you never stop sketching.

2. Twitterbots are the telos of a number of significant artistic movements’ ideas:
– Suprematism’s interest in objective relations between elements;
– Futurism’s obsession with technology, automation and obsolescence;
– The Oulipo’s keenness to write not poems but machines to generate poems and to implement processes to exhaust those machines;
– Modernism’s flirting with intertextuality, because a Twitterbot is incontrovertibly in a corrupt social space and defined by its relation to the elements around it;
– Flarf’s anti-poetry and internet fixation;
– Uncreative writing’s valorisation of process over product, because Twitterbots successfully remove the author from the individual product, remove any suggestion of authorial choice or agential production: you author the process only

3. That last point is the most essential. Because by automating and infininitising some artistic processes, you draw attentiomn to when human agency is actually important. Twitterbots are not the enemy of human poets, but a troublesome friend locked in dialectical relations. We show each other how we work. We see when automation matters and when agency matters. Massive exercises in uncreative writing or painting now take trivial or low effort, so when they are done by a human, the artistic value is found in the very pointlessness of the effort, how it expresses agency in a deterministic world. Individual insight can be simulated, but only badly and occasionally, so insight becomes both more clear and more suspect. We see the human in the robot and the robot in the human.

4. They are the best comedians: they repeat a joke until it isn’t funny, then until it is again, then until it isn’t again, then…

5. They are an awkward intervention into a hypercapitalist space. While they clearly contribute to the success of Twitter by making it more pleasurable to be there, they disrupt the smooth collection of data for the purpose of advertising sales. Their strange follower patterns and uninterpretable tweets gum up the algorithms which make lives valuable. Their wholly inappropriate affective stances are gentle disruptions of the emotional timeline. They do not destroy capital, but they do make awkward spaces of critique within it, sometimes complict, sometimes destructive.

6. I’ve now made around 20 bots, and I feel like a farmer, quietly tending to my herd, my crops, feeding them, giving them to feed you.

The First Fifteen

1. Bot Vaizey

Former UK Culture Secretary Ed Vaizey made a crashingly silly speech in which he demonstrated the same level of creative acumen that earned him the mockery of most artists in the UK. James Varney asked if I could respond with a bot. I hadn’t planned to start #NaBoMaMo with something fairly slight, but doing a snap response bot (see also: @HardBiscuitsUK) by request felt very much in the spirit of the month.

This was knocked together very quickly, and then later given an update to give it more variety and depth. I find that the easiest and most fun bit of making a CBDQ bot is coming up with pleasing syntax varieties: the hard long busywork is synonyms. The two things that quickly give a new bot depth are *long* wordlists for every variable term, and nested syntaxes generating tweet variety. Once my bot is sketched, the big job is going through it word by word and asking “Can this be randomised? Or expanded to a new syntax?”

Platform: Cheap Bots Done Quick (source)
Dev time:  1 hour to get a passable version, 45 more minutes to current completion level
To do: Rake a thesaurus to expand basic elements, add some more syntaxes

2. Orkney Bot o Wirds

This is an extremely simple bot programming-wise: it has a long list of words to pick from, and a 1/7 chance of tweeting a random book, resource or encouraging creative message instead. It involved a lot more actual writing than most of my bots, though, because I wanted to make an interesting usage example for each word. Usually the writing of a bot is a trial-and-error process of combining and recombining elements until you get the right feel (more like cookery than writing), but this involved switching back to a different type of thinking.

I think this bot has broad appeal: it picked up the most followes the most quickly. It’s interesting how little that’s related to programming depth! Often the bots that take me the most time to code have the least broad interest, though they’re often the more appealing ones to boteurs. It’s that difference between being interested in the process and being interested in the result.

Platform: Cheap Bots Done Quick (source)
Dev time:  30 minutes to release, 3-4 hours since getting the word list up to the end of F.
To do: Keep going to the end of the dictionary, tend indefinitely as more books and resources become available.

3. Jamie Jones, Urban Explorer

Inspired by @str_voyage and @spacetravelbot, I wanted to make a horror version of the infinite journey bot, so I came up with the scenario of an urban explorer trapped in an endless series of tunnels. Aesthetically, I decided to go for panicked and impressionistic rather than straightforwardly narrative. This led to a problem that the results seemed quite vague and uninterpretable, and then I realised it would work better with a clearer cultural context, so I set Jamie’s journey in tunnels beneath Detroit and packed the bot with relevant references. This got it to a decent level of consistency. There’s also a cast of four characters in there, but they’re not currently functioning well narratively. The source includes some good techniques for randomising number of lines and line length, as well as a nifty text-glitch-generator.

Platform: Cheap Bots Done Quick (source)
Dev time:  1.5 hours
To do: Introduce more running plot, so it’s more satisfying to read a sequence; make the characters work better by giving them more specifics; intelligent replies if you try to speak to JJ; more variety in possible speech; ev̵e͝n m̷͘͝o̷̸͢r̴̵͞e͘ ẗ́͟͠҉̯͉̱̟̲e̢͍͙͖͚̞̘̲̰̖̔̌̚͘͘xͩ͜҉̨͕̤̥̹̦t͚̟̽ ǧ͐̈͆ͭͤͨ͗ͬ̋͑͏̧̹͎̬̕l̤̜̫̼̫̫̯̫̥͓̦̰̠͖͇̬͎ͯ̓ͨ̒̋̓͛̊̑̑̃̇̔ͮ̅͆̀̀͘͝i̡͇̺͖͙̘̼̜̪͛́͑̊̑͐̃̿̽̏ͤt̶ͪͥ͗͂͆ͩ̒͒̍̑̅͋̾͠͏͖̜̜̝͍̬̹͙̦͇̲̹̬̙̦̱̤c̾̌̊ͪ̎̿ͥ̊̔ͨ̂̇̄̐̽͊̊͏̡̺͉̼̘̤͇̥͙̘̳̞̖̦̦̮̮̯͜͠͡h͊ͦ̈́͗̎͗͛ͫͧ̽̔ͬ͒̕͏̢͍̯̘̬̥̰͖̼̀͝ ́ͣ͏̶͈͇͞

4. Awful Emoji

This was my first SVG bot. I used w3schools to teach myself svg, and cribbed from @someboxes and @hashfacade to figure out how to use it in CBDQ. The concept is simple and self-explanatory! I wanted to generate emoji to express every possible emotion. I tried to tweak the results so that they ranged from obvious feelings to just-over-the-edge-of-ridiculousness, and also to use some positional randomness to ensure that every face was a little bit askew, just like every human.

Platform: Cheap Bots Done Quick (source)
Dev time:  3.5 hours
To do: I could add more different types of eyes and mouth, and introduce elements for hair, blushing, &c, but I might be totally happy with the conceptual clarity of the current result! Scrolling down the feed, it’s interesting how much variety there is in emotion there from so few elements, and I may want to preserve that variety-through-simplicity.

5. Be the Bot You Want to See in the World

A straightforward joke bot, using the classic bot form of “Taking a sentence and having a couple of elements be randomly selected [verbs] or [adjective] [nouns].” In this case having a dig at the inspiring quote industry. The source has a couple of useful lists of nouns, adjectives and present tense verbs I culled from various internet sources by googling “massive list of nouns” and similar (you can just cull them from me). Text Mechanic and Delim.Co were vital for parsing these lists into a format CBDQ could read; I used those tools for almost every other bot this month.

Platform: Cheap Bots Done Quick (source)
Dev time:  30 minutes
To do: Add more quotes to substitute; find more good word lists to add.

6. Plural Fan

The bot version of a running joke I once shared, appending blatantly incorrect latinate plural endings to ordinary words, to make fun of people who like to say “octopodes” and “rhinocerotes” (I am one of these people). I had a really bad and funny version of this bot running in 15 minutes, which just took a list of singular nouns and whacked a plural ending on. Then I realised that it was even funnier if you trimmed one, two or three characters off the end of the word first, and spend 2 more hours figuring out how to do that. This would, I know, be trivial in a bot written in javascript, which could do the processing one each word automatically, but CBDQ has no such functionality. So I had to work out how to use a spreadsheet to do the processing on the 4000+ nouns, and learning that CBDQ’s parent project Tracery could create persistent variables (so that calling one noun would call one of its abbreviations). This was a ridiculous thing to do for this joke bot, and a lot of laborious busywork that could have been done better in another programme, but it was useful to learn how to do these things for future projects where it might be more necessary. And doing it was the last straw for me deciding that I really, really needed to learn how to code a bot in javascript and host it myself.

Platform: Cheap Bots Done Quick (source)
Dev time:  2.5 hours
To do: She is perfect. She is written in the wrong programme but the results can’t be improved.

7. Quittr

Inspired by carebots like @hydratebot and @check_o_tron, I decided to make a more aggressive version that would put regular reminders in my timeline to quit twitter when I didn’t really want to be on it and was only being kept there by the addiction mechanics created by its designers. I also wanted to make a bot quickly because I was feeling the #NaXxXxMo burn. While the bot is simple, there’s some neat work in the code, with different syntaxes reusing different variables lists in subtly different ways, and employing Tracery’s .modifier system to do so. I learned making this bot that all strings in CBDQ are best off being written in lowercase, using #variable.capitalize# when you need it, for maximum flexibility.

Platform: Cheap Bots Done Quick (source)
Dev time:  30 mins
To do: Bot complete. He doesn’t need anything else.

8. failurebot

I was in the middle of touring and performing and too tired to make a good bot. So I made myself a bot in 15 minutes to remind me that failure is OK. Very appropriately, it got banned by Twitter because the code was so basic (just a single list of options to tweet) that it looked like spam to the algorithms. So I had to spend another 15 minutes adding a tin bit of variety to the code to prevent this from happening. There are now 144 possible tweets. I hope this is enough for Twitter to be kind.

Platform: Cheap Bots Done Quick (source)
Dev time:  30 mins
To do: I could add a lot more syntactical and word-choice variety and this would improve the bot, but wouldn’t that miss the point?

9. Daily Antifascism

This was my immediate creative response to My Arse’s election. I was also hosting a performance installation that night where people built buildings and then destroyed them, which felt appropriate. I ripped the idea direct from Henry Bell’s @Radical_Glasgow and then put a call out to my social media followers for good content. I think that, due to the current lack of diverse content, this is my worst bot of the month so far, but that it has the potential to be one of the best when I put the time in.

Platform: Cheap Bots Done Quick (source)
Dev time:  30 mins
To do: Much longer content lists; find a way to schedule historical tweets for their on-this-day day and repeat annually.

10. hg_ebooks

I needed to teach myself how to code bots in javascript and host my own bots, so I decided to make the most common sort of bot: an _ebooks warped mirror which generates markov chains based on your own Twitterfeed. Nothing original about this, but a very useful exercise for learning the necessary for future bots. I followed this tutorial because it was the most step-by-step, even though it uses python rather than js. By doing that, I started to learn how to use the command line, began to gain a vague and uncertain understanding of what words like “repo” and “stack” mean, and how to host a bot on Heroku. Alongside that tutorial, I had to google a lot more tutorials and questions like “How do I use GitHub?” and “What is a dyno?”, and regularly copy-pasted an error message into google and fished until I found a result I understood enough to copy-paste the right bit of the answer. I still don’t really understand any of it, but I can do it. Mostly.

Platform: Ruby and Python, Heroku (I’m not sharing the source (a) because it’s less useful to you than any of the tutorials online (b) because everything that’s my bit is bad code (c) I actually don’t know how to do this properly because I don’t understand GitHub yet). The same goes for Heroku-hosted bots below. But if you’re desparate to know how I did a thing, message me and I’ll try and share the relevant bit.)
Dev time:  1 hour (plus 4 hours preparatory time relearning js for free at CodeCademy)
To do: I might redo this using Mispy’s version, partly because it produces slightly more satisfying results by building a bigger corpus, and partly because doing so would teach me more useful things for future bots.

11. Bot Save the Queen

Inspired by the beautiful @f__lb_tt_r, I decided to push it a bit further and have fun with the Sex Pistols, based on a suggestion from @inky. The implementation is straightforward in CBDQ, with most of the time spent compiling good rhyming word lists from RhymeBrain. As with @PluralFan, this would be much quicker to programme in JS using an API from RhymeBrain to automatically select a rhyme, but on the other hand the bot is already so chaotic that I like the creative control of handpicking the wordlists. The creative work of this bot is in getting the balance right and the probabilities of each option right, so that the bot as a whole has the right amount of entropy, and distance from and connection to the original. This is harder than it sounds! Which rhyme is too far away to still be funny? How many syllables can I break a word down into before it becomes too much like nonsense? How frequently should Johnny sing a line from the original? This kind of tweaking is at the heart of satisfying procedural generation.

Platform: CBDQ (source)
Dev time:  1 hour to get the first two verses working, another 30 mins later to add a third
To do: Add the remaining 9 verses at my leisure, tweak to perfection.

12. Anarcoo

This was a pre-existing account I’d let lapse, so I decided to resurrect it as an automated propaganimal. I used this tutorial to learn how to make a picbot, mashing it up with the previous tutorial to host on Heroku. I also had to use more of the JS skills I’d picked up to write some of my own code. A lot went wrong. I didn’t know what a Procfile or a package.json were (I think I do now?) and apparently I needed both of those, and I have a vague sense of what git init and npm install do when I put them in the command line. It took three hours to hash through it all, but it was worth it. And the results make me very happy.

Platform: JS, Heroku
Dev time: 3 hours
To do: Reduce posting schedule through some math randomisation, vary the moos more.

13. 500 Dollar Words

Going back to making more original bots, this one is an automated tribute to Aram Saroyan’s beautiful poem “lighght“. It takes a random word and repeats two characters near the middle of it. I wrote the javascript to do that to a random word in 10 minutes. Then I spent four learning how to use the Wordnik API and wordnik-bb so that I could use much longer corpora for my bots, which involved a very lengthy detour learning that node-gyp and contextify were a thing that I didn’t understand but were not working properly, and trying out various things google told me to do to fix them, which I didn’t know what they were doing to my computer but I think it’s OK. I was originally going to try and have each word appear in colour on a pleasant cvg background, but (a) I was exhausted by the end of it, and (b) it turns out this is really hard for anyone to do in node.js on Windows and has made adults weep. So partly because of that, and partly because I aesthetically like the accessible directness of tweeting a single word, I think I’ll leave this bot as it is.

The good thing about spending 4 hours banging my head against what should be a simple thing is, next time I want to interact with the Wordnik API, I’ll be able to do it in around 15 minutes, and next time I want to interact with any API, I’ll have a much better sense of how to go about it. I love learning new skills.

14. 5×5

After an exhausting weekend of heavy coding, I wanted to do something light and easy. I didn’t need to learn anything new for this, but I did get to reprise what I’d learned about SVG and element randomisation. The bot has no deep meaning or artistic purpose: it’s a sketch, an experiment in seeing what happens when you define a set of parameters for randomising elements and put them in objective relation to each other. It will roll on experimenting forever. Instead of making a complicated bot, I wrote the thoughts I opened with in this post.

Platform: CBDQ (source)
Dev time: 30 minutes
To do: Nothing.

15. ÜBERURSONATE

From an idea suggested by @ammonite, this is an automated tribute to Kurt Schwitters’ classic Ursonate. It was a total joy to make, with quite a fancy but neat source code. There’s a nice use of nested saved variables here, I think. And the whole thing is built out of elements of no more than two characters. As a method, I went through the whole of the Ursonate, and parsed the semantic structure of all of the stanzas and a good chunk of the words.

It did make me realise that the power of the Ursonate isn’t just in the playfulness of individual verses, but in the impressive intertwining of elements and patterns across the whole of the piece. This is worrying, because now I’ve got the method down, I may have to do a 50,000 word procedural version for #NaNoGenMo

Platform: CBDQ (source)
Dev time: 2 hours.
To do: Nothing.

Brief Feelings on the Halfway Mark

I am quite tired and I don’t know if I’m going to make it. This feels good. I like the obsessiveness of this project, the self-destructiveness of it. I am willing to fail, but I also like pushing myself past all sense. I also like giving myself permissionm to just make, regardless of quality, and I’m quite surprised by the quality of some of what’s come 0ut. I do need to pace myself a bit better, but I’m also happy.

I’ve learned a huge amount. Technically, obviously: I have way more skills and understanding than I started the month with, which was part of my reasoning for doing the month. I think it’s important to learn some of the languages and rituals our world is now built on. But I’m also learning a great deal about the aesthetics and mechanics of procedural generation: of what is satisfying and what is beautiful, of how to balance simplicty and complexity, of how generated texts can function as standalone objects or social interventions or both.  And this, in turn, is learning for poetry in general. What is the sonnet form if not a machine for producing poems? What is concrete poetry if not an exercise in manipulating elements? What is an artist if not a supremely complicated bot?

Thanks

to my backers on Patreon, who give me the freedom to do very strange and free projects like this.