Articles
Technical deep-dives, insights, and lessons learned
Red Flags Your Developer Isn't Delivering: A Founder's Checklist
A concrete checklist for non-technical founders to identify when a developer is underperforming, stalling, or outright taking the piss. Not theoretical — based on real situations I've seen from both sides. Each red flag comes with what it actually means and what to do about it.
What Happens After Your MVP Launches (Nobody Talks About This)
The honest reality of what happens after you launch an MVP. Not the champagne-popping success story — the actual day-to-day of bug reports, user feedback that makes you rethink everything, the feature requests that never stop, and the operational concerns nobody warned you about. Based on multiple real launches.
The Build vs Buy Decision: When to Write Code and When to Use SaaS
A decision framework for knowing when to write custom code and when to use an existing service. Based on real projects where I've seen founders waste months building things that already exist — and equally, where using the wrong SaaS tool created more problems than it solved.
Week in Review: Mar 30 – Apr 5, 2026 — 42 PRs, 865 commits
42 PRs merged, 865 commits, 2 releases, +677 lines
Your Vibe-Coded Prototype is Broken. Here's How I Know.
A practical guide to recognising the symptoms of a vibe-coded prototype — built fast with AI tools but without engineering discipline. Based on the Rezzy rescue project, where I took a 22-table mess and rebuilt it into 10 clean tables. If your prototype was built by prompting an AI for a weekend, this article explains what's likely wrong and what it takes to fix it.
What an MVP Actually Costs in 2026 (With Real Numbers)
A no-bullshit breakdown of what it actually costs to build an MVP in 2026, covering solo developers, agencies, and offshore teams. Based on real projects I've built and real quotes I've seen founders receive. If you're a non-technical founder trying to budget, this is the article you need.
Week in Review: Mar 23 – Mar 29, 2026 — 8 PRs, 170 commits
8 PRs merged, 170 commits, +1,645 lines
Testing Laravel Apps with Pest: Real Patterns from Real Projects
This isn't a "getting started with Pest" tutorial — there are plenty of those. This is a collection of testing patterns pulled from real production codebases: how to structure factories, when to use datasets, how Pest 4's browser testing works in practice, and the patterns that actually catch bugs. If you've been writing tests for a while and want to level up, or if you're writing tests that feel like they're testing nothing useful, this should help.
Self-Hosting with Coolify: Ditch Vercel and Heroku Without the Pain
PaaS platforms like Vercel, Heroku, and Railway are convenient but expensive. Self-hosting on a VPS used to mean SSH-ing into servers and manually configuring Nginx. Coolify changes that — it's an open-source PaaS you run on your own server. This article covers how to set it up, what it costs, how deployment works, and why I use it for every project including this one. I even built a Laravel package to make the integration smoother.
PostgreSQL vs MySQL for SaaS: I've Used Both, Here's What I Pick
I've shipped production applications on both PostgreSQL and MySQL. For SaaS applications, PostgreSQL wins — and it's not even close. This article explains why: JSON columns that actually work, better indexing, CTEs, array types, and a data integrity model that saves your arse when things go wrong. MySQL is fine for simpler applications. But if you're building a SaaS product that needs to scale and evolve, Postgres is the right choice.
Week in Review: Mar 16 – Mar 22, 2026 — 6 PRs, 170 commits
6 PRs merged, 170 commits, +1,279 lines
React 19 + Laravel 12: The Full Stack Setup I Use on Every Project
This is the exact stack configuration I use on every new project — Laravel 12, Inertia v2, React 19, TypeScript, Tailwind v4, and Wayfinder for type-safe routing. Not a theoretical "you could do this" article — this is what's running on the Progress site right now. I'll walk through every piece, what it does, why it's there, and how they fit together.
Docker for Laravel Developers: The Only Guide You Actually Need
Docker is one of those technologies that developers either love or avoid entirely because every tutorial is either too basic (hello world in a container!) or too complex (let me explain Kubernetes). This article is neither. It's the practical Docker setup for Laravel developers — what you need to containerise your app, how to set up a development environment, and how to deploy it. I use Docker + Coolify for deployment on every project. Here's exactly how it works.
Week in Review: Mar 9 – Mar 15, 2026 — 2 PRs, 20 commits
2 PRs merged, 20 commits, +41 lines
Stripe Connect Explained for Marketplace Founders: The Bits Nobody Tells You
If you're building a marketplace where money flows between buyers, sellers, and your platform, you need Stripe Connect. The official docs are comprehensive but dense. This article explains what Stripe Connect actually is, how the money flows, what KYC really means for your users, and all the gotchas that caught me out while building TidyLinker. This is NOT a code tutorial — it's a plain-English guide for founders who need to understand the system before paying someone to build it.
MVP Tech Stack Decision Tree: Laravel, Next.js, Rails, or Django
Picking a tech stack for your MVP is one of the first decisions founders make, and one of the most consequential. Get it wrong and you're either rebuilding in six months or fighting your tools the entire time. This article walks through how to pick between Laravel, Next.js, Rails, and Django for your MVP — when each makes sense, the real trade-offs, and why I pick Laravel + Inertia for most things. I'll be honest about where it falls short too.
The Freelance Developer Rate Guide UK: What to Charge and How
Real talk about freelance developer rates in the UK market. Day rates, project rates, retainers — what's reasonable, what's taking the piss, and how to actually think about pricing. This isn't a generic "charge what you're worth" post. It's based on 16 years of doing this, including a fair amount of getting it wrong before getting it right. If you're a developer trying to figure out what to charge, or a business trying to understand what things cost, this should help.
Meilisearch in Laravel: Full-Text Search Without the Elasticsearch Tax
I used to reach for Elasticsearch any time a project needed search. Then I'd spend three days configuring it, mapping fields, tuning analyzers, and wondering why it was consuming 2GB of RAM to index 5
GitHub Webhooks to Activity Feed: Normalising Messy Event Data
The Progress site shows a developer activity feed — commits, pull requests, releases, that sort of thing. The obvious approach is GitHub webhooks: configure them, receive events, display them. Should
Week in Review: Mar 2 – Mar 8, 2026 — 9 PRs, 171 commits
9 PRs merged, 171 commits, 2 releases, +121 lines
Availability Slot Systems: Weekly Recurrence with Date Overrides
On TidyLinker, cleaners set their weekly availability once and then block specific dates when they can't work. Sounds simple. It took three attempts to get the data model right. The first attempt was
ID Obfuscation with Sqids: Why Your API Shouldn't Expose Sequential IDs
A competitor once told me they figured out how many customers we had by signing up, looking at their user ID, and subtracting. User 4,218. Four thousand two hundred and eighteen customers. That inform
Content Extraction at Scale: Building a Pipeline That Processes 100+ Sources
DevTrends started as a side project to track developer news. I figured I'd scrape a few RSS feeds and call it done. Six months later, it processes 120+ sources, extracts content from thousands of arti
Supabase RLS Pitfalls: When Row-Level Security Fights Your App
I spent three days debugging why a new user couldn't create their first booking. The insert kept failing silently. No errors, no logs, just... nothing. The row didn't appear. Turns out, the RLS polic
Event-Driven Notifications: Deduplication, Tenant Isolation, Channel Expansion
Every Laravel app starts with notifications the same way: something happens, you call `$user->notify(new SomethingHappened())`, and you move on. It works. Until it doesn't. It stops working when you
Stripe Connect Authorize-Then-Capture: The Implementation Nobody Documents
If you've read the Stripe Connect docs and thought "right, but how do I actually build this?" — this article is for you. I built a full authorize-then-capture flow for a marketplace platform and the g
PostgreSQL vs MySQL for SaaS: I've Used Both, Here's What I Pick
Let me preface this: MySQL is not bad. I used it happily for years. It powers Facebook, Wikipedia, and thousands of excellent applications. If you're using MySQL and it's working for you, you don't ne
React 19 + Laravel 12: The Full Stack Setup I Use on Every Project
I've iterated on my stack for years. Tried Vue, tried Livewire, tried separate SPAs. What I've landed on is the most productive setup I've ever used. It's not bleeding edge — it's the boring-in-a-good
Inertia.js vs SPA vs Livewire: When to Use What
If you're building a Laravel app with a modern frontend, you've got three main options: Inertia.js, a full SPA (React/Vue with an API), or Livewire. They all work. They're all production-ready. But they solve different problems. This article breaks down when each approach makes sense, based on 16 years of building web applications. I use Inertia on everything I build — I'll explain why, but I'll be fair about the others.
Docker for Laravel Developers: The Only Guide You Actually Need
I avoided Docker for years. Laravel Herd (and Valet before it) made local development so painless that containerisation felt like needless complexity. Then I had to deploy to a VPS and everything chan
Real-Time Chat with Laravel Reverb: What I Learned Building Two Platforms
I've built real-time chat on two separate marketplace platforms using Laravel Reverb. The first was for a service marketplace (think provider-customer messaging). The second was for a restaurant booki
Open Source as Marketing: Why I Give Away My Best Patterns
I maintain several open source packages. Claudavel — Laravel integration patterns for Claude. laravel-coolify — a PHP SDK for the Coolify API. polar-flow — tooling for Polar's payment platform. None o
Testing Laravel Apps with Pest: Real Patterns from Real Projects
I'll be straight with you: I didn't always write tests. For years I was the "I'll test it manually" developer. Then I shipped a bug to production that cost a client money, and I became a testing conve
Kent, Remote, Global: Running a Dev Business From Folkestone
I live in Folkestone. If you're not from the UK, that probably means nothing to you. If you are from the UK, you might know it as the town where the Channel Tunnel starts, or possibly as "that place i
AI Code Review via GitHub Actions: Setting Up @claude on Your Repos
I've had Claude reviewing PRs on my repositories for a while now. Not as the sole reviewer — as a first pass before human eyes. It catches things. Not everything, and not always the most important thi
MCP Servers on Cloudflare Workers: OAuth2 + KV Token Storage
MCP servers need to live somewhere. If you're building tools that proxy API calls to third-party services — and most useful MCP tools do exactly that — you need authentication, token storage, and reli
Two-Sided Marketplace Architecture: The Decisions That Matter
TidyLinker connects homeowners with cleaners. Sounds simple until you start building it. Two-sided marketplaces have a unique property: every architectural decision affects both sides, and getting it
Multi-Tenant SaaS Authorization: Policies That Actually Scale
The first time you ship a multi-tenant app without proper authorisation scoping, you'll get a support email that says something like "I can see another company's invoices." That's the moment you learn
Stripe Connect Explained for Marketplace Founders: The Bits Nobody Tells You
Right. You're building a marketplace. Buyers pay sellers, you take a cut, everyone's happy. Simple, yeah? It is not simple. It is, in fact, one of the most complex parts of any marketplace build. And
MVP Tech Stack Decision Tree: Laravel, Next.js, Rails, or Django
Here's the dirty secret about tech stack decisions: the best stack is the one your team knows. That's it. That's the tweet. But since you're here for more nuance than that, let's get into it. ### Th
Inertia.js vs SPA vs Livewire: When to Use What
Let me save you some time: if you're building a Laravel application with a modern UI, use Inertia.js. That's my answer for about 80% of projects. But the other 20% matters, so let's actually talk abou
Laravel Folder Structure in 2026: What Goes Where and Why
Laravel 11 and 12 stripped out a lot of the boilerplate that had accumulated over the years. If you're coming from Laravel 10 or earlier, the new structure looks bare — and that's the point. This article walks through the modern Laravel folder structure, what goes where, and why. I'll reference the actual structure of the Progress site (this very website) throughout so you can see how it works in a real production app, not just a tutorial project.
The Freelance Developer Rate Guide UK: What to Charge and How
I'm going to be honest with you: pricing is the thing most freelance developers get wrong for the longest. I certainly did. I spent my first few years undercharging, feeling grateful that anyone would
Building an AI Developer Intelligence Platform in 10 Days
Ten working days. Two developers. An idea that sounded too ambitious on day one and was live in production on day ten. DevTrends — a developer intelligence platform that ingests content from over 100
I Don't Use Feature Flags. Here's Why.
I'm going to say something that'll upset a certain type of developer: I don't use feature flags. Not in my own projects, not for most client work, not as a default approach. And my deployment frequenc
Week in Review: Feb 23 – Mar 1, 2026 — 11 PRs, 290 commits
11 PRs merged, 290 commits, 7 releases, +2,396 lines
The Solo Developer Advantage: Why One Good Dev Beats a Team of Five
I'm going to make a claim that sounds arrogant but is backed by experience: for most web projects, one good developer will deliver faster, cheaper, and often at higher quality than a team of five aver
Adding AI to Your Laravel App: Practical Integration, Not a Demo
I've shipped AI features in three production applications over the past year. Not chatbots — actual features. Summarising transcripts, classifying content, extracting structured data from messy inputs
Deploying Laravel to Production with Coolify: My Exact Setup
Every time I mention my hosting setup, someone asks "but how?" So here it is. The exact setup. No affiliate links, no sponsored nonsense. Just what works. ### Why Coolify Coolify is an open-source,
Laravel Actions Pattern: Moving Business Logic Out of Controllers
Every Laravel developer goes through the same evolution. First, you put everything in controllers. Then you put everything in models. Then you discover services and put everything there instead. Event
DTOs in Laravel: Why I Use Them on Every Project and How
I use DTOs on every Laravel project I build. Every single one. Some developers think that's over-engineering. I think it's the bare minimum for shipping code that doesn't leak data, break frontends, o
16 Years of PHP: Why I'm Still Here and Not Sorry About It
I wrote my first line of PHP in 2010. It was terrible. The code, I mean — not the language. Well, actually, the language was a bit terrible too. PHP 5.2, no namespaces, mysql_* functions everywhere, e
Building MCP Servers in Laravel: Give Claude Access to Your App
MCP — Model Context Protocol — is one of those things that sounds like hype until you actually build with it. Then it clicks. It's a standardised way for AI assistants to interact with your applicatio
Getting Laravel 12 Logs into Coolify's Log Viewer
Coolify shows container logs — anything written to stdout/stderr by the container process. By default, a Laravel app running behind PHP-FPM writes logs to , which is a file inside the container. Coolify never sees it. This guide explains how to get Laravel errors, warnings, and application logs...
Connecting Claude Desktop to a Laravel MCP Server via Passport OAuth
How to expose a Laravel MCP server over HTTPS with OAuth authentication, so tools like Claude Desktop can connect remotely using . The Goal That's it. Claude Desktop connects to your production Laravel app, authenticates via OAuth, and gets access to your MCP tools. No API keys to manage, no tokens...
Laravel Folder Structure in 2026: What Goes Where and Why
If you've been writing Laravel since the 5.x days like I have, opening a fresh Laravel 12 project can feel a bit like someone's burgled your house. Where's the Kernel? Where did my middleware director
Self-Hosting with Coolify: Ditch Vercel and Heroku Without the Pain
I spent years paying Forge £15/month to manage a server, plus the VPS cost on top. Before that, I paid Heroku ridiculous amounts for what amounted to a Docker container with a nicer UI. Then I found C
Week in Review: Feb 16 – Feb 22, 2026 — 17 PRs, 290 commits
17 PRs merged, 290 commits, +1,691 lines
Claude Code in My Daily Workflow: What Actually Works
I've been using Claude Code daily for months now. Not as an experiment — as a core part of how I build software. Every project I work on, every client engagement, every open source package. It's open
Code Quality Standards That Make White-Label Work Actually Work
Here's a truth about white-label development that took me a while to learn: the code you deliver under someone else's name has to be better than the code you'd write for yourself.
The Overflow Capacity Model: Why Agencies Keep Me on Speed Dial
Here's a scenario that plays out at agencies constantly: a new project lands. It's a good one — solid budget, interesting brief, keen client. The agency won the pitch and everyone's buzzing.
Week in Review: Feb 9 – Feb 15, 2026 — 14 PRs, 240 commits
14 PRs merged, 240 commits, 1 releases, +1,866 lines
What Agencies Get Wrong When Hiring Freelance Developers
I've been freelancing for sixteen years. In that time, I've worked with agencies that made the experience brilliant and agencies that made me question my career choices. The difference was almost neve
Embedding Into Agency Teams: Daily Standups, Their Tools, Their Brand
There's a word that gets thrown around a lot in agency circles: "embedded." As in, "we have an embedded developer." Most of the time, what they actually mean is "we have a freelancer we email tasks to
How White-Label Development Actually Works: 10 Years of Doing It
I've been doing white-label development for agencies for about a decade now. And the thing that surprises most people when I explain it is just how invisible you have to be.
Week in Review: Feb 2 – Feb 8, 2026 — 17 PRs, 480 commits
17 PRs merged, 480 commits, +10,194 lines
When to Hire a Freelancer vs an Agency vs Build a Team
Every founder building a software product hits this question: who do I hire to build it? The three options — freelancer, agency, or in-house team — each have vocal advocates. Usually people who've onl
The Real Timeline for Building a SaaS Product (Not the Twitter Version)
Open Twitter on any given day and you'll see someone claim they built a profitable SaaS in 4 weeks. Side project. No code experience. £10k MRR. Life-changing.
I Asked Claude to Do Archaeology on My Own Codebase
Claude dug through git history and Coolify deployment data to tell me the story of a 10-day project. The receipts were illuminating.
Marketplace Payments Are Harder Than You Think
If you're building a marketplace, you've probably budgeted a week or two for "payments." After all, Stripe makes it easy, right? Drop in some code, money flows through, job done.
Week in Review: Jan 26 – Feb 1, 2026 — 31 PRs, 980 commits
31 PRs merged, 980 commits, 3 releases, +19,556 lines
Converting a Laravel/Inertia App to SSR: The Real Problems Nobody Tells You About
SSR isn't just a config flag. Here's every problem I hit converting 396 pages to server-side rendering — window.location crashes, duplicate meta tags, and the SEO gotcha that nearly broke every page.
The Build vs Buy Decision: When to Write Code and When to Use SaaS
Every project I start involves this conversation: "Should we build this ourselves or use an existing service?" And every time, the founder's instinct is wrong in at least one direction. Either they wa
Claude Code Troubleshooting: Every Common Error and How to Fix It
A practical guide to fixing every common Claude Code error — from ENOENT and MCP failures to context blowouts and permission issues. Real error messages, real fixes.
Securing Your Coolify Instance After the January 2026 Disclosure
Multiple critical CVEs hit Coolify in January 2026. Here's how to check if you're affected, update safely, and harden your instance — practical steps from someone who runs Coolify in production.
Red Flags Your Developer Isn't Delivering: A Founder's Checklist
I want to be upfront about something: I'm a developer writing this article about how to spot bad developers. There's an obvious conflict of interest. But I've also spent years inheriting projects from
Running Parallel Claude Code Agents on Real Projects
A practical guide to running multiple Claude Code sessions in parallel using git worktrees — how to split tasks, manage branches, and get 3x the output without conflicts.
What Happens After Your MVP Launches (Nobody Talks About This)
You launched. Congratulations. The site's live, the first users are signing up, and you feel like you've climbed a mountain.
Week in Review: Jan 19 – Jan 25, 2026 — 41 PRs, 1,667 commits
41 PRs merged, 1667 commits, 3 releases, +18,426 lines
My Laravel AI Development Stack in 2026
An opinionated look at my full AI-assisted Laravel development stack — Claude Code in the terminal, MCP servers for context, Coolify for hosting, and how it all fits together.
Your Vibe-Coded Prototype is Broken. Here's How I Know.
I'm going to describe a codebase to you. Tell me if it sounds familiar.
My CLAUDE.md Setup for Laravel Projects (With Real Examples)
A detailed walkthrough of my actual CLAUDE.md configuration for Laravel projects — global settings, project-level rules, and the sections that make the biggest difference.
How I Rescued a 22-Table Mess and Rebuilt It in 10 Clean Tables
Jamie came to me with a problem I've seen too many times. He had a vision — a platform for the underground music scene that would connect DJs, promoters, and venues. He'd had a prototype built. It loo
How I Use the Coolify MCP Server to Manage Production from Claude Code
A walkthrough of how I manage my production Coolify servers entirely from Claude Code using the MCP server I built — deployments, diagnostics, logs, and more.
How to Evaluate a Developer When You're Not Technical
You're a founder. You've got a great idea, maybe some funding, and you need someone to build it. Problem is, you can't tell the difference between a brilliant developer and one who's going to take you
Week in Review: Jan 12 – Jan 18, 2026 — 83 PRs, 3,368 commits
83 PRs merged, 3368 commits, 11 releases, +66,594 lines
What an MVP Actually Costs in 2026 (With Real Numbers)
I've built MVPs for marketplace founders, SaaS startups, and solo entrepreneurs. Here are the honest numbers — not the "it depends" hedge you'll get from most developers.
Claude Status in My Menu Bar
Quick SwiftBar script to show Claude's status and my daily usage in the macOS menu bar. 10 minutes to build, saves me checking status.claude.com constantly.
Connecting Claude Desktop to Your Laravel App via MCP
Set up Laravel's official MCP package with Claude Desktop. All the gotchas around Sanctum tokens, mcp-remote config, and OAuth vs bearer auth.
Claude Code Global Settings: Where They Live and What They Do
Breakdown of Claude Code's settings system - where config files live, how CLAUDE.md works, and the skill system.
Self-Hosting My Polar Health Data
Polar's API only keeps 28 days of data. Built a server to sync and store it all permanently so I can actually analyze trends.
Building a Python SDK for Polar Watches
Built a Python SDK to pull data from my Polar watch. Async, typed, handles OAuth - all the boilerplate Polar's docs leave out.
Deploying Laravel to Coolify the Easy Way
Laravel package for Coolify deployments - dashboard, CLI tools, and smart Nixpacks generation that detects your stack automatically.
Claudavel: My Laravel + Claude Code Starter
Package that sets up Laravel the way I like it - Fortify, Sanctum, Horizon, Reverb, Telescope, plus Claude Code configuration out of the box.
I Built My Wife a Macro Tracker in 2 Hours
Wife was tracking macros in Google Sheets. Built her a proper app in 2 hours with React, N8n, and Claude for food parsing.
Idea to App Store in 4 Hours
Built a tide times iOS app and submitted to the App Store in 4 hours. React Native, Expo, Claude Code, and a Coolify API proxy.
I Almost Pushed My API Keys to GitHub
Nearly committed my API keys to GitHub. Built a wrapper to keep MCP secrets out of repos entirely.
Coolify MCP: Back From the Dead
Revived my Coolify MCP after letting it rot. Now Claude can manage my entire infrastructure without me copying UUIDs around.
Building My First MCP: Mistakes and All
Built an MCP to manage Coolify from my editor. The OpenAPI spec was too big for Claude to handle, so I learned to work in chunks.
When 97% Is Good Enough
Software engineers have been spoiled by deterministic systems. AI is dragging us into the world every other engineer already lives in.
Feeding Your AI the Docs It's Missing
Claude kept giving me outdated Laravel syntax. The fix was condensing the docs down to just what changed since its training cutoff.
Scope-Locked Vibing
Pure vibe coding breaks down on complex projects. Scope-locked vibing is my middle ground - keep the speed, avoid the mess.
Running Claude Code from Your Phone
Set up SSH access to my laptop so I can run Claude Code from my phone. ZeroTier was the answer after port forwarding and Tailscale failed me.
Claude Code Won't Run? Check Your PATH
Claude Code wouldn't start. Turned out to be a rogue alias in my .zshrc from months ago. Here's how to debug PATH issues.
Why I Split My Coolify Server in Two
My Coolify server kept dying during deployments. The fix was stupidly simple - separate the UI from the workload.
Ditching Forge for Coolify: The Full Migration
Migrating a production Laravel app from Forge to Coolify - database dumps, storage files, Nixpacks configs, and all the shit that can go wrong.