A Calm Side Project

There’s no way round it– side projects come with some measure of responsibility. As soon as you have users, fans or even customers, you can’t just leave anymore. People will be counting on your thing to work. Having customers means success but if you’re already drowning in one inbox then adding another busy one is not going to feel like success.

If your day job takes up all your waking hours, if it feels like the house is on fire at all times, if you feel bad when leaving the office –or closing the laptop if you’re a remote worker like me – then a side project isn’t a good idea.

If, on the other hand, you’re in the privileged position that your day job leaves you with time for yourself then there’s plenty of room in the week for side projects.

But because work on side projects is mainly (if not only) driven by your own excitement and curiosity, and because you only have so much time left after your regular job, your side project should allow your effort to go up and down without turning into, as they say, a garbage fire.

We don’t want garbage fires. We don’t want to burn out so we can’t keep doing the good work. We’re in this to build quality projects and quality connections to the people who use our thing. And if we’re constantly putting out fires or doing uninspiring, dreadful work, we won’t have the excess energy to do the good work.

Sometimes you will put in 2-3 hours and get loads of shit done. Other times you’ll feel like rewatching Arrested Development instead[1]. This should be alright, mostly always.

If your idea or app requires consistent, daily work, consider this: Can you repurpose or re-shape it into something that doesn’t require your every waking hour? It might feel exciting right now but in 2 years you’ll wish you never started.

  1. Don’t build business-critical things.
    For example, things that come with multiple nines[2] of guaranteed uptime. As soon as people rely on your service for the critical parts of their service, you’re on the hook. That’s why companies have revolving on-call schedules so one employee can go on a holiday or, well, sleep, because someone else is on the hook. When you’re just you, you are just you. No sleep.

  2. Automate the right things and at the right level.
    Between hand-holding users and fully automating things, there’s a scale of partial automation.
    If your signup process is hard to get right, maybe it’s better to do it manually for now. This is a good idea if you have few but large fish. Terrible if you have thousands of small krill.

Charging users (if you are so lucky) is something that often comes with lots of ifs and if it does, it can probably be done manually at first.
I love the idea behind the project Runbook where every step can start as a manual, human task, before gradually becoming automated.

  1. Use the tools that you know.
    Even though I’m always tempted to use something new and flashy, I mostly just use good ol’ Ruby on Rails. Even though I’m curious to learn Figma instead of Sketch, I make myself use the latter. This ensures that the mere 3 hours I have, go towards something constructive.

This is not meant to be an exhaustive list. It’s merely a suggestion of things to look out for before starting your project or how to calm down projects you may already have on your hands.


  1. Season 1-3 only, of course. ↩︎

  2. Service availability is measured in how many nines you can put as decimals after 99%. 5 nines means the service is guaranteed available and functioning 99.99999% of the time. If you’re down for one hour in an entire year, you’re for example already down to 99,9885844749% uptime. A single nine. ↩︎

The Side Project Garden

Along with our house came a rather extensive garden. It’s not acres of rain forest but it’s definitely more than what we were used to; nothing.

It’s big enough to have several sections. There’s the front yard, there’s the back yard with its beginning by the house, its open, grassy middle and then end, which has been seemingly completely neglected by the former owner for years. It is a mess. With a little love and good set of gloves, that end could become almost a little garden in itself.

When we got the house, the Danish November’s harshness had everything stripped of leaves and berries and anything green that could give us, the crude city people, any indication of what any of it was.

Then spring came and it blew up. It turned out we had raspberries, blackcurrants, redcurrants, apples, hazelnuts, a, lonely but giant, rhubarb. Tiny woodland strawberries came up all around the edges of the bushes. The kids ate everything.

How do you handle all that green? You only have one choice: Little by little. You nurture one part. Leave it for a bit. Look at the mess. Then come back and tend to another part. Little by little.


Frank Chimero recently posted something on his blog that resonated with me (and others.) On the topic of how the author of Game Of Thrones, George R. R. Martin, built his intricate world with its complicated relationships and long-running plotlines:

In interviews, [George R. R.] Martin has compared himself to a gardener—forgoing detailed outlines and overly planned plot points to favor ideas and opportunities that spring up in the writing process. You see what grows as you write, then tend to it, nurture it. Each tendrilly digression may turn into the next big branch of your story.

It resonated because it reminded me of how I treat my side projects. (I recommend reading the whole postblog.)

When I look at all of my projects, it’s a mess. Each project deserves nurturing. They hunger for the attention of their master who’s seemingly found new love elsewhere. Nothing is perfect, heck, some parts just barely hold together. Yet, my attention isn’t easily controlled. Forcing myself to throw every spare hour at trimming the edges of every project would make me mayor of Burnout City faster than I could buy a fancy top hat. And even if I did, it wouldn’t be time enough to get everything into perfect shape.

So I pick a part, a plant, and nurture it a bit. Yesterday that was Joof.app which is getting renamed and restyled and has been so for months. That is, I had decided that it was to happen, but I hadn’t found the time or motivation.

Icon sketch

Jamming with Marc about names back in November, we’d come up with Sprinkles which, although being a slightly loaded term in the developer world, fit perfectly.

A rough sketch of a logo direction had been living as the only thing on my otherwise completely empty macOS desktop. Then, two days ago, the motivation was there and I bashed together a version of it in Sketch.

Sketch icon

I sent it out to a few trusted designer friends on Twitter to get some quick reactions. Everyone agreed it wasn’t quite there yet. The window didn’t look like a browser. The colors were more akin to an editor. Another round and it looked like this.

Round two icon sketch

I’m not sure this is where it ends – but it’s good enough for now.

Good enough is good enough and with side projects that’s what we’ll have to come to terms with. We can look out into the project garden and see how everything is perhaps a bit rough, but a little love here and there and over time we’ll get to eat the berries and and and…, enough with that metaphor.

The first 10 hours

It has always annoyed me when people proclaimed that they always wanted to learn to play the piano or any other skill as if it was ever too late.

I wish I could code. Well, how do you think anyone ever learnt anything? They put in some time. And, if you’re really serious about that wish, this is the only way to do it. But I don’t have the time! you say and you are wrong.

What you don’t have is either the motivation or a clear enough idea of how to start.

This is not to get all #hustle on you but you have time. Exchange one of the TV shows you watch with learning to code a little bit. One season of Game of Thrones is, what, at least 10 hours? I promise you that you can make your own, your very own, home grown website in 10 hours or less. Especially if you call those 10 hours a deadline.

Unsurmountable tasks like “☑️ learn to code” or “☑️ learn to play the piano” are daunting because they’re impossible to ever finish. When is anyone done learning to code? I’m certainly not and I’ve been going for over 15 years. People die having had successful programming careers yet still learning to code.

This is just to say that, you do absolutely have time to learn to code something. Perhaps, start out with the task of creating as much of a personal website as possible in 10 hours. This works if you don’t know anything about coding and it works if you’re a pro.

The deadline makes sure you don’t waste too much time on details or the fact that there are things you don’t know yet. You’re a smart, capable person. You can look things up if you need to.

I promise you, if you do this, you will feel like you can do anything and you’re now at least 10 hours into the life-long task of learning to code.

Using Sorbet in (Neo)Vim via coc.nvim

I for one welcome Stripe’s new typechecker for Ruby. As many of us learnt from Typescript, the added help from the typechecker is a great benefit with little to no cost.

To add Sorbet’s hints and errors to your Neovim, install coc.nvim and add this to your :CocConfig:

"languageserver": {
  "sorbet": {
    "command": "srb",
    "args": ["tc", "--lsp", "--enable-all-experimental-lsp-features"],
    "filetypes": ["ruby"],
    "rootPatterns": ["sorbet/config"],
    "initializationOptions": {},
    "settings": {}
  }
}

Restart vim and load up a type checked Ruby file. What a time to be alive 🍦

Practicing Product

I think side projects, software at least, are a lot like the Civilization games. You can’t wait to start. The first 10% is awesome. 10–40% is complex and the difficulty ramps up. 40–100%, all you can think about is starting over on something else. At around 80%, you just quit and actually do start over. [comment]

I laughed, like you do when alone by the computer: with a smile and a snort, when I read this hitting comparison on Hackernews.

It feels like you are almost done before you even type rails new. And so you jump right in but already after the first few minutes you realize you’ve made the stupid mistake again.

The stupid mistake of thinking that anything would be easy just because you can imagine a few parts of it in your naive head.

Yet, side projects — or lets just call them projects because why does it matter if they’re on the side? — are the best way to learn. Even if you don’t finish them you learned something. You can read all the books or blog posts in the world and still learn more by actually building something.

You get to experience the whole process from designing to developing to redesigning to planning features, eventually (hopefully) deploying and marketing your thing. When you consider the whole of it, it isn’t quite so small anymore.

But what if the things you want to practice are specifically the last parts?

I recently launched many.link.

It all began when I saw someone use linktr.ee on Instagram. I liked the idea but felt the execution lacking. Their administration tool was anywhere from bad to not working. The actual profiles looked bland. I could do something like it1 fast enough, I thought.

First, I needed a short, quirky domain so I typed words like bio into iwantmynameand bio.kiwi was available.

My gut feeling told me some things would be important for this to work:

  1. The domain had to be short enough and signal intent. People expect your Instagram link to do one thing. How do we signal that this one might contain several — only by the name?
  2. The profile pages needed to look presentable and well arranged, easy to understand. And…
  3. Be customisable. People who have multiple things to link to are also people who are concerned about their online presence. Aesthetics are a big part of anything. How do we make it easy to customise yet hard to mess up. Pre-built themes would be relatively easy to provide so we’ll start there.
  4. Frictionless sign up. OAuth (the “Sign in with whatever” buttons) makes it easy to provide authentication features for every service on the planet. But would that make sense? Intentionally I kept it to Instagram. Adding Facebook or Twitter might take a second to add but it would confuse the entire sentiment of the service.

One problem though: this was in the middle of the Cambridge Analytica story and Facebook had seemingly put a cooler on handing out API keys to anyone and their neighbour. So after applying to get my Instagram app approved and waiting, checking for updates for a few daysweeks to no news, I eventually put the project away.

Showing what I had so far to a few not-so-maker-scene-but-very-Instagram-savyfriends made me realise that the domain, although cute 🥝, didn’t tell the story well enough. My friend Emilie suggested allmylinks and .app was available. Bought the domain but did nothing with it.

There it was for a month or two. Online and working on the wrong domain. Far from done, even further from done enough to submit.

Then came Christmas and I discovered Magnify. A few days later they launched on ProductHunt. Nice little product, simple concept, good execution. They were #1 for the day. Wait a second? I have one of those lying around somewhere!

I checked Instagram’s developer section. It had gotten approved!? What’s the minimum amount of work I need to do to put this on ProductHunt? The landing page and … polish?

I copied the general idea of Magnify’s landing page — header, short text, big preview on the right. Made sure everything looked presentable on the inside too.

Then I discovered allmylinks.com doing the exact same thing (there are so many!) and went back to iwantmyname. I typed all kinds of things into the box and pulling the lever like a granny working a slot machine. Suddenly, there was many.link. Works!

A few evenings’ work and I had it ready for launch. I put it on PH at 00:13 San Fransisco time and to my surprise it went to #1 for the day.

There’s so much more to making a thing than programming it. We all know that it’s a lie that if you build it they will come. I wanted to practice all the other parts than building.

many.link was the perfect project to practice ProductHunt. Everyone has an Instagram account and is familiar with the problem. The problem is so small, you can explain it with a single sentence. The running costs are the price of whatever the cheapest VPS you can find costs.

Now, this leaves the project in an awkward place as its main purpose has been fulfilled. Could I do ProductHunt? I could. Can I make it generate some revenue? We’ll find out in the future.

I ended up selling many.link.

Introducing: Spotify Hard Mode

I for one miss the days of spending at least 30 minutes at every party going through the host’s CDs for the ones I knew, the ones I knew I wanted, and most of all; the ones I didn’t know I wanted.

The days when a friend would bring his newly purchased cd to your house so you could listen to it together. But only until he left and you’d have to wait?! until his next visit to hear that one genius track again.

I’m nostalgic, I know, but I’m not going to sit around and sob. I’m bringing it back:

With Spotify Hard Mode you can offer to lend out records in your Spotify collection to your friends — or request to borrow from theirs.

When one of you lend out a record it disappears from your collection and appears in the other’s. If it’s a record that you know you’re going to miss you can add a timed request for your friend to turn your record back.

This will not be automated.

Instead your friend will be pinged to turn back the record by themselves and in the process be asked to write a few words as a review. Not like a public facing, thumbs up or down, dreadful review like the internet is brimming with. But a short text based, personal review from one friend to another.

When a record comes back to your collection it will suddenly be at the top of the list again (because you sort your albums by date added like any reasonable person) and you will once again be reminded of how much you listened to this all summer, two years ago, and just how good it is. The best records will keep being on top of your collection pile.

If you cheat and manually re-add the record while it’s lent out, Spotify Hard Mode will punish you by removing two other random records from your collection plus add a few thousand plays of Smurf songs to wreak havoc on your Discover Weekly and Daily Mixes.

YouTube Binge Bundler

It’s 2am. You planned to go to bed 4 hours ago but even though you could’ve guessed where this would end you visited YouTube.

Eyes sore, head spinning. You are at your twentieth video in a row. Or was it thirtieth? In the middle of a binge, the stream of videos seems so natural. You flow between categories and themes, hand in hand with YouTube’s algorithms, in a game of never ending Ooh that reminds me of…

You’ve long forgotten where this began. The last few videos were of Queen songs with the vocals singled out. What an amazing talent he was! And you can’t go to bed *juuust *yet because there’s at least a few more Related Videos and what about cover versions? There must be some good cover versions of this song.

If you’re anything like me you can’t control YouTube at night.

Introducing: YouTube Binge Bundler™

YouTube Binge Bundler™ looks at your YouTube History for what looks like a recent binge and turns it into a playlist, easily shareable with friends and family.

If your binge looks like other binges, our Machine Learning robots will suggest videos to add to your journey.

I always end up having at least a few Michael Jackson recordings in there. But that’s just me. You might have your own go-to things that are never not relevant. They will find other late night Michael Jackson aficionados and who knows — you might end with new, tired and confused friends.

If you’re up to the challenge you can provide a description. Like a sort of guided trip or journal entry of a fever dream. Fun!

Skip.life

Why read it later when you can skip it for life?

Skip.life — The “Read it Later” service for people too busy to Read It Later

I enjoy a good, steamy hot take as much as anyone, I just don’t always have the time right now. That’s why I use Instapaper. Or, used to use.

Because my Instapaper reading list grew faster than I would read whatever I would put in it, every visit became more about feeling guilty than enjoying taking the ;dr part out of the tl blog posts.

So I moved to Pocket.

And what a relief! Just me and a completely fresh Pocket archive, empty of articles and guilt. Ready to be filled with longreads of whatever we are very, very concerned about this week.

And so I quickly began throwing anything in there. I even added my friends as friends and added a few of their recommendations. Some of them had many and that made them seem just the kind of smart that I want to be.

Until a few days later when my Pocket started to look like my Instapaper. Uselessly filled with a ambitions I couldn’t live up to. So I ditched it and began using Safari’s built-in Reading List instead. And what a relief?

I was beginning to see a pattern and needed a drastic change. So I made skip.life:

Skip.life integrates 100% with your browser

Introducing skip.life

Skip.life is a browser extension, an app and a way of life. Just like you’d expect from Instapaper, Pocket or the other guilt trippers. Come across an article you’d love to read *just not right now? *Click the “Save” Button™ and you will be treated to a very satisfying animation of a robot arm carefully archiving the article for later enjoyment, then the tab will close.

Yet, nothing else will happen.

Skip.life will skip it for you.

You’ll feel satisfied that you didn’t miss out on the article. You definitely saved it for later. And 6 minutes later you will have forgotten both the article and every intention of reading it — and best of all, you’ll feel zero anxiety when you log into skip.life and see that you have 0 unread articles.

You must be very smart!

Getting a project's Ruby version from the Gemfile

It used to be that every project had its own .ruby_version file. But you’d also have to specify the same version in the Gemfile. I say nay to .ruby_version and instead get it from one place:

alias ruby-vers="cat Gemfile | grep '^ruby' | sed -E \"s/.*[\\\"'](.+)[\\\"']/\1/"\"

Now you can $ chruby ruby-vers your way to success!

Using Preact in production with Rails' Webpacker

Preact is like React but smaller in size. I think? Anyway, so I’ve been told. It’s also different in some ways and I’m not entirely sure how, but they have this thing called preact-compat that’ll plug right into your Webpack config and use Preact instead of React which seems like free filesize savings. Right on!

First:

$ yarn add preact-compat webpack-merge

In config/webpack/production.js:

const environment = require("./environment");
const merge = require("webpack-merge");

module.exports = merge(environment.toWebpackConfig(), {
  resolve: {
    alias: {
      react: "preact-compat",
      "react-dom": "preact-compat",
    },
  },
});

I saved 2 whole megabytes with just this change. No, of course that’s not true.