RSSAmplifier

Blog

Steve McDougall — Articles

Practical engineering education, courses, and resources for the modern PHP & Laravel developer.

juststeveking.comRSS feed ↗178 posts

Latest posts

Eighteen Files And One Nix Module: How My Brain Works

The Obsidian vault I use as a system of record for every project, why the checkouts inside it are gitignored, and why half of it is generated from my NixOS flake.

MCP Goes Stateless: What Changed and Why It Matters

The Streamable HTTP transport replaced HTTP+SSE and quietly made MCP servers stateless. Here is what that means, how the new transport works, and why it unlocks serverless and edge deployments.

One Host, Twenty-One Files: A NixOS Flake That Stays Out Of Your Way

How auto-imported flake-parts modules, wrapped desktop packages, and a single base16 palette file shape one NixOS config - and where each one bites.

Seven Days in Ten Milliseconds

A workflow that sleeps for three days is not a workflow you can test by waiting. Owning the clock, asserting on absence, and the races you only get one shot at.

Building an order fulfilment workflow in Laravel

Build a real order fulfilment workflow in Laravel: signals from webhooks, timeouts, retries, branching, sleep and saga compensation, one step at a time.

Building Bulletproof Laravel APIs using Schema-First Contract Validation

Stop letting undocumented fields into your Laravel API. Write the JSON Schema first, then enforce it in middleware, DTOs, and your Pest test suite.

Strangling Procedural Legacy PHP into Laravel

Replace a procedural PHP monolith with Laravel one route at a time. Nginx ingress, session bridging that actually works, and Eloquent on a legacy schema.

Give your Laravel AI agent real-time web knowledge

The Laravel AI SDK is provider-agnostic, but its built-in web tools aren't. Here's how to give your agent real-time web knowledge without losing that independence.

The Right Agent at the Right Time

How to run AI across the whole dev lifecycle: the right agent at each stage, human gates on judgement, and decision records that keep architecture honest.

Fibers Plus the Polling API: What Async PHP Actually Looks Like Now

Fibers give PHP concurrency. The Polling API gives it native epoll and kqueue. Here's how to build on both, with honest benchmarks.

The Polling API Is the Most Underrated RFC PHP Has Shipped in Years

The Polling API gives PHP 8.6 native epoll and kqueue at last. Here's why the RFC nobody discussed is the most consequential in years.

A Proper Look at Tabstack

A developer's review of Tabstack, the Mozilla-backed web API that gives AI agents clean extraction, browser automation, and cited research without a scraper.

Giving your agents a terminal: a first look at the tabstack CLI

A hands-on look at Mozilla's tabstack CLI: a single Go binary that turns any URL into clean Markdown or JSON, runs browser automation, and scripts neatly.

The Tips Behind API Artisan: Building Laravel APIs Developers Actually Want to Use

Practical tips for building Laravel APIs developers trust: contract-first design, versioning, RFC 9457 errors, idempotency and more. Free book inside.

Testing Actions, Not Mocks

Mocking your own Actions tests the wiring, not the behaviour. How I test Laravel Action classes for real with Pest, and where fakes still belong.

Meet Sevalla; Cloud Hosting Without the Headache

Sevalla simplifies cloud hosting by providing intuitive app deployment, database hosting, and object storage. No infrastructure to manage.

Server-Side Rate Limiting in Laravel with Fingerprint.dev

Learn how to build device-based rate limiting in Laravel with Fingerprint.dev, Redis caching, and custom middleware to avoid the limits of IP-based throttling.

The Reason I Love Tempest for APIs

Tempest makes API development feel lightweight by combining typed request objects, attribute-based validation, discovery-driven routing, and built-in mapping with minimal ceremony.

The Art Of Keeping Business Logic Honest

Use state machines and workflow engines in Laravel to keep business rules explicit, auditable, and resilient across async processes.

From Diagram To Implementation Plan

Turn your diagrams and design notes into a clear build order that respects dependencies.

Introduction To Systems Architecture

Learn how to map application components, layers, and dependencies before you start building.

Reading Between the Lines

Learn how to spot hidden assumptions in a brief before you turn it into code.

Relationships, Cardinality, and the Questions Your Schema Is Asking

Understand relationship types and cardinality so your schema reflects how your data really connects.

Shaping Before You Build

Shape features before coding so scope, approach, and boundaries are clear from the start.

Stop Writing Code First

Think through requirements, assumptions, and structure before you open your editor.

The Mid-Level Mindset

A practical mindset shift for turning thinking-first habits into mid-level engineering judgment.

Thinking In Layers

Use layered thinking to place logic in the right part of your application before it turns into a mess.

Writing Features Not Tasks

Turn vague tasks into user-focused features with clearer outcomes and better stories.

Your First ERD

Map entities and relationships before you write migrations so your schema starts on solid ground.

The PSR Standards You Are Probably Ignoring

Five PSR standards that most PHP developers skip. Master them and write code that works anywhere, tested easily, and tied to nothing.

When CRUD Isn't Enough: How Real APIs Outgrow Their Design

Most Laravel APIs start as clean CRUD systems. This article walks through why that breaks down, and how an action-based design fixes the mess.

Introducing Signal: documentation that lives in your code

Signal is a PHP library that generates living documentation from native attributes. Annotate your classes, run one command, get accurate docs.

Building Modern Laravel APIs: Lead Scoring and Prioritisation

Building a configurable lead scoring engine in Laravel 13 - config-driven weights, query objects for prioritised retrieval, rescoring commands, and a top leads endpoint.

Building Modern Laravel APIs: The Action Pattern

Building a lead enrichment and scoring pipeline in Laravel 13 using the AI SDK, structured agents, composable Action classes, and PHP enums for type-safe status management.

Building Modern Laravel APIs: Authentication with JWT

Add JWT auth to a Laravel API with register, login, refresh, and logout flows using Form Request DTOs, Action classes, and auth:api middleware.

Building Modern Laravel APIs: Foundations and Project Structure

Start the Modern Laravel APIs series by structuring Pulse-Link for production with clear layers, ULIDs, action classes, DTO requests, and versioning.

Building Modern Laravel APIs: Ingesting Leads

Implement lead ingestion in Laravel with Form Request validation, typed DTO payloads, Action classes, and JSON:API responses for POST /v1/leads.

Managing Expectations in the AI Era

How to have honest conversations with stakeholders about AI productivity - what actually changes, what doesn't, and how to set realistic expectations.

Building Modern Laravel APIs: Routing, Versioning, and API Contracts

Learn how to version Laravel API routes, signal deprecations with Sunset headers, and keep API contracts aligned with your implementation.

Running A Better Table

How to run a Shape Up betting table - the planning meeting where pitches get selected and cycles begin or quietly collapse.

Redefining Engineering Roles in the AI Era

AI makes implementation cheaper and judgment more valuable. Learn how engineering roles, hiring, and team design are changing.

Reviewing AI Generated Work

How to review AI-generated code effectively, what failure modes to watch for, and how to maintain quality standards as code volume increases.

Spec Driven Development With LLMs

How to write specifications that produce useful LLM output, covering interface definitions, edge cases, and why the spec is your highest-leverage artifact.

Shape Up: A Practical Introduction

A practical introduction to Shape Up - the planning methodology built on appetite over estimation, fixed time with flexible scope, and small autonomous teams.

Writing Pitches That Work

How to write Shape Up pitches that give engineering teams real clarity - problem definition, appetite, solution shaping, rabbit holes, and no-gos explained.

Why Sprints Are Broken

Technical debt is inevitable. What matters is whether you manage it deliberately. A practical framework for prioritisation and stakeholder communication

Career Growth: From Junior to Staff Engineer

A practical guide to engineering career progression, from junior to staff, covering promotion criteria and the conversations that move careers forward.

Leading Through Uncertainty: Crisis Management for Tech Teams

How engineering leaders make decisions under pressure, communicate through uncertainty, and keep teams focused when the path forward is not clear.

Technical Debt: When to Fix, When to Ship

Technical debt is inevitable. What matters is managing it deliberately. Here is a practical framework for prioritisation and stakeholder communication.

The Engineering Manager as Coach, Not Boss

How to develop your coaching skills as an engineering manager, with practical techniques for performance conversations, growth planning, and career development.