Skip to content

01Uses

Uses

What I build with, what I host on, and a set of habits that cost me something to learn. The list stays short on purpose: every dependency in a plugin is a dependency in somebody else's site.

6 categories · 33 entries

02The application stack

What I reach for when the thing being built is an application rather than a page.

Laravel
An API that could have a second client put in front of it, rather than a framework quietly rendering its own front end. Sanctum for authentication; the authorisation layer is written by hand.
Vue 3, Composition API
Composition over Options for anything non-trivial. Logic that belongs together lives together, and it can be pulled out into a composable the day a second screen needs it.
Pinia
One store per domain, each owning its own loading and error state. A single global store is comfortable for a week and unreadable by the third feature.
Vite
The build for everything — applications and plugin interfaces both. Fast enough that a React panel inside wp-admin stops feeling like a compromise.
Tailwind
Tokens in one file, utilities everywhere else. The token layer is the part that matters; the utilities are only how it gets applied.
Nuxt
This site. Prerendered, with a bundle budget that fails the build rather than being admired in a readme.

03Local development

Two stacks, kept apart. Application work and WordPress work do not share an environment.

Laragon
Where the Laravel side lives. Apache, PHP and MySQL without an afternoon of configuration.
LocalWP
One throwaway site per plugin. A plugin has to be installed on a clean WordPress before I believe it works.
MySQL
The database under both stacks. Enough of it that a data migration can be a query rather than a plugin.
A test suite that runs locally
Just over a hundred suites on the form plugin alone. They exist because it ships to sites I will never see, and no amount of clicking replaces that.
A guarded release script
Building a release by hand is how a stray development file ends up in a zip. The script refuses rather than reminds me.

04Version control and terminal

The layer underneath everything else. Unglamorous, and the part I would miss first.

Git
Every project is a repository, including the client sites that were never supposed to have one. It is also the reason I can work on a live site and still have a way back.
Git Bash on Windows Terminal
POSIX habits on a Windows machine. Most tooling assumes a Unix shell, and it is less work to bring one than to translate every command.
GitHub
Public for the plugins, private for client work. Actions for anything that has to happen on a schedule.
Composer
PHP dependencies, and increasingly the autoloader inside plugins that used to get by without one.
npm
The other half of every build. Kept boring on purpose — a dependency in a plugin is a dependency in somebody's site.

05The WordPress side

What goes into a plugin, and what goes onto a client site. Two different lists with two different standards.

React with @wordpress/components
Plugin interfaces are applications mounted inside wp-admin. Using the WordPress components is why they look like they belong there rather than like something bolted on.
dnd-kit
Dragging that works from a keyboard and announces itself to a screen reader. Retrofitting that is far more expensive than choosing it.
The WordPress REST API
The only seam between a plugin's PHP and its interface. It is what makes the PHP testable without a browser anywhere near it.
Advanced Custom Fields Pro
For client sites, where the content model lives. Fields named in the client's vocabulary, not the database's.
Elementor
Not a compromise — the right answer when an in-house team edits weekly. Locked templates, a small palette, global styles set once.
WooCommerce
With as few extension plugins as the requirement genuinely needs. Every add-on is a licence somebody has to keep paying.

06Hosting and delivery

Mostly other people's infrastructure. The skill is working inside constraints I did not choose.

The client's own hosting
Shared hosting, a control panel, no staging environment and no deploy pipeline. That is the honest description of most WordPress work, and pretending otherwise is how a rebuild gets quoted when a fix was needed.
FTP against production
Not a preference, a constraint of agency work. It teaches one discipline above all: change one thing, verify it, keep a way back.
Cloudflare
DNS, CDN and Pages. This site is prerendered and served from it.
A transactional email provider
Site mail leaves through a real provider, never the web host's PHP mail. This is the single most common reason a contact form fails silently.
Backups the client owns
To storage in their account, not mine. Leaving me should never mean leaving their data.

07How I work

Process rather than software. Most of it was learned the expensive way.

Model the data before the interface
The fastest way to make something expensive to own is to build the screens first and discover the shape of the data afterwards. True of a Laravel schema and of an ACF field group alike.
Read the source before the documentation
Learned in two years of having nobody to ask. It is still the fastest route into an unfamiliar framework, and it is why picking up a new one is a week rather than a season.
Ask who maintains it, before choosing how to build it
The same question opens every project. It decides page builder or custom theme, and it decides how much of an application belongs in its API rather than its front end.
Deep work in the morning, calls at night
US clients, Dhaka time zone. The overlap is my evening, which leaves the mornings uninterrupted.
A repeated complaint is a specification
The same request from four unrelated clients is not an inconvenience. It is the only market research a one-person shop gets for free, and every plugin I have finished started there.
Write the handover in the maintainer's language
One of my plugins ships its maintainer notes in Bengali. Documentation somebody has to translate before using is documentation that will not be used.