#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.

Performance, Politics, Art, Dialogue and Twitter

Politics, Rambles, Theatre

This is a short reflection on publishing the #GiveUpArt Twitter essay as part of the #SOTAflash conference, which ran alongside State of the Arts 2011. I reduced an essay (forthcoming in an Arts-Activism reader from Silent City) to forty 120-character tweets, which I scheduled at three-minute intervals between 11.30 and 1.30 on the day of the conference. My original thought was that this would be a sort of “essay as event” intervention into #SOTAflash and SOTA itself. As it happened, expanded far beyond that to become something else: thanks to the people who were taking part, something more interesting.

I had originally planned not to do anything on Twitter while the essay was being published, but I began to receive so many replies, objections, engagements and arguments – and began to see so many other interesting things to talk about in the feed – that I ended up having multiple parallel conversations about the ideas of #GiveUpArt while the essay was being tweeted. I was getting swept up in currents of conversation around the hashtag. I began to feel quite overwhelmed by the participation, and spent the full two hours frantically reading and responding to the comments.

Because so many ideas were flying around and being argued under the #SOTAflash hashtag already, my Twitter essay became a small nexus of chatter amid a much wider conversation with many other nexuses. Nexii. Nexapodes. I did dominate that feed for two hours, inevitably, but far less than I’d originally expected and worried about. It was thrilling to know that my conversations were just some among many: that the curators of #SOTAflash had created a multi-level and highly participatory site of argument alongside and around SOTA itself. The result is that several participants at SOTA quickly recognised that everything happening on the conference fringe was far more interesting and relevant than the conference itself, in form as well as in content. For my part, I couldn’t begin to understand why anyone would pay money to listen to dull, centrist speakers and have heavily-structured conversations rather than take part in a fluid, chaotic, freely-accessible multi-platform argument taking place in both cyber- and meatspace. Of course SOTA was dull: the form set it up to be so. It’s hopeless to expect anything worthwhile to come out of a conference format so out of touch with trends and currents in the way people now think and create. A hierarchical, authoritarian format will produce thought hemmed in by those structures of power: a horizontal, anarchic format will produce a wild variety of dissent and passionate, provocative thought.

As for #GiveUpArt, well,  it became much more of a performance, much more of an event, than I’d originally expected: it was a series of stimulating interactions and conversations triggered by or taking place around the brief bursts of pre-planned thought, and that’s much more interesting than just publishing an essay in short snippets. As a result, I became much more of a performer, tweeting about my own frenetic tweeting, thanking people profusely, arguing more provocatively, enjoying the lights that were shining in my direction. Twitter just is this fascinating blur of writing and performance: it is writing-as-performance, or performance-as-writing. It is a real-time experience with a short-lived archive; readers/watchers are participating not-quite-simultaneously, or even several days after each other. Twitter’s texts are technically almost permanent (and can be made more permanent), but after a week they’re even less likely to be read than books in a library’s backstock. And even though an archive does exist, it’s really no more complete and accurate than an archive of a theatre production: you can see the script, the props, the film of the performance, the programme, the audience interviews, and still not really understand the feeling of being part of the event. Twitter, like so much of the internet, is the transitory masquerading as the permanent.

After the day, I’d intended to archive everything that was tweeted under the #GiveUpArt hashtag. But I got too busy and delayed for a few days, and now, as you can see, Twitter’s search archiving is so minimal that that conversation is no longer easily organised and archivable: to do so, I’d have to trawl through the personal feeds of everyone who participated and extract the relevant tweets, no longer accurately timestamped, and reconstruct the conversation as it happened. That’s far too time-consuming! – and the results would be incomplete and unsatisfying. But as I’ve implied, I’m almost glad it’s too much effort now to archive: I don’t think there’s really any suitable means of completely recording multidirectional Twitter conversations, and I don’t think such a recording would capture any relevant essence of the event. For a reader who wasn’t part of it, it would be like trying to listen in on a crackly audio recording of a busy argument; for a reader who was part of it, it would add nothing to the memory.

On the other hand, another version of the essay is soon to be published in print format, and I’m glad of that, too. It will be another aspect of the same project, in the way 2001’s different elements reflected and expanded on each other. A print essay is only minimally an event, just as a Twitter conversation is only minimally an essay – the two share aspects of each other, but are ultimately (and politically) different. I think I’ll find the print essay less immediately fulfilling than the Twitter conversation, but I also think I’ll remember it and what results more and for longer.

One thing I will record now is part a conversation which took place in a chat window while all the tweeting was going on. Its subjects are parallel to those of #GiveUpArt, just as it took place in parallel to the event, but I thought some readers might find it interesting. I’m the first speaker; the second is a Marxist anthropologist friend of mine, a comrade of protests, meetings, arguments and 12-hour tabletop RPG sessions.

12:42
It’s a bit intense
Trying to engage everyone who replies; difficult to keep up!

12:43
It got away from you. How exciting!
Creating through dialogue is quite exciting.

12:46
I fucken love it

12:46
This is why I’ve been watching your work with such interest. I knew you were thinking about such things when I was there, and I was just beginning to think about them.

12:50
The more I work with dialogue, the more I become convinced its a vital creative frontier.

12:50
Well working with it makes you realise how much all art (ignoring your essay, or at least its rhetoric) is dialogic, and merely conceals its origins.
Some of the comments around this are relevant:
http://www.youtube.com/watch?v=7sei-eEjy4g
People accusing her of “ripping off” the Clash, vs a dialogic understanding of hip-hop.

13:01
Oh yeh, MIA loves pressing those buttons :-D

13:01
Well it’s the essence of hip-hop. There was an amazing paper at this autonomist conference I attended about how hip-hop is an act of creation in the commons.

13:02
And those are the roots of all poetry
Baba Brinkman’s thesis is that hip-hop is a return to the roots of folk poetry and performance

13:02
Well Negri would argue that all productivity is immediately production in common, and it takes juridical private property to convince us otherwise.

13:02
http://www.youtube.com/watch?v=PBX_eKDABx0
http://www.babasword.com/writing/poetry/rhymerenaissance.pdf

13:03
Essay as event… Wonderful.
“Work can be liberated because it is essentially the one human mode of existence which is simultaneously collective, rational and interdependent. It generates solidarity. Capitalism and socialism have only succeeded in subjugating work to a social mechanism which is logocentric or paranoid, authoritarian and potentially destructive.” Negri and Guattari

13:08
Ooh nice

13:14
Damnit, I’m signing up for twitter.

13:17
Oh no!
You’ve buckled
It happens to us all eventually
Do you mind if I publish the bits of this conversation about #GiveUpArt in a reflections blog tomorrow?

13:19
Of course not.
Fuck ownership.
I’m pleased my work’s of some use.