I'm a web-developer and tech-enthousiast writing about the same two topics. Currently living in Antwerp, Belgium and working at Spatie. Want to know more?

One of my favourite memories is staying up late when I was fourteen. Some friends and I were running an illegal server hosting company over Teamspeak. As I wasn't allowed to use my laptop on school nights I had built my own computer and hidden it behind my desk. Using a self-soldered VGA to S-video connector I enjoyed late-night coding sessions in 480i. Switching to a random TV channel every time I heard one of my parents outside of my room.

Now, 15 years later I'm still into the same things. I enjoy learning new things, building applications, messing with new hardware and tinkering with random electronics.

Tell me less.

Converting HTML to PDF using PHP

If you spend enough time building web applications, it's likely that you will eventually need a solution for generating PDF documents. Consider scenarios like invoice PDFs, printable tickets, gift vouchers in email attachments or printable shipping labels. Let's look at four options to accomplish this in a PHP application.

Measuring caffeine intake at Spatie

For a while now, we've had some empty space on our office dashboard. One of the more interesting ideas that we came up with, is a tile that can count the number of coffees brewed at the office based on a Raspberry Pi listening to the coffee machine.

Setting up and securing a private Composer repository

At Spatie, we host several packages on a private composer packagist server using Satis. In the first of this two-part blog series we'll take a look at how we're distributing these packages by hosting our own private Composer repository using Satis and how you can do that too.

Private Satis authentication backed by Laravel

In part one of this two-part series we looked at setting up a Satis repository for our private GitHub packages. Now that we've got a basic Satis server running, let's look at the options to secure this server.

Comparing DNS records on two nameservers

We've all been there: you've just manually copied 30+ DNS records from one server to another and you're about to press the metaphorical red button by updating the domain's nameservers. If only there was a way to make sure you've copied everything correctly...

Some notes on slow queues and Redis over TLS

When playing around with a load testing tool and Laravel queues I started noticing a weird pattern: every 22 dispatched jobs, there would be a 5 second delay on all queues before dispatching the next set off jobs. This only seemed to be the case using a DigitalOcean Droplet and their managed Redis servers.

Open‑sourcing Tinker.app

Back in 2017 I started working on Tinker.app: a hosted, in-browser version of Laravel's Tinker tool. It allows you to run and debug PHP code straight from a browser window. As an added bonus, package creators would be able to sandbox and demo their Laravel packages using embedded Tinker.app sessions.

Enable early access Metal support for JetBrains IDEs

JetBrains probably has some of the best IDEs out there. However, if you've ever used one for more than two minutes, you'll know it's not their speed that puts them on the leaderboards. Project Lanai looks to (partially) solve this by using Apple's Metal API to render the application. Let's look at how we can enable an early access build with Metal support on any JetBrains IDE.

Advanced Laravel migrations using temporary tables

If you've ever ran a big migration in Laravel before you might know there are a lot of things that can go wrong. Processes go out of memory, migrations crashing half way through leaving some data unmigrated, rollbacks going wrong, etc... Let's see how we can avoid all of the above when creating a somewhat more advanced migration.

Bringing TeamSpeak voice notifications to Discord

In the past few weeks my friends and I spent quite literally day and night on Discord's voice chat. This inevitably brought back some good memories from the Summer nights we spent playing games and chatting away on TeamSpeak. And even though Discord is pretty great, there's one TeamSpeak feature missing to complete the nostalgia trip: the obnoxious voice notifications. Let's bring them back. _User joined your channel_

Running Laravel's scheduler without setting up CRON jobs

Scheduler is a tiny shell script to run Laravel's scheduler every 60 seconds, without having to configure any CRON jobs.

How migrations might be slowing down your Laravel tests

Over the years I've read a lot of interesting posts about speeding up PHPUnit. The last one being a pretty good summary by Laravel News (link in article). Remarkably, there's one trick that wasn't mentioned in any of these articles. I swear this is not clickbait.

Fixing Imagick's “not authorized” exception

Over the last few days we've had a couple of issues with Imagick and processing PDFs on our servers. As it turns out, these issues are caused by automatic security updates. Let's look into the issue and its solution.

Quickly set up existing Laravel projects

Lately, a lot of cool shell aliases and functions have been posted on Twitter. I've decided to join in on the fun and create a shell function for something I do about 5 times per day: setting up an existing Laravel project.

How to ‘hack’ and win the May Mayhem blog contest

I feel like programmers are often as good at breaking things as they are at fixing things. Part of the thought process of programming anything new is figuring out its flaws, weaknesses and possible exploitations. As a web developer, I often find myself applying the same thought process to everything I see and read about online. Including Laravel's May Mayhem blog contest.

Building APIs with Laravel Query Builder

If you've ever worked on any medium sized API I'm sure you quickly discovered a lot of frequently occurring patterns. Parsing the query string, retrieving necessary models, filtering, sorting, adding pagination and finally encoding the data as JSON. Creating a new endpoint quickly becomes an exhausting chore of making the same decisions repeatedly. To make some of these decisions for us, we built our latest package: laravel-query-builder.