Development
A collection of posts about Web Development, whether it be problems I've faced, solutions I've found, cool stuff I've been trying out or new projects I'm working on.

Laravel Live UK 2026
I am writing this from the comfort of my garden, just a few days…

Using Cursor Security Agent
Last month, we received a report from a security researcher via…

Laravel Moat
I've been on a bit of a security drive recently, what with all…

Laravel Pulse now supports `use_upsert_alias`
We hit a bit of a bug in a couple of our Shopify Apps this week.…

PCOV for code coverage
In Some ways of speeding up your tests I mentioned about using…

Using PHP Enums for Laravel Shopify
I recently announced that I've became a maintainer for the…

I'm now a maintainer for Laravel Shopify
I'm excited to announce that I'm now a maintainer for the…

Adding Video Support to the Laravel AI SDK
One of the Shopify Apps I've been working on recently uses…

The Github Security Advisory Process
A few weeks back, I woke up to a text from my good friend Sam…

I'm now maintaining Elephpant.me
Over the last couple of years, I've been using and contributing…

PHPUK 2026
February is a month I look forward to because it’s time to head…

My Laravel Cloud Bucket List
I've been using Laravel Cloud for a bit now to test whether it's…

Thoughts on the Laravel AI SDK
This week I took the Laravel AI SDK for a spin! It hasn't…

Livewire 4
I'm a big fan of Livewire, the SaaS I've been building for the…

Some ways of speeding up your tests
At work, I've been focusing on getting the test suites for our…

Trying out Vitest
For our Shopify Apps at work, we have a fantastic PHP test suite…

Trying Laravel Pinout
At Laravel Live last year, I got to watch a talk by Dan Johnson…

Flaky Tests
If you're writing tests for your application, you've probably…

Laravel Rules for RectorPHP
I'm a huge fan of RectorPHP. It makes upgrading your codebase so…

SaloonPHP now has a Leaky Bucket
One of the many things I've been working on lately is adding…

Why I'm not a fan of certifications
I've seen a bunch of stuff on Twitter recently about developer…

Laravel Telescope Integration for SaloonPHP
This week, I've been working on getting Laravel Telescope…

Integration Prompts for SaloonPHP
I've been using SaloonPHP for a while and one of the things I've…

Laravel for non-tech folk
I work with a lot of people. Some of them are engineers, some of…

Move over PECL, it's time for Pie
One of my favourite talks at Laravel Live UK earlier this year…

The State of PHP 2025
Every year, Jetbrains run a survey called The State of PHP and…

Composer `setup` Command
Did you know that composer has a setup command, in which you can…

New Laravel Forge
I've been using Laravel Forge for a couple of years now and it…

Opinionated Starter Kit by Nuno Maduro
Nuno Maduro recently dropped his own starter kit for Laravel…

Laravel MCP Beta
Recently, the Laravel team launched the beta of the Laravel MCP…

Redactable Models
Redacting data in models is important, depending on your…

Filament v4 is now Stable
It's a happy day for Laravel and Filament fans because Filament…

Profanify is in Pest V4
I'm super proud to announce that Profanify, my Profanity checker…

Laravel Boost
This week, I took Laravel Boost for a spin. Boost is a new…

PHP 8.5: Fatal Error Backtraces
This is the 3rd in my mini series, exploring some of the…

Laravel Idea is now FREE
If you use PHPStorm, chances are, you've either heard of or are…

PHP 8.5: Diffing the ini file
This is a follow up post to the first in this mini series where…

Laravel Pint can be ran in parallel
One of my favourite features of PestPHP is the parallel…

Faker Stripe V5 is now out
I'm happy to announce that V5 of Faker Stripe has been released!…

Laravel Live UK Recap
Earlier in week, I headed down to London for Laravel Live 2025.…

PHP 8.5: Pipe Operator
PHP 8.5 is fast approaching. I wanted to look at some of the…

Celebrating 30 years of PHP
Jetbrains has recently announced that it's hosting an event…

Junie for PHPStorm is pretty good
This week, well, mostly today, I've been playing around with…

You should have a decent CI/CD pipeline
It'll save you a lot of time... Since starting work on the SaaS…

I finally got round to using Laravel Pulse
I've wanted to use Laravel Pulse for a while now but could never…

Profanify now supports Danish 🇩🇰
Earlier this week I tagged v3.15 of Profanify! This release…

Grok is amazing at building games
I decided to give Grok Studio a try over the past week as I'm…

Why choosing the right AI model is important
The SaaS I'm currently building integrates with the OpenAI API…

FluxUI is fantastic
I'm currently working on a SaaS and early on in the development…

A healthcheck endpoint is one of best things you can add to your API
Whilst scrolling on Twitter earlier (yes, I still refuse to call…

Introducing Squeaky
It's been a while since I've created a new package, so I'd like…

Lawman 4 has been released
It's been a while since I've made any updates to Lawman but I've…

Dutch Support added to Profanify and how you can contribute
I'm happy to announce that now has support for the Dutch…

A tip for dealing with Google API's
The SaaS I'm helping build does a lot with Google API's. In…

Upgrading to PHP 8.4 with Laravel Forge
This week I decided to upgrade the SaaS product I'm helping…

Importing 1.7 billion rows of CSV data from Stripe with PHP
This post is inspired from a Tweet Christoph Rumpel put out…

I spoke about Github Actions
Every month at work, we have a Tech All Hands, where our…

Laravel Cashier is awesome!
I recently had a reason to dive into Laravel Cashier when it…

Help the Yeti during Debug December
Sentry have a pretty cool challenge running for December called…

PHPStan 2.0 has been released and how to get a new ElePHPant!
Earlier this week, creator of released PHPStan 2.0 🥳 PHPStan…

One of the many reasons I love Laravel Forge
If you've seen my previous posts, you may know that I'm…

Vonage Knowledge Quest & Adding Alex to my Herd
Earlier this week, I had the pleasure of joining for the first…

Profanify v3.3 has been Released
It's been a couple of months since I first released , the…

Monitoring Using Oh Dear
I've mentioned a few times on this blog that I'm currently…

What's new in PestPHP v3
Now that is over for another year, it's time to look forward to…

Announcing Profanify
This weekend, I decided to work on a new plugin for . If you…

Lawman surpassed 1000 downloads!
I launched Lawman earlier this year to make it easy to bring the…

I spoke about PestPHP
At work, every 6 months, we rent a theatre and all of our…

Parallel Testing with PestPHP
You may have guessed that I'm a big fan of PestPHP and one of…

I spoke at Teesside University
Well, this morning was quite an interesting one as I gave a…

My First Time with Livewire
I've been looking into Livewire for quite some time now, but…

Lawman for SaloonPHP
So SaloonPHP received a new plugin this week! The plugin is…

Alternate Design Patterns with SaloonPHP
So if you've used SaloonPHP, you'll know it's pretty awesome. In…

Testing Backed Enums with PestPHP
PestPHP has had the toBeEnum() Expectation for a while now and…

Method Selection in the SaloonPHP Laravel Plugin
I'm a huge fan of SaloonPHP created by my good friend Sam Carré…

Faker Stripe v3.1
I've just released a new version of Faker Stripe! This is a…

The Saloon `list` command
If you're using Laravel for your application and Saloon for your…

PestPHP `isUrl()` Expectation
I added another Expectation to PestPHP recently! I'd like to…

PestPHP `isBetween()` Expectation
This week in my free time, I've been working on a new…

PestPHP `toHaveConstructor()` and `toHaveDestructor()` Expectations
This past weekend, I decided to add a couple more Architecture…

I added some additional Expectations to PestPHP
If you're familiar with PestPHP, then you might also be familiar…

Laravel Uninspire
If you're familiar with Laravel, then you might be aware of the…

How to get Saloon to work with Laravel Zero
I have been using the amazing Saloon to handle my API…

How to check for incorrect env usage in Laravel with Pest
If you're using Laravel, then you should be familiar with the…

How to check for leftover debug code with Pest
We've all done it, committed to Git with a rouge dd() in our…

Faker Stripe on Laravel News
Well, what a brilliant surprise! I noticed that my Faker Stripe…

Announcing Faker Stripe
Making my own PHP package is something I've wanted to do for the…

Laravel Pint
Pint is a PHP CS fixer, built on top of PHP-CS-Fixer. It's a new…

Ghost Finally has Native Search
July 12th 2022, was a glorious day for any fans of Ghost because…

calebporzio/sushi
On a project I've been working on recently at work, I needed a…

Conditional Job Chaining
One of my recent projects at work had me working with jobs and…

The Power of the Gist
I save a lot of stuff that helps me out with my work day to day,…

You should be using Dependabot
As a Developer, Dependabot is fast becoming one of my favourite…

Code Highlighting in Ghost
Ghost currently doesn't ship with Code Highlighting, you can…

How OctocatBot Works
OctocatBot is one of the handful of Twitter bots I've built and…