DEV Community

Cover image for Dev Log: 2026-06-30
Nasrul Hazim Bin Mohamad
Nasrul Hazim Bin Mohamad

Posted on

Dev Log: 2026-06-30

TL;DR

Three threads today: a public Livewire tables package jumped to Laravel 13 + Livewire 4, an identity portal got a cleaner audit-log datatable, and an IAM system got defensive plumbing — whitespace-safe status, read-only DB guards, and ops tooling.

1. Public package: Laravel 13 + Livewire 4

I forked laravel-livewire-tables to a v4 line after upstream declined Livewire 4. Today it landed Laravel 13 support, dropped Livewire 3, moved tests to Pest 4, and got a Testbench workbench demo. Full write-up in a separate post — short version: when upstream says no, fork it, but bring the test harness.

2. Identity portal: collapsing a wide datatable

An audit-log datatable had drifted into per-service columns — one column per service, which doesn't scale and reads badly on mobile. The fix was to merge them into a single Services cell with inline pills, and pair the user into one cell and status+services into another.

TL;DR: fewer, denser columns beat many thin ones. Lesson: when a Livewire table grows a column per entity, that's the signal to collapse into a composed cell (a Blade partial rendering pills) instead of widening the table forever.

Before After
One column per service One Services cell, inline pills
Separate user/email columns One composed user cell
Faded status colours Solid status colours

3. IAM: defensive plumbing

The bigger thread was hardening an identity & access management system. Three lessons worth keeping:

Whitespace-insensitive status. A stored status string with a stray space (think "ACTIVE -X" instead of "ACTIVE-X") silently failed a downstream eligibility gate. The root-cause fix was to normalize on the way in and compare insensitively, then backfill the bad rows.

// normalize before persisting, compare without trusting whitespace
$canonical = Str::of($raw)->squish()->upper()->value();
Enter fullscreen mode Exit fullscreen mode

A status string is a contract. If a space can break a gate, the comparison is too trusting.

Read-only DB guard. A failover left the DB read-only, and the scheduler kept firing jobs that all failed — a cascade of noise. The fix: detect read-only mode and stop the cron cascade early, with a notification instead of a flood of exceptions.

Ops tooling over the app. Added audit + remediation tools (status audit, resync, normalize) so on-call can inspect and fix state without raw DB access, plus permission-gated access to queue/dashboard internals. Exposing safe, gated operations beats handing out database credentials.

Takeaway

Different repos, one theme: make the source of truth tolerant of messy input, then guard the edges — whitespace, failover, and access all count as edges.

Top comments (0)