Articles

I’m a full-stack developer with leanings towards Laravel (TALL); as well as devops and automation. Most of these articles are published as a reference for myself, but if someone finds them useful, then great!

You can see the list of articles below, the tags; or use the search function below to see more.

Some things I want to learn and write about (even if it’s just for myself) in the future:

Containerise a private Github Readme Stats server and upload stats card image to S3 using an Ansible playbook on a schedule with Semaphore
Published:
Use git update-index --assume-unchanged to remove local changes of a Dockerfile from the staging area in a repository, and use (an ignored) docker-compose.override.yml to configure xdebug.
~3 minutes
Published:
A relatively basic Laravel integration with an Amazon Cognito user pool with two clients. The first client for web users will be used to initiate (from Laravel) login/logout on Cognito’s hosted UI with email/password. The second client will be for system users, which will generate tokens with email/password through API instead of hosted UI. Finally, a simple console command to decode/verify web and system users’ JTWs from the user pool’s JWKS.
~23 minutes
Published:
Learn how to add asynchronous search to a hugo blog with alpine.js and fuse.
~7 minutes
Published:
Create and configure a GitHub workflow to run PHP QA tools (e.g. phplint, phpcs), and then run unit and feature tests (e.g. php artisan test, phpunit), and finally generate a code coverage report or some other artifact.
~8 minutes
Published:
Send a message template containing emoji from Twilio in Laravel.
~3 minutes
Published:
Easily consume arbitrary raw AWS SQS messages produced by another application in your Laravel application’s queue with a Job and queue configuration.
~4 minutes
Published:
Learn how to set up a GitHub workflow to build documentation for a generated PHP SDK from multiple generators, and consolidate them all into a single gh-pages branch.
Published:
Generate and save a blade component containing a Chart.js chart in Laravel (without controller bloat) using Browsershot, and then upload it to S3.
Published:
Use the Laravel Pipeline component with many Pipes to replace arbitrary placeholders in DOM with computed values using a Model’s accessor
~4 minutes
Published:
Create a Laravel middleware to parse the response DOM and update a set of img’s src to be routed through imgproxy.
~3 minutes
Published:
List the active git branch for a set of git repositories in whiptail, then jump to the selected repository’s tmux window
~5 minutes
Published:
Setting up the Tailwind breakpoints by adding custom devices in Google Chrome’s device toolbar for easier testing.
~1 minute
Published:
I’ve hosted many apps. I’ve set up CI to build containers. But I’ve never figured out the continuous deployment part, until now. I will use watchtower in a GitHub workflow to trigger the image update and restart the container.
~13 minutes
Published:
Bundling the generated output from a static site generator (e.g. hugo) into a simple static file server (e.g. caddy) for testing the build.
~2 minutes
Published:
Copy a file from another git branch without checking to that target branch.
~1 minute
Published:
Want your Laravel app to do something after running migrations? Here’s how I did it.
Published:
Understanding basic SVG path and viewbox for a simple filled triangle.
~2 minutes
Published:
Connect to a remote server with mc from command line (non-interactive).
~1 minute
mc
Published:
Enabling MySQL query logging on Mac (without Docker).
~1 minute
Published:
A command I’ve used a few times to install a fresh Laravel project into the cwd’s src/ folder, leaving the cwd for your own README, Docker, Terraform, etc. files.
Published:
Installing and configuring Xdebug with Laravel Valet.
~1 minute
Published:
A few tools (email, object storage, logging) to substitute compatible APIs from production environment for local development.
Published:
How to handle backend requests given from livewire/sortable. Data fetched in mount - think Posts by Users (as prop into Livewire component) under a Category (as prop into Livewire component), then sort order persisted during action and re-rendered seamlessly.
~2 minutes
Published:
How to set up PHPStorm, and use webdevops/php-dev:7.x image using xdebubg v3.
~1 minute
Published:
Create an AWS S3 and corresponding CNAME in Cloudflare for static site hosting using ‘infrastructure as code’ using Terraform.
~8 minutes
Published:
A UK place name gazetteer loaded into a docker image with some spatial querying.
~5 minutes
Published:
Building a private Docker image with custom structure and data, for a legacy app for a slightly easier CI pipeline.
~4 minutes
Published:
Using failedValidation for standard JSON responses on validation error(s).
~4 minutes
Published:
Slim single action controllers and IDE friendly FQCN route definitions in Laravel.
~4 minutes
Published:
Code Quality and Security - SonarQube empowers all developers to write cleaner and safer code.
~2 minutes
Published:
Moving our semi-unstructured data from a mysql database, stored in a json column to a mongodb instance for better performance.
~8 minutes
Published:
Use a SOCKS proxy to query an IP restricted API with Postman.
~1 minute
Published:
Automatically have Github Actions build some code-generated (binary) assets and attach to a release when a new tag is pushed.
~3 minutes
Published:
Automatically have Bitbucket CI build a static site and move the built into a production or staging bucket depending on the branch.
Published:
Relatively barebones PHP environment for Codewars Kata challenges, with xdebug.
Published:
Publish messages to a RabbitMQ instance using PHP. Build a PHP consumer to process messages in the background with supervisord.
Published:
How you might integrate content written in a Ghost Blog into a Laravel site using its Content API.
~8 minutes
Published:
A simple whiptail script to select which databases you want to refresh for local development work. Downloads using awscli and some pv for progress on decompressing and importing.
~2 minutes
Published:
This was hell. Just an excuse to save some handy wget, ssh, find, csvtool, xargs, commands and other occasionally useful things, honestly.
~5 minutes
Published:
Basic scripts for dealing with PDF in my job - converting, cutting and catting - throwing some zenity around gs and pdftk.
~4 minutes
Published:
Some tips I picked up to make sites hosted on Apache httpd servers more secure.
~5 minutes
Published:
Friendship ended with terminator, now tmux is my best friend.
~3 minutes
Published:
How you can integrate some PHP QA tools in your project, and guard your project with git hooks.
~7 minutes
Published:
One ingress nginx reverse proxy to multiple php:apache containers with different (XDebug) configurations.
Published:
An interactive CLI for logging server audits in bash with whiptail and logger.
~3 minutes
Published:
To top