A recap of 2021
Now that we are in the final days of 2021, let's take a look back at that stuff my team and I did in 2021.
On a personal level
I don't want to focus too much on my private life, as I'd like to keep that private.
At the start of this year, everybody thought that the pandemic would last for a couple of months more. After that, we would regain our freedom. Unfortunately, things turned out a little bit different.
I consider myself very lucky as my girlfriend and my two sons (now 7 and 9) are not impacted by the pandemic too much. Sure, we all got covid at some point this year, but we all recovered very quickly, and it didn't leave any lasting effects.
When I look a little further than my household, I see that some people dear to me have suffered a lot in the past year and continue to do so for various reasons. Before this year, I naively thought that bad things wouldn't happen to me or to people close to me. I guess I'm lucky that everybody around me was doing ok for the 41 years I've been on the planet.
This ongoing situation did colour most of the things I did in the past year, putting things in perspective. I still like working and creating open-source, but I more than ever realise that other things are essential. I'm grateful that I am in good health can work on the things I love.
Improving the home office
I've worked a lot from home in the past year, as working together in an office was discouraged by the government.
I made some improvements in the home office. Here's how it looks right now. For these pictures I turned the lights up to full brightness, usually I like to have it slightly dimmed. These were also taken at the night time, during the day, there is light coming through that window.
To learn the hardware and software I use for my work, read my uses page.
You'll notice a few LEGO sets in the pictures above. This year, I built these two big sets: the Colosseum and the Millennium Falcon. I've also built a small one: the Bonsai tree, which was a gift from my colleague Seb. Although I'm not a big LEGO fan and won't likely buy another one of the big sets, I did enjoy building them; it was a very relaxing experience.
All my life, I've been playing in bands and creating music. This year, again due to covid, we couldn't rehearse for long periods. This made me decide to have some more musical instruments in my home. My band I now often record things at our home and ping pong recordings to each other. We've made a couple of excellent songs this way, which we'll hopefully release at some point in time.
I also recorded a few songs on my own in my home office. Here's one of them.
Music I listened to a lot
Here's some of my favourite music that I had in high rotation in the past year:
- Jeff Parker - For folks
- Skee Mask - Pool
- Lee Ranaldo - In Virus Times
- Gil Evans - The Individualism of Gil Evans
- Low - Hey What
- Herz Aus Glas - Subtanzen
- Kid Cudi - Man On The Moon
- For Those I Love - For Those I Love
- F.S. Blumm & Nils Frahm - 2X1=4
- LoneLady - Former Things
- Tomaga - Intimate Immensity
- Sofia Kourtesis - Fresia Magdalena
Spatie had a very successful year again. We released a highly successful product: Ray. Many features and improvements were added to Flare, making the best exception tracking for Laravel even better. We also shipped major updates to existing products and launched a couple of new courses.
Releasing open source
Before heading into the products, let's take a look at the open-source efforts from our team. At the moment of writing, our packages have been downloaded 215 million times, and they are being downloaded 12 million times a month. I think this is pretty impressive, certainly considering that none of these packages are in the Laravel core but stand on their own.
Here's the list of new package that we released this year:
On average, we released a new package every two weeks. Believe it or not, this is less than the previous years.
Our client work has always driven our open-source efforts. Currently, we are working on a couple of long term projects for only a handful of clients. So, it's expected that the open-source output is a lit bit less.
One of the most fun ones to work on are the ones that immediately add a lot of value to your Laravel app: such as laravel-health, laravel-support-bubble, and the soon to be released laravel-comments.
Ray is a desktop application that can help you to debug faster. It's beautiful to look at and dead simple to install and use.
In mid-2020, the author of x-debug tweeted this controversial statement.
PHP developers that don't use Xdebug for debugging are amateurs.— Derick Rethans (@derickr) June 20, 2020
Many people, including myself, strongly disagree with Derick on this one. This tweet made me think about the pros and cons of dump and die debugging and how to fix the downsides. You can read more on this thought process in the Ray announcement post.
Instead of letting cluttering your web page or CLI with debugging output, my idea was to send it to a dedicated window, where we can render the output beautifully and pair that with a very easy to use API.
I first made a proof of concept using Livewire, because that's the technology I could most quickly build something like this.
The codename at the time was Timber (that name was inspired by you sending logging information to it). It started as an open-source project that was built using Livewire. The idea was to have a package that made it easy to send things to the application log and display it on a Livewire powered webpage. That package was actually released; it's called laravel-log-dumper.
When using this Livewire page to debug, I immediately felt the pain of having the debug output in a browser window. It would be better to display the info in a floating window that is always displayed above all others. I decided to rewrite that Livewire page to a simple Electron app. Here's how that looked like.
After using it for a couple of months, we saw a lot of potential in the idea and decided to launch it as a proper paid product. Multiple team members helped with designing the UI and refactoring the codebase. We also decided to rename it to Ray. The loose meaning is that this application can shine a Ray of light on your app or that it's a Ray a light when you're in the dark debugging.
We shared Ray with a couple of friends to get early feedback. Ray was released in early January in this Livestream.
I remember being very nervous as I had no clue what the reactions to this idea would be. Luckily, a lot of people seemed to love it. Up until this day, we still add features to Ray regularly and are planning a v2.0 mid next year, with some very cool features.
Ray has exceeded our expectations. We sold thousands of licenses and reached revenue numbers with six digits. For me, the biggest reward comes from people saying how much faster they can debug and how useful it is. It may sound corny, but even though the money made is very nice, this kind of feedback makes me feel that Ray positively impacted many people, which is the most important thing.
Flare is the best exception tracker for Laravel applications. It was launched about 2,5 years ago at Laracon EU.
This is what I had to say about Flare in last year's recap:
Flare is a fantastic product that got too little of our attention this year. Flare did grow, but in our opinion, not enough.
I'm happy to report that things have been different for Flare this year. In the final months of 2020, we focused on internal refactors to stabilise the application and power upcoming features.
This year we delivered on our promises and launched a whole list of new features of improvements.
We now recognise exceptions coming from Livewire components. For those exceptions, we display a Livewire tab.
That tab displays the entire state of the Livewire component in which the exception occurred.
When an error occurs inside a job, we now show all properties of that job, and this will potentially help you fix the problem faster.
We've also added a new timeline at the top of a project, so you can see when errors did occur.
The search field itself gained autocompletion, so it's easier to hunt down particular errors:
These are the things that stand out, but we did a whole lot more. You can read the entire overview in this post at the Flare blog.
We're delighted with the current state of Flare. We're using it for all of our projects and think it is the best exception tracker for Laravel apps. In the past year, we've seen a significant uptick in MRR which, unlike last year, is according to our expectations.
We still believe that there is much room for growth both feature and money-wise, so we'll continue pushing new features and our marketing next year. I can already share that early next year, both the marketing site and the app itself will get a beautiful new coat of paint.
Mailcoach is a self-hosted platform to send out emails affordably. You can use it to send regular email campaigns using an email provider of your choice.
In March, we shipped a new major version: v4. This version offered:
- a new design
- drip campaigns to send automated emails based on the activity of your audience
- administer and log transactional emails from your application.
You can see those features in action in this video.
Mailcoach v1 was the first product we ever shipped, and it has done much better than expected. Since launching v4, we got a lot of positive feedback for the drip campaigns functionality. We now use Mailcoach ourselves to send out all promotional mails for spatie.be, and personally, I use it for the newsletter of freek.dev.
Next year, we launch v5, which adds compatibility with Laravel 9, we'll streamline the sending behaviour even more. We'll also make it much easier to get started with Mailcoach.
Laravel Event Sourcing
Next to creating digital products, Spatie is working on a couple of big client projects. In one of those projects, event sourcing is being used in a big way. In that particular project, we use our homegrown Laravel Event Sourcing package.
Because we were building up so much practical knowledge on how to event source in a Laravel app, we decided to build a course around it called Laravel Event Sourcing.
Together with the course, we've also built an app called Laravel Shop, where the principles explained in the course are put into practice. This app is available in a private repo where everybody who buys the course gets access to. There's now a friendly little community that can help each other with questions around event sourcing.
Because the knowledge in this course is very specific, we decided to price it a bit higher than our other course. The course didn't sell as many copies as the other courses, but the result was still good because of the higher price.
A couple of years ago, Adam Wathan launched an excellent course on testing in Laravel. This course is where most of the developers in our team learned testing from. Even now, the course holds up pretty well. But Laravel hasn't been sitting still. Over the years, many new methods were added to make testing easier, together with excellent features like parallel testing.
Testing is a fundamental skill for every developer. Unfortunately, in many programming courses and schools, there's a high focus on building things and not on automatically testing them. That's why we thought it would be a good idea to create a new, up-to-date testing course for Laravel.
Because Pest's intention of providing the best DX possible aligns so much with Laravel's similar goal, we think that it's only a matter of time that Pest becomes the default (or at the very least a heavily used) test runner for Laravel.
When we started out creating our Testing Laravel Course, we had to decide if we would use PHPUnit or Pest as the test runner. We could have explained everything using PHPUnit and then added a couple of videos about Pest as a supplement. But for newcomers, this would not have been very clear. That's why we decided to record the whole course twice: a flavour with PHPUnit, and another flavour with Pest.
To promote the course, we created a Testing Tidbits drip campaign. Subscribers get one testing tip a day in their mailbox.
Because testing is such a broad and evergreen subject, the potential audience for Testing Laravel is larger than, let's say, our Laravel Event Sourcing course, and this also showed in the sold quantities. Testing Laravel did very well and continues to sell. We hope that this course will enable many developers to write better code because it's backed by tests.
Next year, Laravel 9 and Pest v2 will get released. We aim to record a couple more videos on the new features so the course stays fresh.
Laravel Package Training v2
We think we're good at creating packages. That's why a couple of years ago our very first video course was on creating packages. The success of that first course allowed us to continue creating all the other ones we've done since then.
But like most things in IT, the way we create packages evolves. In the initial course, we used both our PHP package skeleton and Laravel package skeleton. These skeletons were also vastly improved over time. Because what you saw in the package video course didn't match these skeletons anymore, we decided to record a new version of the course.
Laravel package training v2 was released near the end of the year. As this course is an update, and we didn't push the promo as hard as with other releases, sales were also moderate compared to the other courses. But because of the quick production time (it only cost us about a week or two to create the update), we're still happy with the results.
Plans at spatie.be for 2022
We don't want to share too much information on upcoming things, but we can already that say that:
- we will launch Mailcoach v5 early next year
- Ray 2.0 with some awesome features will arrive in the first half of next year
- we're already busy creating a new course, no ETA yet
- we're experimenting with something very cool, and we might create a SaaS out of this
- there's another product that of which we have a working proof of concept, but we still need to polish it
So yeah, lots of things to do!
Meanwhile, we're also going to keep on doing client work. You might find this odd as we have a good portfolio of digital products. Many of our team members still love doing client work from time to time. By doing so, we learn many things about how Laravel and related technologies are used in real-world projects.
I didn't do a single talk at an in-person event this year because there weren't any. I really start to miss this.
Instead, I've focused on streaming on YouTube from time to time. Whenever one of my colleagues or I create a new package, I now have the habit of demoing and source diving it on a stream. I've also had the honour this year to host a couple of Laravel Worldwide Meetups. Every month, my buddy Christoph and I did one of our casual artisan calls which I very much enjoy.
Around the middle of the year, I also improved my streaming setup. As a webcam I use a Sony a6400 camera with a Sigma 16mm 1.4 lens. It is connected to my computer via an Elgato Cam Link 4K. To get more customisation options while streaming I went from StreamYard to Ecamm Live. This also allows me to stream in glorious 4K.
Here are a couple of my favourite streams of the past year.
You can view all the streams I did on my YouTube channel or the beautiful Larastreamers site.
At Oh Dear
I've been calling Oh Dear an uptime monitoring service, but that isn't true anymore. Like most uptime services, Oh Dear can monitor your homepage, but additionally, it will crawl your entire site and report any broken links. It can also monitor your SSL certificates, crawl your website for mixed content, and monitor your scheduled jobs.
This is much more than simple uptime monitoring, so from now on, we'll call Oh Dear the all-in-one monitoring tool for your entire website.
Much like in 2020, my buddy Mattias and I worked hard on improving Oh Dear.
The most notable changes are that we added two new check types. First up: Oh Dear can now monitor your DNS records. We'll show your DNS records in a pretty UI, notify you of changing DNS records, and tell you when we've detected a problem with your domain nameservers.
The second new check type is application health monitoring. Using Oh Dear, you can now monitor various aspects of your application and server. This way, you could get alerts when:
- disk space is running low
- the database is down
- the load on your server is too high
- Redis cannot be reached
- mails cannot be sent
You can monitor any aspect of your app that you want. You can learn more about this feature in this blog post.
One of the most significant improvements we made was under the hood. We managed to cut the number of queries that Oh Dear performs each second in half. You can read more about this major refactor in this blog post.
This year, we've also added monthly site reports, revamped the user, team and billing sections, introduced private status pages, allowed sites to be grouped, added advanced user management and guests, added a support bubble, enabled monitoring password protected sites, ... and much more. Feature-wise it was a massive year. In this blog post, you can read a nice summary of everything that happened at Oh Dear in 2021.
I've been calling Oh Dear a side project, but that also isn't true anymore. Like last year, we managed to double Oh Dear's MRR. Both Mattias and I could now live comfortably with the profits we make with Oh Dear. But rest assured, I don't have any plans to leave Spatie. Working on stuff at Spatie is my main thing for years to come, with Oh Dear being a profitable side hustle.
I can already share that we're working on a total redesign for Oh Dear. I'll be coding the backend changes, and we've hired some help for the front end. Here are some preliminary screenshots of how Oh Dear might look in early 2022. Good times ahead!
The freek.dev blog
This blog is now seven years old. That's an eternity on the internet. Although I feel like I wrote a little less this year, there were still some good posts that I'm proud of. Here are some good ones:
- Introducing Ray: a debugging tool for pragmatic developers
- Simplifying service providers in Laravel packages
- How to customise Jetstream and Laravel Spark
- Execute Artisan commands on remote servers
- Why and how you should remove inactive users and teams
- Handling console signals in Laravel
- Develop faster by adding dev routes file in a Laravel app
- How to render markdown with perfectly highlighted code snippets
- Strategies for decreasing the number of queries in a Laravel app
- A Laravel package to crawl and index content of your sites
- My current setup (end 2021 edition)
- Our improved changelog workflow for packages
- A bash function to run tests for both PHPUnit and Pest
- A Laravel package to monitor the health of your application
- Fixing the dreaded "'pcre2.h' file not found" error when installing imagick
Of course, this is only a small selection of the new content on my blog. You can see all posts I've written myself in the originals section.
Full Stack Europe
This is going to be a short section. Due to the pandemic Dries, Rias and I couldn't organise the full in-person conference this year. Instead, we held a couple of online workshops, which were great, but of course didn't have the feeling of an in-person event.
Hopefully, 2022 will be a better year to organise our conference again.
Even though 2021 wasn't the year we got rid of the pandemic, it was a good one. I'm proud of the things my team and I have accomplished.
Here are links to recaps I wrote previous years:
I hope you had a good year, and I look forward to what we all will do in 2022.
Submit your recap here, and I'll add it to the list below.
- Luke Downing
- Amit Merchant
- Jeffrey van Rossum
- Christoph Rumpel
- Nuno Maduro
- Justin Jackson
- Kenneth Schabrechts
PLEASE ADD MINE ⬇️— MCDOUCHE (@phpdouche) December 22, 2021
2021 WAS MUCH LIKE 2020.
What are your thoughts on "A recap of 2021"?