2020 Year in Review
Here’s my first ever year in review. It’s a deep dive into how 2020 was for me and it wasn’t easy to write.
December 23, 2020
2020 has been the best year I’ve ever had for my professional life. I’ve had many fun moves in my time, like leaving my first job, but this year has been the year of everything lining up.
But this year hasn’t been all roses for me. I’ve lost multiple family members this year and, a few days before writing this, I received some devastating news about my canine companion, Saxon.
I’m going to try and focus on the positives, and hopefully give encouragement to the people who are in a similar position to the one I was in, but I will touch on the negatives too. So brace yourself.
January - We moved house
This year started great. We’d just bought our first house and we finally had a bit of control. We were renting a nice house before but the landlord was selling it, so we were having to vacate for viewings and it was such a headache. First world problems, I suppose, but it disrupted our life a fair bit, as we had to get the dogs out of the house and drive around for an hour or so with a temperamental toddler… in the winter. So we were happy to be done with that.
My main focus (work-wise) was contracting. I was in a very rare & fortunate position to be working with an incredibly forward-thinking company, building some fantastic applications. I loved the group of people I was working with and we were building some incredible things. All private, so I can’t share anything, but the work was Laravel & Ember.js.
In addition to that, I was working on Fathom Analytics when I had time. This would typically be at the weekends, or when I took days off from contracting. But by this time, Fathom had already been growing and all the income I’d lost from taking days off contracting was starting to come back to me via Fathom. It was a big financial risk, but 2019/2020 was the time to take it. And at this time, I had no idea that I’d be wrapping my contracting work up in just a few month’s time.
February - Quitting
By February, Fathom was growing at an insane rate. In January, I had convinced myself that I could handle everything. But at the start of this month, it was clear to me that I couldn’t do both, and I knew I had to leave. Fathom had urgent challenges, support, and various other things. If I was 18, had no wife and no daughter, I would be able to do both. Back in those days, I’d be able to handle both of these things. But I now had responsibilities outside of work, and I knew that the responsible thing to do was to have the conversation with my client.
It wasn’t easy and it wasn’t a fun conversation. We still had so many exciting projects on the horizon, and I was leaving at an important time. It was even harder because I was helping train a junior developer, and I was sad to be leaving that. Fortunately, we found a great replacement for me. He was highly experienced, had a great personality, and did an incredible job at taking over.
Changes like this are always a shock for everyone involved, and it was certainly hard for everyone. But there’s always “the other side” and things ended up great. I’m still friends with the client and they’re still smashing it as a company.
March - When everything changed
March was the month where everything changed for me. It was the month when I launched my first course, Serverless Laravel. I’ve not shared much about this in public, especially the financial side, but I’m highly aware of my duty to pay it forward by sharing my experiences. I kept notes when I started this course and I’m going to share them.
If you build a course, one of the most common questions that you’re asked is “how did you decide what to make?”. And honestly, this was a combination of 2 important pieces:
- I had been very public about our use of Vapor. And I was regularly getting DMs and emails asking me questions. Of course, I was happy to answer them, but it was taking up a chunk of time
- I’d just bought a house and any kind of cash injection right now would be nice. Outside of credit cards, which I pay off in full each month, I don’t carry debt. And now I had a mortgage.
Back in December, I was sitting on the sofa in our old house, and I was thinking about all of this. And I had an epiphany that hit me like a ton of bricks. I could put all of my Laravel Vapor knowledge into a course, sharing all the challenges I had and I could sell it. I’m not exaggerating, I remember it well. So I immediately opened up Basecamp and made a bunch of notes to keep me grounded. And here was the private document I wrote:
1st December 2019
As with anything, there are multiple stages of a project. At this point, energy and excitement are at their peak. You can’t wait to dive into things. Your gut/brain is saying this course will do so well. Even as you think of things, you’re thinking about the course and visualizing how well it will do. So the first thing I want to do is outline my goals here. They need to be tied to things I can control:
I want to establish myself as an expert in this sector and build my personal brand. This will also open up employment/freelance opportunities for me down the line as more people know about me
I want to help bring light to Fathom
I want to contribute to the community and give out tips. Not everything is about money, I enjoy helping people
I want to build an audience
So those are the things for now. Your drive will surely sink mid-project, as you start to doubt things, but keep pushing through.
I started drafting out ideas for the course at the weekends, writing scripts, and thinking about what I might talk about. I spread the development of the course across 2 months, and then I took around 2 weeks off towards the end of February. And those final few weeks were essential for wrapping up the recording.
Listen, I’m going to do a separate, detailed blog post on the whole course process but, long story short, the course was super popular and helped a ton of people. I’ve met so many people from doing this course, we have an incredible Slack community, we got hundreds of thousands (millions?) of dollars in AWS credit for people and I’ve learned a lot from everyone who is in the course too.
And yes, I know what you’re thinking, show me the money. I’ve not shared any financials before, so here goes. The course did $46,000 USD in the first week and has done around $120,000 USD overall. But I’ll talk more about the inception, process, marketing, money, and everything else in another article.
But suffice to say, this course was fundamental in laying the groundwork for making the transition into full time Fathom work much easier.
April - Custom domains
April was the month that we finally finished my custom domain solution to make our analytics bypass ad-blockers and launched it. I had been working on & off on this idea since 2019, taking various pauses along the way, and I finally got it launched in April. I ended up sharing the entire technique on Laravel News and so many people have used it.
We also launched Data Export, which was a headache in the serverless world. We’re now in a position where we have the maximum sized Lambda handling all the .csv creation. What a palaver.
June - Uptime monitoring
In June, we added simple uptime monitoring to all Fathom accounts at no extra cost. This was something that just worked out perfectly. A short while back, we were talking about doing this. Our initial plan was to roll our own, but we just didn’t have the time. And we had been working out an arrangement with PingPing since February 2020. Long story short, they provided us with the uptime monitoring infrastructure, and we just utilized their API. It was a match made in heaven and our users love it. It’s a huge value add for our customers.
We toyed around with screen resolution too but, ultimately, we couldn’t include it without violating the ePrivacy Directive, so we didn’t pursue it. Fortunately, we can still offer the device type.
This month was full of a lot of privacy law based technological innovation. We spent a good chunk of time on a large refactor that we ended up binning (US: putting in the trash).
One of the most important changes we made was to our “random animal generator” for custom domains. We had to remove a beloved bird from the list of animals our random selector users. A few customers were given booby.theirwebsite.com as their custom domain. Booby is a bird! And look, I do understand that animals aren’t everyone’s favourite thing for a custom domain. When I got assigned “donkey” as my custom domain animal, I wasn’t too impressed.
July - Cloudflare outage & Schrems II
July was an interesting month. Right after deploying our uptime monitoring feature, cloudflare had huge issues, and took a huge chunk of the internet with it. A lot of people learned some important lessons that day. We fired off a whole bunch of notifications because, well, things seemed to be offline. As you can imagine, we ended up with a whole bunch of feedback saying “chill out on the up_down_up/down notifications”.
PingPing moved fast and introduced a whole new range of notification options (delays etc.) and we added throttling our end too. The upside of this was that we got to refine this feature very quickly.
In addition to this, we were blessed with the Schrems II ruling which has caused us a huge amount of work. Fortunately, we have an incredible privacy officer and, whilst a lot of companies haven’t fully understood what this ruling means to their company, we’ve been building new technology off the back of this. Keep your eyes open.
August - Viral customer & Laracon online drama
In August, the first big event was one of our customers going insanely viral. Now let’s be clear here, we’d had customers going viral before, but this was a new level. Fortunately, the customer in question has publicly tweeted about things, so I can talk about details. They launched a Universal Basic Income website, where you could apply to take part in a test. For those who aren’t familiar with UBI, the idea is that you’re guaranteed a baseline income, regardless of whether you work or not. I’m not going to argue about the pros & cons of this but they hit a nerve, as millions of people flooded to the website. What an incredible product launch.
Once all that madness had calmed down, I had a week to get ready for Laracon online. Now originally, this conference was meant to be in-person but, you know, COVID-19 happened. So we had to do everything by Zoom and my talk was the last talk of the day. Instead of going the standard route, I decided that I was going to try and put together an entertaining piece & stream it. I spent hours putting together a video, with a mixture of code, explanations, transitions (with epic music), and whatever else.
On the day of Laracon online, I enjoyed the speakers throughout the day and couldn’t wait to unleash my madness. I had it all planned out, and it was going to be fun. The hard work would be worth it.
It came to my turn, and I took the call and then used ManyCam to stream the epic video I put together. Off the bat, it was received very well, with a funny cameo, and we were rolling. But shortly into things, something happened that I hadn’t anticipated. The code screens were completely compressed and nobody could see anything. From what I understand, Ian Landsman tried to stop things but I couldn’t hear him. And the presentation continued with mediocre quality, unbeknownst to me.
After my slot was done, I hopped on Twitter and the response seemed to be pretty positive. And there was a Tweet about someone on the Laravel Discord wanting me to record audio to soothe them when they sleep, which I thought was funny, so I signed up for the Discord to joke about it with them. I loaded Discord, registered, and went into the Laracon channel, but I wasn’t met with funny jokes. People were pissed.
Throughout my talk, people had been saying various things, and one guy slagged me off on something completely unrelated to my talk. Anyway, I felt an instant disappointment. The irony. I had spent a huge amount of time putting together something I had hoped would be entertaining but it fell flat due to quality issues. I could’ve spent 30 minutes doing my talk but I chose to spend 4-8 hours doing a video.
After all was said and done, Ian didn’t put a hornet nest on my doorstep either (I suppose I owe covid credit for that) and I learned an important lesson that day. If I ever end up speaking again, I’ll stick to the format. It wasn’t the place to try something new like this, and it wasn’t my show. So for everyone who experienced that live, please consider this my apology, and I hope the downloaded videowas good viewing (it was great quality ;)).
September - Big tech enters the space
In September, we launched a bunch of revenue growing pieces behind the scenes. We rolled them out and managed to produce an additional few thousand dollars off the back of these changes alone, which felt pretty good. We’re big fans of automating things that can help grow our business. So I spent most of the month on this.
The big event of September was Cloudflare entering the privacy-first analytics space. Honestly, it came as a shock. This space has been pretty much 100% independent, bootstrapped companies, and it caught everyone off-guard to see them try to muscle in with their “free” offering. They’ve been very vocal in their marketing about how client-side analytics are “bad”, whilst simultaneously releasing a client-side analytics product, which was very strange positioning. And I’ve been highly vocal about the numerous inadequacies of their analytics add-on and why people should be wary of “free” products offered by big tech. But I’m done with this chapter.
October - Phantom Analyzer
In October, we spent a few weeks building a tool that scans websites for tracking pixels (or “spy pixels” as DHH calls them). It was a huge success and did so much better than we anticipated. It took us a few weeks to build (mostly because I was fighting with Headless chrome) but it was worth it in the end.
To end the month, I refactored a whole bunch of code to get our codebase cleaner ahead of some large refactors we had planned.
November - Someone attacked our company
November was absolute insanity. In so many ways. Over 50,000 people have read my article, so there’s a chance that you, yes you, have already read my blog post about the crazy DDoS attacks launched against us. Interestingly, at the time of writing this, we’re still seeing attacks every weekend.
So I spent a huge chunk of November trying to fight these attacks, learning from the AWS team, and building various spam cleaning/defence systems. It was an exhausting month but, hey, we ended up with a viral article that increased Fathom trials by 100% for an entire week. Swings and roundabouts.
November was also epic because we landed DuckDuckGo as the first guest on our podcast and formed a fantastic connection with their communications manager. We spend so much time in emails these days, and sometimes it’s just nice to speak to someone and vibe with them. Plus he was British, so that’s an instant +100 in my books.
We ended November strongly when Joel Gascoigne, CEO of Buffer, tweeted about Fathom. It was a huge, full circle moment for me because I vividly remember being in my bedroom as a 19/20-year-old listening to Joel on Mixergy. I’m not kidding. I vividly remember being blown away by the whole thing. And then 8 years later, Joel is tweeting about how much he likes a product I co-founded. It was surreal.
December - What we’re up to
December has been a busy month too. We’ve been working on optimizing performance. Originally, we were gearing up to migrate to Elastic, but I’ve chickened out for now and we’re going to stick with MySQL for the time being. Outside of that, we’re looking to move various pieces of our application to DynamoDB, which is an exciting move. Once we’re done with that, myself and Alex DeBrie will be launching DynamoDB for Laravel. Exciting times.
Additionally, we’re also working through a huge amount of compliance work with our privacy officer, which includes new technology changes and partnerships. It’s an incredibly exciting time for us but I often feel like a clown, because there’s a lot of juggling. We’re making progress though, and we’ll be sharing various pieces very soon.
On the podcast front, we got to speak to the CEO of Fastmail on our podcast, and that was a blast. Funny story, we ended up having to cut part of the interview because he went into such technical depth on the email front that most of our audience wouldn’t follow it. Bron is incredibly smart and knows more about email than I know about tea & crumpets. So that was a great relationship to build.
Hey, you’re finally here. The part where I look at everything and think about what I’m going to start doing or stop doing. The New Years’ resolutions, I suppose. So I’ll list them out:
- We will never do a major release of Fathom again. We said this when we did Version 2 but we mean it this time. Delaying functionality for the sake of a major release is quite exhausting. Once Version 3 of Fathom is live, we’ll only ever be doing incremental releases, meaning more regular updates
- I need to get back into shape. I joke about this on our podcast, Above Board, but I’m going to commit to it this year. We’re fortunate enough to have a home gym so I have no excuse. I’ve done it before, I just need to prioritize it. Maybe I’ll find some other developers/business owners and we’ll keep each other accountable
- Coffee is here to stay. I started a big discussion on Twitter this year about coffee, and I kicked it for a few months. But I’ve started drinking cappuccinos again and, to be honest, I’m cool with the addiction. I love a good cup of coffee, it fuels my work and I don’t care anymore. It’s not crack cocaine, it’s caffeine.
- One thing at a time. This is probably my biggest flaw right now at a professional level. We are working on about 10 different projects right now. They just creep up. We get 80% of them done, and then something else takes priority. And honestly, it’s mostly a Jack issue, I don’t think Paul (Fathom co-founder) has ever had this problem. So I’ve started focusing on getting one thing done at a time, and it will lead to better results. And the good news is that I’m currently finishing things off so we’ll be able to get a whole bunch of stuff out of the door
- Keep saying no. I used to read about how “saying no” is the big challenge for entrepreneurs and I thought it was nonsense. Well I was wrong. I get emailed all the time about random opportunities, investment, acquisitions, consulting, you bloody name it. And I’m finding myself letting emails go and saying no to so many things. It feels good.
- Keep writing. I never used to write. I’ve had a ton of feedback on my writing and people have no idea how much I appreciate it. I get comments about my technical writing and it motivates me. In addition to that, I get negative comments about the various language I use in my blog posts, so it’s a good balance that keeps me humble. But people are reading my posts :)
- Continue to help people. I can’t reply or say yes to everything but I try to help people where I can. I have no time for consulting these days but I always try my best to reply to emails.
It’s not all good news
I am writing this recap a few days after learning that my 4-year-old German Shepherd, Saxon, has a form of leukaemia, and the vet thinks he’ll be dead within 2-4 weeks. Honestly, I’m still completely devastated about the whole thing, and I don’t think I’ve accepted it yet because he’s right next to me sleeping as I’m writing this. So although I talk about a lot of great stuff publicly, it’s not all roses in my life. My nan died a little while ago too, and that still doesn’t feel real.
2020 has been a hard year for a lot of people, for so many different reasons. And whenever bad things happen in my life, I think about something I heard on an episode of The Ricky Gervais show many years ago, about how if we took the sum of the world’s problems, and we were each offered an equal share, we'd say no thanks and stick with our problems.
Edit: Thanks to Trek, I have the original quote:
"If all our misfortunes were laid in one common heap, whence everyone must take an equal portion, most people would be content to take their own and depart."
Never assume your dog will live for 9 years. Don’t get attached to the idea that your dog will grow up with your daughter and that they’ll be best friends. Cherish every moment with your dog, or any pet, or any person, because life is fragile and everything is temporary.
And for Saxon, well, only the good die young.