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…