Faustian Bargain

This post is more than a year old. The information, claims or views in this post may be out of date.

I had an interesting encounter on Twitter a few days ago, the implications of which have been stirring in the back of my mind since.

I rejoined the fray about a month ago, with the intention of using Twitter very differently than I had before. For one, I only follow news organizations and people that I know well outside of Twitter. Secondly, I try not to get engaged in hot-button social or political issues, since there’s generally not much benefit that comes out of those conversations.

Mostly though, I had intended to keep more of my posting activity focused on useful things – like the stuff I’m building, or how my journey as a freelancer is progressing. On balance I don’t think I’ve really achieved that so far, and I do honestly lament that fact.

And then something interesting happened. In another thread, I was commenting on Gwen Ngwenya’s resignation as the DA policy head (a big deal in liberal politics), and as usual, I tried to see it from perspectives everybody else was ignoring.

Like how she’s a young, bright, capable black woman who just burned a male-dominated organization for being incapable and disorganized, and what if most of the blowback is just a bunch of insecure men lashing out?

Between that observation and the former tweet, somebody actually took issue with me. Apparently, by both commenting on a political issue in a way they disagreed with, and expressing a desire to talk about things other than politics, I had somehow personally disappointed them.

I didn’t even finish reading the tweet before blocking that person, so I couldn’t tell you what the rest of it said, and my life is not served in any way by knowing it. But it did remind me of Ben Hunt’s mirror engagement theory – an idea that more people should really be familiar with.

I hadn’t realized it up until that point, but apparently I’ve become something of a celebrity to a few people on Twitter. I don’t say that in a self-aggrandizing way – what I mean to say is: I’ve said enough things that enough people want to hear, and by following/liking/retweeting the things I say, some of them feel like they’ve entered into a contract with me.

In that contract (which I’m completely unaware of), I need to provide them with the snippets and hot takes that aligns with their existing beliefs, which they will then boost to their own audiences – in return, I get additional exposure and influence.

For as long as I give them what they want, (they think) they’re giving me what I want – and the moment I break that contract by saying something they disagree with, it becomes my fault.

It’s analogous to sports fans – another concept I don’t really go for. I’ve known fans who get really amped up over their favorite teams and players, then take it deeply personally when these celebrities let them down. Of course, these players have absolutely no idea who their fans are – they’re just playing the game.

Twitter flips that on its head in two ways: It makes it possible for anyone to achieve celebrity status (just tell people what they want to hear), and it makes it possible for anyone to provide realtime feedback when they feel like you’ve violated their implicit contract.

The reason any of this is relevant: I’ve been on Twitter for a long, long time. I joined in 2008, back when there were so few people locally, you could count them by hand.

Twitter back then was an absolute treasure. A network full of early adopters that weathered service outages because it meant connecting with other early adopters. Twitter was the counter-culture, an “underground” network where we could be vulnerable and honest, and find empathy and common ground with people all around the world.

And then it started going mainstream. The Obama campaign used social media to take the White House, setting a precedent in US politics. Over time, here in South Africa, as the uptake grew, so did the potential for political warfare.

It’s a great deal for failing news organizations: Twitter is a constant source of drama, easily repackaged as engaging news segments. With political parties joining the fray, it’s now a battleground of ideas. When Bell Pottinger rolled out their social media offensives as part of the Gupta PR campaign, they were playing from a well-established handbook.

Today, Twitter is basically a toxic hivemind. Give it what it wants, and it rewards you with completely undue social influence – a rapid conduit to getting your message out via established and credible news organizations.

There’s every benefit to being a crowd-pleasing hack. Roll out the hottest takes, never apologize for getting things wrong, never back down, never stop making your fans feel like they made the right choice in defending you to their friends.

Create and maintain a caricature of yourself that appeals to people that would rather not put any thought into their own arguments, and will instead impulsively agree with anything that feels right to them – even if completely illogical. Do this, and you’ll end up famous (and possibly, wealthy).

But it’s a Faustian bargain: You can never be your honest self, and you must always please the crowds that give you power. Displease the hivemind, and it will literally ruin your life.

You’ll get harassed off the platform, then your personal information will be dug up and routed to people that take absolute pleasure in making your life miserable. It’ll kill your brand, your business, and in some cases, may even drive you to kill yourself.

Given the way those incentives are set up, it’s no surprise that South African Twitter is slowly becoming more toxic as it enters into the mainstream. It’s old-school pedagogy reinvented for modern technology. A true flattening of the hierarchy that never stopped to question if the hierarchy had any merit – if there was a reason we only let certain people have major platforms and massive social influence.

In any case, this is what we have to deal with. For my part, while I will occasionally apologize for not meeting my own goals, I’ll never apologize for having complex opinions, or being honest in their expression.

This means I’ll never be popular, but I’m 100% okay with being myself. At the end of the day, that’s far more important to me.

How to Podcast, 2019 edition

This post is more than a year old. The information, claims or views in this post may be out of date.

It’s actually easier than you’d think!

The Noscript Show, on Spotify

I won’t really get into the “why’s” of podcasting here – there’s a bunch of good reasons to do it (people like listening more than reading, easy way to build a brand, easier to syndicate, works great on mobile devices, fairly low production costs, and so on), but I want to focus on the how.

There’s three areas to cover: Production, Syndication and Promotion. Unfortunately none of these will tell you how to make a good podcast – that’s left as an exercise to the reader 🙂


First, you need a decent setup with which to record audio. The entire production is audio, so going for higher quality and less distortions/background noise are key.

Having a good microphone is essential. Doesn’t need to be the best, but it does need to deal with ambient noise in your recording environment, while clearly picking up the full range of your voice.

A typical USB headset designed for calls would work well for this. Depending on your budget, you could get standalone microphones for anything from R399 to R1895. While you can get USB microphones with on-board soundcards, you might also consider getting a standalone XLR microphone with a dedicated external sound card – this will give you studio-quality audio (and your environment becomes even more important!).

Then you’ll need software to do your actual recording with. I recommend Audacity unreservedly – it’s great software, completely free of charge, which works on both Mac and Windows. Using Audacity, you’ll be able to record your own microphone, as well as compose in any other audio streams.

Another really useful feature – if you have an MP4 video file, you can extract the audio from it in one go. That’s actually what we’re using to produce the podcast audio files for The Noscript Show.

If you plan on doing more conversational-style podcasts, and routinely use something like Discord or Skype for calls, the next best option is OBS Studio. While it was originally designed for video streaming, the composer is really easy to use, and you can mix in audio from other calls + your own microphone into one file.

To add a little extra personality to your podcast, you might consider editing in an intro and exit sound. Just a few seconds of music on either end will make for a more polished production. AudioJungle is a great place to buy short clips like that, and they’re usually licensed for exactly this sort of use.

Finally, the artwork. You’ll want to design something that represents your podcast (much like an album cover), but this doesn’t need to be professionally done. Between the free Photopea for editing and Unsplash for free images, you can whip up a good selection of options really quickly!


So now that you’re set up to record your podcast, the next step is syndication. Basically you need to put your podcast online, and make sure that your listeners can get ahold of it.

There’s a huge amount of options to go for here. If you’re the developer type, you can really just do this all on your own server: Make the files publicly accessible and assemble an RSS feed.

In my case, I ended up going with a paid Libsyn account. They’re the oldest and most reliable game in town, and have worked out the difficult stuff involved in getting your podcast out there. Specifically, they understand what each provider (Spotify, iTunes, Google Play, Soundcloud, etc) requires, and makes it really simple to provide the correct information.

There’s a huge amount of podcasting services out there. If you don’t like Libsyn, you can try PodBean, BuzzSprout, Blubrry, SoundCloud, Podomatic, Spreaker, BlogTalkRadio, Castos, Firesize, ZenCast, Simplecast, Audioboom, Whooshkaa, Podigee, Pinecast, Pippa, OmnyStudio, Podiant, and more.

So out of the box, Libsyn provides a hosted webpage where all the episodes are listed, and you can subscribe here with an RSS reader to be notified of new releases. But we can do better.

Once you have a working RSS feed, you can submit it to:

Each provider has their own requirements and rules, but the same deal generally applies: You provide the RSS feed, they read it, ensure it has all the information they need, and will then pull new episodes into their platforms as they arrive.

This is way better for your users. You can tell them to use their existing music app of choice, simply searching for you there. In South Africa that means iTunes and Spotify, with Google Play yet to make podcasts available here.


And finally: Getting word of your podcast out there!

Honestly, my favorite thing about podcasting is the potential for creating a community. We’re already seeing it with Noscript Show – the people that enjoy our content end up subscribing for more of it, sharing it with their friends, and join us in our community Discord.

So all the usual tactics apply here. Produce good work on a regular schedule, share it out on social media, set up a memorable brand, make your stuff easy to find, and most importantly: Interact with your listeners.

That’s what ends up building the initial community, and it gives you a better idea of what your listeners want from you – especially important if your podcast focuses on a particular industry, skill, or insight.

Bonus: Monetization

This question inevitably comes up once you start researching podcasts – mostly because you’ll find stories about how people are making millions of dollars off theirs.

Podcast monetization is pretty much identical to radio monetization. If you’ve listened to any public radio station, you’ll have noticed two variants:

  • Ad segments
  • Endorsements read out by the producers

In those respects, podcasts are the same. There are platforms that will let you insert ad slots into your podcast, then sell that inventory on your behalf (like a website). Or you could do direct deals with sponsors, and agree to read out a sponsored message (or play a clip) directly in your content itself.

But there’s a third option, which is where podcasts have radio beat: You can paywall your podcast, and charge people to listen.

The options available on Libsyn

Right now I have no interest in monetizing the one podcast I am doing, so I can’t offer much more advice than that. What I can say is that paywalled podcasting will require specialized hosting – there’s no point in paywalling it if anyone can just look it up on Spotify.

So there, it’s more likely that you’ll ship out your podcast as a custom mobile app, or via a mailing list with listen links that are connected to individual subscribers.

Lastly, there’s always the donation route. If you produce a good, free public podcast and you get lots of listeners – but aren’t concerned about generating an income – opening up a channel for donations can be mutually beneficial: You get some money, and your fans will feel good about helping to keep you on the air.

A great option for that is Patreon (especially since you can set up a reward structure), or you can just take donations locally with something like PayFast.

Are you going to podcast in 2019? Let me know – I’ll be your first subscriber 🙂

Late-stage internet

This post is more than a year old. The information, claims or views in this post may be out of date.

Here’s a cheerful thought for you as we head into 2019:

How much of the internet is fake? Studies generally suggest that, year after year, less than 60 percent of web traffic is human; some years, according to some researchers, a healthy majority of it is bot.

Max Read, Intelligencer

That’s from this beautiful rundown on Intelligencer – essentially a laundry list of all the ways in which the Internet has disrupted human connection.

It doesn’t even mention the pre-social media scourge of email spam, which at one point accounted for over 90% of emails sent worldwide. Every platform has its spammers, all eventually learning roughly the same thing: That gaming the system is profitable. But like any single-minded attempt at extracting wealth, it leaves the entire ecosystem in disarray.

Simply put, the web is no longer human. It’s been co-opted by machines, optimized for our most basic impulses, reinforced by the massive accumulation of the resulting wealth. The tech boom has left a wake — empathy, humanity and truth, receding into history.

I wrote that a year ago (here, on Medium) almost hoping that 2018 would signal some sort of reversal of the trend. It was published in the middle of peak blockchain hype, during which I had a great deal of optimism for the way public chains might address the scourge of fake news.

(It hasn’t happened, and now seems less likely than ever)

I first got online in primary school, and the internet has been a massive fixture in my life. It’s where I learned the skills that landed me my first job, it’s where I’ve built a career and relationships that now span decades. I’ve always thought of the internet as a net benefit – that connecting lots of people from all over the world was a fundamentally good thing.

On the longer scale of history though, it was really doomed from the start.

Within the first few weeks of starting my first job, somebody pointed out something that I have since come to accept as a fact: That without porn and advertising, the internet would be a handful of boring websites and productivity tools.

Porn has a unique effect on technology: in that it drives the development and adoption of new things faster than any other drive, which I guess makes sense given that we’re human. If you want to know more about who we are as people (and I kid you not) PornHub’s Insights blog is recommended reading.

It’s the advertising that did us in, though.

For as long as there’s been audiences, there’s been ad sales. For as long as those ads were “external” to us (they existed in a context that let us clearly differentiate reality and advertising), they were mostly harmless.

The TV ads of the 1950’s embodied this, with the content and tone mostly being conversational – not unlike how a salesman would pitch you in person.

Archive.org has a fantastic collection of these. It might amuse you to know that even back in 1954, TVs were sold on size. This RCA Master 21″ TV commercial illustrates it beautifully:

From archive.org

Advertising has changed over the last 50 years, though. Modern ads present a supernatural version of reality: The models are photoshopped, the food is fake, products are sold on emotion and status rather than practical considerations. Here’s an ad from 2017 – see if you can spot the differences.

Which again, is largely fine if you understand that you’re being advertised to – between segments of a TV show, breaks in the news, before a movie, before a YouTube video. Being able to put the information in the proper context is what’s important here – and it’s that exact thing that’s been under attack most recently.

Influencer marketing is my second-least-favorite form of insidious advertising. It’s simple: Gain a loyal following and then subtly promote products without actually promoting them. Just make them part of your “lifestyle” on whatever social platform you’re on, and make sure the purchase links are readily accessible.

It works, too – far more than any other form of marketing.

Influencer marketing definitely has it’s social downsides (among them, collapsing the distinction between identity and brand preferences), but I can’t be too upset at this. This sort of marketing reaches the same demographics as tabloids and daytime TV talk shows – people who are easily influenced and apparently see no downside to that.

My least-least-favorite form of insidious advertising has to be Native Advertising – news and editorial functions incorporating paid content under the guise of being news.

That was in 2014, and the practice hasn’t slowed down at all. It’s at the point now where people cannot distinguish between news, and content designed to provoke a response and rake in ad dollars.

In the final three months of the US presidential campaign, the top-performing fake election news stories on Facebook generated more engagement than the top stories from major news outlets such as the New York TimesWashington PostHuffington Post, NBC News, and others

Craig Silverman, BuzzFeed News (link)

That was in 2016, the year we reached some truly ironic situations: Like a for-profit content site publishing sober analyses on news media consumption patterns. At the same time, public interest in the concept of fake news reached sky-high levels, as it helped put the former host of the Apprentice in the White House (the moment reality finally broke).

You want to know the best part though?

People are basically losing interest in the concept altogether. Fake news is now just another part of daily life – another thing to watch out for, like 419 scammers and encryption ransomware.

This is 2018 now. The internet is awash with fake news, churned out by dodgy operations that capitalize on the weaknesses in anti-fraud algorithms on display markets (like Google AdSense). Any place where content can earn money, people are gaming the algorithms (to terrifying extremes). Social networks, desperate for engagement, are slow to act on containing any of this.

All of it ultimately driven by advertising. Businesses want to reach people, people are spending time online, and so the ad dollars flow.

It might have been better if the internet was just email and porn. At least we wouldn’t be questioning whether or not we share the same reality – an actual problem that surfaced during the Kavanaugh debacle.

There is a state of the world where Kavanaugh assaulted Ford in 1982, and there is a state of the world where he did not. Pick one. Now. And once you’ve picked, you no longer co-exist in the same political reality as someone who picked differently. You are truly – and I mean this in a very literal sense – in different worlds.

Ben Hunt on Epsilon Theory (link)

This is why I think we’ve reached late-stage internet. For the longest time, the internet was an escape – a world that existed beyond the physical world, where the same rules didn’t apply, and people were free to explore and experiment.

Then it crept into the mainstream, with the confluence of incentives from hardware manufacturers, ISPs, news organizations, tech startups and advertisers drove the internet into everyone’s home, then everyone’s pocket.

Personally, I have it down to Obama’s election as the moment the internet went mainstream (he used Twitter to great effect). As soon as anything can be used to wage political war and influence the outcome of a public event, its impact makes it mainstream by definition. Tobias Stone calls it “The Great Cyber War“, and it’s hard to disagree.

And so now we’re here: The internet, a daily reality for most people in the connected world, is a primary mode of engagement. The badly-designed incentives and tradeoffs that put ads everywhere, and encourage malicious actors to skirt the rules for cash, consistently weakens our ability to trust what we read. And then there’s the politics, in which it’s essential that one side hates and fears the other, with well-resourced propaganda machines moving their operations into the most effective theater of operations the world has ever seen.

With any luck, we’ll end up in a future where Twitter bots troll the algorithmic influencers and leave the rest of us alone to get on with the business of being human.

I’m in favor of Article 13

This post is more than a year old. The information, claims or views in this post may be out of date.

There’s a very neat trick when it comes to obscuring discourse: conflating unrelated-yet-confusingly-similar issues to make them seem bigger than they really are, and to steal support from otherwise-legitimate causes.

This is an ongoing example (link):

Hillary Clinton is facing backlash for arguing that European leaders should try to assuage the concerns of a growing right-wing populism across the continent by refusing to offer “refuge and support” to migrants.

… politicians expressed shock and concern with Clinton’s comments, which some said appeared to contradict her 2016 campaign position on welcoming immigrants and refugees.

Eliza Relman, Business Insider US

Immigrants and refugees.

There’s a world of difference between the two. Personally, I’m in favor of more open borders and a greater flow of immigrants: people who explicitly and voluntarily decide how and where they want to live, and are prepared to put in the work to contribute positively and assimilate into the culture are all right in my book.

Refugees are very different. They’re not moving by choice, but by necessity. Being coerced out of the land they chose to live in means they’ll hang on to their culture and traditions (as they should, by their own volition).

When this issue is reported though, immigrants and refugees are routinely conflated, to the point where they’re treated as synonyms for eachother – when they clearly are not. So now, even though I completely support as much voluntary, legal immigration as countries can bear, I’m also expected to support the unmitigated flow of refugees to systems that cannot integrate them at all.

I feel the exact same thing happening with this Article 13 issue.

At its core, the EU leans in favor of human rights. The regulations handed down are more often for the protection of citizens than not – GDPR being a stellar recent example.

Article 13 protects rightsholders by preventing unauthorized use of their work. The initial draft of the bill proposed some truly terrible mitigations (requiring automated content filtering on all uploads to catch violations), but the final bill has watered that down quite a lot.

When Article 13 is reported on though, it’s usually with a message like this:

the EU’s new copyright directive have stoked fears that memes will effectively be banned

platforms will have to pay a fee to share a link to a news article and have to start filtering and removing memes.

they will arbitrarily remove content based on their terms and conditions. As a result, many creators will see their content get blocked

Only platforms with deep pockets will be able to comply with the Article 13 requirements

It’s all horseshit, reasoned from a faulty premise that legitimizes theft under the banner of “user-generated content”. The internet that anti-Article 13 activists are fighting to protect was largely built on wide-scale infringement, with the inability to enforce existing laws taken as tacit permission to break them all.

But every wild west is eventually tamed, and the internet is long overdue for this. The truth (especially in Facebook and YouTube’s case) is that copyright-infringed content has been the biggest driver of their success. While they’ll fight Article 13 and sell it as the platforms “standing up for the creators” (and we’ll come back to “creators”), in reality they desperately need the freely-generated content to keep flowing – that’s all that keeps eyeballs on the site, and ad dollars flowing.

As platforms, between DMCA, Fair Use and Safe Harbor, they effectively have a license to print money (or in this case, monetizable attention). They can provide platforms that permit millions of people to violate copyright, then simply take their time to remove infringing content, while never having to compensate the victim.

While they claim to be acting in the best interests of “creators”, they’ve managed to come up with a very narrow, self-serving definition of “creator”: anyone who uploads anything. Truly independent creators are suffering the most under the current regime, illustrated beautifully by Kurzgesagt:

It’s that “immigrants and refugees” trickery all over again: conflating the independent artists who put their backs into creating original content, with the vampires who cut and re-share it without attribution (or fair compensation) to build their own profiles. To the platforms, these are both considered “creators”, which is why this statement from YouTube’s CEO should come as no surprise:

Article 13 as written threatens to shut down the ability of millions of people — from creators like you to everyday users — to upload content to platforms like YouTube. And it threatens to block users in the EU from viewing content that is already live on the channels of creators everywhere. This includes YouTube’s incredible video library of educational content, such as language classes, physics tutorials and other how-to’s.

Susan Wojcicki

(I wonder if Susan’s “educational content” includes these horror shows aimed at young children.)

There’s a whole lot of very subtle trickery in that paragraph. For one, and this is probably the most important point in the whole debacle:

People are rightsholders too.

Most of the criticism about Article 13 sets up this dystopian scenario where a few large companies (Disney, FOX, etc) will end up being the only ones who can publish anything, since Article 13 protects copyright and copyright is evil.

Except, it’s not. In most common-law countries, copyright is actually very simple: You make it, you own it. And if you own it, you should have some say in how it gets used – including permitting people to use your stuff for free, which is what Creative Commons is all about.

Copyright is only evil in a world where you can’t create new things, and the reality here is that a lot of this outrage is coming from people who have built businesses, careers and social standing off the work of others. They’re the ones with the most to lose if laws like Article 13 pass, which is why “copyright” is routinely cast as this benefit that only applies to large companies with expensive lawyers. 

Copyright is a thing we’ve had since 1886, ratified at the Berne Convention and adopted by pretty much every country on Earth. 

You could go (right now) and outline a story about a high school for wizards. Apply some creativity, take on a new angle, mix in your own experiences, draw from a large array of influences and produce something unique – and by default, you’ll have the copyright on it.

That’s creation. That’s what authorship is supposed to look like. Taking a three-second clip from a movie and dubbing a different voice over it is, at best, imitation.

But it’s that imitation that’s now being heralded as “creation”, defended by companies that desperately need large volumes of content to monetize but cannot (or will not) invest in producing it themselves.

Of course, there are more arguments against Article 13, for instance:

Only large companies will be able to afford compliance! Only big platforms like Facebook and YouTube could possibly do this!

Garbage. Setting up your own website comes with a cost of $free, and you have full control over what goes up on there. The only reason these large companies are the “only ones who can afford compliance” is that their business model depends on large-scale, unmonitored, unchecked user-generated content that can be monetized – with bonus points for presenting all of that as a defense of free speech.

This will kill creativity! Nobody will be able to make anything new! Copyrights prevent people from experimenting!

More garbage. The thing about copyright (other than it being a basic human right, globally enforced and freely available) is that the rightsholder can do whatever they want with the rights, including making it available for adaptation.

It’s as if everyone’s taken crazy pills and forgotten that CC-BY-SA exists.

Even in a world where that experimentation/remixing/adaptation is universally good for business, rightsholders (everyone from Disney to neighbour Dorothy) should have some say over how their work is used. If they decide to prevent remixes, that’s their business. Everyone that takes a more relaxed approach will benefit, and the free market will sort itself out.

Ultimately, that’s why I’m in favor of legislation that tries to protect rightsholders from unauthorized use of their work, while still giving them the option of making their work available for adaptation and re-use: Because people are rightsholders too.

Definitely not missing the bird

This post is more than a year old. The information, claims or views in this post may be out of date.

Next week Tuesday (27 November) will mark the 1-month point since I decided to completely ditch Twitter from my daily routine. On Tuesday itself I’m likely to be very busy, but I wanted to take a moment to write some feedback on this experiment.

I can confidently say I don’t miss it one bit. The trade-off just wasn’t worth it: For every connection that was worthwhile, there were at least 20x more knee-jerk reactions and vapid hot takes, and 100x the volume of neurotic, click-bait psychic garbage swirling around a monetized trash compactor explicitly designed to make people feel angry. It felt like mental chemotherapy except it was also giving me cancer.

Twitter had basically become an abusive relationship. For the slim chance that something nice might happen, I was hanging on through torrents of garbage that made me jealous, depressed, despondent (specially the South African political feeds!), and ultimately self-destructive.

Granted, there are much better ways to use Twitter, and there are definite upsides to staying informed. Keeping abreast of major news stories is the easiest form of social currency there is, and it’s a great way to stay updated on interesting projects and useful tools. I was using it badly – as an actual social network.

Even the rage engagement is not real rage. It’s a faux rage. No one writes a snarky reply to @realdonaldtrump because they’re really engaging with The Donald. No, they’re posting to their mirror engagement crew, who they know is also in a rage engagement with @realdonaldtrump. It’s not even virtue signaling. It’s pure entertainment. It’s a simulation where they can “engage” with the President of the United States in the company of their supportive mirror engagement crew. Plus dopamine!

Ben Hunt, A Game Of You

Many months ago an old friend of mine asked me about my daily Twitter habit. He also has a Twitter account, but does maybe one post a month related to projects he works on. I explained that Twitter was becoming the national conversation platform – it was the place that journalists, newsmakers, political parties and influencers converged, and being part of that was probably a smarter move.

It turns out I was wrong, for the reasons so neatly encapsulated in A Game Of You. While there was real engagement (and real connections formed), so much more of the engagement on social media is effectively a simulation: Yes, you’re technically “engaging” with the accounts of notable people and organizations, but in reality your voice isn’t actually heard – and every post is just increasing the risk of damage.

It’s also increasingly performative. The US dealt with this years ago, and South Africa is just catching up to it now. Smart, unethical people have realized that the more outrageous shit you post, the further it circulates, the more it boosts your profile, and the greater opportunities it opens up for you. Yes, it comes at the cost of poisoning the well for everyone, but that’s a small price to pay for quasi-celebrity status.

Then there’s the short-term thinking effect, which has probably been the biggest learning for me over the last month. Twitter (or any fast-paced information environment) doesn’t so much inform you as constantly trick you into thinking you’re learning – but really its just reinforcing the stuff you already believe.

Since quitting I haven’t technically had more time to think, but I’ve been able to think through ideas that take a lot longer. Among them, I’ve been developing a sort of mini-philosophy for how I see the world (more a statement of principles and arguments at this point), and it was only after reasoning through lots of examples I came up with better explanations for things. Hot-take shitposting in humanity’s garbage compactor would have been of little help there.

(Core to that is measuring rules and behavior on a voluntary-coercive axis and balancing it for the maximum liberty of the individual, but that’s better suited for another post.)


Then there’s The Noscript Show! Every week, I co-host an hour-long livestream on which we just decompress and unpack the stuff going on in the world. On every successive episode we’ve improved on our production quality, while sticking to the principle that we script absolutely nothing on the show – and it’s a lot of fun to do.

Getting started with Mastodon!

This post is more than a year old. The information, claims or views in this post may be out of date.

Mastodon Setup

Howdy, stranger! This document is the other half of this video, in which I set up a single-server instance of Mastodon. This was assembled on 9 April 2017, and there’s a good chance that some of the specifics here will change over time. I’ll keep an updated version up on wogan.blog.

(What is Mastodon? I’ll do another post on that sometime!)

If you’d like, you can download a plain HTML, styled HTML or PDF version of this post instead – it might make copying some of the code easier.

UPDATE 17 April 2017: Mastodon has reached v1.2, and now requires Ruby 2.4.1. The post has been updated with new commands required as of today, and an upgrade guide is below.

0. Pre-Prerequisites

At a bare minimum, you’re going to need:

  • A domain name, with the ability to add an A record yourself
  • A free mailgun.com account, with the account verified and your sandbox enabled to send to you
  • A 1GB RAM machine with decent network access. This document uses a DigitalOcean VM.

This setup procedure skips a few things that you may want to do on a “productionized” or “community” instance of Mastodon, such as configuring S3 file storage, or using a non-sandbox email send account. You may also want a beefier machine than just 1GB RAM.

For reference, the OS version in use is Ubuntu 16.04.2 LTS and all the commands are being run from the root user unless explicitly specified.

1. Getting started!

The first couple steps:

  • Create the VM
  • Point your domain to it immediately, by setting the A record to the public IP
  • Log into the VM
  • Set your root password
  • Create a new Mastodon user: adduser mastodon
  • Update the apt cache: apt-get update

2. Install Prerequisites

Now we’ll grab all the prerequisite software packages in one go:

# apt-get install imagemagick ffmpeg libpq-dev libxml2-dev libxslt1-dev nodejs file git curl redis-server redis-tools postgresql postgresql-contrib autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev git-core letsencrypt nginx

That’ll take a little while to run. When it’s done, you’ll need Node (version 4) and yarn:

# curl -sL https://deb.nodesource.com/setup_4.x | bash -
# apt-get install nodejs
# npm install -g yarn

You’ll also want to be sure that redis is running, so do:

# service redis-server start

3. Configure Database

With Postgres installed, you need to create a new user. Drop into the postgres user and create a mastodon account:

# su - postgres
$ psql
> \q
$ exit

Later on we’ll configure mastodon to use that.

4. Generate SSL certificate

Before configuring nginx, we can generate the files we’ll need to support SSL. First, kill nginx:

# service nginx stop

Now proceed through the LetsEncrypt process:

  • Run letsencrypt certonly
  • Enter your email address
  • Read and acknowledge the terms
  • Enter the domain name you chose

If the domain name has propagated (which is why it’s important to do this early), LetsEncrypt will find your server and issue the certificate in one go. If this step fails, you may need to wait a while longer for your domain to propagate so that LetsEncrypt can see it.

5. Configure nginx

With the SSL cert done, time to configure nginx!

# cd /etc/nginx/sites-available
# nano mastodon

Simply substitute your domain name where it says example.com in this snippet (lines 9, 15, 23, 24), then paste the entire thing into the file and save it.

map $http_upgrade $connection_upgrade {
  default upgrade;
  ''      close;

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  return 301 https://$host$request_uri;

server {
  listen 443 ssl;
  server_name example.com;

  ssl_protocols TLSv1.2;
  ssl_ecdh_curve prime256v1;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

  keepalive_timeout    70;
  sendfile             on;
  client_max_body_size 0;
  gzip off;

  root /home/mastodon/live/public;

  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";

  location / {
    try_files $uri @proxy;

  location @proxy {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;

    proxy_pass_header Server;

    proxy_pass http://localhost:3000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;

  location /api/v1/streaming {
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;

    proxy_pass http://localhost:4000;
    proxy_buffering off;
    proxy_redirect off;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    tcp_nodelay on;

  error_page 500 501 502 503 504 /500.html;

Once you’ve saved and closed the file, enable it by creating a symlink:

# ln -s /etc/nginx/sites-available/mastodon /etc/nginx/sites-enabled/mastodon

Then test that the file is OK by running nginx -t. If it reports any errors, you’ll want to fix them before moving on. If the file comes back OK, fire it up!

# service nginx start

Open a browser tab and navigate to your domain. You should get a 502 Gateway Error, secured with your LetsEncrypt cert. If not, go back and make sure you’ve followed every preceding step correctly.

6. Configure Systemd

Mastodon consists of 3 services (web, sidekiq and streaming), and we need to create config files for each. You can use the code straight from this page, as-is.

# cd /etc/systemd/system/

The first file is called mastodon-web.service and consists of the following:


ExecStart=/home/mastodon/.rbenv/shims/bundle exec puma -C config/puma.rb


The next file is called mastodon-sidekiq.service and consists of the following:


ExecStart=/home/mastodon/.rbenv/shims/bundle exec sidekiq -c 5 -q default -q mailers -q pull -q push


The final file is called mastodon-streaming.service and consists of the following:


ExecStart=/usr/bin/npm run start


Once all those are saved, we’ve done all we can with the root user for now.

7. Switch to the Mastodon user

If you haven’t yet logged into the server as mastodon, do so now in a second SSH window. We’re going to set up ruby and pull down the actual Mastodon code here.

8. Install rbenv, rbenv-build and Ruby

As the mastodon user, clone the rbenv repo into your home folder:

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

When that’s done, link the bin folder to your PATH:

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

Then add the init script to your profile:

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

That line is valid for the OS we’re on (Ubuntu 16.04 LTS) but it may differ slightly for you. You can run ~/.rbenv/bin/rbenv init to check what line you need to use.

Once you’ve saved that, log out of the mastodon user, then log back in to complete the rest of this section.

Install the ruby-build plugin like so:

$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build

Then install Ruby v2.4.1 proper:

$ rbenv install 2.4.1

This could take up to 15 minutes to run!

When it’s done, change to your home folder and clone the Mastodon source:

$ cd ~
$ git clone https://github.com/tootsuite/mastodon.git live
$ cd live

Next up, dependencies! Always more dependencies – we’ll install bundler, then use that to install everything else:

$ gem install bundler
$ bundle install --deployment --without development test
$ yarn install

If all of those succeeded, we’re ready to configure!

9. Configure Mastodon

Before diving into the configuration file, generate 3 secret strings by running this command 3 times:

$ bundle exec rake secret

Copy those out to a text file – you’ll paste them back in later. Create the config file by copying the template, then editing it with nano:

$ cp .env.production.sample .env.production
$ nano .env.production

Inside this file we’re going to make several quick changes.


To enable federation, you need to set your domain name here:


Then, for these 3, paste in each key you generated earlier:


Finally, configure your SMTP details:

SMTP_LOGIN= (whatever your mailgun is)
SMTP_PASSWORD= (whatever your mailgun is)

Save and close the file.

10. Run installer

If you’ve done everything correctly, this command will install the database:

$ RAILS_ENV=production bundle exec rails db:setup

If that passes successfully (it’ll echo out every command it runs), you can then precompile the site assets, which may take a few minutes:

$ RAILS_ENV=production bundle exec rails assets:precompile

At this point, we’re almost ready to go!

11. Configure cronjob

This is technically optional, but highly recommended to keep your instance in good order. As the mastodon user, start by determining where your bundle command lives:

$ which bundle

That path will be substituted for $bundle. Now, edit your own crontab:

$ crontab -e

Select nano (2) if you’re prompted. As of version 1.2 (17 April 2017) you only need one daily task in your crontab:

5 0 * * * RAILS_ENV=production $bundle exec rake mastodon:daily

Save and close the crontab.

12. Log out and return to root

We’re done with the mastodon account. Log out and return to your root shell.

13. Start Mastodon

The moment of truth! Enable the Mastodon services (so that they start on boot):

# systemctl enable /etc/systemd/system/mastodon-*.service

Then fire up Mastodon itself:

# systemctl start mastodon-web.service mastodon-sidekiq.service mastodon-streaming.service

Open up a browser tab on your domain. Mastodon can take up to 30 seconds to warm up, so if you see an error page, don’t fret. Only fret if it’s there for longer than a minute – that requires troubleshooting, which is outside the scope of this document.

You should eventually get a signup page. Congratulations! Register an account for yourself, receive the confirmation email, and activate it. This should enable you (the first user) as an administrator.

14. Securing Mastodon

This is by no means a comprehensive guide to server security, but there are two quick things you can change while the root shell is open. Start by editing the passwd file:

# nano /etc/passwd

Find the mastodon entry (it’ll be near the bottom) and replace /bin/bash with /usr/sbin/nologin. Save and quit. This will prevent anyone from logging in as the mastodon user.

Next, configure ufw. First check if it’s disabled:

# ufw status

It should be off, since this is a brand new VM. Configure it to allow SSH (port 22) and HTTPS (port 443), then turn it on:

# ufw allow 22
# ufw allow 443
# ufw enable
? y

That will prevent any connection attempts on other ports.

15. Enjoy!

If you enjoyed this guide, I’d appreciate a follow! You can find me by searching wogan@wogan.im in your Mastodon web UI. Give me a shout if you were able to get an instance set up with these instructions, or if you ran into any problems.

16. Upgrade to v1.2 (17 April 2017)

If you’ve installed Mastodon according to these instructions, you’ll need to do a few things to upgrade to the latest version.

Start by logging into your instance as the root user, then re-enabling your mastodon user shell (in step 14, change the mastodon user’s shell back to /bin/bash). We’ll use it in a bit to perform the upgrades themselves.

When that’s done, stop the Mastodon services like so:

# systemctl stop mastodon-*

That will shut down all the Mastodon services. In a new window, log into your mastodon user and install Ruby 2.4.1, the new preferred version:

$ cd live
$ rbenv install 2.4.1
$ gem install bundler --no-ri --no-rdoc

This will install the latest Ruby, and the version-appropriate bundler. Now pull down the latest source code:

$ git pull

There are a couple of one-time commands to run – in order, they are to install new dependencies, run database migrations, do a one-time avatar migration, and recompile the frontend.

$ bundle install
$ yarn install
$ RAILS_ENV=production bundle exec rails db:migrate
$ RAILS_ENV=production rake mastodon:maintenance:add_static_avatars
$ RAILS_ENV=production bundle exec rails assets:precompile

When this is all done, make sure your crontab has been updated to use the new mastodon:daily command. Refer to step 11 above for details.

Finally, the teardown – log out of the mastodon user, and switch back to your root connection. Set the mastodon user’s shell back to /usr/sbin/nologin (step 14) and restart the Mastodon services:

# systemctl start mastodon-web.service
# systemctl start mastodon-sidekiq.service
# systemctl start mastodon-streaming.service

Give it a few seconds to warm up, and check that they’re running with:

# systemctl status mastodon-web.service

If you get a green dot with “running”, you’re good to go!


A lot of this guide was sourced from the official Production guide on the Mastodon Github page. I reorded it into a logical sequence after running through it for a few tries.

This post was updated for v1.2 (and v1.1.2) upgrade notes on 17 April 2017.

Fare thee well, Twitter

This post is more than a year old. The information, claims or views in this post may be out of date.

I feel honored, in a very weird way, to have witnessed the birth, growth, stumbling, and inevitable death of a global phenomenon. I might have said that about Gangnam Style, but somehow that bloody video is still attracting views.

I’m referring to Twitter, and I have such fond memories of Twitter. They launched in 2006, but it was only in 2008 that I became aware of it. My first memories of Twitter was that it was a faster, lighter, and somewhat less-sophisticated version of Facebook, which I had first joined in 2007.

Within a South African context, I was on Twitter before it was cool. It’s hard to believe in 2016, where basically every talk show and marketing campaign is using hashtags, and questionable social movements are using the platform to rally and organize social change – but there was a time when Twitter in SA was small. Really, really small.

Small enough that in May 2008, a few of us started assembling a manually-curated directory of South African Twitter users. This was back when Twitter didn’t have a search feature (remember how that used to be a whole separate site?), and geolocation wasn’t even remotely an option.

The Internet Archive will forever immortalize this entry on a free PBWorks wiki (used to be Peanut Butter Wiki, by the way), before the spam came along.

2016-09-24 18_47_40-satwitter _ FrontPage.png

Three months later, the list had grown to a mere 150, and I think we got to about 300 before Twitter started gaining some real traction here in SA.

By September 2008, Twitter had introduced us all to the concept of the Fail Whale, and outages were about as common as uptime. I quite liked Twitter, though, and they had a REST API -so between that API, a profile search feature, and a few cron jobs, I built a South African shadow site, called TwitterSA.com.

All it did, really, was continuously search for users that had South Africa (or major cities) as their location in their profiles, automatically follow them, and cache all their tweets in its own database. I recall eventually adding a signup feature, and started scraping the tweets for popular links and hashtags that were being shared.

Yes, it was basically a nascent social media listening platform. If I knew how popular those would have become in the years to follow, I definitely would have held on to it a lot more strongly than I did.

It had a brief, but glorious reign. At one point it held the definitive directory of South African Twitter users, and even, some crazy how, got myself and the designer featured in an ITWeb column.

That lasted until about July 2009, when Twitter started sending out Cease & Desists to all domains that included “Twitter” in the name. We received it, discussed it for about two minutes, and decided to shut down the site. Twitter was only a few months away from launching their Geolocation API, which would have made the service redundant anyway.

Since then, I’ve been perpetually on-and-off Twitter, simultaneously inspired and frustrated by it. I never could figure out the best way to make use of it, and towards the end of 2015 I started making the mistake of trying to have rational debates through the platform.

Turns out, 140 characters at a time is not a good medium for debate, and the average participant who attempts it is not really great at communicating complex, cogent arguments – myself included. Retweets make it far too easy to take things out of context and magnify them to a hostile audience, and it’s way, way too easy to get mobbed off the service.

Which is why I quit in February 2016.


I left it connected to my WordPress.com account, on the off chance that some of my audience would appreciate the stuff I write here – but on the whole, I disengaged completely. Frustrating limitations, hostile audience, apathetic moderation – was there any other outcome?

And it turned out, I wasn’t the only one starting to feel this way. Me dropping off Twitter came as the stock coasted to its lowest level since IPO:

2016-09-24 19_02_49-$TWTR - Google Search.png

As it turns out, it’s really hard to monetize such a shitty place. And I choose that word with the utmost care:

  • The highest engagement comes from social media addicts and internet trolls
  • The tools basically streamline the hate mob and harassment process
  • The ad formats infringe directly on the stream experience
  • Twitter’s API policies turned exclusive and hostile, alienating developers
  • Nearly every algorithm adjustment upset users, who wanted reverse-chronological feeds entirely of their own curation
  • Twitter was routinely in the news for all the wrong reasons – usually because of someone famous (or just an inconsequential profile) saying something stupid that blew up

I suppose the smart Twitter investors started cottoning on to the fact that something was wrong back in April 2015, when they started redefining (almost every quarter) the metrics they used for measuring their own success. The less-smart investors would have started getting alarmed in August 2015, when the SEC started asking pointed questions about how Twitter was running their business.

For me, though, the moment of clarity came just last month, in August 2016, with a long-form Buzzfeed article entitled Inside Twitter’s 10-year failure to stop harassment. It’s a fascinating read, and in a few months, will serve as the pre-post-mortem of why Twitter collapsed the way it did.

So as of today, Twitter is on the chopping block. And the one piece of data that is really telling? Twitter’s stock price, the moment news broke of a potential sale:

2016-09-24 19_10_56-#TWTR - Google Search.png

That’s the last heartbeat of a company destined for flat-lining: When their stock gains instant value only because there might be a quick return. It’s a bit of a “vultures are circling” situation, with some of the braver ones picking at the still-lumbering victim.

At this point investor sentiment is basically clear – Twitter has to go. I can’t imagine there’ll be a last-second magic trick that restores Twitter’s credibility and independence. If that were possible, it would have emerged at some point in the last five years.

So what’s next? One thing to bear in mind is that no social network, post-acquisition, has actually survived in a form that in any way resembled the original. Social networks are tricky things, and new owners typically want a good financial return on their investment.

Whoever buys Twitter is getting a mixed bag of:

  • Some very good distributed message processing tech – global scale, realtime delivery
  • An executive team void of any real direction
  • A disillusioned workforce, whose attempts to improve the platform have met with repeated failure
  • A social hot potato, in that Twitter is more or less the new 4chan, and were forced to create a Safety Council in reaction to “extreme” speech
  • A political hot potato, in that anyone with clout will want the service sanitized to remove harsh messaging about them.
  • A financial hot potato, with declining ad revenues across the board
  • A brand that created two new entries in the Oxford Dictionary: Twitter and Tweet
  • A grab-bag of acquisitions: Vine, Periscope, some adtech and design startups
  • And a domain name that, if you think about it, is kinda dumb – birds can’t use smartphones

About the only thing that makes sense, acquisition-wise, would be to turn Twitter into a one-way content provider: letting brands and verified celebrities use it as a platform to push out messaging, while severely limiting user interaction – like how Hollywood works right now, basically.

A dumb content pipe with no controversies and news blowups is preferable, commercially speaking, to a public square for free speech and open debate. It’s a lot easier to monetize a captive and engaged audience, and if there’s one thing that news outlets in particular have realized in the last year, you don’t need a public feedback facility to enable that.

I might even start using Twitter again, should it turn into something that has a net positive effect on my mood. A safe content delivery pipeline, pushed to the top of your phone, with granular interest tracking, personalized content and real-time feedback? Marketer’s wet dream.

But for now, enjoy the long shadows cast by the setting sun that is Twitter.

Swinging a double-edged sword

This post is more than a year old. The information, claims or views in this post may be out of date.

It’s been an interesting few weeks in terms of freedom of speech, and what that means on the internet. On 31 August, YouTube made a small but significant change to its advertising policy – it set new guidelines for monetizeable content, and included rules specifically against offensive content.

In a lot of contexts, that’s pretty justifiable: It shouldn’t ever be the case that a system is put in place that rewards hateful and destructive speech. Under the previous system, ad revenue was pretty much a direct correlation to viewership, and controversy is a constant driver of viewership.

For example, it would be possible to create a YouTube channel that featured nothing but trolling and baiting other people, and not only would you get a response to that, you’d actually be rewarded for your efforts with ad revenue. That cannot possibly be a reasonable thing to reward – it directly fans the flames that make YouTube an unpleasant place to be.


Trouble is, “offensive” is an extremely subjective and rapidly-moving target – nowhere more so in the US, with college campus politics and ludicrous entitlement driving a new generation of offenderati. A recent, glowing example of this was a Lyft passenger who berated the driver for being racist, simply because the driver had a Hawaiian bobblehead accessory in his car:


That’s one element to consider. The second is how quickly instances like that are used to fuel internet mobs – groups of people with internet access and nothing better to do. They’ll gang up, post harassing messages on social media, try unearthing private information about their target, and generally try making their lives miserable.

If that Lyft driver in the article above was on social media, he would have been targeted with death threats, his information would have been made public, he’d probably be barraged with phone calls and texts for being “racist” – none of his fault, and all of it perpetrated by what I can only imagine is a mentally unstable woman.

That behavior – distasteful as it is – is a fantastic driver of “engagement” on these platforms. It drives eyeballs to videos, it drives comments (albeit bad), and it drives uploads – mainly rebuttals and rants. And YouTube is, in my opinion, justified in trying to protect themselves from that. Not only because advertisers will be insisting on it, but also just because it’s the decent, human thing to do.



But because everyone’s so easily offended, and because people can be rallied up into attack mobs, there’s a very real downside: The systems by which YouTube enforces this policy are largely automated, and there’s basically no preemptive defense. If you say the wrong thing on YouTube, or you upset a group of people (maybe no more than 50 people, even), they can rally against you and flag all your videos for inappropriate content. And after a certain point, the system simply starts demonetizing your videos.

That’s a bit of a slap in the face to the people that work on producing great content for YouTube. It takes a lot of effort to build a channel and an audience, and the ad revenue from that was what made it viable for a lot of content creators to keep doing that. There’s a large overlap between the people that are passionate about creating YouTube content, and the people that believe strongly in the views they’re sharing.

And since we’re now living in a world where simply existing is offensive to some people, it’ll become harder and harder for those content creators to justify spending so much time and effort producing content for YouTube (which already takes 45% of all ad revenue), when it’s so easy for someone to get a hate mob together and torpedo your earnings.

YouTube is by far the largest platform for community-driven speech in the world, and they’ve swung a bit of a double-edged sword here. They’ll likely end up with a profitable network, but at the cost of burning down a vital square for public debate.

Meaning that the final holdout just bit the dust. Facebook has been tailoring their algorithms for years, designed to put profitable content in front of you. Twitter’s losing the battle for their independence, and will have to start making larger compromises pretty soon if they want to remain relevant. And now YouTube has thrown their independent content producers to the wolves.

Kinda makes you long for MySpace a bit.