Design & Development15 min read

What's New in Laravel — July 2026: First-Party Images, Human-in-the-Loop Agents & Everything Laracon US Announced

Ritesh PatelBy Ritesh Patel|August 4, 2026

The June roundup signed off with three promises: MySQL scale-to-zero was landing imminently, the AI SDK was still inching toward its 1.0, and the framework had more room to run. Two of the three paid off inside July. The third took a turn nobody had on their bingo card — we'll get to Laracon.

First, a confession about boilerplate. Somewhere in almost every Laravel application we've shipped in eleven years — e-learning platforms on Moodle LMS, SaaS backends, the avatar upload on a client portal — lives the same forty-odd lines: take the upload, constrain it, re-encode it, store it, and hope nobody feeds it a 40 MB drone photo. The packages behind those lines changed over the decade. The ritual never did. In July, Laravel absorbed the ritual into the framework.

That's the shape of the month: not one headline but the framework quietly claiming territory that used to belong to your composer.json — image handling, agent safety, even your database's sleep schedule. And then Laracon US opened in Boston, and the biggest thing on stage wasn't Laravel 14 or an AI SDK 1.0. It was a test runner.

In This Article

The short version — if you only read one section:

  • Image processing became a framework primitive. The new first-party Image component (v13.20) handles resize, crop, and format conversion with a fluent API and swappable drivers — including Cloudflare Images, which moves the CPU cost off your servers entirely.
  • Production agents got a stop button. The AI SDK's human-in-the-loop support pauses an agent before side-effectful tool calls and resumes durably after a human approves, edits, or rejects them.
  • The last database learned to sleep. MySQL scale-to-zero shipped July 20, completing the story June started: compute, Postgres, Valkey, and now MySQL all idle to zero and wake together.
  • Laracon's reveal was maturity, not majors. Pest 5 shipped live on stage — 19,000 tests in 5 seconds via Test Impact Analysis — alongside the Laravel LSP, CPX, and artisan doctor. No Laravel 14 date. No AI SDK 1.0.
  • The one thing worth doing this week: pick one upload pipeline, port it to the new Image facade, and delete the service class it replaces. It's the fastest way to feel what "first-party" means here.

Images Are Now a Framework Concern

Every Laravel codebase of a certain age has an ImageService, a ProcessesUploads trait, or a job named something like OptimizeAvatar. Ours certainly do. They all do the same three things — constrain dimensions, re-encode to a sane format, store the result — and they all do it through whichever library the project happened to start with, wired up slightly differently every time.

As of v13.20 (July 14), that's a framework concern. The new Image component gives you a fluent, immutable API that starts from wherever your image actually is — an upload on the request, a path on a disk, raw bytes — and chains through to storage:

PHP
1$path = $request->image('avatar')
2    ->cover(400, 400)
3    ->optimize()
4    ->store('avatars');

The optimize() call re-encodes to WebP at a sensible quality; the example in the pull request takes a 2.1 MB PNG down to 75.8 KB. If you need more control, the API has it — contain() with a background fill, resize() with a single dimension to preserve aspect ratio, quality(), and direct format conversions including toWebp() and toAvif() (the AVIF, PNG, GIF, and BMP outputs arrived a week later in v13.21). You can also pull a processed image back out of storage and keep working on it:

PHP
1Storage::image($path)
2    ->contain(1200, 630, background: '#0B1120')
3    ->toWebp()
4    ->toBytes();

Why it matters: the interesting design decision isn't the fluent API — it's that image processing is now driver-based, exactly like cache, queue, and storage. A new config/image.php and an IMAGE_DRIVER env var select between GD, Imagick (both powered by intervention/image ^4.0, still installed as a suggested dependency), and Cloudflare Images, which does the manipulation remotely. That third driver is the quietly radical one: your production servers never spend a CPU cycle on image work, and the code doesn't change. Image processing just moved from "a library you picked in 2019" to "an infrastructure decision you can revisit per environment."

In practice, what changes for our team: the upload paths we maintain across e-learning platforms on Moodle LMS integrations, SaaS dashboards, and client portals converge on one API — and the hand-rolled service classes those apps carry become deletions. For anything already behind Cloudflare, the remote driver means a media-heavy app can stop budgeting compute for encoding entirely. The place you'd still reach for a package is model-attached media: spatie/laravel-medialibrary's collections and conversions solve a different problem than raw manipulation, and the two now compose rather than compete.

Tip
The counter-intuitive part: "the framework got an image library" undersells what happened. Laravel didn't pick a winner in the image-library debate — it made the debate configuration. When processing is a driver, "where should image work run?" becomes a deploy-time question with a per-environment answer, the same way "where does the cache live?" already is. That's a category change, not a convenience.

Your Agents Learned to Ask Permission

The AI SDK shipped four releases in July — v0.9.0 through v0.10.2 — and the thread running through them is not what you'd expect from a library racing toward 1.0. The headline feature makes agents less autonomous.

Human-in-the-loop tool approval, which landed in v0.10.0 (July 21), lets any tool declare that it needs a human's sign-off before it runs. An agent that decides to call an approval-gated tool doesn't execute it — it pauses, and your application gets the pending calls to surface however you like: a review queue, a Slack message, an admin panel button.

PHP
1$response = $agent->prompt('Clean up export files older than 30 days.');
2
3if ($response->awaitingApproval()) {
4    // $response->pendingApprovals holds the tool calls the agent
5    // wants to make — surface them to a human for review.
6}

The human's verdict comes back as a decision map, and the conversation resumes from durable history — approve one call, rewrite another's arguments, reject everything else with a wildcard:

PHP
1use Laravel\Ai\Approvals\Decision;
2
3$agent->continue($conversationId, as: $user)->prompt([
4    'call_abc' => true,
5    'call_def' => Decision::edit(['path' => 'exports/2026-06']),
6    '*' => false,
7]);

The engineering underneath is what makes this production-grade rather than a demo feature: approved results are recorded durably before execution continues, so a retried request can't double-run a side effect — a failed continuation retry comes back as a clean conflict instead of a second deletion. Tools opt in via the Approvable contract or a requireApproval() call, and — the detail that tells you where Laravel's head is — the SDK's own built-in filesystem tools (write, copy, delete) now require approval by default. Autonomy is something you now explicitly grant, not something you get.

The rest of the July run, briefly:

  • Str::summarize() (v0.10.0) — one-line AI summarization as a string macro: str($incidentReport)->summarize() or Str::summarize($article, sentences: 5). It runs through a dedicated agent tagged to use the cheapest configured model, which is a nice pattern in itself: casual AI calls shouldn't ride your flagship model by default.
  • Multimodal embeddings (v0.10.0) — image and audio embeddings for Gemini and VoyageAI, auto-cached.
  • Tool-choice support (v0.9.1) — force or forbid specific tools across Gemini, OpenAI, and Anthropic.
  • Default models moved — the Anthropic default is now Claude Sonnet 5 (v0.9.0), and Gemini's default got a July bump too. If you don't pin models explicitly, read your changelogs.
  • The 0.x caveat earned its keep — v0.9.0 rearchitected every provider gateway onto a shared text-generation loop. It's the right foundation, and it was a breaking change with an upgrade guide. The SDK ended July at v0.10.2, still shy of 1.0.

In practice: the ops agent we sketched in our multi-agent systems post — the one that reads Nightwatch exceptions and posts summaries to Slack — gets exactly one upgrade from all this: the step where it does something now has a human in front of it. That's the difference between an agent you demo and an agent you give write access to production data, a line we drew the hard way in AI Agents in Production.

Tip
The counter-intuitive part: the closer the AI SDK gets to 1.0, the more of its energy goes into restraint — approval gates, durable audit trails, conflict-safe retries — rather than capability. That's the correct read of where agents actually fail in production. The most production-ready feature an agent framework can ship in 2026 is a reliable way to stop.

Laravel Cloud: The Whole Stack Sleeps Now

June's headline was checkpoint/restore scale-to-zero for compute and cache, with MySQL promised "in a few weeks." On July 20, that promise landed: MySQL Flex databases now sleep when idle, and the full stack — app, database, cache — can idle to zero and wake as a unit.

The mechanics follow the same philosophy as the compute work. Storage stays online the whole time; only database compute sleeps. Every cluster sits behind a proxy layer, and when a connection arrives at a sleeping database, the proxy holds it while compute resumes — so the first query after a quiet night runs a few hundred milliseconds slower instead of erroring. You pick the idle window (one minute to one hour, or never), and existing databases keep their current sizing and pricing unless you opt in.

July's Cloud run didn't stop there:

  • Secrets Manager (July 16) — org-level secrets you write once and link to multiple environments, encrypted in the browser before they ever reach Laravel's servers, decrypted only at deployment. "Write once, read never" is the right default for a platform holding your production credentials.
  • Monorepo support (July 8) — Cloud detects monorepos, lets each application pick its root directory, and multiple apps can deploy independently from one repo.
  • The platform is quietly outgrowing "Laravel hosting." Symfony apps started running on Cloud unchanged in late June, and on July 28 — Laracon's opening morning — Next.js and Nuxt deployments followed: JavaScript frontend and Laravel backend in one monorepo, each with its own scaling and domains, one bill. "More languages and frameworks are coming soon" is doing a lot of quiet work in that announcement.
  • Managed queues got rebuilt — isolated autoscaling workers that scale to zero on an empty queue, idle wake under one second (down from about thirty), FIFO queues, hour-long jobs on the Pro class, and scheduled pre-scaling for the traffic you can see coming.
  • Private Cloud is now HIPAA-certified, joining SOC 2 Type II and GDPR — with a dedicated AWS account, VPC isolation, and static outbound IPs for the teams that need compliance to even start the conversation.

In practice: in June we said we were auditing which of our staging, preview, and internal environments still deserved to run 24/7. The honest answer, then, still excluded the databases — compute could sleep but MySQL billed on. As of July 20 that asterisk is gone, and the audit math changes accordingly: a client preview environment that gets opened for a weekly review can now cost nearly nothing for the other six days, database included.

Laracon US: Pest 5 and a Wave of Tooling

Laracon US ran July 28–29 at the SoWa Power Station in Boston — 18 speakers, and a keynote stat worth repeating: 1,776 pull requests merged into the framework this year, 3,242 more across Laravel's other open-source repos, with 270 contributors landing their first-ever PR. Whatever else you think about the ecosystem's pace, it is not a one-company show.

The conventional wisdom going in was that Boston would deliver at least one of: a Laravel 14 date, or the AI SDK's 1.0. It delivered neither. What it delivered instead was shipping — starting with the biggest release of the conference, which wasn't from the framework at all.

Pest 5 shipped live on stage (July 28, during Nuno Maduro's opening keynote — v5.0.0 hit GitHub the same day). The marquee feature is TIA, Test Impact Analysis: Pest builds a dependency map of your codebase and, on each run, executes only the tests affected by what changed, replaying cached results for the rest. It understands Laravel-specific dependencies — migrations, Blade templates, Vite modules — not just PHP imports. The number Nuno put on screen: Laravel Cloud's own suite of 19,000+ tests went from 3 minutes to 5 seconds. Pest 5 requires PHP 8.4+ and PHPUnit 13, and 4.x continues to receive maintenance in parallel.

The rest of Pest 5 reads like a bet on how testing changes when AI writes half the code:

  • An agent plugin gives AI coding agents a single command to verify their changes against your real suite — factories, database refresh, fakes and all — and with the browser plugin, to drive a real browser and assert backend side effects.
  • An evals plugin scores LLM output quality with the same expect() API you already know — deterministic checks plus AI scorers, skipped by default so your CI isn't quietly billing an AI provider.
  • PHPStan and Rector plugins are built in — static analysis that understands it() and expect(), and roughly sixty Rector rules for modernizing test suites.

Then came the framework-side reveals. Marking clearly what's announced versus what's shipped:

  • Laravel LSP (announced) — a real Language Server Protocol implementation, generalizing what the VS Code extension does (route navigation, config autocomplete, inline docs) to NeoVim, Zed, and Sublime. The end of "the good tooling is only on VS Code."
  • CPX (announced) — an npx-equivalent for PHP: cpx laravel/pint runs a package without touching your composer.json. It can even run code from a Gist URL, which is equal parts convenient and worth a security policy.
  • Artisan doctor (announced) — one command that health-checks an application: APP_KEY, PHP version, extensions, environment config, auto-fixing what it safely can, with packages able to register their own checks. Laravel explicitly positions it as the final verification step for AI coding agents — hand the machine a machine-readable definition of "healthy."
  • Head tag API (announced) — fluent PHP-side management of the document head: OG images, canonical URLs, PWA meta, without template gymnastics.
  • Debounced jobs (announced) — collapse a burst of identical dispatches into a single job execution. Anyone who has fanned out webhook-triggered cache rebuilds knows exactly which incident this prevents.
  • Pint now formats Blade (announced) — one formatter for PHP and templates both.
  • Inertia DevTools (shipped) — a Chrome extension showing every Inertia request with its headers and hydrated props.

The stage tour also revisited work that had already landed quietly — artisan dev and refreshable cache locks among them — which is its own kind of tell: the gap between "announced at Laracon" and "already in your composer update" is shrinking.

In practice: two of these matter to us immediately. Pest 5's TIA changes the daily loop on large suites — our bigger client codebases are exactly the multi-thousand-test shape where a 3-minute feedback cycle quietly taxes every change. And the agent plugin plus artisan doctor form a pattern we've been building by hand: give AI coding tools a deterministic, machine-checkable definition of done. Laravel just made that pattern first-party.

Tip
The counter-intuitive part: the loudest year-over-year change at Laracon wasn't a product — it was the audience the tooling assumes. Pest's agent plugin, doctor's "final step for AI agents" framing, the installer's new automation flags: Laravel is now designing developer tooling on the assumption that some meaningful share of its users are not human. The ecosystems that internalize that early will look very different in two years.

The Framework Kept Moving: v13.18 to v13.23

Six releases landed in July, and beyond the Image component the drumbeat produced several features worth knowing cold.

The HTTP QUERY verb arrived (v13.19, July 7). QUERY is the IETF's new method for the awkward middle ground between GET (safe and cacheable, but URL-length-limited) and POST (body-carrying, but semantically "change something"): it's safe, cacheable, and carries a body. Laravel's HTTP client and test suite now speak it:

PHP
1$results = Http::query('https://search.internal/products', [
2    'category' => 'ai-hardware',
3    'in_stock' => true,
4]);

Test helpers (query(), queryJson()) shipped in the same release, and the community turnaround was remarkable — Laravel News had a full Scout-powered search endpoint tutorial out within eight days, using Route::match(['QUERY'], ...) and noting that first-class Route::query() routing is headed for Laravel 14. That's the first concrete Laravel 14 signal we've seen, for what it's worth. In practice: complex search and filter endpoints are the immediate win — the ones whose query strings kept hitting URL limits and got awkwardly POSTed instead.

Collections learned reduceInto (v13.19). Reduce-by-mutation, borrowed from Swift and Ruby, for the accumulator patterns where classic reduce() forces you to return the accumulator on every line:

PHP
1$totals = $orders->reduceInto([], function (&$totals, $order) {
2    $totals[$order->status] ??= 0;
3    $totals[$order->status] += $order->total;
4});

Queues had a quietly excellent month. A declarative Release middleware sends a job back to the queue without hand-rolling the logic (v13.18); SQS bulk dispatch now uses SendMessageBatch, cutting API round trips for the Bus::bulk() pattern June introduced (v13.19); and the queue fake finally lets tests inspect delayed and reserved jobs, plus beforePushing/afterPushing hooks (v13.18–v13.20). In practice: that last one closes a real testing gap — asserting "this job was scheduled for later, not now" used to require ugly workarounds.

Routing and requests got sharper edges. A #[RouteKey('slug')] attribute on a model replaces the getRouteKeyName() override ceremony (v13.21); a RequestAttribute contextual attribute injects middleware-resolved values straight into controller signatures (v13.21); and schedule:work now shuts down gracefully on SIGTERM (v13.18) — small, unless you run the scheduler in Kubernetes, where it's the difference between clean rollouts and killed mid-run tasks.

And the steady accumulation: a strict RFC 4648 base64 validation rule, Str::counted() for count-prefixed labels, incrementEachQuietly() on Eloquent, separate Redis session prefixes, a #[WithoutMiddleware] controller attribute, and #[SensitiveParameter] sweeps keeping secrets out of stack traces. Releases v13.22 and v13.23 closed the month on July 24 and 27, holding the weekly cadence right up to the conference.

The community kept pace, too — July's package crop included Laravel Time Machine (a request-lifecycle profiler with a Gantt-style phase timeline) and Laravel SMS Catcher (Mailpit, but for SMS notifications), both the kind of small sharp tool that ends up in every local stack.

What This Means for Teams Shipping Laravel

Three threads from July are worth carrying into your planning.

The framework is absorbing the stack, deliberately. Images in July; the Head API, doctor, and LSP announced for the months ahead; artisan dev and route metadata earlier this year. Each one converts a "which package?" debate into a framework primitive with a driver or an extension point. The practical consequence: revisit your default composer.json — some of it is now dead weight, and the first-party replacements are the better-integrated option.

AI tooling is shifting from capability to control. July's agent story was approval gates, durable audit trails, evals, and machine-checkable definitions of done — not bigger models or flashier demos. If you're building agents on a PHP stack, the primitives for doing it responsibly are arriving faster than most teams' willingness to use them. Get the approval flow into your agent designs now, while your agents are still small enough to retrofit easily.

Cloud economics keep compounding. With MySQL asleep, the full always-on tax we described in June is now optional across the whole stack — and the Symfony and Next.js/Nuxt moves signal that "Laravel Cloud" increasingly means "Cloud, by the Laravel team." If your infrastructure review didn't happen after June's post, July removed its last excuse.

August has plenty queued: the AI SDK's 1.0 watch continues (v0.10.2 and counting), the first concrete Laravel 14 signal is on the board with native QUERY routing, and the real-world Pest 5 adoption reports — the ones with other people's test suites — are about to roll in. We'll cover all of it in the August roundup.

Tip
Need a Laravel team that ships against the latest framework features instead of waiting six months to adopt them? We've been building Laravel applications for over 11 years — SaaS platforms, AI products, e-learning systems on Moodle LMS, and queue-heavy workloads running at scale. Get a free quote or schedule a call with our Laravel team.

Related reading

Frequently Asked Questions

What was announced at Laracon US 2026?
The headline was Pest 5, released live on stage on July 28 — its Test Impact Analysis engine runs only the tests affected by your changes and took Laravel Cloud's 19,000-test suite from 3 minutes to 5 seconds. Laravel also revealed the Laravel LSP (bringing the VS Code extension's smarts to NeoVim, Zed, and Sublime), CPX (an npx-equivalent for running PHP packages without installing them), artisan doctor for application health checks, a fluent Head tag API, debounced jobs, Blade formatting in Pint, and Inertia DevTools. On the Cloud side: Next.js and Nuxt deployments and a HIPAA-certified Private Cloud. Notably absent: no Laravel 14 date and no AI SDK 1.0 — the year's story so far is maturation, not majors.
What is Laravel's new image processing component?
Shipped in v13.20 with more formats in v13.21, the first-party Image component gives the framework a fluent, immutable API for manipulating images — cover, contain, resize, optimize, format conversion to WebP or AVIF — starting from an upload, a storage path, or raw bytes. It's driver-based like cache and queue: GD or Imagick locally (both via intervention/image ^4.0, which you still install as a suggested dependency), or Cloudflare Images to do the processing remotely with zero CPU cost on your servers. It replaces the hand-rolled resize-and-encode service class most Laravel apps carry; you'd still reach for spatie/laravel-medialibrary when you need media collections and conversions tied to Eloquent models rather than raw image manipulation.
How does human-in-the-loop work in the Laravel AI SDK?
As of laravel/ai v0.10.0, a tool can require approval — via the Approvable contract or by calling requireApproval() — and the agent will pause before executing it instead of acting on its own. Your application surfaces the pending tool calls to a human, who can approve, reject, or edit the arguments, and the conversation then resumes from durable history with a Decision map — approving one call, editing another, rejecting the rest with a wildcard. Approved results are recorded before execution continues, so retries can't double-run a side effect. The SDK's built-in filesystem tools (write, copy, delete) now require approval by default, which tells you where Laravel thinks the guardrails belong in production agents.
What is MySQL scale-to-zero on Laravel Cloud?
Since July 20, 2026, MySQL Flex databases on Laravel Cloud can sleep when idle, so you stop paying for database compute during quiet hours while storage stays online the whole time. Every cluster sits behind a proxy layer that holds the incoming connection while compute resumes, so the first query after a sleep just runs a few hundred milliseconds slower instead of failing. You choose an idle window from one minute to one hour, or never. Combined with the compute and Valkey cache work that shipped in June, the whole stack — app, database, cache — can now idle to zero and wake together, which changes the economics of staging, preview, and internal environments most of all.

Ready to start your project?

Tell us about your requirements and we'll get back with a clear plan within 24 hours. No sales pitch — just an honest conversation.

Ritesh Patel
About the Author
Ritesh Patel
Co-Founder & CTO, Treesha Infotech

Co-founded Treesha Infotech and leads all technology decisions across the company. Full-stack architect with deep expertise in Laravel, Next.js, AI integrations, cloud infrastructure, and SaaS platform development. Ritesh drives engineering standards, code quality, and product innovation across every project the team delivers.

Let's Work Together

Ready to build something
remarkable?

Tell us about your project — we'll get back with a clear plan and honest quote.

Free Consultation
No Commitment
Reply in 24 Hours
WhatsApp Us