This project had been brewing in my head for a long time. Years, actually. But between the day I told myself “OK, it’s time” and the launch, about two months of evenings and free time went by. Being your own client is a strange exercise. There’s nobody to blame for the specs, and nobody to tell you it’s good enough. And it’s never good enough until you let go!
Craft CMS 5, while waiting for 6
WordPress was ruled out from the start, for reasons I won’t go into here (they’re explained in this article). As for choosing Craft CMS, that decision was made long before the first line of code. It’s not a knock on Statamic, quite the opposite. It’s an excellent tool, which I mostly use for lighter sites, like landing pages or informational sites that don’t change much. Statamic could do more, but Craft is built for large-scale sites, and I wanted mine to be one.
Plain Laravel? It was never on the table; that’s not what it’s made for. Craft 6, on the other hand, which will be built on Laravel, a framework I already use every day, seems like the perfect recipe to me. I can’t wait! But version 6 wasn’t ready and I couldn’t wait, so the site runs on Craft 5.
The migration will come. It will be my dress rehearsal before moving over the sites of clients who want to make the jump too. In other words, I’ll be my own guinea pig.
Tailwind, and no Vue (for once)
On the front end, Tailwind CSS was a given: in my opinion, it’s the most versatile CSS framework. I first thought about adding Vue.js, which I use a lot in my applications. Looking more closely, nothing on this site called for reusable components. So I went with “vanilla” JavaScript, split into small modules. Fewer dependencies, less weight, fewer things to update. Sometimes, the right tool is no tool at all.
The fonts are hosted on the site’s own server rather than loaded from Google Fonts. It’s faster, and it avoids sending visitors’ IP addresses to a third party.
Forge, even without Laravel
For hosting, I had several options. I chose Laravel Forge, even though Craft 5 isn’t a Laravel application, because it’s the tool I already use for my other projects. The site has its staging environment, a private copy where I try out every change before putting it online, and its production environment, meaning the site you’re visiting right now. Images are stored in DigitalOcean Spaces, and Craft automatically resizes them and converts them to WebP. Why? Each device gets an image at the right size rather than a big file meant for a large screen. And WebP is much lighter than JPEG or PNG at equal quality. The result: pages that load faster, especially on a phone, and less data used by visitors.
Bilingual, because why not
The short answer: why not? And no, it’s not delusions of grandeur. The real reason is Cookie Consent Kit. I first created this extension for my own needs, then released it on the Craft and Statamic marketplaces. Its documentation therefore had to be in English, for the global market.
A site where only some parts are in English seemed half-baked to me, so I went all in. And multilingual Craft is a delight, for the developer as much as for the editor. In this case, I’m both.
A homemade consent banner
The site also served as a sandbox for building Cookie Consent Kit. I was fed up with paying for a licence, site after site, for a cookie consent extension that didn’t quite meet my needs and hadn’t been designed with Quebec’s Law 25 in mind. So I decided to build my own, tailor-made. I designed it the way I wanted, with a clear table of every cookie that’s set. It also adapts to any site: out of the box, it offers a light theme and a dark theme, fully customizable to match any brand’s colours. One thing never changes, though: the “Accept” and “Reject” buttons stay on equal footing, as Law 25’s consent rules require. And all of it was put to the test right here, on this site! It’s free for most uses, so I hope others will benefit from it.
The hardest part: selling myself
For my clients, I usually know how to make them shine. After talking with them and taking the time to understand their market, their products and their vision, the words come. For myself, it’s another story. I’m not the bragging type, and I do a lot of my work behind the scenes. Finding the right words to present my own work was, by far, the hardest part of the project. Much harder than the code. Same thing for the testimonials. I asked a few clients if they’d be willing to write a few words for me, no pressure, and just asking made me uncomfortable! But I have wonderful clients: they said yes right away and got back to me quickly. You’ll find their testimonials in the Work section.
The best surprise
Finally bringing to life what I’d had in mind for so long. The result is exactly what I imagined. The geeky vibe is fully embraced, with its bits of code and its terminal, but the site stays pleasant to browse for people who don’t speak PHP. From my head to the HTML, a perfect copy!
If I had to do it again
I wouldn’t change a thing, except maybe the timing: I should have done it much sooner. But I don’t regret waiting either. Today, AI assists me in my work and lets me go even further. In fact, I built this site with Claude, my faithful sidekick, always ready to test my most perilous ideas.
For the curious
Oh, I can already hear you: PHP is dead. If that were true, I really wonder why it still powers about seven out of ten websites, Wikipedia included, and why it gets a new version every year. For a dead language, it’s alive and kicking: it keeps improving, adapts to the most modern standards and keeps getting faster!
| Layer | Tool |
|---|---|
| Language | PHP 8.5 |
| CMS | Craft CMS 5.11 |
| Database | MySQL |
| Custom code | Custom Craft module |
| Templates | Twig |
| CSS | Tailwind CSS 4 |
| JavaScript | Native JavaScript, in modules, no framework |
| Build | Vite 8, connected to Craft with the Vite extension (nystudio107) |
| Rich text editor | CKEditor 5 (Pixel & Tonic) |
| SEO | SEOMate (Værsågod) |
| Forms | Contact Form (Pixel & Tonic) |
| SendGrid (PutYourLightsOn) | |
| Consent | Cookie Consent Kit (Québec Studio) |
| Files | DigitalOcean Spaces, with the DigitalOcean Spaces Volume extension (Værsågod) |
| Fonts | Inter and Titillium Web, self-hosted with Fontsource |
| Package manager | Bun |
| Hosting | Laravel Forge (staging and production) |
| Coding assistant | Claude Code (Anthropic), with Claude Opus 5.5 (1M) |
Wrapping up
Everything you see here is the same tools and the same way of working I bring to my clients’ projects. And for the curious who’ve read this far, a little reward: I’ve recently hidden a few surprises all over the site. I won’t tell you where; that would spoil the fun. While digging around, you might find a few bugs (I’d be surprised, but if you do, please report them to me), but more likely some ghosts! A few hints, though: try copying this article’s link, especially if you’re a Mortal Kombat II fan. Also try unlocking your 30 lives, or sneaking behind the scenes of the site through its terminal. Happy hunting!
And at this point in your reading, you’ve surely unlocked an achievement already!
Richard, his own most demanding client