Sign in

Open source developer, working with Drupal and building Drupal Commerce.

A friend shared the Profit First book with me a little after I started Bluehorn Digital. I have been using it for a few months to allocate profits as legitimate benefits right now instead of at the end of the year when it vanishes and is just some accounting magic. But, what do I do with that profit? What do I do with the profit that is generated by the few subcontractors I have?

I could pocket it and have an extravagant dinner. That’s actually what the book says you should do every quarter with 50% of the profit you…

I just released phpstan-drupal 0.12.10, which includes a major bug fix and major feature.

Thank you, sponsors.

Before diving into the changes, I would like to thank my GitHub Sponsors and contributors on Open Collective who help fund my open source development time for projects like phpstan-drupal. Especially a big thanks to undpaul and intracto for being organization-level sponsors of my work.

Through my GitHub Sponsors and Open Collective, I’m able to cover roughly three hours of development a month.

What’s new?

Better compatibility when drupal/core-dev is not installed

Turns out a rule in phpstan-drupal was causing analysis to crash if PHPUnit was not installed. This was due to an interface check…


I’m adding a new weekly live stream session called Hack and Play, every Friday at 3:00 PM CDT / 8:00 PM UTC. My goal is to find some interesting tool or project to hack and play around with. This Friday I’ll be trying out the Workspaces module in Drupal core. And then, on May 14th, I’ll be hacking around with Tugboat to try out different project configurations (like ReactPHP, Golang, decoupled Drupal with a JavaScript frontend.)

I’d also like to use the Hack and Play to try out things folks are curious about and answer any questions. If there’s anything you would like me to cover or answer, drop an answer on this form:

Photo by Xavi Cabrera on Unsplash

I feel that whenever I attempt something with code, nothing ever just works. There’s some bug or some roadblock that has to be overcome. Apparently, that is the case with embedding!

Drupal 8.6.0 added oEmbed support for media! Out of the box, only remote video providers Vimeo and YouTube are supported. But a quick hook implementation exposes more providers. The providers are based on a repository provided by the oEmbed website. The repository is here:

So I tried to add CodePen. Here’s my snippet of code that I added to my module so that it would be available…

I recently created a Live page to promote my upcoming live coding streams and ways to find my previous ones. I have the times listed. However, times are hard. I first shipped them without specifying the CDT timezone — sorry folks. But still, this is a pain and unfriendly to anyone in a different timezone.

Heck, I even have a hard time translating 24h time format from EDT to CDT, let alone UTC. So I wrote some vanilla JavaScript to transform the times into the current user’s locale — no dependencies!

Drupal outputs its datetime fields in a time element…

I’m a huge fan of TailwindCSS. After using it, I find writing media queries for responsive interfaces complicated instead of leveraging the responsive variants of Tailwind. Not to mention I can stop fretting over the naming of my classes to ensure I meet my own made-up SMACSS/BEM standard.

I am migrating my personal site to use Tailwind. The current version isn’t anything fancy, it’s mostly vanilla CSS, but I pass it through PostCSS for some cleanup via Gulp.

My new setup: Tailwind with purging compiled via Laravel Mix.

I have some things moved over to Tailwind right now and could…

I have written my first GitHub Action — bluehorndigital/setup-drupal. In my phpstan-drupal and drupal-check projects I have various GitHub Actions workflows that build a Drupal project via Composer.

There are actually a few quirks with changes in Drupal 9, so I made an action to simplify setting up a Drupal project.

As of 9.1.0, the drupal/recommended-project template now specifies a minimum stability of "stable". Why does this matter? With this setting the following versions would not be installable:

  • ^1.0@rc
  • ^1.0@beta
  • ^1.0@alpha
  • 1.0.x-dev

So, if you are testing a package in your GitHub Action workflow — it will be rejected! …

GitHub Actions has made continuous integration seamless. Not because it is a superior product — I am by and far a huge fan of CircleCI — but because of its ease in integration. TravisCI was a huge breakthrough in continuous integration for open source projects. Instead of running a private Jenkins server, you could connect your GitHub repo to TravisCI and start building on each commit. However, both TravisCI, CircleCI, and other continuous integration tools require a multi-step setup. GitHub Actions (for better or worse) bypasses this.

Normally you need to commit your pipeline configuration files — .travis.yml, .circleci/config.yaml, etc…


Five years and two months ago, I joined Commerce Guys, which was primarily focused on building Not long after joining, Ryan, Bojan, and I spun Commerce Guys out of to refocus on Drupal Commerce. In that time, we created Drupal Commerce 2 for Drupal 8, grew from a scrappy team of three to a team of 16, rebranded the company to Centarro, and found new ways to grow the company and the open source project sustainably. After five incredible years of product and community development, I’m ready to start a new adventure.

This decision took a lot of…

I use DDEV-Local for my local development stack. DDEV leverages mkcert for trusted local development certificates. The mkcert tool has been a missing component in my local development stack for a long time. And, the best part, it has worked without any problems. Until this week. My coworker said that a script I wrote was not working — it kept failing saying that the remote certificate could not be validated. However, cURL had no complaints, nor did any web browser. I chalked it up as “works on my machine 🤷‍♂️.” Until today 😬.

I was working on the follow up…

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store