Agentic commerce is one of those phrases that is currently doing a lot of work. It can mean an assistant buying a jacket for you, an AI travel agent assembling a trip, a coding agent purchasing one API call, or a research agent paying to unlock a single dataset. Those are very different products, but they share one important shift: the buyer is no longer necessarily a human in a browser, clicking…
Welcome to the USA In May 2026 I made my first trip to PHP[tek] , and my first trip to Chicago. Both had been on the list for a while. PHP[tek] is one of those conferences that comes up again and again when you talk to people in the PHP community: long-running, community-heavy, practical, and with a reputation for being very good craic. It more than lived up to that billing. I was lucky enough to…
In May 2026 I had the pleasure of speaking at phpday in Verona. It was my first time at the conference, and my first time in this part of Italy. phpday is one of those events I had heard a lot about from other speakers over the years, usually in the form of "you should really try to get to that one." Having finally made it over, I can see why it has that reputation. Good talks, a very friendly…
Stripe Session 2026 In May 2026 I made the trip back to San Francisco for Stripe Sessions . Last year was my first time at the US event, and I came home with a fairly comprehensive review , along with a renewed appreciation for just how enthusiastically San Francisco believes in hills. This year I was marginally better prepared. Running shoes packed, lungs braced for the hills, and Stripe Advocate…
If we're running a business on Stripe, chances are we've got a few different payment flows in play. We might have a full ecommerce checkout on our website, but also send payment links to customers over email or by phone for ad-hoc or in-person sales. Stripe's built-in email notifications cover all successful payments on our account, but what if we only want to be notified when a payment link is…
I was recently getting ready for a demo. Android Studio was running, the app preview was looking exactly how I wanted it, and all I needed to do was share that preview window in Google Meet. Simple, right? Not quite. Google Meet gives you three options for sharing: your entire screen, an application window, or a Chrome tab. The app preview I needed to show was one pane inside Android Studio, not a…
That's a wrap on Dutch PHP Conference for 2026! This was my second time speaking at the event, and it's quickly become one of my favourite conferences on the calendar. The talks are strong, the organisation is excellent, and the atmosphere strikes that rare balance between deeply technical sessions and broader conversations about where our industry is going. Four Conferences, One Community One of…
In February 2026, I had the privilege of speaking at ConFoo in Montréal - my first time at the conference, and my first time in Canada. Speaking at ConFoo 2026 The Talks I delivered two sessions at ConFoo this year: Boosting Frontend Page Speed and Avoiding Déjà Vu via Idempotency . How exactly do you pronounce "idempotency"? The Q&A after both sessions was thoughtful, challenging, and genuinely…
Migrating billing systems sits right at the intersection of "absolutely critical" and "terrifyingly risky". Get it wrong and you can double-charge customers, lose subscription history, or quietly break revenue reporting. It's the kind of project that keeps finance teams up at night, and engineers triple-checking spreadsheets at 1am. Stripe's Billing migration toolkit is designed to make this less…
The Tailwind CDN is a fantastic tool for rapid prototyping. Drop a single script tag into your HTML and you have access to every Tailwind utility class immediately - no build step, no configuration, no hanging around. It's perfect for quickly putting together a basic game , single-serving page, or letting an AI agent iterate on a design without friction. < script src = "…
In November 2025, I spoke at Build Stuff in Vilnius about creative defences against scrapers, phishers, and digital opportunists. It was my first time attending Build Stuff , and was a superb introduction to the conference. Build Stuff 2025 The Talk I delivered "Digital Cat & Mouse: Strategies to Outsmart Scrapers, Phishers & Thieves” - a talk blending practical defences, odd stories from real…
Expanding your online business internationally is easier now than it has ever been. With more and more people using digital payment methods, improved marketing and advertising tools make it possible to quickly find and serve new customers, all over the globe. While this growth is great, it does bring some new challenges. A key one is handling the cost of converting currencies between your local…
When watching videos on YouTube, I often toggle the playback speed to run slightly faster than normal. Recently, however, YouTube's playback speed UI has become strangely inconsistent - some videos still show the speed controls, while others show a locked "1x" option with no way to change it. Some have it, some don't! Fortunately, the solution is simple! Crack open the javascript console, and…
TL;DR Google quietly removed the &num=100 parameter that SEO tools used to load 100 results per page. That change wiped out millions of bot-driven "impressions" for positions 20–100 in Google Search Console data. Result: average position suddenly looks better , impressions drop , and actual traffic often falls . Your site didn't suddenly rank higher - Google just stopped counting the robots.…
As part of my day job, I spend a fair bit of time on LinkedIn, and have the app installed on my phone. I keep notifications fairly limited - there's always a nice dopamine hit from "X has commented on your post" or "Y liked your reply", and connection requests are genuinely useful. Recently though, LinkedIn started sending persistent notifications warning me that I might have missed other…
It's a rite of passage which will happen to most devs at one point or another. You're working on a system, there's some email-related functionality, and suddenly you're getting questions from a user about a weird-looking email they just got from your system. Oops! A cold sweat breaks out as you realise that testing real-world email paths from non-production systems is a high-risk activity and…
Lately we've been receiving a number of warnings from Google about sites we operate: Google has been notified that your site allegedly infringes upon the copyrights of others, and violates applicable copyright laws in your region. It is Google's policy to remove copyrighted content when the copyright holder or their authorized representative alleges that a use is infringing. Therefore we are in…
Recently I was working on a side project, EverythingIsShowbiz.com , a mostly-vibe-coded transcript search engine for the "What Did You Do Yesterday?" podcast. This being a rare case of "side project that actually got finished", eventually I got to the launch point, and the last few fiddly bits - setting proper title tags, open graph tags for social network sharing, and needing a favicon. What's a…
Anyone who has spent a non-trivial amount of time on the internet will recognise the following scenario. You click a button to do something online, waited a second, nothing seems to happen, so you click it again... and now your social media post is duplicated, or you've got two orders in your cart. Welcome to the world of broken idempotency! Where your API gets a nasty sense of Déjà Vu, reliving…
In early June, I had the please of giving a talk at the International PHP Conference in Berlin. My talk was a technical one, all about idempotency - why it matters, how it makes our APIs more resilient, and what can go wrong when you forget about it! My Talk Getting started My talk as "Avoiding Deja Vu: Building Resilient APIs with Idempotency". It introduces the concept of idempotency - what it…
When working on presentations for various conferences , I often use Google Slides. Yes, yes, I know - it's very basic, and like hand-editing html in Notepad at this point. But when bouncing between mac laptops and linux desktops, it's handy to have the deck centralised somewhere I can keep chipping away it when I've some free time. With the decks I'm putting together, I'm a sucker for simple,…
In May this year I had the pleasure of speaking at the CyberWiseCon / DevDays Europe event in Vilnius, where I delivered a new talk for the first time, Digital Cat & Mouse: Strategies to Outsmart Scrapers, Phishers & Thieves . The Talk This talk was a collection of real-world stories from the digital trenches, going from the fictitious Shamrock island in Dublin Bay, to using 10 Downing Street, the…
Back in the mid-2000s, I was working at a very popular property website in Ireland. At the time, there was effectively a duopoly in the market. We had a large, established competitor, who were bankrolled by a prestigious media group, and backed by some of the more well-known estate agents in the country. And then there was us - closer to a scrappy start-up, with a lot of people on their first or…
Stripe Sessions, Moscone Center In May 2025, I travelled to Stripe's product conference, Sessions, in San Francisco. We in Square1 are long-term Stripe partners, and have regularly attended the European-based events, but this was my first time making the trip Stateside. Taking over the place The Future - Coming Soon At Sessions, Stripe have a relentless slate of product announcements - mixing new…
Efficient video encoding has meant that sharing video files in formats like mp4 or webm has become increasingly-popular. However, there are a number of tools which don't yet support video embedding, Google Slides being a prominent example. In these cases, we need to wind back the clock and reach for the old reliable animated gif format. Converting mp4 to an animated gif Ffmpeg is a wonderful…
Chrome is an ever-green browser, meaning that the application is constantly being updated. Running it on Ubuntu occasionally leads to a problem where the distro build is behind the latest available version. Within the app itself, we're then prompted to upgrade, with Chrome flagging that it can't update via normal Ubuntu update channels. In-app warning in Chrome Going to the Chrome site,…
I've always believed the best way to really understand a technology is to push it in stupid, impractical directions and see what breaks. Inspired by Corey Quinn's claim that Amazon Route 53 is actually a database , I wondered: what's the opposite of that? If DNS can be used as a database, what's the most absurd way to implement a DNS server? That thought led me to this project - using Stripe…
Recently I returned to an old Node app that runs on AWS Lambdas . When they work well, Lambdas are a wonderful piece of serverless technology, allowing applications to scale up and down as required. I finished my changes, prepped the app for deployment, uploaded it, then stumbled into a small AWS Lambda pitfall entirely of my own making, but one surprisingly tough to debug, given the cryptic error…
In March 2025 I was lucky enough to get the change to present at the Dutch PHP Conference in Amsterdam. My talk, "Avoiding Déjà Vu: Building More Resilient APIs Using Idempotency," explored what idempotency is (and, importantly, how to pronounce it!), its role in API resilience, and the critical mistakes it can help developers avoid. The conference was run jointly with the AppDevCon and WebDevCon,…
Tools like Ollama make running large language models (LLMs) locally easier than ever, but some configurations can pose unexpected challenges, especially on Linux. Without proper GPU utilisation, even powerful graphics cards like my AMD RX 6700XT can result in frustratingly slow performance. In this post, I'll walk you through how I overcame compatibility issues on Ubuntu to unlock the full…
Filament is a great time-saver when building out admin functionality in a Laravel app. It takes care of a lot of the boilerplate needed when building CRUD-style admin apps. Typically Filament will run inside an admin section ( /admin etc) while the main app runs on the domain root. But what if you want the whole app to be a Filament app, and have it run in the application root? Updating Filament…
When developing with Laravel, Pest is the modern choice for testing. It's expressive, clean, builds on the PHPUnit framework, and as of Laravel 11 is the default setting for new Laravel applications. However, when you're first starting out, you might run into some configuration issues. One common error is the A facade root has not been set error. This error typically indicates a bootstrap issue…
Cloudflare Workers provide a powerful way to run serverless JavaScript code on Cloudflare's edge network, placing your logic closer to your users without requiring dedicated servers or additional infrastructure. This flexibility makes Cloudflare Workers a compelling choice for numerous use cases, such as avoiding rate limits on remote APIs, implementing CORS proxies to get around cross-origin…
In this article, we'll cover how to create a simple and free RESTful JSON API, using Google Sheets as a data source. This can be a very effective pattern for simple CRUD applications - anywhere the data is managed by non-technical users, with an app which is a simple consumer of that data. For our example, we'll work with election results, showing the seats won by each party. The data can be…
I had a fantastic time at the International PHP Conference (IPC) in Munich last week. There were a lot of really high quality talks delivered by fantastic presenters - I've plenty of homework to take away, from all the new tools and techniques I've learned about! The organisers were also good enough to let me up on stage for a while, and briefly sate my internal extrovert. Munich is a great…
Recent updates to Ubuntu 24.04 led me to regular lose my wifi connection. There was no pattern to time of day, machine workload, or anything like that - it was seemingly completely at random. The wifi connection would vanish, and even after restarting it, my previous wifi network would no longer appear, and no other networks could be joined. This typically took a hard reboot to resolve. As ever…
In June 2024, I had the pleasure of speaking at the PHPers Summit , in Poznan, Poland. My talk was about the quick wins available for backend developers who need to improve front end page speed. It was an updated version of a similar talk which I did at PHPUK 24 , and a great experience all round! Speaker experience The team did a great job of reaching out and making sure things were all set for…
Since the GDPR came into being, we've all become familiar with cookie banners on our favourite websites. They allow us to customise the amount and type of data we feel comfortable sharing before using a site. Recently a number of major European publishers have rolled out some very interesting changes to better monetise people who don't want to share their data. Now users who don't want to share…
Domain name renewal can be a pain in the backside. As developers, we all know the pang of shame that comes with a renewal charge for a hobby domain we've not gotten around to doing anything with yet. But worse than that is the domain that you are actually using, which expires due to a combination of missed renewal notifications and an expired credit card! Ideally we want a reliable system which…
> composer test Metadata found in doc-comment for method MyTest::it_loads_user_ok ( ) . Metadata in doc-comments is deprecated and will no longer be supported in PHPUnit 12 . Update your test code to use attributes instead. Recently I was working on some package updates for Laravel 11 compatibility. As part of this, the version of PHPUnit I was using was bumped from 9 to 11. I ran the tests, and…
PHP UK is a vibrant, welcoming, developer conference which I have enjoyed attending many times in the past. This year was a little different, as I took to the stage for the first time! While I've spoken before at a number of dev meet-ups and expert panels , this was my first time delivering a talk live to such a large audience. It was an exciting experience, but also pretty nerve-wracking and…
Two Factor Authentication (2FA) is an important part of ensuring account security. This typically involves linking your account to a mobile authenticator app, and after logging in via a normal username and password, adding a time-limited code from the app. It's increasingly-common to see online services require this secondary level of security, particularly from users with admin access or…
When developing APIs, idempotency is an important concept to be aware of. If an API supports idempotency, a client passes a unique key per request, which the server uses to avoid re-processing requests submitted multiple times. This helps to avoid, for example, issues with payments being processed multiple times or forms re-processed when a user has a poor connection. It's a concept supported in…
Recently I was building out a multi-tenant API using Laravel, and ran into a problem with my tests. I was getting a Lock wait timeout error on even the simplest of tests, and spent a frustrating chunk of my day banging my head against the wall until I found a solution. SQLSTATE [ HY000 ] : General error: 1205 Lock wait timeout exceeded ; try restarting transaction The scenario here is that I have…
I had a great time recently speaking with Liz Moy on Decrypt , the developer podcast from the folks at Evervault . We spoke about the importance of developing empathy for your users, the challenge of managing competing demands on your roadmap, and some of the more pressing issues when integrating AI into development workflows. We also talked about some of the struggles I had when moving from a…
When it comes to enhancing engagement on articles, having video content available can be highly effective. One challenge with having video content available on your site is making people aware that it exists! Traditionally a solution for this is to overlay a play button on the image, indicating video availability on clickthrough. However, traditional methods of loading play button overlays are…
Value objects are a very effective tool to improve the quality of your application, as well as the readability of your code. These are small objects which contain domain-specific business rules. They're particularly useful when working with dynamically-typed languages like PHP, where the move to using more structured types has been pivotal in improving application quality. What are value objects,…
Unlocking additional payment flows is a game-changer for businesses of all sizes. Low-code and no-code tools make it possible for more businesses to handle their payment flows directly on the Stripe platform. For example, it's possible to send a customer a link to enter their card details, then generate invoices which will automatically charge this card, all without leaving the dashboard. This…
When publishing content online, attracting readers to your content is critical. The combination of headline and image is key, with social networks often using these in their "link previews" when your content is shared on their platforms. With such a large proportion of traffic coming from social media, a compelling first impression is critical. But if you have several different ideas for headline…
As developers, we often find ourselves working with collections of data in our projects. Whether it's stock price data, weather readings, or server response times, this data can often be very noisy - lots of extreme, short, jumps and falls! This noisiness can make it really difficult to spot long term trends in the data. In many cases, we aren't concerned so much with the latest value in the data…