Categories
Uncategorized

My failed start-up

Why it failed and why i’m releasing all the source code for free.

This is a long post.

If you are just looking for the code click here

When lockdown started in the U.K I started looking for ways to spend my extended time at home. I wasn’t working because I had quit my job on Feb 16th to travel the world. Timing has never been my strong suit.

So instead of sitting around I decided to start a contracting company, got awarded a few small contracts and I released a few apps written in SwiftUI. But I wanted a bigger project to sink my teeth into.

There were two ideas I kept coming back too;

  1. A hosted org-mode in the browser.
  2. Some sort of local social network.

Given that everyone was forced into their home I thought it would be the perfect time for something like the app YikYak to make a comeback.

Ghosts of apps past.

For those who never got a chance to use YikYak let me try to explain it quickly. The app touted itself as the first hyperlocal social network. A users post could only be viewed it if you were no further than 5km from the initial post location. You could vote posts up or down and comment underneath posts. It was simple but unique.

YikYak eventually implemented some very unpopular changes. Bullying, Racism and Doxxing was always a problem on YikYak. They didn’t do a huge deal to moderate the content on the app, instead leaving the community to self-police. Eventually they had to do something so they enforced email or telephone signups.

Cue mass exodus of users.

Introducing Ottr 🦦

So I began work on Ottr in early February.

Ottr was going to be YikYak for the people in lockdown. In the same way TikTok came from the ashes of Vine – Ottr was to be the refinement of the ideas behind YikYak.

  • Ottr's home page
  • A new post
  • Comments under a post
  • Explore mode
  • Explore Mode

A user could create a new post and comment underneath other posts. They could upvote or downvote posts. They could click the Explore button and whisk off to a new location. You could share posts to Reddit or Twitter. I got all of these features working in a web app created in React, and an iOS app. It got funding from the Amazon Activate program.

Components of ottr - my failed startup
The components of Ottr

But as of today Ottr is dead. I’m going to talk about why I no longer believe in the idea, the key failures that lead to that decision and why I am releasing absolutely everything I made.

On anonymity.

For all its flaws – I absolutely loved YikYak. It came out the first year of my bachelors degree. It was by far the most used app on campus. I would be sitting in the university library and someone would post about the weird smell coming from the desks on the 3rd floor. Or the little nod the doorman would give you on your way in.

People would post about the crazy antics of their friend on a drunken night out. About the cute doggo’s in the parks. Or how awful the food from the students union was. Maybe they would post about their crush.

Those posting on YikYak were having the same experience you were. They were seeing the same things as you, and that made you feel engaged. It was anonymous, which ended up being a double edge sword. It allowed for great humour and creativity, but sometimes the jokes went too far.

Anonymity would be YikYak’s greatest strength and its most fundamental weakness.

And yet…

People got hurt using YikYak. Anonymity breeds toxicity – there are clear precedents for this on the internet – 4chan, 8chan and Reddit.

I knew that there was potential for this to happen again – but I thought I could solve it. My thought process was;

  • I will add a report button and over time I can just add moderators to keep on top of the reports.
  • Posts will be removed when they get downvoted too much.
  • I will redact PPI and add profanity filters.

This arrogance was mistake number 1. When I eventually let a few people use the site they broke the profanity filters with ease. Even among ~100 users people wrote spam and cluttered up the front page. Going on the site in the first week made me wince at how ugly it looked, with people filling the character limit with posts consisting entirely of emoji. It made the site look amateur.

Moderation on the internet is an unsolved problem. Handing the moderation over to automated systems will mean bias can creep in, and it’s hard (impossible?) to tune between zealotry and permissiveness. With an automated system you are going to upset some people.

Humans > Robots?

Humans are better at moderation, but they cost much more money and come with their own problems. I think the shining example of human moderation is Hacker News. Daniel Gackle and Scott Bell tackle the problems inherit of internet forums with a competence not seen elsewhere.

The New Yorker wrote this great article about how difficult that is to achieve – and that’s with Hacker News having a distinct voice. Hacker News is a place for people to post about things that are intellectually interesting to hackers.

Ottr didn’t have a clear voice – it was a place for people to post about things going on in their community. That could mean anything.

Something that is acceptable in one location, might not work for people elsewhere. You could have moderators from each community – but then you are giving that moderator a lot of power to make others unhappy.

I think Reddit is a horrible place for new posters – and part of the blame falls on moderators having too much power. Some moderators on Reddit have so much power they can control the front page, and with that, the tone of the site. I really didn’t want that.

It appears we’re at an impasse.

So if humans and robots couldn’t be trusted, what could? Ottr made the same compromise YikYak did – of letting the community police itself – and it failed (I think) because too few people used Ottr.

A self policing community has great potential to trend towards its worst elements. If someone posted something false about me on the internet, I would have great incentive to downvote it – but why would anyone else – especially when there was the potential for scandal, entertainment and outrage.

I care about how the site looks to first time users, but why would anyone else?

And so those stupid emoji posts stayed on the front page.

Is anybody alive out there?

So poor moderation options left Ottr open to the same kinds of toxicity that YikYak failed to combat. The second key issue was the fact that I don’t know how to get people to use Ottr in the first place.

I’ve never read a book on growth hacking or how to make your product sticky. I kind of understand when its happening to me (“Hand over your contacts to get some shiny coins?”, “How about you share this post on Facebook and Twitter?”, “Our site is restricting registrations at this time – Sign up with your email to be notified when we have an opening?”), but it always rubbed me the wrong way.

I wanted a few people to start using Ottr and then they would be so blown away by how good it was that they would tell their friends and share it themselves.

Build it and they will come?

I focused on UX simplicity and features and the idea of getting people to use it was always running on a low priority background thread. Instead of getting the first iteration up and focusing on what people said about that, I had a clear vision of what it was to be like, what I would add from YikYak, what I would change, and then I would hand it to the people and they would say “Yes Adam – very good, thank you!”.

Treating user growth as a secondary concern is the dumbest thing you can do for a social network. It is all that matters. Mistake #2 was thinking I was above this somehow. I treated growth-hacking and user-growth as something for other people to be concerned with. That is a juvenile approach to business. Because I can code doesn’t mean that I am somehow too pure to engage in the business of marketing or advertising the things I code.

I am working on fixing that this year and i’m trying to understand, rather than scoff, at the ideas behind growing and marketing the things I make. So far it seems much more difficult than learning to code. I didn’t understand or appreciate this until I reflected on the time I spent on Ottr.

Burn, Baby Burn.

By copying the mistakes of YikYak and ignoring the fundamentals behind making a social network work it meant that Ottr never got off the ground. You might argue that I didn’t try for very long – and you are right, I didn’t, around 4 months in total. Mistake #3 is the real reason I wanted to be done with the whole project. I was completely burnt out.

As I mentioned before, I had just quit my job in February to travel. For reasons I won’t go in to, consuming myself with Ottr directly after leaving my last job was a really bad idea.

As I couldn’t travel because of the pandemic and because I had already planned for my mini-retirement I had enough money that meant I didn’t need to jump into another job. The contract work I was getting was not very engaging – so I suddenly had a lot of free time.

So I threw myself into Ottr. I remember looking at ScreenTime stats at the time and it showing emacs being open for 80+ hrs a week. I stopped reading. Stopped watching movies. From waking up to going to sleep i’d just be working on it. Ottr went through a few iterations and I threw huge chunks of work away at points.

Then the wheels came off.

Then one fine day it all stopped being worth it. I was riding along on a wave of getting the next feature done. Talking to a partner at Amazon helping with deployment. Tinkering with CloudFlare because I thought now it’s going into production, I will obviously be inundated. But when it came time where it was actually “ready”, I became immediately repulsed of the idea of trying to grow Ottr.

Doubt crept in. “This is just a copy of YikYak”, and it was, but YikYak doesn’t exist anymore. There is nothing new under the sun.

No matter how hard I tried I couldn’t produce an ounce of enthusiasm for the project any more.

Can some good come from Ottr?

This sudden lack of enthusiasm reminded me of the book ‘The War of Art‘. I think I am so afraid of failure that I can never really finish anything. I love the process of creation. But I hate the idea that someone would judge that creation. Procrastination kicks in, I began to doubt myself and I believe I am a huge fraud.

Then one day I replied to a tweet asking what tech stack people used. I wrote “React, NodeJs & Postgres”. A few hours later someone replied;

A tweet from a new coder. Even though my startup failed, people could learn from it.
A tweet from a new coder.

I realised then that I possess some very valuable information. I know how to create and deploy many disparate parts of a software system.

Now, I may not know how to grow it. And I might have profound issues with self-confidence. But I do actually have something valuable I can give the world with Ottr.

It’s a ready made tech stack. The code could be used to teach people all the moving parts of a modern application. They could use this as a learning experience for at least one way to get started creating their own.

Even in failure, there is success.

So today I have made the Ottr repositories public. You can download each part of the system from the database, the backend, the web client and the app and you can get them all up and running on your computer. I want Ottr to be a place where people can go to answer;

  • How do I get text from a react component onto someone else’s screen?
  • How do I connect to a database?
  • Can I get one of those little green locks on my webpage?
  • Is it possible to have real time updates when someone posts a new comment?
  • Where can I put secrets?
  • How should I go about structuring my code?

Now it will take time before all of this is in its simplest form inside these repositories. Ottr lacks tests and there are some hacks and crappy code here and there – but that doesn’t make it valueless.

A happy ending?

Today the code is open for people to tinker with, but continued value will come from a series of blog posts I am writing explaining high level concepts of software such as those detailed above, using Ottr as a base for examples.

There are so many questions a beginner has about modern software – and Ottr, even in its current form, can answer a lot of them. I want it to be a flat pack startup.

Now that the source is open – you can help make it better. Pull requests very much welcome!

RIP Ottr

Here lies the final(?) resting place of Ottr: 2020 – 2020.

Please let me know if anything breaks – or if you would like any part explained in more detail.

Categories
Uncategorized

Dotfiles without Symlinks

In my day-to-day as a developer I make use of a lot of different tools. Emacs for writing code. mbsync/isync for pulling down new emails. Vim for quickly editing files on remote hosts. Tmux for ssh’ing into servers. I like to configure this software to make it feel exactly right to me.

For example, my emacs configuration file is about 300 lines long and contains things like custom themes and fonts, making the UI as simple as possible and a bunch of little lisp snippets to help me automate repetitive tasks.

Over the course of their career a software engineer will need to setup new computers. If they don’t have a way of porting over their old configuration files to the new computer they will be wasting time every time they need to do this. So they think: “I know! I will just store my configuration files somewhere and sync it between each computer!”

Not a bad idea at all. There are a few ways to do this. Most end up using Dropbox or GitHub. My initial attempt at solving this was to create a folder containing all my files and then create symlinks in my home directory.

However, I quickly found that this was a pain in the ass. If you do a Google search for “why are symlinks bad” you will likely end up this cat-v article which sums up the issues with symlinks.

The problem with symlinks.

My main problem with them is that they break some foundational assumptions about the file system. If you open a symlink should you be transported to the directory containing the linked file?

What about double dot in the terminal – in the context of an open symlink does the double dot mean up a directory from the containing folder, or up a directory from the folder containing the symlinked file?

TL;DR: Symlinks are a kludge and in some cases they break simple file hierarchy semantics.

So how do we fix it?

Grin and bare it.

Git has around 1.5 million individual commands. One of those commands is –bare when initialising a new git repository.

By initialising a git bare repo in our home directory we can still track individual files, we can push them to a remote, and we can do it without having to resort to using symlinks.

So how does it work? Here are the few simple commands to get it set up.

cd ~;
git init --bare $HOME/.cfg

alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'

config config status.showUntrackedFiles no

So now we are ready to add files to our repo. Adding that alias to your bash or zsh profile will be helpful for the future.

Adding some some files.

So now we can use start adding all of our configuration files.

config status
config add .emacs
config commit -m "Add .emacs config"
config add .config/nvim/init.vim
config commit -m "Add vim config"

Pushing to a remote.

config add remote origin <REMOTE_GITHUB_URL>
config push

If everything went well you should now see your changes in Github. Well done – we’re all sorted for now on this computer!

Cloning.

And to go full circle lets see how we can then clone the dotfiles to a new computer.

git clone --separate-git-dir=~/.cfg https://github.com/USERNAME/REPONAME ~