Changelog & Timeline

A chronological history of my blogs, notes, projects, talks, and milestones.

blog

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.

blog

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.

blog

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.

blog

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...

blog

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...

milestones

Relaunched the blog with Astro

After an extended radio silence, I officially rebooted the blog. I walked in tired of over-engineered architectures and...

notes

Note Update

I am finally satisfied enough with the new site design to launch it. More iterations to come...

til

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...

til

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...

til

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...

til

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...

til

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...

til

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...

til

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...

til

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`. ...

til

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...

til

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

Remote Drupal Development

Over the years, I have significantly lesser time for development and an increasing need to move around. After dealing wi...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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/), ...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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....

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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...

blog

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 ...

blog

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...

blog

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...