Changelog & Timeline
A chronological history of my blogs, notes, projects, talks, and milestones.
How I Saved My Immich Installation from a Broken PostgreSQL Upgrade on TrueNAS
A deep dive into a manual PostgreSQL 15 to 18 migration for Immich on TrueNAS SCALE, using Warp's AI agent to navigate a broken upgrade path.
Beyond "It Works on My Machine": Lessons from Modernizing a Legacy Ansible Role
My journey modernizing an old Ansible role for chezmoi, navigating the shifts in the Ansible ecosystem, and learning to treat AI as a senior peer.
Self-Hosting Atuin with Docker and Coolify
My journey to solve fragmented terminal history by self-hosting an Atuin sync server using Docker and Coolify.
Teaching Gemini My Voice: A Journey into Skill Creation
When working with **Large Language Models (LLMs)** to generate content, there's always a risk of losing your unique pers...
The Reboot: Ditching the Grand Architecture for Astro
It’s been a while. If you’ve been following my corner of the web, you might have noticed an extended radio silence. I’v...
Relaunched the blog with Astro
After an extended radio silence, I officially rebooted the blog. I walked in tired of over-engineered architectures and...
Note Update
I am finally satisfied enough with the new site design to launch it. More iterations to come...
Laravel's trusted proxies with Coolify
Recently at work, I was setting up Coolify in the Axelerant infrastructure. Part of the process was getting a Laravel ap...
Azure resources and resource groups in different regions
While working on a client project, I ran into some strange behavior with Azure and Terraform. It is entirely possible t...
Azure Container Apps and NAT Gateway limitations
If you're dealing with Azure Container Apps, here is a frustrating limitation I ran into: you cannot attach a NAT Gatewa...
Coolify, Cloudflare Tunnels, and SSL redirect loops
I spent some time setting up Coolify on my home server. Since I use Cloudflare Tunnels to route traffic to a wildcard su...
Why Python projects use a src directory
I recently started building a small Python tool to convert some markdown files. I noticed that modern Python project gen...
Laravel's chunk method for deleting records
I've been meaning to clean up some old tickets using a console command in a Laravel project. I used Warp to generate the...
Cloudflare tunnel limitations with HTTPS terminating
Recently, I was setting up public hostnames over a Cloudflare tunnel to access services within my homelab. It behaves a...
Kubernetes RBAC permissions for kubectl top pods
Recently at work, I was trying to figure out the exact RBAC permissions required to let a user run `kubectl top pods`. ...
Reclaiming video memory for a headless server
I've been meaning to optimize the resources on my Beelink SER5 Mini PC since it runs entirely headless as a Proxmox VE s...
Fixing missing pip3 tools when using asdf
It happened again. Sometimes, tools installed via `pip3` are simply not accessible from your path. This usually happens...
The month of DrupalFest
I began writing this series of posts on April 1st, 2021 to celebrate DrupalFest, Drupal's 20th year. [When I started](ht...
What I want to see in Drupal's Future
This DrupalFest series of posts is about to end and I thought that a fitting end would be to talk about the future of Dr...
Understanding overridden configuration in Drupal
The configuration API is one of the major areas of progress made in Drupal 8. It addresses many challenges of managing a...
A Drupal Developer's Tech Stack... continued
Just as I published [yesterday's article](https://hussainweb.me/a-drupal-developers-tech-stack/) on the tech stack, I re...
A Drupal Developer's Tech Stack
The title of this post is not really accurate, but I can't think of another way to say it. This post is related to my ea...
Remote Drupal Development
Over the years, I have significantly lesser time for development and an increasing need to move around. After dealing wi...
Altering forms in Drupal: a workable mixed approach
I thought I was done with the series of posts on object-oriented programming [after my last one](https://hussainweb.me/a...
Altering forms in Drupal: Comparing hooks and object-oriented approaches
_Update: [Read the follow-up to this post](https://hussainweb.me/altering-forms-in-drupal-a-workable-mixed-approach/) wh...
How I contribute to Drupal (my workflow)
I have been contributing to Drupal in a few different ways for a few years now. I started off by participating in meetup...
Tracking Drupal (and open source) contributions
We at Axelerant have been contributing to Drupal in our own ways for a long time. In fact, I worked as a full-time contr...
The Panacea of Objects in Drupal
Drupal 8 was a major revolution for the Drupal community in many ways, not least of which was because of the complete re...
What does a Drupal developer do?
Now that we have discussed some of [the concerns with career growth](https://hussainweb.me/career-growth-with-drupal/), ...
Career Growth with Drupal
As the Director of Drupal services at Axelerant, one of the things I often worry about is the growth of each of the memb...
What I look for in Drupal contrib modules
As of this writing, [there are 47,008 modules available on Drupal.org](https://www.drupal.org/project/project_module). E...
What I would like to see in Drupal 10
I picked up this topic from [my ideas list](https://docs.google.com/spreadsheets/d/1SMLEWHkk7OPpBi9Ajzxu8ZHzftvesmpMC6JE...
Building a Digital Experience with Drupal
Drupal is a CMS. One might even say that Drupal is a good CMS and they would be right about that, in my not-so-humble op...
People in Drupal
As I was leaving home for the park, I wondered aloud what topic [should I write about today](https://twitter.com/hussain...
My thoughts on Automatic Updates in Drupal
It’s spring and I decided to come out to a park to work and write today’s post. I sat on a bench and logged in to my Wor...
Simple Infrastructure as Code (IaC) for Drupal
I have been setting up computers and configuring web servers for a long time now. I started my computing journey by buil...
Running (testing) Drupal in CI pipeline
Here's a quick post to show how we can run Drupal in a CI environment easily so that we can test the site. Regardless of...
Thriving on Chaos in Drupal
Today, I want to share my thoughts from a book passage related to Drupal. The book, [Everyday Chaos](https://www.amazon....
Drupal Podcasts (and some PHP ones)
Today's DrupalFest post is on the lighter side. I am just going to talk about some of the podcasts I listen to related t...
Why you shouldn't decouple Drupal and why you should
Today's post is going to be a quick one; not because it is an easy topic but because a lot has been said about it alread...
The magic of Drupal events
I missed joining the [DrupalNYC](https://www.drupalnyc.org/meetups) meetup today. Well, I almost missed it but I was abl...
Accessing Drupal.org API
I am going to keep today's DrupalFest post simple and talk about the API to access content on [drupal.org](https://www.d...
My advice to my younger self (and to new Drupal developers)
I recently opened up a spreadsheet where people can put in their ideas of what I can write about in this DrupalFest seri...
Code Quality check tools for Drupal
This is the fourth post in my DrupalFest series and I am excited to keep it going. I want to write about different tools...
Speed up Drupal websites by using PHP's preloader
PHP 7.4 introduced the concept of [preloading classes (files)](https://wiki.php.net/rfc/preload) on server start-up into...
Quick setup of a Drupal site
This post will cover quickly setting up a Drupal website for testing, experimentation, or evaluating features on your lo...
Let the fest begin! #DrupalFest
It has been 20 years since Drupal began its journey in a dorm room and reached enterprises. April 2021 is marked as the ...
My (updated) Drupal Story
Now that I have [announced](http://hussainweb.me/let-the-fest-begin-drupalfest/) my "a blog a day" DrupalFest attempt, h...
Setting up Python venv in Visual Studio Code
I recently set up a new laptop for work and was about to get most of the way using [my dotfiles](https://github.com/huss...
Build infrastructure for a multi-site Decoupled Drupal solution using Terraform
Presented at DrupalCamp London 2020.