Announcing Branch – Stats and what’s next

24 hours ago I announced a new project I have been working on: Branch – a continuous integration service for WordPress developers. I was pretty transparent throughout the day on Twitter and thought it would be fun to do a little summary on how it all went.

Before

Branch is a product I’ve been working on for the past few months. It feels like the natural progression from my other product WP Pusher. However, compared to WP Pusher, Branch is a very large project and a big technical challenge. What I launched yesterday was far from a product that someone could actually sign up and use. So what exactly did I launch?

After a lot of tinkering I am finally at a point where my working prototype can clone a Git repository with a WordPress theme, fetch the PHP and JavaScript dependencies, compile the assets and deploy them to a WordPress site. This is far from production ready, but it is working well enough that I felt comfortable recording a screen cast showing it to the world. I had decided in advance that a screen cast of a working prototype would mean a hard stop of the development of the product. I simply cannot spend more time developing this product before it’s been validated better. That’s what the announcement yesterday was about – gauging the interest.

In addition to the screen cast I had written a manifesto titled “WordPress developers are developers too”. It goes into something I feel pretty strongly about, but won’t re-state here. Read the manifesto if you are curious. I have previously written a lot of blog post targeted at WordPress developers and I felt pretty comfortable that my manifesto would be provocative enough to get people’s attention, but not too much to derail everyone’s attention from Branch. I would say it worked pretty well. The main inspiration for writing a manifesto came from Derrick Reimer and Ben Orenstein.

On the landing page I did a few things before launch: Added Fathom analytics (privacy, yay!), added an email opt-in and linked to a pre-populated Tweet after sign up. The pre-populated tweet did alright, nothing crazy, but I still think it’s a good idea to encourage people to spread the word:

The day before the launch I made sure to queue up an email to my email subscribers on my WP Pusher email list. It’s about 2500 WordPress developers. I accidentally messed up the time zones, so the email actually went out an hour before I had planned – 11am UK time, instead of 12pm. I also tweeted out asking for people to help me spread the word the next day as I had a big announcement to make. This is a trick I’ve stolen from Adam Wathan and I think it works really well if you can make sure that you already have a few people cheering for you.

Finally, I reached out to a few Twitter friends and acquaintances to ask for feedback. This helped me tweak and fine tune the landing page a bit. A big thank you to everyone who had a look!

Launch

I had planned to Tweet out at 11am UK time, which was an hour before the email was supposed to go out. This would give me an hour to fix any immediate errors that people would potentially be pointing out. Just when I was about to hit “Tweet” I realized that the email was already going out. Well, I guess we are live then! A few minutes before the actual tweet went out I also let people on Twitter know that I was about to make my announcement. After the tweet was out I quoted it and encouraged people to help me spread the word. Quickly a few people started retweeting it to their own followers.

I’m really happy with how the launch went. I’m not used to my tweets getting a lot of attention, so yesterday’s tweet was definitely my most popular tweet ever. So far it’s had almost 17.000 impressions, which is way more than I had hoped for. Here’s how the website stats looked after yesterday:

Later during the day I also shared the link with the Advanced WordPress Facebook group. It was pretty well received in there as well, but most of the traffic definitely came from Twitter. About 10% of the visitors subscribed and about 70% checked the “I want beta access” box.

At about 5pm UK time I made another small push on Twitter targeted the US west coast. This Tweet got a bit of attention as well with almost 5000 impressions and definitely helped keep the ball rolling:

In addition to this tweet I also made sure to be really active on Twitter in general throughout the day.

I think these stats are pretty good and I definitely got more attention than I had hoped for. But more importantly I reached a lot of people and many of them sent me very encouraging messages and emails. Tweets like this definitely made my day:

Even on Facebook people said nice things!

Some of my existing WP Pusher customers chimed in on email as well:

All in all I feel like Branch was really well received yesterday and it feels like it’s definitely something that WordPress developers care about.

What now?

I’m super happy that people seem to be interested in Branch, however it is a big project and I need to have a pretty solid gut feeling before fully pursuing this project. That was the whole point of this launch. The number one question I need to answer now is: Do I think people will use this and will they be willing to pay (enough) for it. My experience with WP Pusher is that, yes, people need this and are willing to pay for it. But will they pay enough to make it a profitable business? I consider WP Pusher a side project because I haven’t actually worked on it full time at any point. I’ve had the intention a few times, but something else has always come in the way. It has sort of had its own life to be honest. At the moment WP Pusher is able to pay (most of) my bills, but it’s not profitable enough to invest a lot of money into a new venture like Branch. That leaves me with a lot of consideration to do!

It’s obvious to me that the next step is to talk to as many interested people as possible. I signed up for Zoom today and will try to set up all the meetings I can to better understand the people that already showed interest. If I decide to fully dedicate myself to Branch there a few things I’ll have to consider:

  • Should I consider raising a bit of seed money to fund the development or maybe join an accelerator/incubator? Or should I just try to bootstrap with the income I have from WP Pusher (might be tight because Branch is quite ambitious)?
  • Should I find a co-founder or otherwise find someone to help me build Branch? In addition to a lot of coding, there is a lot of marketing and product development to do if I want Branch to be successful. Also, speaking from experience, bootstrapping as a solo founder can be pretty lonely.

If you have any questions, inputs or thoughts about any of this, please tweet me or send me an email.

My Favorite Quote

My favorite quote is from a text written by the Sanskrit writer Kālidāsa. I read it in a book about 3 years ago and it has stuck with me since then. It’s rare that I get “excited” about quotes, but this one really got me. I think about it often.

For yesterday is but a dream
And tomorrow is only a vision;
And today well-lived makes
Yesterday a dream of happiness
And every tomorrow a vision of hope

Things I’m reminded when reading this:

  1. Life is right now in this moment
  2. Worrying too much about the future isn’t very helpful

🕉

After Co-living

There are a bunch of people, probably around 30 to 40 to be more accurate, that I feel like I’ve known for years. They come from all around the world. They do completely different things for work. They look completely different. They are meat eaters, vegetarians, vegans, coaches, architects, programmers, investors, entrepreneurs, christians, muslims, atheists, surfers, travelers, students – you get the idea. They are different kinds of people.

The one thing they all have in common is that I’ve known them for less than a year.

These are some of the people I’ve met during the 3-4 months I’ve spent co-living at Sun & Co in the past year.

Sun & Co has been my second home in 2016 and my go-to-place, whenever I had a few weeks with nothing else on the schedule (that required my physical presence that is). I’m pretty sure I have the record for most time spent in the house.

I’ve seen a huge amount of people come and go. A lot of whom said their lives were transformed after trying co-living and meeting such a diversified and interesting group of people.

I had my first co-living experience in 2014, when I lived with a large group of “digital nomads” in a large apartment building in Chiang Mai, Thailand. Still we were living in our own studios. In 2015, I stayed for a few weeks at the famous Surf Office in Las Palmas, but still in shared flats with private rooms. Sun & Co was my first time living and working in a house full of people I didn’t know in advance.

One of the hosts at Sun & Co, and a good friend of mine, Jon, wrote a blog post about how co-living is a very accelerated version of co-working. It’s a great post, which does a great job explaining what I’m trying to say here: Living and working together with people is an extremely accelerated way of making new friends and connections. For me, one of the biggest part of co-living has been the friendships I’ve made that continued after co-living.

There are a ton of “how co-living changed my life” blog posts out there, so instead of doing yet another one, I thought I would share a few pictures of some of the “after co-living” memories I have from 2016.

The Sun & Co 1 year anniversary party – hosted by friend-of-the-house Alejandro on his amazing rooftop. A lot of people came back to connect with “old” friends!

A trip to the nearby market in Jesus Pobre with my girlfriend – made possible by Jon from Sun & Co, who let us take his motorbike! Trusting someone to drive your motorbike is much easier when you’ve lived together with them.

In Edinburgh, having lunch with Mohammed who I met at Sun & Co. Mo and his wife made us an amazing traditional Palestinian feast!

… And an amazing cup of Arabic coffee!

I spent 4 months “house sitting” this apartment in Copenhagen for a girl I met at Sun & Co (because she didn’t want to leave Javea). Again, trusting someone to stay at your place is a lot easier when you’ve lived together for a month.

Last meal in Sun & Co before roadtripping Andalucia. All my friends from Sun & Co and Javea came to the house to say goodbye and eat Burritos.

The Stairstep Approach to Proper Push Ups

5 or 6 years ago I couldn’t do a proper push up. Not a single one. I was overweight and believed I was too heavy to push up my own body weight.

Around that time, I implemented a lot of changes in my life. I began eating healthier and started exercising. I lost weight. I quit smoking. I took a year of leave from university to pursue some of my entrepreneurial dreams. I did a lot of things that gave me a lot more confidence in myself. I also started doing push ups – on the stairs leading down to the basement of my parent’s house where no one would see me.

In the beginning, I didn’t know how to tackle the push ups. I couldn’t even do one, so how would I get started? I remember reading about the “100 push ups challenge” online, but to get started you had to do a test session to see how many push ups you could do. The training program was based on that initial session. Useless in my case.

One of the ways people recommended getting started was doing push ups on your knees. I could do that without any problems, but I still couldn’t figure out how to move on to proper, real push ups.

One day I figured I’d try to do the push ups on stairs instead… I walked down the basement, put my hands on the 4th step up from the floor and I actually did a few “proper” push ups. It was a revelation. Seriously.

I decided my goal was to do 20 push ups on that step. Then move down 1 step. Do 20 push ups. Then continue doing that until I was doing 20 proper push ups on the floor. I don’t remember how long that took, but it worked. Every other day or so, I’d do a few sessions with as many push ups I could do. Slowly I worked my way down the stairs and in the end I had cracked the code and was doing 20 push ups on the floor.

The title of this blog post is a tribute to Rob Walling’s legendary “The Stairstep Approach to Bootstrapping” post, because the exact same principles apply. I think they apply to nearly everything. I honestly believe that no matter what skill you are trying to acquire, there’s always a way to stairstep it. No matter if you are literally doing your push ups on the stairs or you are trying to learn how to build and run a business.

💪

How I Listen To Podcasts

I’m addicted to podcasts.

On any given day I spend several hours listening to podcasts.

Podcasts about business. Podcasts about lifestyle. Podcasts about coding and technology. Podcasts about anything that I’m interested in. In fact, my podcast feed is a pretty good snapshot of what’s on my mind at the moment.

I’ve listened to podcasts for years. Probably 10. And I clearly remember the first podcast I ever listened to. It was a short podcast by Steve Pavlina called “How to Make Money Without a Job“. I downloaded it as a .mp3 file and put it on my MP3 player. It was the only podcast on my MP3 player and I listened to it countless times. I remember listening to it on the train on my way to school and while I was cleaning the windows in my parents’ house. It really inspired me. And I loved the audio format.

Since listening to Steve Pavlina on my MP3 player, my podcasting practice has evolved quite a bit. I thought it’d be fun to share it here.

The tech

There are quite a few different podcast players out there. The one I use is called Pocket Casts and I love it. It’s one of the apps on my phone I use the most. If you are just getting started with podcasts, I definitely recommend that you buy Pocket Casts.

Intermezzo: Why I (only) listen at 1x speed

When you get into the world of podcast consuming, it won’t take long before you are introduced to the practice of listening to podcasts at 1.5, 2 or even 3 times normal speed. Like spooling through a tape on your Walkman. By listening on double speed, you can consume the double amount of content.

I used to listen at 1.5x speed for a while and I got completely used to it. But honestly, whenever I was listening in the kitchen, or somewhere else where other people could hear it, I actually thought it was a bit embarrassing. It emphasized the fact that I was literally addicted to podcasts. I couldn’t get enough. I needed more. Faster.

The reason I stopped listening at 1.5x speed, though, was that it increased my levels of stress and anxiety. The walks I love taking with my podcasts were suddenly making me more stressed and anxious than I already was. And they are supposed to do the opposite!

If something isn’t worth your time at normal speed, don’t listen to it at all.

My advice if you listen at more than normal speed: Try not to for a while. Don’t treat your podcast feed as a todo list that you have to burn through as fast as possible. If something isn’t worth your time at normal speed, don’t listen to it at all.

How I find new podcasts

Pocket Casts has a discover area that you can use to find the first few podcasts to subscribe to. Just find a few podcasts on topics you are interested in and start listening. Honestly, I haven’t found a great place to find podcasts yet. Most podcasts I discover when they are mentioned on another podcast I listen to. It takes a while before you have a solid podcast feed.

The features I wish I had in my podcast player

If you are working on a podcast player and read this, here are my top most wanted features in my podcast player:

  • A way to take notes
  • A way to “highlight” parts of a podcast episode
  • A way to tag and sort podcasts

The listening

What I listen to changes a lot. I add and remove stuff to my podcast feed all the time. I very much use podcasts for inspiration. In many ways, it has replaced blog posts and industry news for me.

When I need inspiration for a new idea or project, I listen very intensely to business or entrepreneurship podcasts to get all fired up. When I need to get the actual work done, I listen a lot less (I can’t listen to podcasts while working) and often to more technical stuff that is related to the work I have to do.

When I listen to podcasts also changes a lot. Sometimes I have more time that others. I take long (5-10 km) walks almost every day where I listen to podcasts. I also like to listen while I drive, take planes, cook dinner or do cleaning. Actually, I even listen to podcasts with my girlfriend. Only, we don’t like the same podcasts. So if we are on a plane or a bus, we’ll sometimes listen to each our own podcast and both be totally cool with it.

That was a lot of words on how I listen to podcasts. If you read all the way to here, you must be a podcast geek too! I hope you found it interesting.

Postlude: My favorite podcasts

I have a lot of favorite podcasts, but here are a few that I have listened to for a long time* and that I will probably continue listening to for a long time.

* A few of these are actually new discoveries that I know I’ll keep listening too.

How To Also Be Productive Tomorrow: 1 Simple Idea

This very simple idea is one of the best productivity hacks I have heard in a long while. It is so simple to implement and it has the potential to really improve your workflow.

Last night, I was accidentally watching a show in TV, which I normally try to avoid. I usually find it to be a waste of time. But yesterday I ended up watching it anyways, because someone else put it on. In the end of the show, 3 celebreties, one of them a famous and controversial Danish poet, had to come up with a creative ending for the show.

When I’m writing, I make sure to always stop while I’m still in the zone. It makes it a lot easier to get started the next day.

Long story, short. At one point the poet, Jørgen Leth, said something that really resonated with me, but never occurred to me. He said: “When I’m writing, I make sure to always stop while I’m still in the zone. It makes it a lot easier to get started the next day.

Wow! There is a saying that you have to “strike while the iron is hot” and I always assumed that it applied to writing as well. I never questioned it. When I am in the zone, I don’t want to stop. I want to get as much done as possible, while I have the chance. However, getting into the zone has always been a mystery to me. After endless staring at the screen, all over sudden I end up in “the zone” without knowing why. At least sometimes. What if, once I am in the zone, I could just leave a door open for the next day, so to say?

There is a saying that you have to “strike while the iron is hot” and I always assumed that it applied to writing as well. I never questioned it.

Well, that would make it a lot more tempting to sit down and get something done. Imagine that right before you write down that really great idea you have, you postpone it until tomorrow. It will stay in your head and you simply can’t wait to get it “down on paper”. Next morning, you jump right into the zone.

To good to be true?

Why I’m Keeping The Free Version Of WP Pusher

This morning, while taking a run in Las Palmas, Gran Canaria (Yay! Location independence ftw!) I decided to no longer offer a free version of WP Pusher. This was quite a big decision for me and something that has been on my mind for a long time. 4 hours later, during my lunch break, I decided to keep the free version after all. Here is why.

Some Background

Throughout the (short) history of WP Pusher, I have had 3 business models. First, WP Pusher was meant as a Software as a Service business, where users paid a monthly fee to use it. This model was great because it allowed me to do stuff on my own server, instead of having to mess around too much on customers WordPress installs. However, when building the plugin, I kept making it simpler and simpler. In the end I felt like the SaaS model was overkill and decided to rewrite everything to be just a plugin. Business model #2 was a free version, available on WordPress.org and a paid version with some extra features.

Then I got this e-mail:
WP Pusher banned from WordPress.org

There went business model #2.

Business model #3 still involved the free version, but now that it wasn’t allowed on WordPress.org, I had to offer it through my own site. Actually, this wasn’t too bad, since this allowed me to collect e-mails from the people who wanted the free version so I could stay in touch.

Fast-forward to this morning.

For a while, I have been kind of upset with the free version. A lot of people are using it, so maintaining it, answering e-mails and the likes all takes up quite a bit of time. And then one more thing. People love the free version! Actually, most of the users I have been in touch with love the free version so much that they do not upgrade to the paid version. Actually, most people who paid to use the plugin did so from the beginning and never used the free version. There went business model #3. At least that was my conclusion this morning.

Why Keeping It Is A Great Idea

So, even though the conversion rate from “Free” to “Pro” is not as high as I would like it to be, I still decided to keep the free version. These are the “why’s”:

  • I have about 20 times as many people using the free version compared to the pro version. These users provide me with invaluable feedback that also relates to the pro version.
  • Most of the bug reports I have received are from people using the free version. I think that people using the free version are actually thankful that they get to use it for free, which encourages them to submit very detailed and useful bug reports.
  • I get to collect e-mail addresses from users of the free version, which means I can stay in touch with them, get their feedback and tell them about the pro version.
  • People using the free version will potentially talk about it and attract new potential customers. (I don’t know if this is valid as I haven’t tested it.)
  • Even though the numbers are not large enough, I still have people convert from free to pro. I think some people use the free version as a free trial before they decide to go pro.

The Unresolved Case

I am still left with a dilemma. I have concluded that either my free version is too good or the pro version needs to be even better.

Should I make the free version worse or should I come up with a better pro version? In my world, the Push-to-Deploy feature from the pro version is without doubt the best part of WP Pusher, but apparently that (and support for branches) is not enough to convert people from free to pro – in most cases.

The main issue is that the pain-relieve when going from not using WP Pusher to using the free version is pretty large. Somehow, I need to make the pain-relieve when going from free to pro equally large.

Anyways, I am keeping the free version for now because in the end, I think it gives me a lot of valuable feedback and user interaction that I otherwise would not have. It is a dilemma, since worsen the free version just does not feel right. At the same time, the free version was originally meant to be a teaser for the pro version – not a replacement. Personally, I think the pro version is killer. Maybe I need to communicate it better. Or maybe add an extra killer feature that users of the free version simply cannot resist.

I am trying to figure out if I need a business model #4.

3 Cool Things You Can Do With Arrays In PHP

PHP has a wide variety of functions for interacting with arrays. Some of them are more known than others. In this short blog, I will demonstrate 3 cool things you can do with arrays in PHP that you may or may not know about.

Turn variables into arrays

The first thing I want to show is how to use compact() to turn variables into an array. I never heard of it before using Laravel, but now I use it all the time – especially in my controllers when I need to pass variables to a view.

php > $name = 'Peter';
php > $email = 'peter@suhm.dk';
php > $array = compact('name', 'email');
php > var_dump($array);
array(2) {
  ["name"]=>
  string(5) "Peter"
  ["email"]=>
  string(13) "peter@suhm.dk"
}

Turn arrays into variables

The opposite of compact() is extract(), which lets you turn an array into a bunch of variables.

php > $array = array('name' => 'Peter', 'email' => 'peter@suhm.dk');
php > extract($array);
php > var_dump($name);
string(5) "Peter"
php > var_dump($email);
string(13) "peter@suhm.dk"

Implement ArrayAccess

Finally, I want to demonstrate the ArrayAccess interface that comes with PHP. It is really awesome and lets you take arrays to the next level. If you need inspiration, check out the Collection class from Laravel. By implementing ArrayAccess, your objects can be accessed like they were an array, which is pretty awesome.

class AwesomeClass implements ArrayAccess
{
    // Example from php.net
    // http://php.net/manual/en/class.arrayaccess.php
    private $container = [];

    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }

    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}

// Usage
$awesome = new AwesomeClass;

$awesome['name'] = 'Peter';

Resolving Controllers With Symfony And A DI Container

For a project I am working on at the moment, we are using Symfony’s great routing component. The other day, I had to set up the routes to work together with our controllers and stumbled upon something that I would like to document here.

By adding a _controller parameter, such as ‘PostsController::show‘, to a route, Symfony’s ControllerResolver can automatically resolve the controller class given a request object. The ControllerResolver is a part of the HttpKernel component, and also contains an interface, so you can implement it however you like. In my particular case, I actually needed to resolve the class from my DI container, and only needed the resolver to resolve the arguments of the method. I was not going to implement my own ControllerResolver, so here is what I did instead:

// First, fetch the controller string from the request
// Could be something like 'PostsController::show'
$controllerString = $app->request->attributes->get('_controller');

// Next, split the controller string and pass it to two variables
list($class, $method) = explode('::', $controllerString);

// Resolve the controller class out of the DI container
$controller = $app->get($class);

// And use the ControllerResolver to get the arguments
// of the method
$resolver = new ControllerResolver();
$arguments = $resolver->getArguments(
    $app->request,
    [$class, $method]
);

// Now that we have the class and the arguments, we
// can finally call the controller and have it return a response
$response = call_user_func_array(
    [$controller, $method],
    $arguments
);

How WordPress.org Did Me A Favour

In the beginning of this week, I wrote about my (non-existing) marketing strategy for WP Pusher, and boy, this week has gone by fast. The day after I wrote the blog, Sara Gooding decided to write an article about WP Pusher over at WP Tavern – a popular WordPress blog. I got pretty excited and realised how effective content marketing is. It works even before you start doing it!

In other news, I didn’t quite get the amount of traffic I would have expected from the Tavern. The day of the article, according to Google Analytics, 270 people stopped by my the landing page. Not quite a Hacker News kinda thing, but actually, I was pretty satisfied. See, out of those 270 visits, I got 50 free downloads which is almost 20 %.

Remember how WP Pusher is not allowed in the .org repository?

WP Pusher banned from WordPress.org

Since then, I have asked for people’s e-mail addresses upon download, so I can keep in touch and send them updates. Had WP Pusher still been on WordPress.org, 50 downloads in one day wouldn’t be anything exceptional, but think about it. 50 e-mails in one day. That’s not too bad and hence the title of this post. Maybe WordPress.org actually did me a favour by removing the plugin from the official repository.

To sum up the WP Tavern thing, I did not make any sales (that I could directly relate to the article) and I got roughly 100 downloads (the article was tweeted multiple times in the following days).

Content marketing it all

This week, I have been trying to work out how I am gonna strategically work with content marketing. I have been really busy with my clients, but every morning I have been reading articles, PDF’s and I have been jotting stuff down in a spreadsheet. I have also started a makeover of the WP Pusher Blog. At this point, I don’t think there is a lot of value in sharing the spreadsheet, but here is a recap of the most important things:

Main channel The WP Pusher Blog
Main focus Develop Thought Leadership
Target audience Freelance developers and agencies that work with version control on client projects.
Main Topics Deployment, version control and best practices

I think there is a demand for quality information about these topics, that hopefully the blog can help satisfy. I really believe that great content is the way to go. The article on WP Tavern was highly based on the few posts that are already on the blog, which leads me to an important point: Writers and journalists are busy people with deadlines. The easier you make it for them to write about you and your product, the more likely it is that they will do so. It’s really a great lesson for me that I will keep in mind.

Now that I have a better content strategy for the blog, and a fresh design, I’m ready to start creating some great content. Hopefully, that content will help drawing more attention to WP Pusher and ultimately more sales.

It has been almost a month since I launched and I am quite satisfied with the results so far. If I was still living in Chiang Mai, Thailand, WP Pusher would already pay for my rent and basic meals. That’s not quite the case here in Copenhagen, Denmark.