Documenting my journey of tackling challenges during my software development endeavors.
Gathering all my in-depth reflections on programming, solution architecture, and related topics, arranged in a chronological sequence.
Writing about software, architecture, and the developer experience.
Thirty commits across three repos, and the day split cleanly into two halves: standing a control...
Fifteen commits, three repos, and the bulk of it in one: a control plane that got an MCP surface, a...
I spent today putting an MCP surface on a multi-tenant Laravel control plane — the kind of app where...
TL;DR I stood a Laravel control plane up on a bare Ubuntu host today. The provisioning...
Four commits across two repos, and a short day by commit count that still managed to contain the most...
TL;DR Bulk actions over a mixed selection always skip rows. A count of skips is not a...
Sixteen commits, all on one private deployment platform, spread across a very long day — a batch just...
TL;DR A method that can't do its job has three options: do it, throw, or return "I can't"...
Heavy day, mostly on one private deployment platform, plus a small but instructive fix in a PDF book...
TL;DR The most expensive bug I hit yesterday wasn't a crash. It was a stub that answered...
A heavy day across six repos. Rather than list commits, here's the through-line: almost everything...
TL;DR Drift detection and autoscaling look like different features. They're the same...
TL;DR cleaniquecoders/pii-protection now ships SecretScrubber (pattern-based),...
TL;DR Rolled a Laravel starter/scaffolder onto Pest 5, made pest --tia (test impact...
TL;DR When one system has to build many kinds of app (Laravel, Django, Go, Node,...
TL;DR An MCP server lets an AI assistant call your app's real actions instead of guessing...
TL;DR Bumped Kickoff (my Laravel scaffolder) to Pest 5, PHP 8.4 floor, Symfony Console...
TL;DR If a web request shells out to a slow CLI (docker, kubectl, rsync…), move it to a...
TL;DR On a deployment platform: added a real nginx reverse-proxy tier with health gating,...
TL;DR Shipped a big reorg of my open-source Claude Toolkit and bundled it into my Kickoff...
TL;DR I reorganised my Claude Toolkit into three clear layers: skills (knowledge), agents...
Back in February I wrote about agent-skills — a repo of SKILL.md files that taught Claude Code my...
TL;DR Fixed a package that ignored its own "configure your own model" setting. Reworked a...
TL;DR A package that lets you configure a model, then calls the default one statically...
TL;DR I use two identifiers per row: a UUID as the public ID (URLs, APIs, forms) and an...
TL;DR Shared-database multi-tenancy = one database, every row tagged with tenant_id, a...
TL;DR Ran the same SEO + analytics checklist across five public repos and a couple of...
TL;DR Shipped a SEO + analytics baseline in Kickoff: meta/OG, canonical, JSON-LD org...
TL;DR I merged several training courses into one monorepo and gave every course the same...
TL;DR Spent today rebuilding two training diagrams — a layered reference architecture and...
I'm opening up my ebook series to technical reviewers before the final edition ships. Here's what the job actually involves, and the four-column format I use to make book feedback useful.
TL;DR Shipped an email broadcast module: audience filtering, suppression, queued...
TL;DR Shipped an email broadcast feature: audience filter → suppression gate → one queued...
TL;DR Rewrote a bootstrap seeder so the deployment stack — DB engine, queue runner, PHP...
TL;DR I rewrote a product's differentiators after noticing four of five were claims any...
TL;DR Rewrote a product's landing-page differentiators to only keep claims a rival can't...
TL;DR Shipped account suspension across two Laravel apps — an enum, a middleware, a...
TL;DR Suspension is not deletion: keep the row, block the sign-in. Model it as a status...
TL;DR Fast-forwarded two Laravel apps off an old in-house skeleton — in layers, not one...
TL;DR A job dispatched once, at row-creation time, has a silent failure mode: if that...
TL;DR Three unrelated repos, one recurring theme: derive from a single source of truth...
TL;DR The sidebar, the new section switcher, and breadcrumbs all read the same...
TL;DR Two apps each had their own password-change/reset logic, plus config toggles to...
TL;DR Collapsed a billing model from à-la-carte features to plans-only, in four safe...
TL;DR Moved a SaaS from à-la-carte feature subscriptions (pay per feature) to plans-only...
TL;DR Rolled a shared support-widget embed setting across the whole product suite — one...
TL;DR You can't put a Blade directive (@if/@endif) inside a component tag's attribute...
TL;DR 23 commits across 4 repos, one theme: opening apps to the outside world,...
TL;DR Built an embeddable support widget for a helpdesk product: no cookies — a...
TL;DR Two Laravel backends started serving Flutter apps on the same day — an events...
TL;DR A gate check-in app can't depend on live Wi-Fi: scans must work offline and sync...
A driver-based, testable BayarCash integration pattern from three production Laravel apps — checkout, webhooks, and the recurring-billing reality.
TL;DR Sync must be idempotent. Re-running a gateway sync should converge, not explode on...
TL;DR Syncing config into an API gateway (Kong here) is a converge operation, not an...
TL;DR You can record outgoing mail — sent, delivered-ish, opened, clicked — using...
TL;DR Shipped two a11y wins in laravel-livewire-tables v4.1.0: focus traps on popovers...
TL;DR "Disable" should drain, not delete. Turning off a gateway route or an upstream...
TL;DR Public Livewire tables package: extracted a theme-class seam so Blades stop...
TL;DR Blade templates that branch @if($isTailwind) ... @elseif($isBootstrap) for CSS...
TL;DR Three threads today: a public Livewire tables package jumped to Laravel 13 +...
TL;DR Upstream rappasoft/laravel-livewire-tables marked Livewire 4 support wontfix, so I...
TL;DR A multi-tenant app was resolving the active tenant from the request...
TL;DR A metrics engine had two query paths — a SQL push-down for big datasets, an...
TL;DR Two threads today: an organization layer on top of an existing multi-tenant app, and...
TL;DR Centred a sidebar brand mark in the collapsed rail (open-source starter kit) — pure...
TL;DR Shipped a composer share command + reverse-proxy trust so a local Laravel app can...
TL;DR Exposing a local Laravel app over a public HTTPS tunnel breaks two ways: assets...
TL;DR Pushed commercial rules (free seats, bulk seats, tax) out of code and into config +...
TL;DR Commercial rules — how many free seats a plan gets, whether you can buy seats in...
A deep day, not a wide one. The bulk of the work was a sustained platform build where the same...
Here's a bug with a great property: it works perfectly for almost every link in your email, and...
I spent a long stretch this week building out the storage layer of an observability platform — the...
There's a tension every app hits eventually: some configuration really should live in .env and...
Exposing your app to an AI agent over MCP is basically handing someone a master keyring and trusting...
Two threads today, and they rhyme more than I expected: both are about who gets to do what, and how...
A wide day rather than a deep one — four separate threads across a few projects, each with a lesson...
Performance work has a reputation for being glamorous — the heroic "we cut latency by 80%" story....
Some days the work spreads across a few projects instead of landing as one big feature. Today was...
There's a moment in every app's life where someone asks: "can an AI assistant just talk to this...
I've now built MCP servers into enough Laravel apps to notice the pattern: I keep rewriting the same...
If today had a spine, it was MCP. I shipped the generic MCP toolbox into a public package and stood...
Here's a small thing that cost a disproportionate amount of head-scratching this week: a remote MCP...
I tagged cleaniquecoders/laravel-mcp-kit 1.0.0 today, and most of the work that got it there was...
I spent today building a backup-and-restore feature for a Laravel app that manages multiple API...
Anyone who manages an external system from a Laravel app eventually hits the same uncomfortable...
Most of today went into a user-management overhaul in kickoff — my Laravel starter kit. Flyout CRUD...
Today's work was a small piece of UX that's easy to underestimate: making an admin "browser" page...
Imagine you write a letter in a secret code that only your old house key can read. Then you move. You...
Bundling an admin UI inside a Laravel package is a different game from building one in an app. The...
There's a class of bug that's maddening: it passes every test you have, then crashes in the user's...
Here's a fun one. You build a package that backs up an app's config — the .env plus the settings...
I spent today wiring an MCP server into a Laravel app that manages a Kong API gateway. The...
A gateway-agnostic subscription and invoicing engine for Laravel. No per-gateway sub-packages — a payment gateway is one contract you implement per app. Ships a bundled local gateway so the full subscribe → pay → invoice → receipt loop runs before you've signed up with any merchant.
A pure-PHP toolkit for encrypting, masking, redacting, and tokenizing personal data — built as plain classes with explicit inputs and outputs, so it drops into Laravel, Symfony, a queue worker, or a CLI script unchanged.
A solid screenshot-to-BRD workflow for vibe coders, the two failure modes nobody talks about, and the missing step that separates a demo from a system.
Blueprint before code. How I went from drowning in ideas to shipping structured products using Claude, CLAUDE.md, and a phase-based workflow.
A Laravel package that exposes allowlisted Artisan commands through a Livewire-powered web UI with full audit logging, queued execution, and notifications.
How I automated convention syncing across multiple Kickoff-based Laravel projects using a custom Claude Code skill — so I never have to update CLAUDE.md one-by-one again.
I've been building with Claude Code for a while now, and one thing kept bothering me: every new...
Ever spent hours going back and forth with design tools trying to nail down a logo? I built a Claude...