Obtaining a Masters in Computer Science
After more than twenty years building software, I want to pursue a master's degree in computer science to deepen my understanding, strengthen my leadership, and earn it before I turn 50.
After more than twenty years building software, I want to pursue a master's degree in computer science to deepen my understanding, strengthen my leadership, and earn it before I turn 50.
Why I moved my personal site from Drupal to Astro on Cloudflare Pages to reduce cost and maintenance, not because of any limitation with Drupal.
Been going deep on a handful of projects this summer, wanted to take a moment to contribute a Drupal module that solved a problem for us called Canvas Fields - the ability to assign standard fields to Canvas Page entities. Text fields, reference fields, list fields. Why?
Over the last year, AI coding assistants have become a regular part of my development workflow. Like many developers, I have spent countless hours working with tools such as Claude Code, OpenAI Codex CLI, Gemini CLI, and GitHub Copilot CLI.
In my last post I alluded to some software projects I was working on, and in the nick of time I have two ready to share before we enter 2026.
Welcome to my Spotify 2025 Wrapped! I don't have Spotify, so this is my year end wrap from my point of view. Like previous years, I didn't get to write as much as I wanted to, but I've also been juggling a lot more than before.
Every so often I run into something in Drupal that reminds me why I still enjoy working with it after all these years. Recently, while working with the Group module, I needed to display a few pieces of dynamic information: the number of members in each group and a handful of user thumbnails.
I published my second Google Chrome plugin today.
Whoever gave the 60 day prognosis was right on the mark, unfortunately. It's always a shock, followed by a sense of relief that someone is no longer suffering the hardships of one of the worst kinds of cancer.We're seeing it happen with someone else too, sadly.
What would you do if you were told you had 60 days to live?
Today I published my first ever browser plugin for Google Chrome - Librarian.
In my last post on running Ollama in my home, I detailed how I repurposed an Intel NUC as a mini-server to host Ollama, Docker services, Fedora Server, pi‑hole, and more (kevinquillen.com
5 years ago I decided to get a Raspberry Pi Zero W and install Pi-Hole on it for blocking bad traffic on our network. It worked incredibly well.
In my last post I mentioned releasing a small project in Rust called Hoi, a task runner meant for collaboration or personal use. Since then I was able to add a few more features, nearing a point which I consider 'feature complete':
During covid lockdowns I had several projects in my spare time to keep me busy. One of them was teaching myself to learn how to read sheet music. Another was building an LCD screen marquee of data powered by a Raspberry Pi 3.
For many years, Postman was a tool of choice for me when testing APIs while in development. It was a quick way to construct HTTP requests of any type and probe responses, test auth, things of that nature.
We're coming up on almost three years of automated Drupal core updates for my personal site.
Forticlient seems to have a lot of issues working correctly on Fedora and/or SAML required setups (where you complete the auth in an external browser). The best I can get from the error logs is that the connection was terminated. Fortinets support of Linux is not the best.
It has been perhaps the 3 busiest months of my life between bidding on homes, closing, and moving. Despite my best efforts and planning, there was a lot more work and logistics than I had anticipated.
I've recently taken up maintainership of the Netlify module for Drupal.
I'm on the move again!After months of searching, we've finally found our dream home. I will have a lot to do between now and the closing date, right after which I need to begin work on the "Drupal 11 Development Cookbook" with Matt.
Drupal 11 is coming down the pipe this week, are you ready? I've already updated my site to the latest release, even though visually it looks the same to you.
Eat at a local restaurant tonight. Get the cream sauce. Have a cold pint at 4 o’clock in a mostly empty bar. Go somewhere you’ve never been. Listen to someone you think may have nothing in common with you. Order the steak rare. Eat an oyster. Have a negroni. Have two.
I know I had set a goal for myself to write more this year, but I have not been motivated to write lately for two reasons.
It feels like the post I made for 2023 goals was done only a little while ago - but here we are again at the start of a new year. I'll keep it short this year, things like reading and exercise are table stakes. Those are 'must do' things that are not really goals anymore - I just do it.
Last week I wrote up a walkthrough in dealing with a change introduced for List field validation in Drupal 10.2 using a stored procedure to rewrite existing data.
2023 was a white hot, fun, successful and non stop year for me. Perhaps one of the best in my life both personally and professionally. Hoping for (and working toward) that trend to continue into 2024 and beyond.
Drupal 10.2 has arrived and ships with several new features, bugfixes, enhancements and quality of life improvements.
I have seen some chatter lately about folks asking how to access the Solr admin interface over HTTPS instead of HTTP connection in DDEV. Enabling this is a simple change to the docker-compose.solr.yaml file in the .ddev directory.
Thanks to Symfony, Drupal has an incredibly robust routing system. What once used to be a chore in Drupal versions prior to 8 is now a breeze.
Security is a paramount feature of any modern CMS. Drupal has a well defined authentication and RBAC (role based access control) system limiting the scope of what users can or cannot do.
It's exciting to see some recent momentum into adopting DDEV as the official local development environment for Drupal, supported by core and contrib community leaders.
We recently spent a few days at Velir overhauling our local Docker development stack for Drupal merging our tool and workflow with DDEV for better project outcomes. DDEV is an amazing fit for modern Drupal development.You can read more about it here:
A few months back (sorry, its been a minute!) I detailed how you could set up PHPDocumentor to automatically generate documentation for your custom code and modules for Drupal.
It was quite a week spent in Pittsburgh earlier this month for Drupalcon! We are beginning to rollout our thoughts and experiences from members of the team who attended, what we saw, and things that piqued our interest!
A long time ago, I wrote about setting up PHPDocumentor 2 for Drupal in PHPStorm.
Velir will be at Drupalcon Pittsburgh next week and have a couple of talks that we are presenting!
It has been a very busy couple of weeks on this end and despite my best efforts I have not had a lot of time to write posts. We've been busy authoring a lot of code. As a result, three Drupal modules have new releases that contain all kinds of new features:
In just a few short weeks we have made a lot of progress adding features and fixing bugs in the OpenAI module for Drupal. We have just released an alpha7 preview of the module containing 3 notable changes:
Everyone is talking about ChatGPT and where tools like these can fit into everyday life. But is the future of artificial intelligence only chatbots?
I am excited to announce that last year I participated in co-authoring The Drupal 10 Development Cookbook alongside the venerable Matt Glaman to bring you many years worth of experience distilled down into
2022 went by in a complete flash. I had a never ending flurry of activity in work and life that kept things moving pretty fast for me. I launched several new projects, developed many custom integrations and solutions, took on new clients who's vendors gave up on them.
This site is now proudly running on Drupal 10! Are you ready? We can help you get there!
A month ago, I put in an order for a new machine that I had waited all year for - the Intel NUC 12 Enthusiast.
As promised in the last post, here is a new article over on the Velir blog.
In line with the previous post, I have been thinking a lot about my career trajectory and how it is still ever rising. I've been doing what I do now for nearly 25 years.
I've been hitting several milestones these last few years. Next week I hit another one, I will turn 40.
A few years ago I spent a weekend converting my static blog into a Drupal 8 site which I chose to host on Amazon Web Services.
The Brave team has introduced a new feature for their Brave Search engine called "Goggles". Goggles, in short, filter search results out by additional relevancy rules using an individual Goggle.
2022 has proven to be quite the year. I did not intend to go many months between posts, but life has been very busy! I am on the go all the time this year but here's some quick run downs of whats going on.
It seems like the time flies anymore these days - now it's 2022. As is personal tradition, I start the year off by making a goal list.
20 years is a long time.
I've been quiet for a while. Not because I am short on ideas or have nothing to say, I've been moving several initiatives at work and home forward. Spinning many plates, making sure none fall.
Took some time off from posting for a little while, a lot has been going on. All good stuff, just super busy.
Its been roughly five months since I decided to make the leap from Mac OS to Linux. I am happy to report I have only had to go back to the Mac a couple of times to retrieve some files.
Drupalcon 2021 is in a few weeks.
Today, I passed the final exam in a series of exams from Acquia for Drupal 9 - the Frontend Specialist certification.
Now that we had a game server up and running on AWS, there were a few remaining bugs to iron out. These caused the game to crash pretty much immediately on connecting to the server.
I am in the midst of a Drupal 7 to Drupal 9 upgrade for a client. This is the first time I am using the Migrate Drupal and Migrate Drupal UI core modules to do an inline upgrade. So far everything has been great.
Continuing in my efforts to achieve goals and be a force for the agency, I've obtained the Acquia Drupal 9 Backend Specialist certification.
The CKEditor Wordcount module has received a new release that updates it to support the new features added to the word count plugin for CKEditor.
In the second post of this series, I went over reviewing visible bugs in the game and rectifying them enough to where the game can be played. Here, we now need get the game online.
This will be a pretty short post - I've quit social media. I actually quit a majority of them many years ago. Last spring I locked my Twitter and never looked back. That was something I said I was going to do for a while, and then finally did. I've had enough.
In the first post of this series, I spoke about reviving a Quake mod from a quarter century ago to see if it can still be played in 2021. Here I discuss some of the bugs and UI tweaks I fixed in my quest to get the game running.
In 1996, id Software released a game that forever changed the gaming landscape of both the single player experience and multiplayer experience that still influences games to this very day.
I am now an Acquia Cloud Platform Pro Certified professional! Acquia Cloud has powered the infrastructure behind the Drupal projects I have worked on for many years. I am now certified in a number of areas:
Today I am a newly minted certified professional for Acquia Site Studio 6.0. Site Studio is a low-code component based page building power suite for Drupal.
After 11 years I have decided to leave the Apple ecosystem for doing development work and move to a dedicated Linux environment.
Composer 2.0 was recently released with much improved performance in fetching and updating dependencies. If you are running projects on Drupal 8 or 9, you are going to want to switch as soon as you can.
At Velir, I've spearheaded the usage of Docker for local development since 2017. One of the most invaluable tools to lowering the barrier of entry for people was adding Ahoy to our toolbox.
Today, I am pleased to be posting that I have received certifications in two areas of Drupal 9 from Acquia:
This year has afforded me a lot of time to pick up another old habit: reading. In previous years with a much busier city lifestyle, my level of reading took a backseat to most things, just like running.
A busy year gets even busier.
It's a long hot summer.
My site is now running on Drupal 9! The upgrade was pretty straightforward with only a few things to correct in some custom modules so they could be read and registered in Drupal 9. On deck are a half dozen client projects to bring from 8.6+ to Drupal 9.
Great news for developers who use Docker for Mac and encounter performance issues.
I recently updated our local Docker development stacks to use Traefik version 2. Traefik is an edge router application that makes setting up services and routes rather simple.
In a previous post, I discussed how to use custom cookies on Pantheon and how to provide a browser based functional test using the WebDriverTestBase class from Drupal 8.
Migrating legacy applications can be quite a challenge. Quite often they are very nuanced and go well beyond "how do we get content from here to there?". There are many aspects to consider.
Tokens represent an inline replacement when evaluating or rendering text. In Drupal, the Token module goes all the way back to Drupal 4.x and still exists today for Drupal 8 (and soon, Drupal 9).
Earlier this month, a round of updates were made to a client site and deployed to production. A critical bug came in saying that donut charts in visualizations were now showing the wrong numbers and that this was a top priority since it was visible to the public.
The migrate system in Drupal 8 is very powerful. In very few lines of code, you can hook into various data sources, process and import data into Drupal.
Having worked on a project this year that makes extensive use of Migrate in Drupal 8, there are some considerations to have when running them on a remote system.
On most of the projects I work on these days, I typically have requirements at a certain point where data from the application has to meet ReactJS in the frontend at the theme layer.
In an earlier post I demonstrated how to add some extra functionality on a node type in Drupal 8 via the ThirdPartySettings API.
Upon the relaunch of my site, I decided to go with no comments. It is not a mistake that they are not here.
I've done a lot of migrations in Drupal 5, 6, and 7. Migrating into 5 and 6 was pretty rough. Version 5 basically required raw script power and chunked looping. 6 did as well. By the time I had to do migrations for projects again, I was well into developing projects in Drupal 7.
The ThirdPartySettings API in Drupal 8 is a useful way to store extra configuration or information to a configuration entity.
I see people ask or state they are confused about how to deploy Drupal 8 when most (if not all) hosting platforms disallow running tools like Composer or NPM in production.
After many, many years of running on various static site platforms, I've relaunched my blog on Drupal 8.
Shortly after publishing my last post about Erlang, I noticed a bug in the code which would not have happened if I wrote unit test(s) first.
I have done a lot of research this year on what I believe will be some of the next great generation of tools and languages. I strongly believe PHP is on a fantastic road with 7.x, but there is another language that has been on my radar for quite some time, Elixir.
Most developers at some point or another will inevitably need to add custom code to a site. In Drupal, this could be anything from extending core functionality, altering forms, or creating entirely new functionality.
On a recent project that was built on Drupal 8, we had a requirement to integrate with three different search platforms.
Earlier today there was a ping in Slack for assistance. A coworker needed to update 140 XML files with a new element, and the element value will be populated from an existing element in the node.
Just wanted to drop a quick post about a plugin I came across last week called fzf.
Ever get to the end of a project and have a panic moment when you realize that all the content entered contains links in the WYSIWYG that contain the full domain, and not just the relative path to content (ex. http://dev.mysite.com)?
Overriding a service in Drupal 8 is pretty easy. Within your sites directory, you will see a file called default.services.yml. You can adjust these defaults by adding a services.yml file in the sites directory.
Just wanted to drop a quick nod to a long awaited feature in PHP that other languages have enjoyed for a while now… type hints and return types.
In the last post, I touched on how you can define a service in your mymodule.services.yml file and pass it parameters to configure the object when it is injected as a dependency into other classes.
In my latest adventures in Drupal 8, I had to build out a multisite search with Solr. While I will touch on that later, I wanted to call out something I learned today, which is how to inject dependencies to your Drupal class with non-native Drupal code. What do I mean by that?
I was doing an onsite with a client earlier this week, assisting in a demo of the Drupal 8 solution we were building for their team. During the meeting, it was expressed that they wanted all instances of a text editor to have the same buttons and capabilities.
In my last post, I detailed how you can add new repository endpoints in your composer.json file for your own repos.
On a recent project, we had taken a Pattern Lab based prototype and created a Drupal 8 theme from it. In order to track updates and stay independent of the work happening by the front end team, I added the Pattern Lab repo to the project as a git submodule.
In Drupal, most breadcrumb generation and navigation is sufficient by basing it off of the menu hierarchy with the Menu Breadcrumb module.
Just wanted to share a quick example of overriding a field output from Search API if the value isn’t exactly what you want.
Last week, I had to solve a problem where a prototyped form contained a button element and svg icon for the submit button on three search forms.
Today I had an excellent opportunity to put Drupal Console to work for me. I also wanted to show a colleague what was possible and how fast you can move with it.
If you want to grant Vagrant the ability to edit your /etc/exports file for NFS shares, there is a short write up on the official Vagrant website for OSX.
If you are theming an entity (in this case, node) and you want to display the created or changed date in a different format, you can use the following to do just that.
So part of what I want to do this year is write a bit more, and start making more use out of zsh/terminal.
I tend to do these things at the start of every year. Every year that I make them, they tend to get larger. Sometimes you make small goals, which is okay, but are you really challenging yourself by going after low hanging fruit? I don’t think so.
This year, the Neato theme for Drupal 7 and 8 passed 700 installations.
I decided to give myself a little challenge at the end of this year. After Thanksgiving I decided I wanted to try something different for a change and start getting better acquainted with the shell, throw my hat in the air and start learning Vim.
In recent conversion efforts of Custom Publishing Options and Taxonomy Views Integrator, I had to replicate the permission assignments from Drupal 7 to Drupal 8.
When developing modules for Drupal, there inevitably comes a time when you may need to include an external CSS or Javascript plugin or library for your project.
Adding Composer packages to Drupal 8 is pretty easy. There is a module called Composer Manager that can be used to add packages that modules require, but there are instances where you just need a package (and no need to create a module).
Out with the Old I usually don’t do these sorts of posts, you know, ones where you reflect on the year behind you.
If you use Gulp or Grunt in your projects, there is a chance you can may inadvertently trigger a segmentation fault on the server. This is a very unusual error to see in Drupal, and it can be hard to track back what actually caused it.
There comes a point in every programmers career where they must make the decision to change up their career or face burnout, skill rot, boredom, and fatigue. I call them the four horsemen of programming, and I faced them all.
Ever find yourself working on a Drupal theme and unable to figure out why templates aren’t recognized, CSS isn’t changing, or JS is still acting funky only to realize you haven’t done something as simple as clear cache? We all have. Fortunately, we can do this automatically via Grunt.
PHPStorm is a fantastic IDE for PHP. I’ve been a fan of JetBrains’ products for quite some time. Whether it’s RubyMine, WebStorm, PHPStorm, or PyCharm, their IDEs are one of the most developer friendly tools I have ever come across.
If you host your Drupal site on the Pantheon platform, you may already know that you do not need to include a settings.php file because they provide the connection information for you automatically. However, you can provide one if you are setting up database connections.
If you’re doing a migration of media files, you most likely will be working with a list of URLs. Other times, you will have a local file system from which to pull in media. When working with just a list of URLs though, you’re somewhat working with a ‘blind’ import.
Lately I have been exploring whats coming down the pipe for new versions of SASS. Version 3.3.x brings in a lot of new or improved features that, as a programmer, are very cool. I’ve enjoyed using SASS as a means of styling for quite some time now.
Migrating content from one platform to another saves lots of time from doing grunt work and gets data moved fast. However, simply moving the content doesn’t mean the job is done. There are other considerations too, such as 301 redirects for example.
PHPStorm and the JetBrains suite of products are without a doubt, the best IDEs on the market for their respective applications.
What? Thought we were done? There are still things left to learn here. There are always things to learn.
Every now and then you’re going to have one of those projects that will need to be migrated from one platform to another. If you’re lucky, it’s a system like Drupal that has an excellent Migration framework.
There really aren’t many platforms or technologies out there that a developer dreads more than Internet Explorer. Nothing out there has caused more wasted hours on a project than possibly reddit or an aging Windows installation.
How many times have you faced this?
Whoa there! This post will be applicable to you if you develop within a Vagrant virtual environment in OSX/Linux.
Every time I see the throbber.gif appear it pains me, because with some simple changes, we can make the feel of it so much better.