14 Jul 2026, 15:10 UTC≈1,220 views5 reactionsread 1 September 2026 🕰️ The silent Laravel scheduler bug — finally fixed in 13.17
You write clean, obvious code:
$schedule->command('send-morning-report')
->dailyAt('09:00')
->between('09:00', '10:00')
->timezone('America/New_York');
"Send the morning report between 9 and 10 New York time." Reads one way only.
Except it didn't work. The report went out overnight.
The reason — between() and unlessBetween() locked the ti…
🔥5
12 Jul 2026, 07:30 UTC≈1,160 views19 reactionsread 1 September 2026 ⚙️ `php artisan dev` in Laravel 13.16 — the end of the `composer dev` era
Every Laravel dev knows the ritual: open 4 terminals.
→ php artisan serve
→ php artisan queue:work
→ php artisan pail
→ npm run dev
Someone came up with composer dev — a single command running everything via concurrently. Better. But the config lives in composer.json, no typing, adding your own process means editing JSON by hand.
13.16 move…
🔥10❤6👍3
5 Jun 2026, 06:35 UTC≈1,750 views15 reactionsread 1 September 2026 🪤 Nested `whereHas` — the slowest construct in Eloquent
If the first two traps were about silent bugs, this one just kills the database.
You need users with orders for a specific product:
User::whereHas('orders', function ($q) {
$q->whereHas('items', function ($q2) {
$q2->where('product_id', 5);
});
})->get();
Clean. Declarative. Sails through code review.
Here's what actually hits the DB:
SE…
🔥9✍3❤3
1 Jun 2026, 07:45 UTC≈1,540 views8 reactionsread 1 September 2026 🛡️ 5 lines in `AppServiceProvider` — and `key:generate` can't nuke your production anymore
Every Laravel dev has felt this once: hit Enter on a command, and the same second realize you were in the wrong terminal.
For most commands, it's a 5-second scare. For php artisan key:generate on production — it's a disaster in under a second.
APP_KEY is regenerated. Then, in escalating order:
→ Every session invalidated — …
🔥7❤1
29 May 2026, 07:45 UTC≈1,360 views5 reactionsread 1 September 2026 🪤 `doesntHave` + SoftDeletes — the silent bug you only catch in production
You've written this code:
User::doesntHave('orders')->get();
"Give me users with no orders" — for re-engagement emails, analytics, cleanup scripts. Looks unambiguous.
But if Order uses SoftDeletes, Laravel silently adds orders.deleted_at IS NULL to the inner query:
SELECT * FROM users
WHERE NOT EXISTS (
SELECT * FROM orders
WHERE u…
🔥5
27 May 2026, 07:15 UTC≈1,190 views8 reactionsread 1 September 2026 💸 One flag in Laravel 13.10 — and your workers stop burning money
A typical queue worker runs 24/7. Actually works 3% of the time. The other 97% — idle on your AWS/GCP bill.
The old option was --stop-when-empty: queue empty → worker exits. Looks perfect on paper. In practice — jobs arrive in waves with 2–3 second gaps. Worker keeps starting and stopping. Each boot is ~300ms of Laravel bootstrap. Net savings — zero.…
👨💻4👍3🤝1
25 May 2026, 11:55 UTC≈1,160 views13 reactionsread 1 September 2026 🪤 whereHas + withCount: doubling your DB work for nothing
Everyone writes this. You probably too:
User::whereHas('orders', fn($q) => $q->where('status', 'paid'))
->withCount(['orders' => fn($q) => $q->where('status', 'paid')])
->get();
"Give me users with paid orders and the count." Reads clean.
Here's what the DB actually sees:
SELECT *,
(SELECT COUNT(*) FROM orders
WHERE user_id = users.id AND …
🔥8✍3👨💻2
14 May 2026, 15:30 UTC≈1,510 views10 reactionsread 1 September 2026 🔐 Laravel 13.9.0 fixes a UX wound you stopped noticing
The flow nobody talks about:
→ user clicks "generate password" in 1Password
→ your form rejects it: needs a symbol, too short, whatever
→ user gives up and types qwerty123
Laravel 13.9.0 ships Password::toPasswordRulesString() — it converts your validation rules into the HTML passwordrules attribute (an Apple spec). Safari, 1Password and Bitwarden read it and g…
🔥8❤2
28 Apr 2026, 19:45 UTC≈1,840 views16 reactionsread 1 September 2026 📎 Laravel PDF 2.6 — Attach PDFs to Emails Without Disk
Before, generating PDFs for email looked like this:
→ Create PDF
→ Save to disk
→ Attach to email
→ Delete file
Spatie laravel-pdf 2.6.0 solves this elegantly.
Before:
$pdf = Pdf::view('pdfs.invoice', ['invoice' => $invoice])
->save(storage_path('temp/invoice.pdf'));
$mail->attach(storage_path('temp/invoice.pdf'));
unlink(storage_path('temp/invoice.pdf'…
🔥9❤7
6 Apr 2026, 13:45 UTC≈2,070 views11 reactionsread 1 September 2026 🔍 UniqueConstraintViolationException Now Has Details — Laravel 13.2
Catching UniqueConstraintViolationException, but then what?
Before — just a database message. Parse it yourself.
Now — structured data.
Before:
try {
User::create(['email' => '[email protected]']);
} catch (UniqueConstraintViolationException $e) {
// Which field? Parse $e->getMessage()...
}
After:
try {
User::create(['email' => 'tak…
❤7🔥4
4 Apr 2026, 15:05 UTC≈1,790 views5 reactionsread 1 September 2026 🔥 releaseOnSignal — No More Stuck Locks in Laravel 13.2
withoutOverlapping() prevents parallel task execution.
But there's a catch: if the process gets killed — the lock stays.
The scenario:
→ Kubernetes does a rolling deploy
→ Scheduler receives SIGTERM
→ Task didn't finish in time
→ Lock remains in cache
→ Task won't run until TTL expires
The fix in Laravel 13.2:
Artisan::command('reports:generate', function ()…
👍3🔥2
2 Apr 2026, 07:20 UTC≈1,610 views10 reactionsread 1 September 2026 📐 JSON:API Resources — Native Spec Support in Laravel 13
Building APIs that follow the JSON:API spec?
Before: spatie/laravel-json-api or manual boilerplate.
Now: built-in.
Generate:
php artisan make:resource PostResource --json-api
Define attributes and relationships:
class PostResource extends JsonApiResource
{
public $attributes = [
'title',
'body',
'created_at',
];
public…
❤7👍2🤝1
Showing the 12 most recent of 20 posts we hold for @webblend. View and reaction counts are the latest single reading for each post, not a live figure, and a recent post is still accumulating both. A view count marked ≈ was rounded by Telegram before we ever saw it — t.me prints views in full below 1,000 and to three significant figures above, so ≈1,200,000 means somewhere between 1,150,000 and 1,249,999. Unmarked counts are exact. Text is reproduced from the public post preview and truncated for length.