Engineering,
taught
&
leadership,
practised.
I'm Steven — CTO at Digitonic, a PHP engineer since 2010 and a keen golfer with a terrible handicap. This is where I write it all down.
Latest from the journal
Persist Multi-Turn Chat History with the Laravel AI SDK
A stateless agent forgets every turn. Here's how to wire persistent conversation memory into a Laravel AI SDK agent, resume a chat by ID, and stop long histories from wrecking your token budget.
Parse HTML5 Properly with PHP 8.4's Dom\HTMLDocument
For twenty years, parsing HTML in PHP meant fighting DOMDocument's mangled UTF-8 and XPath. PHP 8.4's Dom\HTMLDocument finally does it properly.
Style Form Fields After Interaction with Tailwind v4's user-valid and user-invalid
A `required` field shouldn't glow red before anyone has typed. Tailwind v4's `user-invalid:` variant styles validation state only after interaction — no JavaScript, no class toggling.