Sep 24 2019
Sep 24

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past week.

You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide assistance on, we encourage you to get involved.

Drupal 9 Readiness Meeting

September 16, 2019

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. Site developers who want to stay in the know to keep up-to-date for the easiest Drupal 9 upgrade of their sites are also welcome.

  • It usually happens every other Monday at 18:00 UTC.
  • It is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public Drupal 9 Readiness Agenda anyone can add to.
  • The transcript will be exported and posted to the agenda issue.

Guzzle, Diactoros, symfony/http-client, and PSRs-7, PSRs-17, and PSRs-18

Drupal 9/8 PHP version requirements

MySQL 5.7 and MariaDB 10.1 will officially end support in Oct 2020

Chx suggested splitting the MySQL and MariaDB drivers eventually as they continue to diverge.

Stable upgrade status, but missing features

Gábor Hojtsy announced Upgrade Status went stable a few days ago. There are various missing features: 

Documenting deprecated code / triggering deprecation errors properly

Drupal 8.8 is the deadline for:

Remove core's own uses of deprecated APIs

Drupal core's own deprecation testing results are really close to done.

Drupal Module Upgrader 7 => 9 directly

There’s been lots of work recently by Amit GoyalRohit Joshi, and Pranit Jha to add Drush 9 support and make the transformations produce Drupal 9 compatible results. They also made the test suite green with lots of work and are looking into the possibility to write new transformations with rector. Unfortunately, due to conflicts of dependencies, rector cannot be added to a Drupal instance without Support PHPUnit 7 optionally in Drupal 8, while keeping support for 6.5 being resolved.

Deprecations in contrib

Admin UI Meeting

September 18, 2019

  • Meetings are for core and contributed project developers as well as people who have integrations and services related to core. 
  • Usually happens every other Wednesday at 2:30pm UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • There are roughly 5-10 minutes between topics for those who are multitasking to follow along.
  • The Admin UI Meeting agenda is public and anyone can add new topics in the document.

Design Revision 1

The breakpoint for Cards set to 85rem Vertical Tabs style update.

Design revision 2: heading spacings

We have several options for defining the default:

  • Equal vertical+bottom space: it could be 1em or 0.75em. (margin: 1em 0; or margin: 0.75em 0;
  • Only top: 1em or 0.75em.
  • Only bottom: 1em or 0.75em.
  • Different spacings for top&bottom: margin: 1em 0 0.75em;> go for this

UX meeting

We did a Claro demo and found some bugs. The first one for messages, without icon and title and working on that in a follow-up.

Drupal Core Cross-Initiative Meeting

September 19, 2019

UX Update

Cristina Chumillas talked about UX with the following update:

  • Claro is on track, design components need to be reviewed and blockers resolved.
    • Several issues are nearly complete.
    • Several that still need work from the blocker's list.
  • Issue submitted to add Claro to Drupal Core:
    • Close to getting a green light to add it as an alpha module.
  • Next steps:
    • Need additional accessibility maintainer reviews.
    • Need additional RM support to understand what the level of sign off should be from each of the maintainers.

Workspaces Update

Andrei Mateescu talked about Workspaces with the following update:


  • List of stable blockers obtained after meeting with maintainers/rm’s.
  • Before marking stable, we need a conversion of path aliases to entities (big patch), which adds some risk.
  • 2 other major asks:
    • Compatible w/ content moderation.
    • Ability to add subworkspaces.
  • On track right now for getting int core, pending final reviews of those changes.


  • None right now.

Next steps:

  • Work on the 3 major things identified, get final reviews.

Multilingual Migration

Gábor Hojtsy, Alex Pott, and Michael Lutz talked about Multilingual Migration with the following update:


  • Most issues to get it committed progressing, Alex Pott is working with V Spagnolo on final ones.
  • Hard to get data migrated correctly and still grab old migrations to fit them into new formats.
    • For revisions + translations, one big overhaul of node revision table is the solution landed on to maintain backwards compatibility.
  • Solution is actually working (yay!) just need to do some cleanup, testing & validation.


  • Testing is required to validate the solution will work for people who are expecting granular controls.

Next steps:

  • Testing / Validating the solution to manage both revisions and translations.
  • Later reviews from entity subsystem maintainers, framework mgmt, PM, and RM will need to happen.
    • Meet with Lucas Hedding working with V Spagnolo to review the potential breakdown-scenarios.

Drupal 9

Gábor Hojtsy provided a Drupal 9 update:


  • Deprecations => making a ton of progress, some hard ones left.
  • Symfony 4 => several mysterious issues found, working to resolve those issues.
  • Upgrade status => Stable release hurraayyy!! So far no issues found apart from one person who had no UI showing.
  • Drupal Module Upgrader => working w/ community to make it produce D9 compatible code. 1.5 tag released yesterday, no feedback yet.
  • Rector => converts your d8 code to d9, looking into merging this into drupal module upgrader.
  • Contrib deprecation errors, Ryan Aslett at the DA is helping to resolve the results of deprecations across contrib! 
  • Core deprecation => requirements recently redefined, D9 branch should be opened with D8.9 branch in less than a month! Whoo-hoo!


Next steps:

  • Hey initiative owners: make your stuff Drupal 9 ready, please.
  • Resolve final deprecations.
  • Keep working on Symfony 4 issues identified.
  • Test modules / deprecated API’s and hold a D9 sprint in Amsterdam.
  • Keep looking into merging rector.


Keith Jay provided the following update on Demo: 


  • Progressing for working with layout builder for recipe type in the basic format.
  • Working on expanding features.
  • Working on making a front-page based on layout builder.
  • Creating more tooltips.
  • Great new content coming from a UK-based chef.
  • Layout switcher also in progress.
  • 3081587 => may have a core-related issue, to be continued.


Next steps:

  • Keep working through the above issues, nothing needed.

Auto Updates

Lucas Hedding gave an auto updates with the following update:  


  • 3 parts:
    1. PSA tells you the update is coming.
    2. Readiness checks are preflight checks to confirm your site can be updated.
    3. In-place updates do the fix.
  • The first two parts have been released in alpha.
  • Video podcast prepared, will be live first weekend of October.
  • DA blog post to promote will follow.
  • In-place updates are also progressing.


  • One issue that needs further discussion to get to RTBC, could use core committer review on this so they know what the blockers are.

Next steps:

  • Work through final issues related to part 3 => in-place updates.
  • Testing and validation to get to RTBC => beta release with all features.
  • Work through the issues identified => stable contrib release.
  • Core release will happen later, not to be rushed at this point.


Ryan Aslett gave an update on Composer with the following update:


  • Down to the last couple of items.
  • Made tons of progress.


Next steps:

  • Final reviews / Remediations from core committers and Alex Pott.
  • Write documentation / enablement supports / marketing & promotion of improvements
  • Commit to 8.8!
Sep 16 2019
Sep 16

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past week.

You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide assistance on, we encourage you to get involved.

Getting Involved Guide Refresh Meeting

September 10, 2019

This meeting:

  • Usually happens on alternate Tuesdays

  • is text only!

  • happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!

  • has a public agenda issue anyone can add to.

  • Meeting transcripts are still a work in progress, but please comment on the meeting agenda issue so we can grant you credit for attending/contributing!

Issues & Progress


Out of the Box Initiative Meeting

September 10, 2019

Keith Jay and Ofer Shaal talked about Use Media images in Umami demo issue, since Media is very close to becoming stable. Umami team is working hard to prepare Umami to support it.

New recipe is coming up!

The Umami team is discussing adding new recipe content with the help of Anna Christoforou, who has very kindly allowed us to use some of her recipes. Take a look at Anna's Instagram page where you'll see some of her amazing food and images. Keith Jay is working with Anna to add her recipe for homemade hummus, currently being created as a patch for which there will be plenty of opportunity for anyone who wants to help with general reviews and translation into Spanish. Since this recipe is very simple and doesn't require any cooking time, it has been suggested that it could be the basis of a video that we'll produce to demonstrate media.

Sep 09 2019
Sep 09

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past week.

You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide assistance on, we encourage you to get involved.

Drupal 9 Readiness Meeting

September 02, 2019

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. Site developers who want to stay in the know to keep up-to-date for the easiest Drupal 9 upgrade of their sites are also welcome.

  • It usually happens every other Monday at 18:00 UTC.
  • It is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public Drupal 9 Readiness Agenda anyone can add to.
  • The transcript will be exported and posted to the agenda issue.

Multiple Version Compatibility for info.yml Files

Congratulations on landing multiple version compatibility for info.yml files! The new core_version_requirement key in *.info.yml files for modules and themes now supports semantic versioning as implemented by the Composer project. This allows modules and themes to also specify that they are compatible with multiple major versions of Drupal core. For more information, read the issue at
New 'core_version_requirement' key in info.yml files for modules and themes allows Composer semantic version constraints including specifying multiple major versions of core.

To follow up, the issue Don't catch exception for invalid 'core_version_requirement' in info.yml files was opened and Gábor Hojtsy posted Drupal 8.7.7+ will support extensions compatible with both Drupal 8 and 9! to explain the multi-version support in the newest release.

Drupal 9 Requirements Issue

The Drupal 9 requirements issue has been updated to list 3 requirements: 

  1. Multi-version compatibility
  2. Symfony 4.4 green, and
  3. lack of (or very low) use of deprecated APIs.

There is also a fallback date on the week of October 14th, alongside 8.9's branching [META] Requirements for opening the Drupal 9 branch.

Symfony Updates

Drupal Core Depreciation

Drupal core's own deprecation testing results are posted here.

DrupalCon Amsterdam

  • DrupalCon Amsterdam is approaching fast! It would be lovely to run Drupal 9 compatibility contribution events for next month's DrupalCon.
  • Tools for PHP deprecations should be there.

Missing tooling for constants, JS deprecations, and Twig deprecations

Admin UI Meeting

September 04, 2019

  • Meetings are for core and contributed project developers as well as people who have integrations and services related to core. 
  • Usually happens every other Wednesday at 2:30pm UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • There are roughly 5-10 minutes between topics for those who are multitasking to follow along.
  • The Admin UI Meeting agenda is public and anyone can add new topics in the document.

Core Issue Draft

  • Review core issue draft to add Claro administration theme to core.
  • We need to open an issue to start evaluating what's needed to add Claro to core and start getting feedback from everybody involved in the process
  • Roadmap issue we still need several things.

Underlining Link

Today some concerns were raised about the last issue for underlining link.

There are two proposed options to solve the issue.

Black underlined links and hover in blue.

showing black text with a black underline on load and on hover text changes to blue

Blue underlined links and remove underline on hover.

showing blue text with black underline on load and on hover the underline disappears leaving only blue text

Action Link Styles and Padding

The current design of action links leads to several issues:

  • Spacing between mixed elements button | button | action-link | action-link | button.
  • No explicit visual feedback that they're links.
  • Extra whitespace if an action link is the first element in a content row.

In the last revision, we had with Product Management for Claro we had some feedback that we need to address before adding Claro to core.

Some initial tests are moving this way.

spacial adjustments to settings toolbar in claro

Composer in Core Initiative Meeting

September 04, 2019

While working toward issue 2982680: Add composer-ready project templates to Drupal core, we discovered that the Vendor Hardening Plugin sometimes fails to work, throwing an error. The issue is documented in Move Drupal Components out of 'core' directory.

A related issue, [meta] Reorganize Components so they are testable in isolation, covers the ability to test Drupal's core Components in isolation as much as possible.

Vendor Hardening plugin

Add Composer vendor/ hardening plugin to core.

Ryan Aslett summarized: Duplicate the contents of core-file-security into core-vendor-hardening because core-vendor-hardening is unable to find core-file-security when composer-installers move it due to the composer's behavior regarding plugin interaction. Moving all of the components might have other consequences and require additional efforts that we eventually want to tackle, just not right now.

Broken Builds

  • While creating the 1.4.0 release of this project this line was changed resulting in broken builds for all packages that depended on behat/mink-selenium2-driver: 1.3.x-dev such as Drupal core and many others.
  • It also looks like we're inching closer to a 1.7.2 release in behat/mink.    

Template Files

The templates we have so far look good, once vendor hards things the question is, will they be done? The tests are probably not something we want in drupalci like that. Possible we should wait for Add a new test type to do real update testing to add tests. It's okay to add this to core without tests for the time being.

Automatic Updates

Potential conflicts have been uncovered and need to be addressed.

Angie Byron has been trying the past couple of days to get up to speed on the autoupdates initiative. Work is happening at and it seems they’re going a “quasi-patch” approach doing in-place updates. You can find Greg Anderson's summary within the issue comments to follow along.

Migration Initiative Meeting

September 05, 2019

This meeting:

  • Usually happens every Thursday and alternates between 14:00 and 21:00 UTC.
  • Is for core migrate maintainers and developers and anybody else in the community with an interest in migrations.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public migration meeting agenda anyone can add to.
  • Transcript will be exported and posted to the agenda issue.
  • For anonymous comments, start with a bust in silhouette emoji. To take a comment or thread off the record, start with a no entry sign emoji.

Issues Needing Review

Great progress is being made, and there are a lot of issues that are awaiting review.

31 Days of Migrations

31 days of migrations have been an outstanding success, thanks to Mauricio Dinarte and his brother! How best can we include these guides in the official documentation and make sure that they are disseminated to those who could use them? Mauricio suggested: 

  • It can be copied over in full like this book, Drupal 7 - The Essentials.
  • Should it be broken down into "recipes" (self-contained examples)?
  • Should it be broken apart and add the relevant pieces into the existing documentation topics/pages?
Sep 06 2019
Sep 06

Our team has always been engaged and hands-on when it comes to web accessibility and inclusion. Through learning, teaching, auditing, remediating or supporting others doing the same, providing information access to all is at the core of how we run our business. Inclusivity, equality, and global access is still very much a work in progress for humanity. Any step that Hook 42 can take towards improving inclusion and access, you bet we’re going to do it. This year’s Bay Area Drupal Camp (BADCamp) is no exception.

This camp is packed with content covering accessibility topics. Aimee and Lindsey leading a web accessibility training session on Thursday. On Friday and Saturday, there are four sessions that will touch base on accessible best practices. Thank you to each of the presenters for broadening the audience one of our favorite subjects. We hear you, and are so happy to join in on the discussion!

Web Accessibility Sessions at BADCamp

Your Code is Terrible!, presented by Jayson Jaynes, will cover the topic of semantic HTML. In the talk, Jayson will explain its importance, how to best practice it, and what developers benefit from by understanding it. The best part? Jayson will explore some tools that make creating semantic code in Drupal easier and how to utilize your new tools to ensure accessibility compliance.

It's a Bird... It's a Plane... It's ¯\_(ツ)_/¯? Using Machine Learning to Meet Accessibility Requirements, presented by Danny Teng and Neha Bhomia, will explore a new world where manual input for alt tags becomes a thing of the past. The pair will explore how machine learning can be leveraged to take care of the tedious task of alt text generation. 

Shine a Light on Me, presented by Paul Sheldrake, will cover a broad overview of a chrome extension, Lighthouse, that checks pages for not only accessibility compliance, but site performance and SEO concerns as well. Paul will cover the basics for why it’s important to run these scans, and how Lighthouse can help make that process a little better for everyone.

SVG Magic!, by Anthony Horn, will talk about the glory that SVGs behold. There is more to an SVG than putting scalable vector on the web, and Anthony will walk through exactly what that entails from animation to accessibility compliance and everything in between.

Web Accessibility Training at BADCamp

Our accessibility training session at BADCamp, Web Accessibility Training, will take place on Thursday from 8:00 am to 5:00 pm. We hope you’re ready for a deep-dive into all things inclusion on the web. 

Aimee and Lindsey will cover as much as they can squeeze into one full-day crash course. The course starts at accessibility laws and principles, works through design, content, media, code, and testing tools. We cover the topic with both a broad but deep approach for all attendees to gain the most exposure to such a big topic. 

At the end of the day, our goal is to make sure everyone becomes an advocate for web accessibility! We hope you’ll gain a better understanding of where your organization stands with accessibility, what specific role you’ll play in ensuring your websites stay compliant, and how you can show others where to go in order to apply accessible best practices in their areas of expertise.

It’s going to be a busy camp, and we are thrilled to be part of such a hot topic in the web community. If you want to chat further about accessibility, you can always stop by our booth while you’re there to pick our brains. We’re always in the mood to talk accessibility!

Sep 03 2019
Sep 03

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past week.

You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide assistance on, we encourage you to get involved.

Out of the Box Initiative Meeting

August 27, 2019

Mark Conroy (markconroy) and Ofer Shaal (shaal) talked about:

Drupal Getting Involved Guide Refresh Meeting

August 27, 2019

This meeting:

  • Usually happens on alternate Tuesdays.
  • Is text only!
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public agenda issue anyone can add to: Meeting - Getting Involved Guide - 27 August 2019
  • Meeting transcripts are still a work in progress, but please comment on the meeting agenda issue so we can grant you credit for attending/contributing!

During the meeting, the following topics were discussed:


We have consensus on Personas! The issue, Consensus on contribution personas, tracks all of the progress. We need to store those personas as they are in somewhere we can easily reference.

Writing Style Toolset

Loving that we know the styles are already agreed in issue Evaluate, pick, and configure checking/linting tools for the Getting Involved Guide. The toolset is making great progress so far.

Proposed outline 

The outline needs a review - how do we make it attractive and welcoming to new potential contributors? Find documentation and progress updates in the issue Proposed Outline for the Getting involved Guide.

Community Section

Admin UI Meeting 

August 28, 2019

  • Meetings are for core and contributed project developers as well as people who have integrations and services related to core. 
  • Usually happens every other Wednesday at 2:30pm UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • There are roughly 5-10 minutes between topics for those who are multitasking to follow along.

Beta & Stable Blockers Revision

  • Field cardinality can be unpostponed after table drags has been finished.
  • Cards issue is blocked by action links so that could use some help.
  • Image and file fields are blocked by design work.
  • Status report page is blocked on design unless we go with the existing one for beta.
  • Probably Media designs won’t be on time, so probably the Media should be moved to stable.
  • We need some help with accessibility revisions.

Layout Redesign: Max-width Limit

We opened this issue for Layout Redesign after facing some problems with Card Style Updates with wide screens.

Customizable Settings

Looking to determine what we would like to have as customizable options. The discussion is started in the issue Provide form for customizable settings.

Aug 29 2019
Aug 29

Drupal 8 has a wonderful migration system that generally boils migrations into a particular entity type down into a single YAML file. This file specifies the data source, the output entity type, and how to process input fields and where in the entity they get stored.  

However, there can be a number of complications. Two, in particular, are bad or unexpected input data values, and exactly what form the input data - or even, the partially processed data - is in (eg, is it a scalar, an array, a nested array, etc.). Because the migration system doesn’t provide a way to look at what’s going on inside the process pipeline, it can be difficult and frustrating to debug these kinds of issues.

One way to quickly see what’s going on without having to get into xdebug and grope around in the code for the various plugins provided by the migrate, drupal_migrate, migrate_plus, and migrate_tools modules, is to create a debug plugin and place it wherever you need in the process pipeline.

Usually, the custom migration module code will be structured like this:

├── config
│   └── install
│       ...
│       ├── migrate_plus.migration.node_article.yml
│       ...
├── README.txt
└── src
    └── Plugin
        └── migrate
            ├── destination
            ├── process
            │   ...
            │   ├── Debug.php
            │   ...
            └── source

We’re going to look at the node_article migration pass for an example. The YAML file could look something like this:

id: node_article
label: Node - Article
migration_group: migration
  - Drupal 6
  plugin: node
  node_type: blog
    type: article
  nid: tnid
  type: constants/type
    plugin: default_value
    source: language
    default_value: "und"
  title: title
  uid: node_uid
  status: status
  created: created
  changed: changed
  promote: promote
  sticky: sticky
      plugin: static_map
      source: format
        2: 'filtered_text'      # Filtered HTML "no links"
        3: 'html_text'          # HTML
        5: 'plain_text'         # PHP code
        6: 'filtered_text'      # Filtered HTML
        7: 'plain_text'         # Email Filter
      plugin: default_value
      default_value: 'html_text'
  'body/value': body
  'body/summary': teaser
  revision_uid: revision_uid
  revision_log: log
  revision_timestamp: timestamp
  plugin: entity:node

But say that it turns out that the body/format is not getting translated correctly when the node_article migration pass is run. How can this be debugged to understand if the YAML structure is wrong, or the data values are wrong?

Let’s have a look at migration/src/Plugin/migrate/process/Debug.php:

namespace Drupal\migration\Plugin\migrate\process;

use Drupal\migrate\MigrateExecutableInterface;
use Drupal\migrate\ProcessPluginBase;
use Drupal\migrate\Row;

 * Debug process pipeline
 * @MigrateProcessPlugin(
 *   id = "debug"
 * )
class Debug extends ProcessPluginBase {

   * {@inheritdoc}
  public function transform($value, MigrateExecutableInterface $migrate_executable, Row $row, $destination_property) {
    echo "DEBUG: " . $this->configuration['message'] . "\n";
    print_r(['value' => $value]);
    if (!empty($this->configuration['row']) &&
        $this->configuration['row']) {
      print_r(['row' => $row]);
    return $value;


Debug.php provides a process plugin that can be placed “invisibly” into a process pipeline and gives details about what’s happening inside there. The transform method for all process plugins receives the $value being processed and the $row of input values, among other things. It should return a value that is the result of processing that the plugin does.

The ProcessPluginBase object also contains a configuration object, where named parameters that appear in the process pipeline YAML code are stored. For example, the static_map plugin can find the source value in $this->configuration[‘source’].

In this case, the debug plugin returns exactly the value it receives, so it doesn’t change anything. At base, it prints a message parameter and dumps the $value so it can show what actual data is being passed and what format it is in. It has been useful to also be able to look at the $row values. To see them, simply add the parameter row: 1.

For example, to see what the result of the body/format mapping is before passing it along to the default_value plugin:

      plugin: static_map
      source: format
        2: 'filtered_text'      # Filtered HTML "no links"
        3: 'html_text'          # HTML
        5: 'plain_text'         # PHP code
        6: 'filtered_text'      # Filtered HTML
        7: 'plain_text'         # Email Filter
      plugin: debug
      plugin: default_value
      default_value: 'html_text'

If it would also be useful to see what the input row values looked like:

      plugin: static_map
      source: format
        2: 'filtered_text'      # Filtered HTML "no links"
        3: 'html_text'          # HTML
        5: 'plain_text'         # PHP code
        6: 'filtered_text'      # Filtered HTML
        7: 'plain_text'         # Email Filter
      plugin: debug
      row: 1
      plugin: default_value
      default_value: 'html_text'

This produces output for each row processed, which can get quite large. If you know what rows are causing problems, the migration can be run with the --idlist=”<source keys>” parameter. If not, simply redirect the output into a file and use an editor like vim to hunt through it for the cases that are problematic.

This idea can be expanded: if there is some logic to the problem, this can be added so that output is only created for rows that create an issue. It’s possible to create more than one debug plugin (with different names, of course) if there are multiple special purpose needs.

Aug 28 2019
Aug 28

Join Hook 42 for Another Exciting BADCamp

Some of our team will be at BADCamp this year with a combination of to-do's and goals. Our team is not only going to be on-site for training, sessions, booth-sitting, and attending sessions, we're also behind the scenes helping organize and plan for this year's event. Our sponsorship, and those of many other amazing donors, is going towards putting together another BADCamp you don't want to miss!

We're excited to be so hands-on for this event and would like to send a special thank you to those involved in the planning and coordination that have embraced Hook 42's participation thus far. The variety of ways we can contribute to this event and make an impact is extensive, and our team is happy to be giving back to an amazing community. We can't wait for October!

Hook 42 Trainings at BADCamp

We're excited to have four of our team members teaming up to give two trainings this year. The first, Adam Bergstein and Ryan Bateman will be talking about GatsbyJS and Drupal 8. In this training you'll learn how to take a brand new Drupal 8 site running the Umami Demonstration Install Profile and build a recipe blog front-end using GatsbyJS and React, with no React experience required! 

We'll also have Aimee Hannaford and Lindsey Gemmill giving training on web accessibility, covering a beginning to end high-level dive into how to be inclusive on the web. For more information about each training, visit the respective training page BADCamp website linked below.

Hook 42's Adam Bergstein and Ryan Bateman deliver a full day Drupal 8 and GatsbyJS training at BADCamp 2019

Hook 42's Aimee Hannaford and Lindsey Gemmill deliver a full day web accessibility training at BADCamp 2019

Registration For Training Sessions Is Now Open!

There is limited availability for training sessions, so sign up soon. Each room holds approximately 30 people. If you're interested in one of our training sessions, or any other training at BADCamp this year, please be sure to register to reserve your spot. See the training detail page on the BADCamp website for more information.


Beyond full-day training, our team will also be giving a few sessions at BADCamp. We're passionate about the topics we submit to camps and conferences and are excited to be sharing our ideas and expertise with all of you.

Hook 42's Adam Bergstein and Ryan Bateman deliver a session at BADCamp

Hook 42's Aimee Hannaford and Ryan Bateman deliver a session at BADCamp

Hook 42's Lindsey Gemmill delivers a session at BADCamp

Hook 42's John QT Nguyen and Pantheon's David Needham deliver a session at BADCamp

We Hope To See You There

If we aren't behind the computer talking, you can find us out and about. Our team will be fully immersed in BADCamp 2019, so we're just as excited to attend the other amazing presentations selected for this year's event as we hope you are.

Hook 42 will also have a booth at the event this year. We're always looking to make new connections with people at these events and can't wait to talk about the amazing things our team has to offer. Whether you're a new face or an old face, come stop by and say hello!

Aug 26 2019
Aug 26

August 26th is a special day for the owners of Hook 42. As a woman-owned company, we are very familiar with the adversity women face in the workplace. We’re even more familiar with how intense that can get depending on the industry you’re in.

Our inspiration for starting Hook 42 was a culmination of many different things, but one of those things was creating our own voice outside of a male-dominated workforce. The signs were clear that everywhere we looked we found areas of improvement, so our owners took things into their own hands and built a business to solve those problems. 

Hook 42 strives to be a fully inclusive workplace, and we encourage our team to voice their opinions and work towards a better version of themselves, no matter what it takes. 

But what does this philosophy have to do with today specifically?

National Women’s Equality Day and National WebMistress Day fall on August 26th. Both of these topics are influenced by a history of inequality and strive to create an inclusive space that gives everyone an equal opportunity. We’d like to take time to recognize the fights that were won and those we’re still fighting today with the celebration of these two holidays.

A Little Bit of History

The United States Congress passed the 19th Amendment to the Constitution granting women full and equal voting rights on this day in 1920. [ source ]

“Later, On July 30, 1971, Rep. Bella Abzug (D-NY) presented a bill designating August 26th as Women’s Equality Day. That year, rallies, celebrations and political debate filled the country on August 26th. By 1973, Congress passed a joint resolution declaring the day to be observed on August 26th of each year. Every year since each president declares this day as Women’s Equality Day commemorating the certification of the 19th Amendment to the United States Constitution.” [ source ]

We’re predicting that it is no coincidence Kat Valentine founded National WebMistress Day on this very same day quite some years later. In only its third year, National WebMistress Day is putting a more granular focus on supporting equal rights for women and recognizing the adversity women face in the technology industry.

As members of that industry, we want to share our support for every woman in tech that is fiercely making an effort to leave their mark and find their place in a chaotic environment. We’re 100% behind supporting the wave-making, change-inducing women of tech and cultivating that same culture right within our company.

We talked to the ladies within Hook 42 to gather some insights into their journey within tech so far, and what the future holds. Let’s continue to drive change, and support those who are advocating these rights.

The Women of Hook 42


What would you tell your younger woman-self if you had the chance to give her advice based on what you know now about the tech industry?

Don’t dress down. You don’t need to compromise your personal appearance to fit into the “hoodie and t-shirt crew”. If you want to rock your comfort wear then embrace it!

Believe in yourself. You are the only one that can affect change around you. Make goals, strive to reach them, and calibrate when you need to. You are the only one that can improve yourself and your life.

And enjoy the journey. 

How can people be an ally to women in tech?

Be supportive in all aspects of a woman’s life. The tech industry has long days, off-hours, and overtime baked into its core. This combined with the added mental and physical workload we may experience outside of work thrives on a supportive culture.

What helps you push boundaries in tech?

Technology is one of the fastest platforms to implement and execute change. I love bringing peace to chaos and to create new “things” that help improve our lives. Being able to leverage technology for good is a big driver for me.

Is there a woman in tech you look up to, maybe a mentor? (Can be someone you've never talked to but are just inspired by)
Gerri Sinclair. She balances a loving family and a wonderful extended group of friends while bringing bold technology changes through the years. Thank you for all of your energy and impact on technology Madame Modem!

What are you looking to accomplish with your career in tech?

I like to have a place where people can feel they can work safely where they can grow in their personal and professional lives. I like to build cool things. My goal is to have more people be able to have positive interactions which said cool things. :) I’m working to extending the tech environment beyond the tech to include the human side of things, like growth, authenticity, inclusion, and accessibility.

Were there struggles in your journey? Do you still face them? How did you push past it?

There are and have been many struggles in my journey. Some struggles have changed over time, some are still the same. Struggles include breaking through glass ceilings, having to work harder / smarter / stronger / faster than men, and being criticized for having the courage to lead the charge and search out brave new worlds.

Mentors, friends, professional guidance, education, and grit got me through the struggles. Once again, a person (me) is fully responsible for my own actions, regardless if I’m advised in one way or another.


What would you tell your younger woman-self if you had the chance to give her advice based on what you know now about the tech industry?

Even though you hear a lot about bad things about being a woman in tech, you can find nice communities who will welcome you and be supportive. If you are in a bad environment in tech (no matter what gender), try to talk to other people in tech who are in healthy environments and consider switching before leaving.

How can people be an ally to women in tech?

Be a good person and call out bad behavior. Try to show that you welcome others in your groups with your words and actions (e.g. the "Pac-Man Rule"). Be open to differing opinions when offered respectfully.

What helps you push boundaries in tech?

Having a supportive community helps us stand on the shoulders of giants and continue to innovate.

What fuels your passion to keep doing what you do every day?

Seeing something I helped build used by real people, in real life.

Is there a woman in tech you look up to, maybe a mentor? (Can be someone you've never talked to but are just inspired by)

Although there are a lot of great people in the Drupal community, there are 3 people who are amazing role models for all genders who immediately pop into my head: Angie Byron, Amanda Gonser, and Gábor Hojtsy.

What are you looking to accomplish with your career in tech?

Using the skills I have for giving back to the greater good and improving humanity.

Were there struggles in your journey? Do you still face them? How did you push past it?

Yes, often. Some things that may help: stay away from toxic people, give yourself permission to fail, give yourself permission to say "no" without guilt, be kind to yourself, and talk to people who have gone through similar things so you know you aren't alone.


What would you tell your younger woman-self if you had the chance to give her advice based on what you know now about the tech industry?

Keep learning and never give up.

How can people be an ally to women in tech?

Support, mentor, and encourage.

What fuels your passion to keep doing what you do every day?

I like working in tech. I’m passionate about what I do and am looking forward to learning new things and grow professionally. I have a dream to become a successful woman, and this dream keeps me going.


How can people be an ally to women in tech?

Start nurturing curiosity at a young age. Encourage the girls and young women in your life to have bold dreams, because that’s the age where kids start conceptualizing what is “possible” and “impossible.” When I was little, I wanted to be an actress or a ballet dancer, but I never dreamed of being a scientist, astronaut, engineer, or inventor. Young people need to hear and see that women totally belong in every sector of public life.

What fuels your passion to keep doing what you do every day?

I’m lucky to have a strong network of family and friends who are my cheerleaders. My community has supported me every step of the way, and so far I’ve had a diverse, and storied career. I’m a career-changer, and my background is primarily in education, so I didn’t find my way into the tech world until recently. My passion comes from knowing who I am, where I come from, and the community that’s helped me along the way.

What are you looking to accomplish with your career in tech?

Build amazing websites and web applications! Make the digital universe a little more accessible with every project I touch. Along the way, I hope to encourage other underrepresented folks in the tech industry to keep chasing their curiosity.


What would you tell your younger woman-self if you had the chance to give her advice based on what you know now about the tech industry?

Do more research. It’s amazing to see how many companies flourish in the tech industry. I didn't know how well rounded it was until I got into it myself.

How can people be an ally to women in tech?

I feel there is a stigma around women in the tech industry that they aren't as smart or as innovative as a lot of men. I feel that if women were given the chance to prove themselves, that they are willing to improve their skills and show they want to learn and progress, there would be a lot more women in the industry and a lot more women-owned companies.

What fuels your passion to keep doing what you do every day?

My passion to do what I do every day comes from the great people I work with. Not only do they support me and encourage me to expand my knowledge, but they give me opportunities every day. My coworkers, leaders, and bosses all work hard to make this company run smoothly, and I strive to work like them. I want to prove that I am capable of taking on challenges and exceeding expectations. I want to be a better me everyday.


What would you tell your younger woman-self if you had the chance to give her advice based on what you know now about the tech industry?

Confidence from a woman might seem to be threatening, but continue to show your value and stand tall. Make sure the words you use are thoughtfully crafted before raising concerns and contradictions. The strong voice of a woman is often mistaken, so delivery is important. Take the time to think before you react in conflicting situations. 

How can people be an ally to women in tech?

When you see something awry, say something. If a woman confides in you, listen with the intent to help. See us based on our level of experience, not based on our gender. Fight our fights with us, and support our equality in the workplace.

What fuels your passion to keep doing what you do every day?

There are two parts of this for me, the first being the people around me. If it wasn’t for the support system I have inside and outside of the office, it would be much harder to hold my head high in the moments of struggle. 

I also thoroughly enjoy what I do and had the luxury of choice in deciding where my career would take me. Every career path comes with struggles, and being able to work through them and come out with something to show for is very rewarding for me and makes the work even more enjoyable.

Were there struggles in your journey? Do you still face them? How did you push past it?

There have always been struggles. My confidence is quite frequently confused with attitude. Things men often receive praise for, like telling it like it is and not backing down, are things women get reprimanded for. Not letting that defeat me, and keeping my head held high is what helps push past the discrimination. It’s not just men that take offense to it either, other women are often threatened by frequent requests to do better, and be better for all of us. There is a fine line between intimidation and confidence when conversing with women, and its a struggle I face daily and work to eliminate. It's in part learning how receptive people are to certain words, and others being open to strong opinions coming from a variety of people.

Knowing who I am and keeping sight of my worth, not letting other people’s opinions of me think any differently of myself, and knowing that my experiences and education are just as valid and just as those around me are how I stay my course. That confidence that gets "in the way" is also what keeps me going every day.

What About You?

Do you want to share your support for the women around you? It's imperative that we cultivate an environment of acceptance and one where everyone feels welcome. Take a moment to give a special shout-out to a woman in tech, or any woman you know that deserves some recognition.

Aug 26 2019
Aug 26

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past week. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

We've had some gaps in August with limited meetings, so we're happy to be back in the swing of things and reporting a lot of great updates.

Drupal 9 Readiness (08/19/19)

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. Site developers who want to stay in the know to keep up-to-date for the easiest Drupal 9 upgrade of their sites are also welcome.

  • It usually happens every other Monday at 18:00 UTC.
  • It is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public Drupal 9 Readiness Agenda anyone can add to.
  • The transcript will be exported and posted to the agenda issue.

Symfony development updates

Composer initiative issues affecting D8 and D9

Simpletest deprecation process

The active issue [meta] How to deprecate Simpletest with minimal disruption is one of the biggest deprecations in Drupal 8 while being one of the least trivial to update for, however, work on it is still a priority. 

Composer in Core meeting 08/21/19

  • It usually happens every other Wednesday at 15:30 UTC.
  • It is for contributors to the composer initiative in core who are working on improving drupal's relationship with composer.
  • It is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public migration meeting agenda anyone can add to.
  • The transcript will be exported and posted to the agenda issue.
  • For anonymous comments, start with a bust in silhouette emoji. To take a comment or thread off the record, start with a no entry sign emoji.

Scaffold files in core

The issue Add core scaffold assets to drupal/core's composer.json extra field is currently waiting on committer attention.

File security component

The issue Add drupal/core-filesecurity component for writing htaccess files has been fixed.

Relocate the scaffold plugin

The issue Relocate Scaffold plugin outside of 'core' directory has also been fixed.

Vendor Hardening Plugin

The issue Add Composer vendor/ hardening plugin to core is ready to be reviewed.

Template files

We have the current template files but still needed are the scaffold files as well as the vendor hardening plugin. Then we will be able to make a template that can be used to make a tarball. changes to support this

  • Change packaging so that it can package 8.7.x the old way and 8.8.x the new way using composer to create a project.
  • Add a variant of the tool that Webflow uses to generate the drupal/core-pinned-dependencies and drupal/core-development-dependencies into the jenkins workflow that publishes those 'somewhere'.

Optionally supporting composer.json for extensions

The issue [PP-3] Provide optional support for using composer.json for dependency metadata still needs work done on it.

Core cross-initiative meeting 8/22/2019



  • On 8/21 we discussed the best course of action to resolve.
  • We hoped to deprecate the Drupal 6 migrations and move them to contrib, but we do not have a way to validate how to make deprecations.
  • V Spagnolo has been working on several issues and they are all advancing well.
  • Nathaniel Catchpole shared some criteria for getting into 9.0-beta1.
  • Good progress has been made on multilingual (biggest blocker right now).
  • Multilingual components must land before 9.0-beta1, thankfully the initiative as a whole is pretty stable.

Blockers (Drupal 6 Deprecations)

  • Needs release manager sign-off on the plan to get deprecation made.
  • Plan for moving those elements deprecated into contrib projects.

Next Steps

  • Need release manager criteria for making the multilingual migration stable.
  • Need release manager review on deprecation plan.
    • Need to document it, our target this week.
    • Need sign off on this and what we’ll do next, the target being next week. 
    • Need a way to get deprecated items into contrib. 
      • Are there any dependencies to deprecate items? Do we have to have them in contrib first?

Auto Updates


  • Contrib Alpha-1 was released this week, it includes:
    • Notifying site owners when a public safety announcement has been released by the security team.
      • Optionally this can be done via email, or in a set message on the page (similar to existing alerts).
    • 8 or so readiness checks to determine if your site can be automatically updated.
    • The above features are available in drupal 7 and 8.
    • Signature signed package now on packagist (dev-master), credit to MWDS folks.
      • This will ensure that MITM attacks are not possible because files are known.
      • This is a base that actual automated updates will rely on.
      • Timelines in the initiative update are still accurate.
      • No impact on 8.8, if added they will be new features on the update module.
      • More user-testing is needed for the PSA. We would like it to be in 8, but it could be in contrib in the meantime. The module is future-proofed enough to disable in contrib when it comes time to enable in core.


There are currently no blockers.

Next Steps

  • Following the PSA there will be the beta release and user testing.
  • The core release is targetting 8.9?



  • The API patch was committed since the last call, it’s in an experimental module.
  • By the 8.8 feature freeze, the UI portion of the module will not yet be ready.
  • This means we can’t release it in core until 9.1.


  • Resources are limited, the patch is large, and more people are needed to help with other aspects of the tool (maybe at Drupalcon Amsterdam).
  • The plan requires the release manager review & discussion.

Next Steps

  • Requires sign off for accessibility on WYSIWYG.
  • Two views issues fixed for content moderation.

Drupal 9



There are currently no blockers.

Next Steps

Continue working on Symfony4, Drupal 8 not using deprecated API’s and multi-version compatibility Symfony3 requirements to open the Drupal9 branch.



  • We have made progress to the critical global issues, mini pager, messages, and others are not completed but are looking likely to land. Some specific one-off pages are most at risk.
  • Targeting 8.8 release, but hoping to descope some things to meet this goal.
  • Authoring components still need designs, hoping to get that work done to get into beta for 8.8
  • Roadmap to stabilize Claro.


There are two issues the release manager needs to review.

Next Steps

Composer (Much of the information here was covered in the Composer meeting on 8/21)


  • Moving well, major patches are in which are focused on bells and whistles that will make the experience better.
    • One major patch changed core development workflow there have been no complaints so far (requires composer 1.9 if you’re working w/ 8.8 repo).
  • Scaffolding plan today requires some duplication of some files. It still needs to be confirmed with the core team.
  • Vendor core clean up plugin now strips out all the testing files from the vendor directory and makes sure there is an htaccess file, this is now a vendor hardening plugin. Waiting to be committed.
  • After the scaffolding and vendor hardening plugin are complete we can create a template that will generate a tarball that is composer ready.


There are two patches waiting to be committed. 

Next Steps



Aug 15 2019
Aug 15

Drupal Camp Colorado was located a mile high at the Aurora King Center, but the topics reached deep beyond the development of technology. Sessions and hallway-track conversations explored the human side of our lovely technology-centric project and I enjoyed the extra depth of those talks.

Connecting With People

Normally camps and cons are crazy for me - packed with marketing, sales, meetings, organizing stuff, herding cats, and volunteering. Experiencing Colorado Camp primarily as an attendee allowed me the space to revisit why I was originally drawn to the Drupal community. 

I met old friends and got to meet people in person that I only knew by online reputation. In a good way, of course! Shout out to the Lullabot podcasters Chris Albrecht and Matt Kleve for providing such excellent content over the years! It was glorious meeting folks from the Denver area - the whole vibe of the camp and the Colorado Drupalers is genuinely happy and inviting. The organizing team did a great job and put on a high quality and information packed event. If you have a chance, check it out next year!

A few attendees at the camp were brand new to Drupal and Drupal Camp Colorado was their first event! Sharing the newcomers’ experience sparked memories from other long-term community members about their first event.

Do you remember your first Drupal event?

I hope that when you read this question, memories of your first Drupal event may surface and you take a moment to revisit the feelings, location, people, and experiences.  

A few of us rekindled our memories of our first Drupal event. Matt Kleve from Lullabot pulled out a picture of a bunch of the Colorado Camp folks at a table from 2007 hacking away at a table at a restaurant - some who are still active in the Drupal community. Wow! I got to see the beginnings of the Denver Drupal community. Thank you for sharing, Matt!

I remember going to a small San Francisco Drupal Users Group (SFDug) in John Faber’s co-working space. It was 2008? 2007? The date is blurry. Kiernan Lal from Acquia and John Faber had a couple of six packs of beer and snacks for the ten or so people who attended. At that time I was an “active lurker” trying to wrap my head around the Drupal Community. Coming from the Big Enterprise and Proprietary Software Giants environment, I was in disbelief that people could be so open and sharing. What was wrong with the Drupal community? Why are they so genuinely nice? After attending multiple events with the same inclusive group of people, the answer was clear to me: the community is full of giving individuals and genuine good will...with fun technology!

Why do we still have Drupal camps?

Conversations then explored why we still come to Drupal events - user groups, regional camps, or the big conventions. Everyone’s personal stories are different and each provides color to why volunteers and organizations continue to create a thriving social community.  

At the surface, we come to learn, teach, and collaborate on the Drupal software platform. We also explore Drupal-adjacent technologies and the human aspects of being within a community and in a technology profession.

Our events are also a place of human connection. They provide a venue for a reunion of old friends, an opportunity to see remote coworkers in person, a time to collaborate with diverse people, and sometimes those star-struck moments when you realize you are standing next to Drupal core contributors in the coffee line or you are meeting the person who wrote the module you love and use so often.

Meeting kind, giving, silly, smart, passionate people is why I personally love the Drupal ecosystem and one of the main reasons Drupal was the platform of choice for my professional career path.

Technology Development

Beyond the connections between sessions I was able to sit in and listen to other experts give share their stories of struggle and success. I was enjoying being a listener again, and taking in all the knowledge that my community has to offer. 

Feeds UI in Drupal 8 

The extended Feeds module ecosystem from Drupal 7 provided a user interface for content editors to import data without having to program migrations. The non-developer import features have been a big gap in the Drupal 8 system. 

Perhaps the true business value of a non-developer based import system isn’t fully realized by the community or supporting organizations yet. Having a non-developer way to import content will be a huge help those transitioning from the end of life Drupal 7 to a Drupal 8 platform - especially within the smaller and midsize implementation. The session “Feeds UI + Migrate Engine = Dream Migrations and Imports” by Irina Zacks and Martin Keerman from Tableau talks about just that.

I have to admit, the Feeds UI / Migrate UI movement would not exist without the pure passion and boundless energy of Irina. She has been championing this effort for years and is finally gaining traction and support, but the efforts still needs help!

Layout Builder and Site Building in Drupal

Kris Vanderwater (ElipseGc) gave us an update on the progress of Layout Builder in “Site Building 2.0: How Layout Builder is Changing Everything”. Layout Builder in core is a collaboration of all the layout-centric module maintainers of times past (e.g., Panels, Display Suite) to provide a unified way to provide the features of the previous layout systems. It is still an ongoing work in progress but is really ready for use by the greater community. My biggest takeaway from this session is “Layout Everything!” - content types, nodes, blocks, and entities. You can even layout a single taxonomy term page! 

Human Development

Challenges Turn into Strengths

Matthew Saunders shared his personal stories of life’s challenges that were turned into opportunity. Matthew’s path is unique but his experiences represent situations and challenges we may have had in the past or come up against in the future. “Pivot-Points - Recognizing Opportunity, Turning Challenges to Strengths” was incredibly touching and personal. Thank you, Matthew, for sharing your story with the community. The session provided an important moment to reflect upon the fact that everyone may be experiencing challenges that other people don’t see.

Exploring & Designing Your Career Path

A job is something one does for money, a career is connected opportunities and fuels one's future. Humans on a career path experience moments when they feel like their direction needs to alter. Money, work-life happiness, interests, and work environments are all catalysts and reasons to revisit and map your career path. My session, “What happens next? Explore and Design Your Professional Path”, is relevant for all levels and roles within the workforce. I’ve personally used the industry standard topics, tools, and methods presented in the session, even as recently as June when Hook 42 had its seven-year birthday. As an organization we continuously incorporate the tools and techniques to mentor our employee’s growth paths.

Dad and Daughter Cover Profiles

“Extreme Makeover: Profile Edition” was presented by the father-daughter team of Greg Marshall and Amanda Marshall. The session provides reasoning why one should represent your online resume and contribution profile on A how-to of the profile edit pages were demonstrated, including the new changes from the diversity and inclusion team. 

I could see the impact this session has on our community instantly. While there, a new community member made his profile with the great instruction provided by Greg and Amanda. This session would be a great addition to a new-drupaler’s orientation of 

There was a loving and supporting banter between the two punctuated by the occasional Dad Joke, which I am no stranger to. The combination provided good will, good humor, and caring fatherly advice that is now extended beyond the Marshall family to the Drupal community.

Great Experiences

I'm thankful to have been able to attend this camp as an attendee and really touch-base with my inner Drupal community member again. Connecting with those I have known for ages, and learning how new people are being introduced to the community provided a closeness to the community that I was losing sight of. Not in a way where I wasn't part of the community, but in a way where being in the weeds with everyone was a refreshing point of view to obtain again. It is important to take a step back, and remember our roots as we grow within a community that has so many moving pieces. Thank you, again, Drupal Camp Colorado for a wonderful experience. 

Aimee hannaford holding quilt of old drupal camp colorado t-shirts

Image Credit: Chris Albrecht Twitter

Aug 13 2019
Aug 13

A great place to start a conversation about decoupled Drupal is evaluating Contenta CMS. While Contenta CMS is not necessarily something you must have to build a decoupled Drupal 8 site, it is designed to do it. You can relatively easily create a vanilla Drupal site that supports a decoupled application, but Contenta has already solved many of the related problems.

So what is Contenta CMS exactly? 

Contenta CMS is an API-first Drupal 8 distribution intended to be used to build fully decoupled Drupal sites. It was built by the developers of many of the modules you may end up using as you build your decoupled site, using their defined best practices to address typical needs and challenges. It is meant to be 100% decoupled, and only uses Drupal 8 as an administrative backend with no user-facing HTML content. This is something you could change if you desired to do so.

At first it seemed like a magical, mysterious system. However, Contena uses core and well-known contributed modules with only a single custom module that provides a few customizations. With only a few small tweaks, you could conceivably have a base system for your decoupled project with Contenta CMS as you would any Drupal 8 project.


The main difference between Contenta CMS and a site you would conceivably build yourself lies in the only custom module the distribution comes with, Contenta Enhancements. This module primarily does a few things:

  • creates a new, streamlined administration toolbar for a decoupled site,
  • provides some additional local tasks menu items giving easy access to necessary configuration,
  • alters the node view to display JSON instead of HTML, allowing for easy viewing of node structure, and
  • disables certain routes not needed or necessarily useful for a decoupled site.

Because this is a Drupal module, you’re perfectly fine installing it in your own clean Drupal 8 install to try to replicate Contenta along with the contributed modules used.

Key Modules

The following modules make up the underlying Contenta architecture.


Consumers is a utility module that allows other modules to define users of the API and then further allows administrators to manage access control for each consumer. 

Decoupled Router

As the module description states, "Decoupled Router provides an endpoint that will help you resolve path aliases and redirects for entity related routes. This is especially useful for decoupled applications where the editor wants full control over the paths available in the consumer application (for instance a React app)."

To further understand the purpose of Decoupled Router, read the great post (and series) by the module creator.

JSON:API (now part of Drupal 8.7 Core)

JSON:API is a plug and play module that fully implements the JSON:API Specification that without configuration exposes your Drupal entities via a REST API.


JSON:API Extras extends the JSON:API module by allowing customizations and management of API endpoints. The JSON:API module does not offer any configuration options.


While JSON:API exposes Drupal entities via a REST API, JSON-RPC exposes Drupal administrative actions that would otherwise not be easily accessible or handled using the REST API.


The OpenAPI is a utility module that allows your Web Services to be discoverable using the OpenAPI standard and thus neatly documented for testing and development when used in addition the OpenAPI UI and either something like OpenAPI UI Redoc or another similar module.


OpenAPI UI helps provide a user interface within Drupal for displaying your OpenAPI standards-based API explorer for your Drupal site.

OpenAPI UI Redoc

This module provides a plugin that implements Redoc for use with OpenAPI UI to display from within Drupal. This is akin to GraphiQL in the GraphQL standard.

preview of redoc in drupalOpenAPI UI using Redoc in Contenta


SimpleOauth is an implementation of the OAuth 2.0 Authorization Framework RFC for Drupal allowing you to use Oauth 2.0 for user authentication.


The subrequests module allows aggregated requests and responses to be sent to Drupal. For example, instead of sending a request for a node and then the node’s associated taxonomy terms, it allows you to send a single request that returns all the data you’d need. The goal being to make decoupled applications more efficient by reducing requests. An excellent article on the motivation for this module can be found on Lullabot’s blog.

Installing Contenta

To get started, head over to the Contenta install page. After installing, run: drush runserver to run server, then access to view site.

preview of contenta home screen

Upon logging in, you will find a familiar interface, with some slightly different links available, with all but the “API” link leading to common Drupal administration pages, and the “Advanced Link” exposing the default Drupal administration toolbar.

preview of contenta admin screen

You should be now ready to begin building your decoupled site. In the following posts in this series, I will explore doing just that.


By adding and configuring the above modules to a new or existing Drupal 8 site (I can’t stress enough that you must install modules using composer), configuring CORS (if needed), you should be ready to begin developing your decoupled application using the technology of your choosing so at this point I wish you happy trails!

*P.S. The folks that brought you ContentaCMS also created ContentaJS, “a nodejs server that proxies to Contenta CMS and holds custom code”. It’s certainly not necessary to begin your decoupled journey, but it does provide some handy features that I think could be extremely useful.

Aug 08 2019
Aug 08

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past week. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

Drupal 9 Readiness (08/05/19)

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. Site developers who want to stay in the know to keep up-to-date for the easiest Drupal 9 upgrade of their sites are also welcome.

  • Usually happens every other Monday at 18:00 UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public Drupal 9 Readiness Agenda anyone can add to.
  • Transcript will be exported and posted to the agenda issue.

Symfony 4/5 compatibility

The issue, Allow Symfony 4 to be installed in Drupal 8, has had a lot of work put into it by Michael Lutz.

Contrib deprecation testing on

Gábor Hojtsy grabbed the data and did some analysis and posted his findings to prepare for Drupal 9. The main topic of the post is to stop using drupal_set_message() now.

Examples module Drupal 9 compatibility

Andrey Postnikov posted Kharkov code sprint on where 23 issues were addressed. Follow the example code for developers project for more information. There are still a bunch of issues to review there if anyone is interested!

Module Upgrader Drupal 9 compatibility

Deprecation cleanup status - blockers to Drupal 9 branch opening

Drupal core's own deprecation testing results, there are currently 13 children issues open, most of them need reviews.

Twig 2 upgrade guide and automation and other frontend deprecations tooling

Semantic versioning for contrib projects

Now that we've come to a path forward for how we plan on supporting semver in core (core key using semver + composer.json for advanced features), the Drupal Association is planning on auditing our infrastructure to start implementing semver.

New Drupal 8.8 deprecations that may need to be backported

  • Ryan Aslett and Gábor Hojtsy did some analysis on deprecations in contrib that are new in Drupal 8.8. They found 17% of all contrib deprecated API use now is from either code deprecated in 8.7 or 8.8. Ryan Aslett looked at the toplist of those deprecations and categorized them based on whether the replacements are also introduced in 8.8 or earlier.
  • We're not backporting API's, that carries far too much semver breaking risk. If a contrib maintainer has usages of code that were deprecated in 8.8.x, and they want their module to be 9.x compatible on the day that 9.0 comes out, they can:
    • do internal version checking,
    • open another branch,
    • wait until 9.1 to be 100% compatible with all supported versions, or
    • drop support for 8.7.x.

Renaming core modules, eg. actions

  • There's a meta about renames.
  • Renaming modules can have impacts on other modules that declare a dependency on those modules. 
  • We need some way to prove that a rename doesn't break contrib modules.

Migration Initiative Meeting (08/08/19)

This meeting:

  • Usually happens every Thursday and alternates between 14:00 and 21:00 UTC.
  • Is for core migrate maintainers and developers and anybody else in the community with an interest in migrations.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public migration meeting agenda anyone can add to.
  • Transcript will be exported and posted to the agenda issue.
  • For anonymous comments, start with a bust in silhouette emoji. To take a comment or thread off the record, start with a no entry sign emoji.

Some issues need review:

  1. Add test of D7 term localized source plugin
  2. Migrate D7 synchronized fields
  3. Ensure language is not Null in translation source queries 
  4. Language specific term (i18n_taxonomy) should not rely on entity translation in D7 taxonomy term migration
  5. Migrate D6 and D7 node revision translations to D8 
  6. Migrate D7 i18n taxonomy term language 
  7. Use the lock service for migration locks 
  8. Undeprecate Drupal\comment\Plugin\migrate\source\d6\Comment::prepareComment() and mark as internal
  9. Create Migration Lookup service 
  10. Validate Migration State should load test fixture
  11. Boolean Field On and Off Label not Migrating
  12. Assert plural labels exist on migrate upgrade form
  13. Migrate UI - review help text
Aug 06 2019
Aug 06

Author’s Note: No rabbits were harmed in the writing of this post.

This summer, I had the opportunity to attend Decoupled Days 2019 in New York City. The organizers did a fabulous job of putting together an extremely insightful, yet approachable, program for the third year of the conference to date.

In case you haven’t heard of the event before, Decoupled Days is somewhat of a boutique conference that focuses solely on decoupled CMS architectures, which combine a CMS like Drupal with the latest front-end web apps, native mobile and desktop apps, or even IoT devices. Given the contemporary popularity of universal Javascript (being used to develop both the front and back ends of apps), this conference also demands a strong interest in the latest JavaScript technologies and frameworks.

If you weren’t able to attend this year, and have the opportunity in the future, I would highly recommend the event to anyone interested in decoupled architectures, whether you’re a beginner or an expert in the area. With that in mind, here are a few of the sessions I was able to attend this year that might give you a sense of what to expect.

Christopher Bloom (Phase2) gave an excellent performance at his session, giving all of us a crash course in TypeScript. He provided a very helpful live demo of how TypeScript can make it much easier and safer to write apps in frameworks like Vue.js, by allowing for real-time error-checking within your IDE (as opposed to at runtime in your browser) and providing the ability to leverage ES6 Class syntax and decorators together seamlessly.

Jamie Hollern (Amazee Labs) showed off how it’s possible to have a streamlined integration between your Drupal site and a fully-fledged UI pattern library like Storybook. By using the Component Libraries, GraphQL, and GraphQL Twig contributed modules in concert with a Storybook-based style guide, Jamie gave a fabulous demonstration of how you can finally stick to the classic DRY (Don’t Repeat Yourself) principle when it comes to a Drupal design system. Because Storybook supports front-end components built using Twig markup, and allows for populating those components using mock data in a GraphQL format, we can use those same Twig templates and GraphQL queries within Drupal with almost no refactoring whatsoever. If you’re interested in learning more about building sites with Drupal, GraphQL, and Twig, Amazee Labs has also published an “Amazing Apps” repo that acts as a sample GraphQL/Twig sample project.

For developers looking to step up their local development capabilities, Decoupled Days features two sessions on invaluable tools for doing decoupled work on your local machine.

Kevin Bridges (Drud) showed how simple and straightforward it can be to use the DDEV command-line tool to quickly spin up a Drupal 8 instance (using the Umami demo site profile, for example), enable the JSON:API contributed module in order to expose Drupal’s data, and then install (using gatsby-cli) and use a local Gatsby.js site to ingest and display that Drupal data.

Matt Biilman (Netlify) also demonstrated the newly launched Netlify Dev command-line tool for developers who use Netlify to host their static site projects. With Netlify Dev, you could spawn an entire local environment for the Gatsby.js site you just installed using DDEV, which will be able to locally run all routing rules, edge logic, and cloud functions. Netlify Dev will even allow you to stream that local Gatsby.js site to a live URL (i.e., on Netlify) with hot-reloading, so that your remote teammates can view your site as you build it.

As usual, Jesús Manuel Olivas (WeKnow) is always pushing the Drupal community further and further, this time by demonstrating his own in-house, Git-based CMS called Blaze, which is a platform that could potentially replace the need for Drupal altogether. Blaze promises to provide the lightest-weight back-end possible for your already light-weight, static-site front-end. In lieu of a relatively heavyweight back-end like Drupal, Blaze would provide a familiar WYSIWYG editor and easy content modeling with a few clicks. The biggest wins from using any Git-based CMS, though, are the extremely lowered costs and lightning-fast change deployments (with immediate updates to your code repo and CI/CD pipeline).

Aug 02 2019
Aug 02

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past May. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

Out of the box meeting  07/30/19

Issues were being worked on by, Ofer ShaalKeith Jay, and Mark Conroy.

Still needs work:

Needs to be reviewed:

Admin UI meeting! 07/31/19

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. 

  • Usually happens every other Wednesday at 2:30pm UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • There are roughly 5-10 minutes between topics for those who are multitasking to follow along.

Beta & Stable issue blockers that are not components and need design:

  • Refer to the spreadsheet of Claro components to find other items that need worked on. Found in the "other design issues" tab.
  • Also, there are several issues that are being marked as beta&stable blockers.
    • If you catch any issue that you think that needs design work please add them there so the design team is aware of them.
    • If you want to go through any of those and add screenshots or other info we'll really appreciate that!

Editor role next steps:

Tables on mobile:

  • Table overflow on mobile currently needs reworked.
  • There is a design proposal currently under review.
    • Andrew Nevins (anevins), recommend to look into accessible-only solutions to this problem, as making a table responsive (apart from simply adding a horizontal scrollbar) can disrupt the semantics of the table to people who need it the most.
Jul 29 2019
Jul 29

This year, Drupal GovCon had an amazing turnout. So great that the registration was at full capacity and had to cap attendance at 1,500 people!

Our team had an amazing time exploring Bethesda, from the conference grounds to the thriving community around it. While there we enjoyed conversing with the community, and forging new relationships. We learned many things, and shared our experiences with many others as well. Overall, it was a great environment for exploration and growth.  

From Hook 42 we had a first-time ever Drupal event attendee, an experienced Drupal veteran, and a goldilocks somewhere in the middle community member join forces. With the variety of community involvement just from our team alone, there were many different expectations attending this event and each person had their own goals and takeaways from this experience. We’re excited that an event can bring so many different people together and provide an experience that resonates with many different community members. Here's what we took away from this GovCon this year.

Aimee's Thoughts

GovCon 2019 delivered another great experience for me. I am a huge advocate of GovCon. I have found great value in my time spent here and look forward to returning each year. This camp is such a well run event that consistently delivers an inclusive, supporting and rewarding experience. I very much enjoyed my time there as a speaker, member and participant. I appreciated the structured content as well as the well attended after events where I got a chance to catch up with old friends, and meet many new people.

The sessions line up at GovCon 2019 was packed full of talented and useful information. There was so much I couldn’t attend that I’m especially grateful for the YouTube recordings. A big shout out for Kevin Thull and the team for getting these up!

It was an honor to be able to deliver my keynote, CommYOUnity: Fostering Healthy Contribution, at GovCon. Community is such a vital, core value to Drupal and that community is built on you and me. When we can build healthy relationships and make time to take care of ourselves we’re actively working on taking care of the community.

Thanks again for the wonderful opportunity and great experience GovCon!

Ryan's Thoughts

First, I wanted to give a big thank you to the event staff and volunteers who made GovCon 2019 possible. I am a first time GovCon attendee and had a great time. I knew when and where the sessions I was interested in were and found my way around NIH easily. The great planning and coordination that went in to GovCon made my experience very enjoyable.

Janessa Worrell and Brianna McCullough, from Acquia, gave a great presentation on governance, "Winter is Coming: How to Use Good Governance to Prevent your Organization from Becoming a Game of Thrones". They brought awareness to some of the harder to reach topics that help an organization align to make better project decisions and did it in an entertaining and informative way.

It was a pleasure to meet David Minton and Stephen Pashby from DesignHammer and then later see their presentation on estimation, "Successful Project Estimation: How To Get Your Weekends Back". Their modeling on historical throughput with detailed task tracking is an engaging idea I think we could put to use. 

I really appreciate the community that came together to share their thoughts and experiences and I look forward to my next opportunity to attend.

Lindsey's Thoughts

I’m semi-local to DC, and very familiar with the area so much so that I would come here as a child on field trips and such. I wasn’t coming here with the excitement of exploring the local community and the city, but more so with the intention of bonding with the Drupal community itself. Making connections with people that are experiencing similar situations as I evolve within the Drupal world is very important to me.

I spent most of my time holding down the booth, talking with many people about the great things our team has to offer. It’s a great way for a new Drupal-member to get to know a lot of people. For the first time ever, I experienced the joy of seeing connections I made at another Drupal event, and seeing their faces in the community again. Those bonds are already strengthening and I couldn't be happier! I am getting to understand just how connected our community really is.

When I wasn’t at the booth I attended sessions about accessibility. One common theme in all of them is that the speaker always shared empowering experiences that would resonate with the audience. They weren't necessarily technical, or Drupal related, but they provided a very humanistic connection to an issue that is usually backed by threatening legal concerns. 

I enjoyed hearing Shawn Brackat from Forum One sharing a story of a blind couple receiving a 3D model of an ultrasound, and Catharine McNally from Phase2 sharing her stories about growing up deaf and receiving the first ever study on cochlear implants. These are aspects of accessibility that people really bond with. Being inclusive is more than just avoiding a lawsuit. It’s about making things easier for everyone, and providing ways to accommodate those that do things differently. Everyone experiences things differently, disability or not, and it's important that we keep that in mind as we build digital experiences for the masses.

I enjoyed participating in my first GovCon in a variety of ways. Whether that was sitting at the booth, attending sessions, or dinner with great friends - I have had so many wonderful experiences. I’m already looking forward to next year.

Wrapping Up

The community always goes above and beyond, providing experiences that everyone can resonate with. GovCon did not fall short of those high standards. We’re so thankful to all of the organizers, and happy to have been one of many great sponsors that can help support events like these. All of us had a wonderful time, and we’re happy to be so involved with a community that has a great ecosystem. We’re already planning our next event... we’ll see you in Denver!

Jul 26 2019
Jul 26

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past May. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

Out of the box meeting  07/16/19

At this meeting we discussed the following issues:

Drupal 9 readiness

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. Site developers who want to stay in the know to keep up-to-date for the easiest Drupal 9 upgrade of their sites are also welcome.

  • Usually happens every other Monday at 18:00 UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public Drupal 9 Readiness Agenda anyone can add to.
  • Transcript will be exported and posted to the agenda issue.

Meeting Highlights from 07/08/19

Multiple branch compatibility, semantic versioning, and composer.json proposal:

Schema version and database updates hooks in Drupal 9.

Split off SchemaInstaller from, the question is how long should 8xxx hooks be kept. They will need to be updated to D9, but should we have people update to 8.last first, and fire all of those updates before allowing them to update to D9 and start the 9xxx series of hooks?                                         

We discussed that at least for now, we will leave the minimum at 8000 for the sake of running updates, or have some special handling for when one is running the D9 codebase with a 8xxx schema to force an update before one's site works, or something along those lines.

Deprecation cleanup status -  blockers to D9 branch opening

Examples module for D9 is looking for maintainer(s)

Module renames, action and menu blockers

Drupal core cross-initiative meeting 07/24/19 


Status of Media

  • Focus is on WYSIWYG, working on three things.
  • Representing media in WYSIWYG is going quite well. Well tested, some CSS things outstanding, following Cristina and Lauri discussion.


Status of CMI 2

  • Big API patch landed, not blocker anymore.
  • The ball is in their court, as the module is not yet ready to review.


Status of Workspaces

  • On track for stable workspaces. Currently working on:
    • fixing the bugs,
    • sub-workspaces, and
    • merging (not written yet because it needs the hierarchy).

Blocked Items In Workspaces

  • Reviews for RTBC and Needs review issues in workspaces
    • Remove workspace association entity type (tracking entity revisions vs. workspace) and replace with custom storage
    • Revisionable entity types cannot be uninstalled if their code does not exist anymore. Issues blocked are:


Status of Claro

  • General components need to be unblocked for beta / Drupal 8.8.
    • The Media library is the most important.
      • Currently doing research there.
    • Status report page UI.
    • Some other small components.
  • There is a new designer joining full time.

Blocked Items in Claro

Auto Updates

Status of Auto Updates

  • Lucas can now move forward as he was unblocked by DA last week.
  • PSA feed is the first phase, once it is there we will Drupal set message on every page.
    • This will go to core once/if possible.
    • There will be a contrib release first to figure out bugs.
  • Checking for update eligibility would stay in contrib, there are various readiness checkers that are tagged services. (Is read only, do you have db update, local modifications.)
    • All readiness checks are in 8 and 7 and committed.
  • Next step will be an in-place update with a quasi-patch zip file, there is an issue with passing tests. (It has a manifest to know deleted files, other files drop-in replacements.)
    • Ftp will make this available.
    • Will not work for dev branches or hacked sites.
    • Using composer will not be supported in the first version, only for tgz.


Status of Migrate

  • Ideally do an audit step, Mike proposed a framework for this, very high priority.

Blocked Items in Migrate

Drupal 9

Status of Drupal 9

  • Deprecation fixes going in core going very well, down to 29 individual issues, all have issues, once the Drupal::l() lands, we will be down to double digits of instances.
  • Symfony 5 and 4.4 is in heavy development, we don't know what to adapt to right now, so we are in a holding pattern waiting for what is going to happen there.
  • Symfony 4.3 has some fails.


Status of Composer

  • Moving along pretty well.
  • Wikimedia merge plugin (original solution to core directory and product scaffold files) is to be removed, so we can move closer to the unofficial composer on its way to being official.
    • We don't know if anyone is relying on it.
  • Core vendor cleanup plugin should be reusable.
  • Scaffolding introduced a random fail, looking at that.
  • Templates are the last part when we can change packaging, when the tarballs would be created by composer eventually.
  • Spreading out to solving "all things wrong with composer."
    • Eg. subtree split to only get core modules you need not all of them.
    • Lightning should be able to be built on
Jul 26 2019
Jul 26

We’ve recently wrapped up another great Drupal event, at Drupal Camp Asheville. The sponsorship our team provided, in conjunction with the support of many others, helped the camp achieve many goals that we are proud to have been a part of. 

The experiences our team had stood up to the expectations of all Drupal events,

From Hook 42, we had three people who were able to participate this year, and each member of our team had different expectations going in, and learned many valuable things. Here’s what they have to say.

Danita’s Experience

Although it was only my second year of attending Drupal Camp Asheville, it already feels like “home.” One of the highlights of any Drupal camp or con or meetup is getting to see old friends and meeting new ones, and this camp doesn’t disappoint. An added bonus was getting to hang out with two Hook 42 colleagues (including Jonathan, one of the camp organizers), something that doesn’t happen often enough with a remote team.

On Friday, I joined a fairly packed room for a full-day training on CSS Grid and Flexbox with Wes Ruvalcaba, Senior Front-end Developer at Lullabot. Along with how to use Grid and Flexbox, Wes shared some tips and tricks he uses when theming Drupal websites. Even though I’ve used both Grid and Flexbox before, I came away from that all-day training with a better understanding of when and how they are “supposed” to be used - and to quit using “floats” for layout!

Sessions I attended on Saturday included one on contributing back to Drupal presented by Amy June Hinelline, Kanopi’s Community Ambassador. It was a good reminder that anyone (not just super-experienced coders) can do something to contribute and that our contributions make the community stronger.

In addition to the trainings and sessions and “hallway track” conversations, the social events and just the location of the camp in Asheville make this a not-to miss camp. I know I can’t wait until next year. 

Jonathan Experience

Another great year at Drupal Camp Asheville. On Thursday we all gathered to play games and hangout at the Wedge. Friday I gave my full-day “Essential Drupal 8 Developer Training”, and it went really well. I had a full class with lots of great questions and comments, and like last year, my voice started to give out. I didn’t record the training this year, but it was basically the same as 2018. Videos, slides, and code examples for the training are all available online.

Saturday we had an amazing group of presenters show off some of their best work and discuss topics they are passionate about. As an organizer, we made a lot of effort ensuring that there were great sessions for almost any topic related to Drupal or Drupal adjacent. We had everything from improving client interactions to an overview of the JSON:API, from understanding Drupal 8’s caching mechanisms to a discussion of emotional labor in communities, and from working effectively as a remote team to data analysis and visualization.

All sessions were recorded and uploaded to YouTube. Full playlist Drupal Camp Asheville 2019 sessions

As an attendee, it was really great to see the old guard and meet some of the new. I had a great chat with a new Drupal developer who is implementing a chat bot for his university, enjoyed tacos and beverages with the creators of Backdrop CMS, and talked about video games with friends as we hiked up to Catawba Falls. It’d be difficult to list each great interaction I had because there were good people and fun conversations happening practically the whole time. 

Biased opinion: I can’t recommend Drupal Camp Asheville enough. Thanks to all the hard work by our Director April Sides, the camp is well managed and a wonderful, casual, and considerate event for everyone. Hope to see you there next year! 

Group photo of drupal asheville attendees waving

Jul 11 2019
Jul 11

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past May. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

Drupal 9 readiness meeting! 07/08/19 

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. Site developers who want to stay in the know to keep up-to-date for the easiest Drupal 9 upgrade of their sites are also welcome.

  • Usually happens every other Monday at 18:00 UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public agenda anyone can add to.
  • Transcript will be exported and posted to the agenda issue.

Drupal-check and Upgrade status updates

Drupal 7 migration path UX improvements to do

Started work on "create an audit plugin class/manager for migrations", in an attempt to provide a user interface for situations where the migration path can’t be determined without some input from the user.

Removing deprecated API uses from core

As per Drupal core's own deprecation testing results we have moved somewhat in the past month, therefore by resolving "Replace calls to format_string()" we could cut down to less than 50% of the current number. Previously we indicated that we are looking into core’s use of deprecated APIs as an indicator as to when the Drupal 9 branch could be opened, where we can do the actual Symfony update as well as PHP version requirements updates. Doing this so as to have a branch for people to test with sooner than later, there by resolving the deprecated API uses is in that critical path.

The roadmap for simpletest out of Drupal

  • A published roadmap for simpletest is live. 
  • There are a few issues here:
    • There's a module called simpletest in core that should be deprecated.
    • There's a class called TestBase which should be deprecated.
    • There's a simpletest UI that might end up living in D9 as testing_ui.
    • There's a test runner called that needs to be refactored for all of the above.

Admin UI meeting (07/10/19)

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. 

  • Usually happens every other Wednesday at 2:30pm UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • There are roughly 5-10 minutes between topics for those who are multitasking to follow along.
  • The agenda is public and anyone can add new topics in the document.

Permissions and other requirements for the new Content Editor role:

The "Add new Content Editor" role to "Standard Profile" issue is open.

The basic features we identified are:

  •   Create and edit new content - articles and pages
  •   Use the basic HTML text format
  •   View unpublished content
  •   Create and edit terms (tags and categories)
  •   Access the administration theme

One of the suggestions was to base Editor permissions on what Umami already set up and add all the permissions that are needed in all modules that come with core (even that they come disabled by default).

Review and approve the Roadmap to stabilize Claro

Issue "Roadmap to stabilize Claro" was opened.

Status of the tabledrag component

  • Table drag style update is in progress. From a design perspective, the current table drag and drop is good enough for a MVP(beta) Claro version.
Jul 11 2019
Jul 11

For the past several years (2016, 2018, 2019) Dries has written articles aimed at helping people decide if and how one should decouple Drupal; a general survey of the state of decoupled/headless Drupal. In his most recent post he mentioned the pace of innovation has been accelerating due to the number of Content Management channels and JavaScript frameworks to support. I’ve been particularly excited about the JavasScript frameworks and hoped to find more in-depth coverage of this.

Much to my chagrin, from numerous conversations with Front-End developers as well as other Full Stack developers, I’ve found that knowledge in the community about a lot of the innovations happening outside the traditional Drupal or Open Source world has not grown as fast. Much of the content being published, in my opinion, doesn’t necessarily do a great job of covering some of the better possibilities out there and potentially leave readers and attendee’s of talks un-informed on just what the possibilities are.

Understandably, everyone can’t be expected to know everything about everything, but I believe there’s an opportunity for the community to leverage some of the powerful tools that exist with the knowledge we have to increase the use case for Drupal.

Show ‘Em What We’ve Got

Today, unlike the days of yesteryear, many members of the community are already equipped with the tools to build truly native mobile applications thus eliminating the need for Java or Swift since JavaScript and TypeScript based languages can be just as effective. 

In the interest of raising more awareness of what’s out there, I’ve decided to explore some of the most popular frameworks for building native mobile apps from a single codebase using technologies familiar or learnable by many. With that, I’ll be exploring their ease of integration with Drupal.

Exploring The Possibilities

Over the next several months I will explore and evaluate some of the tools available for native mobile app development, as well as Drupal tools, modules, and distributions that facilitate this. I will also go through the process of building actual apps to provide insight into the research you may not have the time to do yourself. 

The tools I will explore, in addition to core and contrib Drupal modules, will include:

  • ContentCMS (API-first Drupal distribution)
  • ReactNative (Framework for building mobile apps with ReactJS)
  • Tabris (Framework for building native mobile apps with JavaScript or TypeScript)
  • NativeScript (Framework for building native mobile apps with JavaScript, TypeScript, Angular or VueJS)
  • Appcelerator Titanium (Framework for building native mobile apps with JavaScript)
  • Fuse (Framework for building native mobile apps with JavaScript)

My hope is that by the end of the series, there might be a few converts to Drupal-powered native mobile development both from the Drupal side and from the frontend development side. WordPress is already ahead of Drupal on this with several plugins that convert WordPress sites into native mobile apps, so we have some catching up to do.

Jul 08 2019
Jul 08

Our lead community developer, Alona Oneill, breaks down highlights from Drupal Core Initiative Meetings this past week. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

Out of the box initiative meeting (07/02/19)

At this meeting we spoke with the developers at Blackfire.

  • We have a working account with Blackfire to try out Umami,
  • Also tried New Relic - which showed that search indexing is taking a long time,
  • Can we change how Umami installs so that long steps can be skipped to save time?

Issues to work on this week:

Admin UI meeting (07/03/19)

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. 

  • Usually happens every other Wednesday at 2:30pm UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • There are roughly 5-10 minutes between topics for those who are multitasking to follow along.
  • the agenda is public and anyone can add new topics *in the document*.

Dialog Issue

  • Dialog style issue.
  • Issues in the core.
  • Proposed the idea that we would try to do research on dialog solutions in Claro and replace jQuery UI dialog with something in our scope of work. An a11y maintainer didn’t like the recommendation and after doing some more research on this it feels like very hard because we might not be able to keep BC at least 100%.

Claro Alpha 4 Goals

Documentation to Work On

  • We should open an issue for tracking our plans for alpha releases, as well as beta and Roadmap.
  • There is supporting documentation for Claro here.
  • Strategic-initiatives needs to be updated.
  • The Proposal to use PostCSS for Claro in core.
  • Design sprint at DrupalCon Europe:
    • Several designers will attend the event, so some would like to have a sprint or focused BoFs.
  • Editor role:
    • We are still missing part of the `Define the new set of permissions` before we can create the patch.
  • Vertical tabs:
    • Mobile design is troublesome, because they are not vertical anymore and behave like the details element. The problem on the design here is that we can't have vertical tabs in small devices, they need to be one  below the other. And we can't have the title above and the content 5 tabs later after all the titles.
Jul 01 2019
Jul 01

Our lead community developer, Alona Oneill, breaks down highlights from Drupal Core Initiative Meetings this past June. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

CMI 2 Initiative Updates

Status of CMI 2

Major patches are being reviewed and hopefully will land after it gets a change record.

Next steps for CMI 2

  • A final review from Lee to be completed.
  • The config environment module, different configuration in different environment, is in production.
  • At a stage where nothing is needed from Core Cm or FM’s.

Composer Updates

Status of Composer

A patch went in to use composer as a dev requirement and we're on the road to making core test builds and upgrades. The scaffolding patch was reviewed and moved to RTBC.

Next steps for Composer

  • Need core maintainers to review the testing framework from miles 23.
  • Need core team to help with the scaffolding issue.

Workflow Updates


There are two major patches being worked on at the moment:

Would also like to see the issue to allow 'syncing' content to be updated in content moderation without forcing the creation of a new revision be updated. Content moderation is working with this as it allows people to moderate any content within the workspace via the user interface.

Stable release

Upgrade path is on hold until this approach is validated or approved. Workspace merging is currently in need of an issue.

Next Steps for Workflow

Get release managers and fm review is needed on issue #3062434. Get FM review on issue #2803717 because it currently needs additional input. An issue for workspace merging also needs to be created. We're trying to get the first 2 issues into 8.8 (and 8.7).

Drupal 9 Updates


  • Drupal check got a release last week by mglamman with all deprecation error messages.
  • Upgrade Status has new features in dev that categorizes error messages on actionability. The action items are, supported, deal with it now, not supported, deal with it later, or deprecated for Drupal 9.
  • Explaining in the UI of the module to help them engage with contribution maintainers.
  • There is low-level planning in the works to:
    • Identifying work to manage dependencies and defining the process to do this work.
    • Issues related for info:
    • We are asking for investment from Acquia to complete some of the work.
    • Core jQuery UI discussions are continuing.
    • Symfony 5 branch is now open! The branch requires a min php 7.2. For Symfony 4 the php requirement is 7.1.

Drupal 9 Blockers

Cannot complete deprecation list for 8.8 because November is when we’ll get the list from Symfony for the SF5 release.

Next steps for Drupal 9

  • Continue to keep tabs on what is happening with Symfony 4 and 5 changes.
  • Review the list of items being deprecated for 8.8 with RM/FM.
  • Make a decision on if the team goes with Sf4 or Sf5.
  • Confirmation on the resourcing ask for Drupal 9 work.
  • Confirming the front end deprecation process.
  • Identifying critical path items and sequencing for Drupal 9 work.

Claro Updates


We have one group working on admin ui theme, Claro. There is a lot of contribution progress from both front-end developers and designers. The Alpha 3 release of Claro was released in the middle June.

Another team is working on react-based decoupled admin ui, however there is not much momentum at the moment. So far, a component library has moved forward with limited resources.

Next steps

The team is on track for getting in 8.8, likely as a beta. This will address open issues with designers,  address changes that developers need to make which have already been found, and work on get approval from RM/FM on moving the theme toolbar CSS to the Seven theme.


  • At Devdays++ accessibility improvements and fixes were worked on and signed off by RM/Media team consensus.
  • Drag and drop zone for file uploads was discussed at the UX meeting as the current design was causing accessibility issues.
  • The plans for WYSIWYG are complete and ready to be worked on moving forward. 
  • Media metadata issues are now unblocked.

Next steps

  • Continue prototyping on the accessibility solutions to be compatible with drag/drop zone for file uploads.
  • Keep working with contributors and community members to find solutions that could incubate there.
  • Keep working on WYSIWYG.
  • Resource and allocate people to work on metadata.

Migrate Updates


The current migration is not as user-friendly as we’d like. We need a better user experience.


There is a large list of things generated from Angie Byron on the experience:

  • Running a pre-flight check will reveal if your data has an issue. We need a better way to check that issues you’d run into are uncovered and fixed before they migrate.
  • Solution needs to not mess with the command line and be more intuitive.
  • Working with UX to find an appropriate solution.
  • Currently have 4 migration maintainers with limited additional resources. We need more people writing code!

Next steps

We will continue with the multilingual upgrade path and keep working on preflight check to improve the migration experience. 

It Takes A Village

Thank you for being involved in the community, we're happy to be helping spread the word about the progression of a great platform. Please check back for frequent meeting recaps to gather insights on the latest Drupal Core developments and find ways to get involved. Our community thrives when we all come together!

Jun 20 2019
Jun 20

For years, community members from Chattanooga talked about their local camp. These community members routinely support other camps, through attendance, volunteerism, and by giving talks. It was our time to return the favor.

Hook 42 not only sponsored the event, but delivered a training and two sessions. From our team Jonathan and Adam attended, and they really enjoyed the time there.

Adam’s Experience

I was grateful to have the opportunity to deliver a full-day training on GatsbyJS on Friday and one of the featured talks on Saturday. I want to recognize my training peer Ryan Bateman who helped out with many of the preparations for the training. I also want to thank attendees who came to either. 

The training was an end-to-end GatsbyJS primer. We set up a Pantheon instance running Umami. We walked through a series of primers and hands on lessons. Most in the room were able to deliver a working Gatsby recipe site to Netlify. It was fun to cover so much material and watch people go from nothing to a functional site. Feedback was positive and it was very helpful to have the super fast Chattanooga internet speeds.

I prepared a brand new talk entitled “Evolving Priorities: Tech, Community, and Impact.” I looked at topics like technical skills, emphasizing the needs of people, and changing our individual frame of reference to what has an impact on the world. I also shared some thoughts on the evolution of Drupal, both from a community and a product. I appreciated those who attended and subsequently gave me feedback for future improvements.

Many people from other close by camps were able to attend. It was so nice to see friends from Asheville and Atlanta to show their support for the deserving Chattanooga crew. Doug Vann, Mike Herchel, Aaron Feledy, and Jordana Fung, among others, also attended from the broader community. It was great spending time with everyone.

I found the camp to be friendly and represent the spirit of those giving back to the Drupal community. Organizers selflessly volunteered their time and committed to helping their guests have a wonderful time. In particular, I was able to go to Rembrandt coffee, Freemont (burger and craft beer night), and Heaven and Ales brew pub. It was a beautiful area with green scenery and beautiful waterways.

Jonathan's Experience

And so we meet again. 2019 was my 2nd year at Drupal Camp Chattanooga, and it was even better than the first. Hanging out with the locals and those visiting from other areas is one of my favorite parts of attending a Drupal Camp. Last year I had to rush home and didn’t get much of a chance to get the full experience, but this year was different in all the best ways.

We started the camp off right with a game night at Code Journeymen’s offices and had a rambunctious night of accusing people of fascism while enjoying each other’s company. It was a welcoming and comfortable atmosphere that, as a camp co-organizer myself, I admired greatly.

After I had a short adventure of being lost in the parking lot, the camp itself seemed to go off without a hitch. They had a lot of really great presentations. I evolved my priorities with Adam, learned about fixing my mistakes as a developer with Jordana Fung, finally got to see Mike Herchel’s Front-end Performance talk, and over lunch looked at some code and talked about custom composite/rich fields with Hawkeye Tenderwolf. It was great times all around.

It was also a great enjoyment to have the opportunity to give my presentation, Glitch: Love to Learn the web again, as the Glitch product and community are a topic I’m very excited about. Reception of the talk seemed to be good as well. There were multiple outstanding questions that I tried my best to answer, and I even remembered to repeat one of them back on microphone for the recording. Otherwise, it was basically a blur of me gushing over Glitch. Check it out!

After camp wrapped up, we were off to the arcade. Rather, a pinball museum, where we played some games older than anyone I’ve ever met and played on another machine that had to weigh over 1,000lbs. We enjoyed a round of pizzas and beverages before hitting the town, exploring a few of Chattanooga’s secrets.

All-in-all, what a great camp experience. As a co-organizer of Drupal Camp Asheville I have some sense of what it takes to make a camp happen, and those Chattanooga folk make the hard work look easy. I can’t recommend enough that you try to attend Drupal Camp Chattanooga 2020.

*Image taken at Drupal Camp Chattanooga, borrowed from Twitter.

Jun 11 2019
Jun 11

Our lead community developer, Alona Oneill, has been sitting in on the latest Drupal Core Initiative meetings and putting together meeting recaps outlining key talking points from each discussion. This article breaks down highlights from meetings this past May. You'll find that the meetings, while also providing updates of completed tasks, are also conversations looking for community member involvement. There are many moving pieces as things are getting ramped up for Drupal 9, so if you see something you think you can provide insights on, we encourage you to get involved.

Drupal 9 Readiness

Meetings are for core and contributed project developers as well as people who have integrations and services related to core. Site developers who want to stay in the know to keep up-to-date for the easiest Drupal 9 upgrade of their sites are also welcome.

  • Usually happens every other Monday at 18:00 UTC.
  • Is done over chat.
  • Happens in threads, which you can follow to be notified of new replies even if you don’t comment in the thread. You may also join the meeting later and participate asynchronously!
  • Has a public agenda anyone can add to at
  • Transcript will be exported and posted to the agenda issue.

Meeting Highlights From 05/13/2019

Update on Drupal 9 dependency targets (CKEditor, Symfony, PHP)

  • The plan is to release Drupal 9 with CKEditor 4 support, add optional CKEditor 5 support during D9's active support, and deprecate CKE4 before D10
  • D9 will probably be EOL in Dec. 2023 and CKE 4 can have security coverage through then
  • Policy issue

Documentation Updates for Drupal 9 tasks for Drupal 9

Opened an issue today to track these and currently working on Drupal 9 plan summary via


Upgrading to Drupal 9 version of Classy and Stable could be hard given the number of unknowns. We are proposing to provide the current versions of Classy and Stable in contrib space. This would allow pre-existing themes to add a dependency to the contrib version of the themes and have the exact same behavior in Drupal 9 as they had in Drupal 8.

To avoid this problem in Drupal 10, we are proposing to not ship Classy as part of Drupal 9. The feature gap would be replaced with a new starter kit theme.

Risks for June 2020 Target Date

  1. Biggest worries right now are: D7 to D8 migration support, including finishing multilingual support and UX improvements.
  2. Filtering fails that are not actionable.
  3. Roadmap for Simpletest moving forward. Currently Simpletest isn't formally deprecated, we're welcoming any thoughts and suggestions here

Meeting Highlights From 05/27/2019

New Drupal 9 Readiness Features & New Contrib Readiness Data

  1. is now live on

  2. Also Dwayne McDaniel figured out a new way to run his contrib analysis scripts and published a fresh set of data at

  3. Gábor Hojtsy took that and analyzed the top ones up to 50 uses and created this summary doc with docs pulled from api.d.o with a script:

  4. Also the coder rules got fixed to conform better to the core trigger_error()/@deprecated formats and a new coder release is out now, so core can update to that

Documentation Updates for Drupal 9

An extensive review was completed of the Drupal 9 docs. The review yielded grammatical improvements to improve English formatting.

New Critical for the D9 Roadmap

There's some discussion already in the other meta

Sprint plans for DrupalDevDays Transylvania?

  • WebTestBase is officially deprecated, "Convert contrib test suites to BTB" might be a good sprint topic.
  • Alex Pott has a good start on getting the conversion docs a little more up to date and we're trying to continue to add to it,

Release schedules (branch opening, alpha, beta, rc) for Drupal 8.9 and 9.0

  • Beta1 would be tagged the first week of April 2020 if we are ready for 9.0.0 in June.
    • If we're not ready for 9.0.0 in June by say March, then we switch 8.9 back to a normal minor with a normal minor schedule (and announce the December release date).
    • Also with regards to documenting on the releases page we should probably inform the rest of the committers first. The email should outline the alphas, March as a go/no go decision, deadline for June vs. Dec. 3. as well as the beta and RC dates.

Freezing entity schema updates between 8.9 and 9.0

  • With 8.7 especially, but not only, entity schema updates are causing a lot of trouble for sites trying to update. Sometimes it is a bug in the update, just as often it is corrupted data or custom code on sites trying to update. Given 9.0.0 will have a lot of other changes, we should consider not committing any big entity schema updates to 8.9/9.0.

  • Opened an issue, freeze entity schemas in 8.9.x and 9.0.x to work on solving this.

Out of the Box Initiative Meeting 05/28/2019

  • We want to create a roadmap for Drupal 8.8 release. You can find the details here:
  • Talking about Umami Demo.
    • Trying to shave off all installation time and figure out where it goes.
    • Adding an option with and without multilingual.
  • Talking about creating help pages about all new features and things in 8.8 release.
  • Add a floating tour button on pages that have an explanation (need to create an issue).
  • Implement Layout Builder on every page, recipe, and article.
  • Working on Umami’s Language-switcher as a drop-down menu.

Layout Initiative Meeting 05/29/19

Currently, when using Layout Builder, the already added sections give no indication of their layout or its configuration. This isn't a big deal for sighted users who are only using the default Layout Builder layouts, because the only configuration is the widths of the columns, which they'll be able to see visually.

However, for non-sighted users, or if a layout has more complex configuration (for example, using different proportions for different view port sizes, or adding class names, or anything since layout plugins have full control over their settings and rendering), then there is no indication given of the section's layout or its configuration.

An issue was created to document this concern.

graphic with drupal logo next to phrase community of support

That's A Wrap

Check back for frequent meeting recaps to gather insights on the latest Drupal Core developments and find ways to get involved. Our community thrives when we all come together!

Jun 10 2019
Jun 10

This post was written by Adam Bergstein with input and feedback from Aimee Degnan and Ryan Bateman.

Hook 42 recently had a project that required the use of Kubernetes. Kubernetes is an orchestration tool that helps solve many enterprise problems when using multiple containers. People often want redundancy and scale across a series of containers or the same set of containers across multiple machines. Kubernetes helps solve this. It also can help perform orchestration tasks during failures or to distribute load between containers. Managing containers at scale can be a challenge and the goal of Kubernetes is to help.

We have long been tracking the efforts of Lagoon, a promising open source continuous integration and continuous delivery (CI/CD) hosting platform that is developed with Kubernetes. CI/CD is built around the concept of rapid deployments of ongoing, frequent changes. This lowers the risk presented by larger, fixed deployments by promoting smaller, more routine deployments. Lagoon not only offers hosting-related tools, but the platform is able to run locally as well. The CI/CD capabilities helped create testable environments as we pushed changes through our development workflow. We want to share our experience. 

Understanding Considerations

There are some key concepts to understand how Lagoon works before diving in.


Drupal applications require a “source of truth” for persistent content, which includes a Drupal application’s managed files and database. Production environments (or pre-production before a system is launched) conventionally serve as the source of truth environment within a development workflow. Content is subsequently pulled from the source of truth and it is only managed by changes made directly on the production system. Where code can be pushed through environments, content should always get pulled from production. 


Code repositories are critical for managing code and deployments. Each change is one or more commits that can be staged within specific branches. Changes can be merged into other branches, rolled back if there is an issue, and audited as a series of changes. 

Hosting providers offer varying conventions and integrations tied to code repositories. As a simple example: both Pantheon and Acquia offer their own Git repositories commonly synchronized with a Github or Gitlab repository. The Github/Gitlab repositories offer development tools like pull requests or integrations to help support team-based workflows. 


Both repositories and hosting platforms expose relevant hooks that are useful for performing actions during DevOps events. This is how automation can be built into specific changes. Automation is critical for any CI/CD infrastructure, as it’s not manageable or practical to manually rebuild environments as each frequent change occurs. 

Creating and maintaining branches, tags, and pull requests tied to repositories create opportunities for automation that are commonly leveraged repository events in our DevOps infrastructure. Even synchronizing between two repositories can be a useful DevOps trigger, as this signifies code is ready for some degree of deployment or testing. 

Any sort of deployment found in CI/CD workflows often require rebuilding containers. This is common for all environments. Persistent aspects may be left untouched, while the containers for a given environment are rebuilt as new changes are deployed.

On-demand Environments

Cloud infrastructures changed the traditional way of understanding environments. On-demand environments are a result of rapid change and are transient. This is in contrast to an environment traditionally configured on a bare metal server. On-demand environments are commonly provisioned with new branches, tags, or pull requests and destroyed when the changes are deployed. They are not intended to persist.

In a CI/CD workflow, incremental changes are verified before the production deployment. Development-specific branches and pull requests can build new environments known as on-demand environments. Persistent contents from the “source of truth” are copied with changes pushed to a branch on a new environment. This helps to verify and mimic production behavior with the new change. And, the environment subsequently goes away when the change is deployed.

Fixed Environments

Hosting providers still commonly offer “fixed” environments as people are not often comfortable merging an on-demand environment right into production. But, fixed environments exist for an intended purpose. As an example, a production environment is intended to be what end-users access. Other environments are commonly used to vet changes before a production launch. Vetting may include any of the following purposes: proper deployment, stakeholder approval, automated tests, and verified with the most recent code (changes pushed while the code was developed and/or staged). The same fixed environments can be uniquely configured and used in those capacities in a more permanent capacity.

Exploring Lagoon

Every hosting platform has a set of best practices tied to their platform that drives intended use. While any platform, like Lagoon, can seem opinionated, our focus is to connect the aforementioned concepts to their specific Lagoon equivalent. 

Repositories, Hooks, and Events

Lagoon, at this point, attaches to a remote repository, like Github or Gitlab. Lagoon integrates through the repository platform, via a webhook or continuous integration system. The hook is intended to be invoked during specific events like branch creation and/or pull request to help create the CI/CD on-demand environments. This approach shaped our development and release workflow to the Lagoon platform, which we elaborate more on below. 

Fixed Environments

The first thing our team did was set up fixed environments tied to specific branches. This met the need of having changes go through a conventional development, staging, and production release cycle. Within Github, there are subsequent branches for each fixed environment. As a best practice, each branch was locked within Github. This is to ensure a branch was not accidentally removed, which may remove a fixed environment entirely. 

Github repositories often leverage “master” as the default branch. We’ve selected that as our branch for our development server. This is useful for pull requests, as “master” is selected by default and our team didn’t need to worry about selecting the wrong branch. Doing so may trigger a code deployment to another, unintended environment.

On-demand Environments

Lagoon maintains two events for provisioning on-demand environments. The first is pull requests. Pull requests seem to be useful if you are operating in a pure CI/CD environment where changes can be tested as an environment tied to the change. But, pull requests often are not created until a potential change is ready to be reviewed and possibly merged. This would be ideal for an environment to do smoke testing. But, we desired to have environments for work-in-progress as well, where anyone could push a commit to a branch, demonstrate some work, or get help on something. We opted not to use pull requests for that reason.

The second provisioning event is through a branch pattern. This leverages a naming convention to create on-demand environments. Lagoon monitors the creation of any branch that matches the pattern and creates an environment. This is helpful for the initial testing of changes.

Release Workflow 

Our release workflow is based on staggered branches. Changes are pushed to the on-demand branches and prepared for initial review. A pull request is made for the code review and smoke testing occurs on the on-demand environment. Once the pull request is merged into master, our development server is rebuilt (any commits pushed to master trigger a rebuild of the development server). We close all on-demand branches at this point, which subsequently removes the environment on Lagoon. 

Once the merge is complete, additional quality assurance, client review, and automated testing occurs through development and staging environments. This happens by making a pull request from the master to staging branches, creating a release candidate. 

With all of the verification passing, we are able to initiate the release. This is done via a pull request from the staging to production branches. Once the pull request is accepted, the production release occurs. All of this is automated thanks to the hooks and events tied to the Lagoon platform.


Lagoon rebuilds environments on every push to a branch. In our workflow, accepted pull requests push vetted code to branches. Persistence becomes a major factor when environments can be rebuilt in this fluid manner. 

Lagoon also provides the ability to configure what environment is deemed the production environment. This is subsequently protected within Lagoon and persistent. The “production” branch, and its subsequent environment, represent the source of truth for database and files. Rebuilding the database and files on a production release is risky, so this mechanism needs to exist to differentiate from the other more fluid environments that get rebuilt more routinely. These protection mechanisms helped avoid production data being overwritten through the API or any unintended impact by a production deployment and subsequent rebuild. Not only that, but this helps identify what data needs to be routinely backed-up and maintain high fidelity.


All non-production environments should automatically load a copy of the production database and files when new changes are pushed to the subsequent branch. Verifying changes before being released to production was a critical DevOps automation for us.  We leverage hooks in Lagoon (defined in the .lagoon.yml file) with Drush commands and aliases to identify the environments that synchronize the database and files from production every time an environment is rebuilt.  

Code artifacts were also a vital part of our DevOps automation. We leveraged Composer to build the Drupal codebase (using the great Composer template for Drupal projects - drupal-composer/drupal-project) and Gulp to build the theme. Custom code was committed to the repository. This allowed us to easily and routinely evaluate changes to core and contrib.

Once our code was built, we executed Drush commands to import the configuration, run database updates, and clear caches to ensure changes were properly deployed. While this does not catch every possible nuance in deploying code (e.g. rebuilding entities), we automated a significant portion of this that should minimize the need for running manual commands. 


Lagoon is doing some innovative work, especially for Drupal teams looking for a CI/CD platform adopting rapid releases. Their “infrastructure as code” implementation, through their Docker images and .lagoon.yml configuration, enable rapid, effective change at the heart of DevOps that can help continuous learning and the subsequent predictability of automation. 

As expected, coming from the perspective of using other hosting platforms like Acquia and Pantheon, there was some learning to adapt to the fluid CI/CD nature of the platform. Lagoon’s local implementation replaced our standard MAMP, DDEV, and Lando setups. Being able to add in restrictions, like branch locking, was beneficial to our teams transition when configuring the infrastructure. Also, there were some different conventions, like leveraging drush aliases through Lagoon’s CLI container and not through a local Drush, that were unique. But, many of our existing knowledge and concepts were the same or could easily be mapped to their Lagoon equivalent.

After some trial and error, we were able to share some feedback with the Amazee team on improvements to their documentation and relevant code samples we felt could help others. Hopefully shaping the path forward for others being onboarded can make it easier to digest for those new to the platform.

Overall, Lagoon shows a lot of promise for modern workflows. While different than other hosting platforms, Lagoon enabled our team to work effectively and efficiently from start to finish. We’re excited to see how the platform evolves and continues to provide solutions capable of rapidly changing to our customer’s needs. 

Jun 05 2019
Jun 05

Hook 42 is headed to Tennessee for our next community event. Not only have we proudly sponsored Drupal Camp Chattanooga, you'll also find us doing a Gatsby.js training as well as giving talks about topics we hold near and dear to our hearts. Come say hello if you're there.



We're very excited that Adam Bergstein will be conducting this year's keynote in Chattanooga. You don't wanna miss it!

Change is the only constant in life. As technologists, the landscape around us is constantly shifting. We must evolve or become irrelevant. How do we do so? It's a gradual thing, but it also happens so quickly. Together we're going to explore considerations around that evolution and how we can embrace the changes. 

Topics include the limitations of technical skills, a purpose-driven perspective, and evolving ourselves. When evaluating Drupal, Adam shares how the product and community have evolved in the past and opportunities for the future. You can take away some perspective on how to approach change and evolve professionally.

Glitch: Love to learn the web again

Jonathan Daggerhart is talking about one of his favorite community tools - Glitch! You may not be entirely sure what Glitch is, but we promise you'll leave with more excitement than ever for learning new web technologies again. Jonathan will be covering the basics of Glitch, demoing it, and you to use it for fun and profit! Bonus points if you are already using Glitch today.

Man sitting at desk typing on laptop with gatsby.js logo on the screen



Adam Bergstein is leading an all day training on Friday, June 7th, diving deep into Gatsby.js. Make sure you bring your laptop, as this training is very hands-on. We're ensuring everyone participating can leave with a more developed sense of what Gatsby.js can do and how you can implement it in the future. In this training session, Adam will go over setting up your environment followed by primers and follow along exercises that cover the following items:

  • Setting up Gatsby
  • Basic GraphQL & Gatsby
  • Test Drupal GraphQL
  • Recipe Listing Page (plus responsive images)
  • Recipe Detail Page
  • Updating Recipe List
  • Deployment

We hope you're ready to get your hands dirty with this training.

See You In Tennessee

We're excited for our trip to Tennessee. Yet again our ambitious team is always rushing to be first in line for the growth of our community. We enjoy trading stories with all of you, which is why it is important for us to share our experiences and methodologies that we've fine-tuned along the way. Chattanooga is just another stop on the community train for the Hook 42 team, and we couldn't be more excited to watch our community learn and grow together. We hope to see many familiar faces this year and make some new friends along the way.


Jun 04 2019
Jun 04

One of our recent projects required a progressive enhancement approach for visual changes. Instead of a full end-to-end rebuild of a Drupal theme, a progressive approach can be accomplished with theme switching. Many Drupal 8 projects leverage custom block types, Paragraphs, or Layout Builder to place one or more design components on a page. This provided the client with the ability to split up a larger architectural change into a small set of pages and components that can be gradually rolled out. Of note, such an approach can also serve as a viable solution for A/B testing of visual changes. 

Screenshot of a Drupal 8 layout before and after updates were made

Understanding Context

There are several solutions capable of providing theme switching. One key differentiator is context. Do you want to switch a theme by page, role, language, associated taxonomy, URL parameter, or authenticated/unauthenticated traffic? Context serves as a critical requirement for determining when a theme switches.

In our case, we progressively enhanced a theme page-by-page. We would work on one page, configure the theme to switch for that page, and continue to add pages as our work evolved. Solutions may vary based on the desired context. The rest of the blog post helps explore solutions for page-level context.

Background Research

I explored the following approaches to help solve the problem.

  1. Theme Key module: This is a very popular approach from Drupal 7 sites but did not appear to have a Drupal 8 release and this issue paints a murky future for any sort of use of the module.
  2. Style Switcher module: This offers a block for switching themes, sort of like CSS Zen Garden where you could select the look and feel. This wasn’t quite the context we needed.
  3. Switch Page Theme module: This was most effective for our use case. It allowed both page-level specificity and optionally allowed us to select the applicable roles. It also offered configuration, which was helpful for deploying progressive theme switching with theming changes.

Setting Up Switch Page Theme

It’s basic configuration. No programming is required. 

preview of theme switcher in drupal 8

The configuration page is fairly straightforward. Each rule is demonstrated by a row and can be ordered if there are rules that take precedence over others. The checkbox demonstrates how to enable or disable a rule as needed. Page paths are specified line-by-line per rule, followed by the selection of the displayed theme and the applied roles. 

After saving, going to the various paths should switch the theme as specified. And, don’t forget to export the configuration.


We were able to set up a new theme and gradually build out the various components with a theme switching approach. This allowed us to deploy changes over time instead of deploying an entirely new theme all at once. Switch Page Theme was an easy to use site building solution for us to specify the desired theme switching behaviors.  

May 31 2019
May 31

How to create a custom Facets query for your Drupal 8 faceted search app

When it comes to allowing users to search a site easily, a faceted search app can be an unparalleled solution. Being able to quickly drill down into search results using specific, easy-to-understand parameters is something that most users now simply expect from any site’s search app.

For Drupal 8 sites, the Facets module makes it relatively simple to create your own faceted search app, whether you’re using the Drupal core Search module or the very popular Search API module to manage your search functionality.

In the case of a site using Search API, the Facets module works particularly well in parallel with more powerful search engine backends like Apache Solr and Elasticsearch. Facets within a search app can take all shapes and sizes, and the Facets module provides a few plugins types that, in concert with each other, can be leveraged to programmatically create any sort of facet you may need for your search app. Because the Facets module relies on the Entity API within Drupal 8, these plugins should appear relatively familiar to most Drupal 8 developers:

  • \Drupal\facets\Entity\Facet
    • Describes the facet entity itself, whose data is received via a widget plugin and parsed by processor plugins
  • \Drupal\facets\Entity\FacetSource
    • Describes the source of the data being fed into the facet
  • \Drupal\facets\QueryType\QueryTypePluginBase
    • Describes the type of query being made against the search backend.
  • \Drupal\facets\Widget\WidgetPluginBase
    • Describes the widget that the user interacts with to control the search UI.
  • \Drupal\facets\Processor\ProcessorPluginBase
    • Describes the processor that translates the user input from the widget into data that can be used within the query.

The Facets module (along with its submodule Facets Range Widget) provides 4 basic query types:

  • \Drupal\facets\Plugin\facets\query_type\SearchApiString
    • The most comment facet query type, based on searching for simple strings.
  • \Drupal\facets\Plugin\facets\query_type\SearchApiGranular
    • Used for numbers-based facets that provide a spectrum of values between a set step size.
  • \Drupal\facets\Plugin\facets\query_type\SearchApiRange
    • Used for queries that allow users to select a range of possible numerical values.
  • \Drupal\facets\Plugin\facets\query_type\SearchApiDate
    • Used for queries to allow users to choose (ranges of) date values.

NOTE: These query types are to be used within the context of a Search API backend, rather than the Drupal core Search module.

So how do we do it?

I’d like to offer a brief example of how you might go about writing your own custom query types for a faceted search app using the Search API and Facets modules.

In our recent scenario, we needed a way to allow users to query against our search backend using numerical values, but in the format of comparing their chosen number value against searchable values using a specific comparison operator. In this case, our users were students who needed to be able to search for specific academic or volunteer programs. They also needed to be able to filter results based on a length of time (in weeks) that would be greater than or less than a specified value.or example, users would need a facet that allowed them to filter results by: any length of time, 1+ weeks, 2+ weeks, 3+ weeks, etc.

With this requirement in mind, the 4 basic query types listed above were not quite up to the task. Instead, we needed to write a custom "Integer Comparison" query type that would take in two key pieces of data. A number to compare values against and a comparison operator with which to make those comparisons. From our example use case above, we only needed the number from the user, because we would be setting the comparison operator (“>=“ AKA “greater than or equal to”) in configuration. However, we wanted to write a generic enough query type that could allow for any basic comparison operator in the future. This is the result:

In the code above, the two key pieces of data (the user-input number and the configuration-defined comparison operator) are $value['int’] and $value['op’]. However, in order to get these two simple values, we also needed to write a custom processor that could receive the raw input in from our facet widget and process that input into those two simple $value['int’] and $value['op'] values.

To understand what’s happening in the preQuery method above, you just need to know that the slider widget we implemented on the frontend had its possible data values encoded in a format like this:

Finally, in the code above, you’ll notice the one method getQueryType(), which is needed to specify which query type the processor should pass its data along to (in this case, our custom integer_comparison query type). In order to make our new query type plugin and processor plugin aware of each other, we need to implement one last hook in our module:

Contributed Customization

We're always looking for ways to customize integrations to fit the specific needs of project goals and we understand that out of the box solutions aren't always going to work. For example, the Facets module itself provides a submodule called Facets Range Widget that allows users to search using a range of numbers or dates. However, the default behavior of this facet assumed the use of a bounded range, as opposed to what we needed, which was an infinite range starting from a definite value. In that case, it was simpler for us to quickly create the exact facet query type that we needed, rather than wrestling with the defaults provided by the Facets module. We were only able to do that thanks to the Facets module’s highly extensible plugin system that leverages the contributed Search API and core Entity API of the Drupal ecosystem. That is why, even when we have a need for custom code, it is always a helpful first step to start from the strong contributed code provided by the Drupal community.

May 17 2019
May 17

This past week I had the pleasure of attending Drupaldelphia, a great event that is part of Philadelphia Tech Week. This helped introduce the Drupal community to a broader audience from the Philadelphia area. It was nice to see new attendees curious to learn about Drupal and what we’re doing. It was a pleasure to be able to meet, and greet, many of these individuals throughout the event.

Some beloved community members like Tim Plunkett, Chris Urban, and Anson Han call Philadelphia home. All participants got first hand exposure to our community in Philadelphia, which I consider to be vibrant and growing. It was great for those of us local to Philadelphia, and those we welcomed that came from afar.

Community Discussion

There was something for everyone and it’s always refreshing to see how much cool stuff is happening within the community. Here are a few of the talks I enjoyed this year:

If you were not able to attend, never fear. Kevin Thull recorded all talks, which are now up on


Hook 42 at Drupaldelphia

Thanks to Hook 42 for sponsoring an event near and dear to me. I live in Pennsylvania and consider this event one of my local camps. It’s not a large event, but it is made up for in the connections forged and overall quality of the event. I’m glad to have been able to speak twice this year.

For my first talk, I spoke about I shared historically where the system has been, what challenges we face today, and where we’re heading. The system represents a labor of love on my part and I’m grateful to be able to spend some of my community time at Hook 42 helping maintain it. The system has a vibrant future and we’re doing some really great things with TugboatQA, one-click demos, Drupal 8, and an Open Collective that should help pave the way for a future inclusion program. 

The second talk was titled, “Impact Through Contribution: A Community for All.” During this talk, I present a path to contribution as “A Hero’s Journey”. This is a known storytelling technique written by Joseph Campbell where characters follow a conventional arc to achieve deeply impactful transformation. I shared stories of those who have had a huge impact and talked about some of the creative efforts happening in the community. I offered some thoughts on areas of growth and improvement for our community. It’s my belief that everyone can have an impact and bring new, creative ways to contribute that make our community stronger. We need to do everything we can to help make that happen.

Final Reflections

It’s such a great time to be with people, talk about cool things we’ve been doing, and help our community progress together. As an example, attendees were able to come together and discuss some outstanding issues on Layout Builder where consensus was formed on some next steps. Taking this conversation purely outside of the issue queue allowed people to learn and help move forward one of the most innovative new tools offered by Drupal.

I had a lot of fun in the city of Philadelphia as well. I can get good cheesesteaks in Central PA, so I needed to think bigger for my time there. I went to not one, but two, different Belgian restaurants where I enjoyed mussels and fries. For breakfast, I enjoyed excellent coffee and an almond croissant that was acquired from Bluestone Lane.

Another great Drupaldelphia came and went. The sessions were great and it was spectacular to connect with those that attended. It had a friendly, lighthearted, low-key feeling that allowed everyone to get something meaningful from the event. I thank the organizers, sponsors, and attendees who made it possible. I’m already looking forward to attending this jawn next year.

May 08 2019
May 08

In case you missed it, Stanford Drupal Camp changed their name to Stanford Web Camp. This transformation marks an important step in the Stanford journey from the camp's inception 10 years ago. We’re happy to be part of the evolution of the Stanford community as they expand into a more inclusive web atmosphere.

Experience Stanford

At Stanford Web Camp, attendees and presenters will discuss a variety of topics about the web from development to accessibility, and everything in between. All of these discussions will take place on the Stanford campus, in sunny California. We're officially inviting you to come explore “The Farm” with Hook 42 and learn other fun Stanford lingo while you’re on site!

As part of the camp, Hook 42’s Aimee Degnan will be giving two talks – one focusing on accessibility and the other on SiteBuilding. So, if you missed Aimee’s talk on a11y tools at DrupalCon 2019 - you can see it live, in-person at Stanford Web Camp! 

Discover Accessibility Tools

Join us to listen to Aimee’s talk, “Which Accessibility Tools are Right For You?“ What you can expect to gain is a broad overview of all the tools that are available in the accessibility testing spectrum. We hope you’ll leave with a better understanding of what the tools are, and how they can be utilized. There are a lot of options out there, and just knowing where to start can be a difficult path.

Aimee will explore the following:

  • Which tools are right for you?
  • Will only one tool fit all of your needs? ;)
  • Build vs. buy some vs. buy vs. free? Is "free" really free?

Level Up Your Layouts

Aimee's second discussion will explore View Modes and Layout Builder. Level up your layout! Component Based SiteBuilding with Layout Builder & View Modes is for those who are familiar with Drupal and are interested in harmonizing tools to streamline component building in the platform.

With Layout Builder in Core, it is essential to build a View Mode and Layout Builder strategy. You can harness the power of View Modes to move beyond Teaser and Paragraphs for display flexibility. Come out and learn how you can build a more streamlined process utilizing the benefits of View Mode and Layout Builder.

The talk will be structured as follows:

  • View Modes in Core
  • Architecting View Modes for your site
  • Lessons Learned with View Modes
  • View Modes and Layout Builder

Join Hook 42 at Camp

Stanford Web Camp is completely free and open to the public, we encourage all of you to explore other sessions and join a community of motivated professionals as we talk about the latest trends and developments in our industry. Come out and say hello to Hook 42, we’re eager to meet new people, connect with old friends, and discuss all things tech.

See you soon! 


May 03 2019
May 03

It’s been almost a month since DrupalCon 2019. We can’t believe how time flies! While we were there, we had a variety of things going on at many different levels. Just as fast as the time since DrupalCon has flown past us, our time in Seattle felt like a tiny blip. 

From organizing summits, lunches, BoFs and presentations, our team was just as busy behind the scenes of DrupalCon this year, as we were being attendees. There were so many ways for us to really dive into the DrupalCon experience and we’re already looking forward to the next one! In the meantime, we put together a recap of our time in Seattle.

Presenting & Involvement

The most notable thing about our team, is how involved we are in our community, and DrupalCon 2019 was no exception. From 7 talks, a lunch sponsorship, a summit training and BoF organizations, Hook 42 had many members participating in DrupalCon. We are thankful for the opportunities provided to us to be able to participate in many areas. We know we had an unforgettable experience this year, and we hope we were able to help all of you achieve that same feeling.

DrupalCon is its own unique experience every year. My heavy involvement in community efforts this year was truly eventful. Pun fully intended! I’m glad to have had the opportunity to work closely with those outside my day-to-day operations at Hook 42 to bring together expertise that normally isn’t co-packaged together. 

~ Aimee

In case you were unable to catch us in the act, here is a list of all the ways our team was working at DrupalCon.

Aerial view of Adam Bergstein and other coffee BoF attendeesPhoto Credit: Chris Urban

Being Prepared for the Unpredictable

A Full Team Website Takeover

Our team set out on a mission to band together and tackle some internal items while all together. When the decision was made to extend the level of effort into those items, nobody batted an eyelash! It was an incredible tribute to the stamina, talents and dedication of our team members have to completing tasks. We did a full hotel lobby takeover for the majority of the trip, in between sessions of course, to spend time taking the Hook 42 website from a D7 website to a D8 website. It’s a very rare occasion, when all of us are in one place, focusing on one item, and working hard to ensure a successful migration into the new system. All of those involved still can’t stop talking about it! 

Our little secret, an easter-egg if you will, to those who are so dedicated to continue reading. A redesign of the Hook 42 website is in the works. Unfortunately you’re going to have to wait a little bit for that one! We’re just glad we finally upgraded to D8!

Hook 42 team takes over hotel lobby to work on new D8 website

Presenting On The Fly

Secondly, Kristen Pol was invited to co-present on a talk with Lingotek. Talk about being prepared for anything! Being a support-member in the audience quickly turned into providing insights to a room full of eager listeners. With additional help from Aimee Degnan, our team was able to put together additional assets to provide the Lingotek team for the collaborative presentation. A huge shout-out to those involved for coming together for last-minute changes and helping solidify a great talk.

Lingotek’s session, Avoiding Trouble Spots When Creating a Multilingual Site, explored the challenges multilingual websites create, and Kristen took the charge head-on to be a co-presenter on the subject. It was a great experience for everyone. 

A Chance To Have Fun

Whether it’s with new friends, old friends, or colleagues - every year DrupalCon allows us to forge connections that stay with us for a long time. The team took a day to explore Seattle together. We had a full team lunch, took an underground tour of the city, and took advantage of a rather sunny day in Seattle to walk around and take in the beautiful city.

Hook 42 team on Seattle underground tour

Meeting Our Newest Team Members

We also had quite a few new faces on our own team this year. DrupalCon allowed us a place to all come together and meet in person. Lindsey, Emanuel and Michael were all able to join our team on a cross-country trip to Seattle. Yes, all of them are spread across the East Coast! 

I always love to meet with the Hook 42 team in person since they are just a great group of people. We were also lucky to have a few new team members since our last in-person gathering.

~ Kristen

Other Connection Opportunities

Outside of the team, we were also able to say hello to a lot of familiar faces that we usually only get to see once a year at DrupalCon. Whether it was in a session, during lunch, at dinner or ending the day over a few drinks, we are thankful to be able to have seen so many of our Drupal community members and re-connect. Our team was able to use DrupalCon as a way to take time away from the computer and get some quality face-to-face time with others in the community.

DrupalCons are as much about the community as they are about learning new Drupal things. While sessions where you can learn a lot of new things about Drupal are the focus, one of the best parts is bumping into old friends or sitting down next to someone new and chatting about a common interest in Drupal and web development.

~ Danita

A Place To Learn

Our team is never disappointed when we leave DrupalCon. We’re always coming away with new ideas, new thoughts, and new procedures for how we do our jobs. It’s the most important takeaway from all of this - is that DrupalCon is always providing content that is spread across a variety of skillsets and interests. This year’s focus on inclusivity made our designer especially happy - you can read all about her first ever DrupalCon experience here.

Although the new schedule reduced the total number of days of sessions at the conference, I felt like as usual DrupalCon provided an awesome environment for everyone to come together and share their experience and expertise.

~ Ryan

Some Favorite Sessions:

Presentation Title Screen, PEGA Build for Change

Migration Workflow Diagram Preview

Glitter rainbow Drupal 8 unicorn

Elevated Third presentation title screen

Drake YOLO

diagram depicting design feedback and front end pairing with backend to build the website

meme - wrote PHP unit test, only took 4.5 hours, yes!

Team Benefits

DrupalCon is imperative to the health of our team in many ways. For starters, it's one of the only times our full team is in one place at one time, and that alone is enough of a reason to enjoy all DrupalCon has to offer. Our team also uses the event to provide thought leadership to the community. We take the time to also learn from other experts in the field on unfamiliar topics or expanding expertise in a certain area. Giving back to the community in more ways than one as a culmination of the event is really what ties it all together. 

It's such a heart warming experience, like seeing 500 of your closest friends once a year. It's a celebration of wins, sharing of knowledge, and a real feeling of connection. This year had such a pleasant vibe and was a nice reflection of our community, which goes well beyond tech.

~ Adam

Thank you to DrupalCon, and thank you to Seattle, for having such an amazing line-up of things to do for all of us that attended!

May 02 2019
May 02

Hook 42 is heading to Philadelphia for Drupaldelphia. Phew, that’s a mouthful to say! Not only are we proud to be sponsoring such a wonderful event, we’re excited to announce that Adam Bergstein will be giving two talks this year.

Dropping the Knowledge

To say we're excited about Adam's talks would be an understatement. To have a chance to share insights and experiences with other eager-to-learn individuals is something Adam enjoys, and he's looking forward to doing it again at Drupaldelphia.

Better Together: Impact Through Contribution

Adam will discuss his journey through the Drupal-verse, and explore ways to make a big community feel easier to navigate. With so many moving pieces, and people involved, it can be overwhelming at times to know what to do and where to find help. The moral of the story? When we all come together and pitch in, we can accomplish big things! Join Adam for an insightful journey through the community, and explorations of togetherness that make Drupal great. - A Community Case Study is a long-standing, free service that has the served Drupal community with an easy-to-use tool for creating Drupal sandboxes. During this case study, we’ll share the motivations behind and how the tool aims to lower the barrier of entry for those participating in the community. We’ll walk through the various use cases and features of the tool and examine how that helps anyone participate in our community. 

We hope you’ll come say hello if you stop in on one of Adam's sessions! If you're not interested in Adam's talks, don't fret! There are plenty of other interesting things happening at Drupaldelphia this year. Take a look at their website to browse other sessions, we're positive there is something for everyone. 


Understanding the importance Drupaldelphia has on the community, we felt it necessary to spread the love and give back to our Drupal family. We enjoy helping our community in many ways, and sponsorship is just another way to contribute to a community that helps so many people develop valuable skills and long-lasting relationships.

The development of our community important to us. Providing support that paves a way for those to come together and learn from each other is a core value of Hook 42 and it applies to more than just our team. Thats why we try to be part of its growth just as much from the outside as we do from the inside. 


Beyond the sponsorship and presentations, we’re happy to be back in the city of brotherly love. Those attending are looking forward to exploring the town and seeing some familiar faces. We hope you'll join Hook 42 in Philly for some good food, good culture and community contribution.

The real question though – when you get to Philly will you be going to Pat’s or Geno’s? Choose wisely!


Apr 17 2019
Apr 17

DrupalCon 2019 was a bit different for me. I have attended previous DrupalCons, usually sitting in the back of the room just taking in all that I could from experts around the world. This year, however, I had the opportunity to be a speaker. Not only was I afforded the opportunity to speak, but I had two separate sessions accepted.

Talking the Talk

Being my first DrupalCon as a speaker, I might have had a few butterflies in my stomach when I arrived. Those quickly faded, and overall, my sessions on Stanford Cantor Arts Center Redesign and A Survey of Emerging Technology were very well received. I had an absolute blast presenting! Special shout-out to my partners in crime, Kristen Pol and Adam Bergstein, for making the transition from attendee to speaker fairly painless.

Stanford Cantor Arts Center Redesign

This talk was a broad review of our work with Stanford Cantor Arts Center that takes a deeper look at a few problems we faced during the build. There were complexities within the content structure and architecture that we needed to be able to accommodate. Flexibility was the most important part of this website. We walked through the solution to leverage UI Patterns module that allowed component based design, making the build process more practical while allowing content editors the ability to adjust as they see fit on certain areas of the site. 

Listen to the full talk on YouTube.

A Survey of Emerging Technology

Together, Adam Bergstein and I highlighted a set of tools that we know integrate well with Drupal and are used to tackle common roadblocks within the environment. I specifically spoke to the value of GraphQL and Gatsby.JS.

GraphQL provides a common interface for API queries. It is specifically notable for the ability to get information in a sole request, versus JSON requests that require multiple attempts before getting all the data. As far as its ability to play nice with Drupal, there is currrently a GraphQL module that is updated and supported by our community. The biggest benefit of using it within Drupal is for standardizing those onboarding into Drupal. Where they may hit roadblocks coming from the outside in, GraphQL makes the Drupal transition easier.

Gatsby.JS is a static site generator that uses static markup, but can still display dynamic information. What is great is you can bring your own backend into Gatsby.JS. Benefit, getting rid of a lot of vulnerabilities by not having any server-side code running. The vulnerability of a CMS is no longer a worry.

Other technologies covered were Hubspot, ElasticSearch, Pattern Lab, and

You can watch the full video on YouTube.

More Than Presenting

Group of Hook 42 Team Members Working in Sprint Room

Beyond speaking, I had a fantastic time hanging out with the team, as usual. Every time we’re in the same location together I’m reminded of how talented, intelligent, and funny everyone is. It was especially awesome to get a chance to greet our three newest members of the team (Michael, Emanuel, and Lindsey) in person.

We spent a sizable chunk of pre-conference time sprinting on our company website, which was an amazing team-building exercise and really showed how much we can accomplish when we work together. So hopefully you’re reading this on the flashy, fancy new-and-improved!

Overall, DrupalCon never ceases to provide an endless amount of opportunity. From spending time with colleagues, to working hard on new efforts, and even having new experiences like being a first-time speaker, I always look forward to what DrupalCon has to offer.

When I began my career at Hook 42, I made it a goal of mine to one day speak at DrupalCon. A long-term goal, but one that I worked very tirelessly to achieve. Getting the opportunity to share my expertise with others on the stage in Seattle felt like the perfect culmination of two years of hard work to get there. It felt amazing to check off my list.

Mar 12 2019
Mar 12

Every year community members from across the globe meet in Orlando for Florida Drupal Camp. This year Adam, Ryan, and Jonathan from Hook 42 attended. It was a fantastic time to connect with people, to learn, and enjoy some warmer weather. Plus, alligators!

Ryan and Adam led a training on connecting Drupal 8 and Gatsby.JS. The training utilized a set of Docker images that help people build everything from end-to-end on their own system. Attendees used the Umami demo, installed JSON API, and configured Gatsby.JS to pull recipes from Drupal. It was well attended and there was a lot of collaboration in the room. Our team appreciated all of those that attended - especially as we worked through technical and wifi issues. 

Ryan and Adam also gave a talk on emerging technology related to Drupal. Some of the topics included, Hubspot, ElasticSearch, GraphQL, Gatsby.JS, and Pattern Lab. It’s important for community members to find and use the right tool for the right job. As Drupal community members, we must be mindful of how these complementary technologies can serve us. You can watch the recording of the session on Drupal TV.

Team Member Reflections


I look forward to this camp each year, and once again this year did not disappoint. Thank you to “the Mikes”, Kyle, and Jordana for volunteering again. The time spent with the community was uplifting and encouraging - even if it was a bit tiring giving both a training and a session. The time spent with my colleagues Jonathan and Ryan, having barbeque, and drinking craft beer with the community all brought a lot of energy. I was able to reconnect with many friends and I always treasure those opportunities. Also, Jonathan and I unintentionally packed the same hoodies and Drupal Camp Asheville shirts. Twinsies!

The session quality was outstanding! Most notably, there were some incredibly great non-technical, people-focused sessions provided by Jordana Fung and Qymana Botts. I strongly recommend seeing both. Thanks, as always, to the amazing Kevin Thull, all sessions are recorded and posted to Drupal TV.
At the end of camp, on the contribution day, I was able to work on the proof-of-concept integrating and Tugboat QA. The result of which is a new Tugboat QA contributed module based on a Backdrop CMS module port.


This wasn’t just my first time to Florida Camp, it was my first time in the state of Florida in general! What a great experience. I had a great time at the camp and really enjoyed speaking with a wide array of folks about decoupled Drupal and Gatsby.js, both through the training Adam and I conducted as well as hallway conversations. Brian Perry’s talk comparing various static site generators and their compatibility with Drupal proved really insightful. I was really excited about his demo of the Tome static site generator, which runs within Drupal itself.

Thanks a ton to the organizers - the camp was a lot of fun and I look forward to attending again next year!


My second time at Florida Drupal Camp was as good as, if not better, than my first. As a Drupal Camp organizer myself, I find Florida Drupal Camp to be inspiring. They manage to pull off being extremely well organized while maintaining a very casual air to the whole weekend. 

As an attendee, I had a unique (for me) experience this year. I went to Drupal Camp Florida without a computer and it was great! Without a laptop always in front of me I found myself more attentive to the session and more engaged in the camp in general. I enjoyed it so much that I will likely avoid taking my computer to future camps.

The sessions I attended were all wonderful and there are a few I’m still thinking about today. Here is a quick list, and my takeaways:

  • How to keep Drupal relevant in the Git-based and API-driven CMS era
    The Drupal island appears to be shrinking as the overall landscape for approaches to web development grows. It doesn’t hurt keeping an eye on the new ways to solve old problems.
  • How to Hire and Fire Your Employer
    Always a fan of these “being human” talks. In this one, April encouraged me to continuously evaluate my values as a person and how they match any given employer. “Life is too short to be miserable” is a powerful perspective to maintain.
  • An Introduction to Gulp
    I’ve been using Gulp and similar technologies for a number of years, but have almost always used someone else’s configuration. Tim makes it look easy to get started writing my own tasks, and I’m really looking forward to doing so on my next project.
  • The problem with Paragraphs, a return to rich fields!
    Maybe the only actual Drupal session I attended, it’s always great to see Hawkeye and get his perspective. In this session he opened my eyes to some serious problems with the Drupal community’s go to approach to solving complicated fields, the paragraphs module. By the end of the session, I was ready to start making custom rich/composite/compound fields for future projects.

Another top-notch Drupal Camp Florida in the bag. I’ll definitely be back next year, and if you’ve never been I highly recommend it.

Mar 08 2019
Mar 08

Look out for Hook 42 at DrupalCon 2019 in Seattle!

It’s that time again, another DrupalCon is fast approaching and our team couldn’t be more excited for this year’s Seattle event. We’ve got a lot in store for you this year, from presentations, BOFs, sponsorships, partnership collaborations, and using our listening ears. You’ll find our team distributed all about.

We’re bringing a stacked line-up of knowledge and experiences to drop on 'ya this year. Not only that, we’re looking forward to hearing all the ups and downs you’ve had this past year, and how we’re all growing together within the Drupal community. 

Let’s get to sharing!


Join us at the Performance and Scalability Summit on Monday. Hook 42 and Tandem have worked with the Drupal Association to line up leading speakers to cover scaling performant Drupal websites to scaling efficient Drupal development teams. The Performance and Scalability Summit is the place for developers, DevOps professionals, decision makers, and other technical stakeholders to plan for growth.


To hear from our experts, find us at one of our talks where we’ll review insights our team has experienced first-hand and how we’re adapting to the new and old needs of evolving technology.

Database Query Optimization in Drupal

Kristen talks all things database, and walks through how to put the sluggish operations behind you to optimize your Drupal environment. Covering the basic optimization steps isn’t always enough, exploring options past the basics will help streamline your Drupal environment for both front-end and back-end users.

Accessibility Deep Dive Workshop

Aimee is teaming up with Caroline Boyden, from UC Berkeley, to take a closer look at accessibility. Together, they’ll use real-world examples of how accessibility is best implemented, and how every member of your team can be part of accessibility, from designers to developers to content authors and everything in between.

Which Accessibility Tools are Right for You?

Aimee breaks down the best tools for implementing and testing accessibility, and the benefits and areas of improvement for these tools. Taking a look at what is available today, and how your team can take advantage of these tools to increase your website’s accessibility.

Drupal 8 Case Study – Stanford Cantor Arts Center Redesign

Kristen and Ryan join forces to walk through one of Hook 42’s latest client projects. Focusing on the implementation of good design and development, and how Drupal was the perfect place to house the dynamic technical needs of the team at Stanford.

A Survey of Emerging Technologies That Complement Drupal

Adam and Ryan are teaming together to talk about the latest tech to take advantage of Drupal’s flexibility and ability to interact well with modern advancements on the web.

Considerations of Federated Search and Drupal

Adam shines the light into federated search, its importance, and how you can implement this applications within Drupal. Taking a close look at how to pair the application with Drupal to minimize risk and increase cross-platform communications.


Women in Drupal Luncheon

We’re proud to sponsor the Women in Drupal Luncheon, fostering inclusivity and empowerment within the Drupal community. We’ll gather to enjoy delicious food, talk shop, and relax amongst professionals.


VP of Engineering, Adam Bergstein maintains the service leverage by the Drupal community for testing and prototyping community contributions. Join him for a BOF on Wednesday! We want to chat with you all things about our go-to browser testing tool for all our Drupal projects.

Adam is also sorting out the Drupal Coffee Exchange meetup. 


Lingotek Session: Avoiding Trouble Spots When Creating a Multilingual Site

Our partner, Lingotek, has organized a session revolving around the challenges with multilingual websites. Through the session you’ll learn about common challenges with multilingual websites, and how you can get ahead of those issues. We’ll be there to support Lingotek and help answer questions during the session.

We Hope To See You There

If you haven’t already registered for DrupalCon Seattle, get on it! We’re ready for yet another amazing DrupalCon adventure, and we’re looking forward to seeing old and new faces in the crowd.



Dec 13 2018
Dec 13

This is the first of many articles about why and how to give back to the community. The information can be used by individuals, agencies, and companies that want to increase their community contribution efforts. 

'Tis the season for giving. A time of giving thanks for the blessing of the harvest and of the preceding year. A time of light in the dark of winter; a season of reflection and thanks. I’d like to recognize the work and efforts of the Drupal Community and reflect on Hook 42’s historic contributions; additionally, I'd like to share how we contribute and how you can contribute more. 

But why listen to Hook 42? We are not one of the largest Drupal agencies; however, Hook 42 was ranked 18th in the list of the global contributors by Dries. We also strategically shaped and sponsored the community efforts of one of the top 30 contributors to the project. 

Hook 42 has a fairly humble approach when sharing our community contributions data. We usually let our team’s commit numbers, sessions, logos, and event organization speak for our continued dedication to the fostering the Drupal community. 

For full disclosure, Kristen Pol and Aimee Degnan (myself) are co-founders / owners of Hook 42, a full-service web development agency specializing in Drupal. We are based out of San Francisco and we have team members distributed across the United States.

Make a Commitment to Contribution

First of all, you must want to contribute. Everyone has different reasons to contribute and how you personally contribute is your own path. It is a deliberate decision that must be turned into action.

The first steps into contribution may be attending a Drupal users group, camp, or logging into Slack or IRC for support. At this point, you meet the community and learn how to further contribute. Hopefully, the Community has been inviting enough that you want to stay. :)

When Kristen and I started Hook 42, we chose “Contribute to Community” as one of our core values. This decision created the foundation for our culture of contribution. We both personally contributed to the project and community in different ways and found great value from giving back. All of our team members have the desire to contribute to community efforts; the passion and self-starting ability to contribute is vital.

Another one of our values, “Ongoing Education and Improvement”, is a strong motivator for our contribution efforts. The Drupal project, and its supporting events, provide a fantastic opportunity for professional development. Coding, documentation, speaking, organization, and volunteerism; there are so many opportunities for growth that are beyond our client work or formal training classes.

I want to thank those organizations and individuals that have made community contributions a deliberate part of their work and life. We are not the only company to do so. We are not the only individuals to do so.

Invest in Contribution

Once you decide contribution is important, a real investment must be made. Contribution takes time. It takes skill. It takes practice. And it also takes money. 

A patch isn’t going to write itself, test itself, or be committed back into the project itself. Documentation must be written and copy edited. Events need to be sponsored and organized.

Hook 42 sponsors 15% of the team’s overall work hours to community contribution. Doing the math, 15% is roughly 4,000 - 4,500 hours of work per year donated to the Drupal community. That is time Hook 42 is not making a profit and is considered a completely operational cost. The work is performed within a normal 40 hour work week for our team members; another value of ours is "Strive for Work and Life Balance".

Our clients also sponsor contributions through the course of project work, session presentations, and case studies.

The 15% metric of sponsored community time does not include the amount of money spent for sponsorship, travel, or one-off support of community contributions like DUG dinners, code sprint snacks, and other community-focused spend. 

An individual’s personal level of investment will probably be much different from a business. The personal investment may include patches, testing, sessions, and camp attendance but is often constrained by personal budget and time one is wanting to commit.

Personally, Kristen and I contribute differently. Both of us organize events, speak, attend conferences, work on core initiatives, and mentor individuals within the community and the team. I contribute less code because my role is more related to business topics (although I’m highly technical); whereas, Kristen’s contributions are more commit and documentation related. This is just an example of how contribution profiles may differ.

From a business perspective, it is both of our jobs to provide a stable environment and work to provide our team members the opportunity to contribute. Consider us “Community Force Multipliers” that strategically align our team’s work with community efforts while we, personally, do less of the commit-centric work.

Many of our team members, including Kristen and myself, contribute additional personal time on top of work-sponsored hours. Those that do are passionate about the community and are active in event organization, preparing sessions and trainings, and participating in sprints. Plus, Kristen and I have to keep the business running regardless of our personal community efforts. Someone has got to keep the lights on. 

I want to thank those organizations and individuals that have made the investment in the community. We are not the only company to do so. We are not the only individuals to do so.

Ongoing Commitment to Contribution

But why do Kristen and I choose to contribute so much to the community? Why do we keep contributing? The two of us drive Hook 42’s budget and time invested in community efforts. Don’t we want more profit or more money in our pockets?

As business owners, we believe that supporting the Drupal project and community ecosystem is an investment in our ongoing business. All people using Drupal must contribute - at their own ability level - to Drupal to keep the platform viable and supported. That contribution can be as easy as active use of the platform.

Improving Drupal isn’t just about benefits to our company, or benefits to Drupal independent contractors, and other Drupal service providers. Improving Drupal benefits organizations using Drupal, so they can have confidence that their choice is a sound investment over time. Again, contribution as a business is not about us, it is about supporting people building their businesses on Drupal.

As people managers, the community ecosystem and the Drupal and Drupal-adjacent technologies provide a great environment for ongoing learning and professional development for our team. Kristen, myself, and Adam help our team members and others in the community find the best fit of work for their goals.

As individuals, honestly, we love the people and the community environment. One of our other company values is “Be Ethically and Morally Good”. As good members of the community, we understand that our individual choices and actions can benefit the greater good of Drupal. 

But I have to admit, sometimes it is a challenge. For all who choose to contribute, you will also be more visible to a diverse, global group of individuals. You may receive criticism for your work or opinions that may not seem agreeable. Kristen and I have been told that the support we provide, both personally and through the business, is not enough. Perhaps without visibility to the actual data of our total contributions, others may not understand the amount of our personal investment in the project. Thankfully, that was an edge case and not the norm. Overall, most community members have provided positive feedback to our sponsorship efforts.

Why don’t we just give up? How much more are we supposed to do? How much more are we supposed to give?

Honestly, constructive criticism and differing opinions make the product and the people improve. No one improves if they are unaware there is room for change.

We constantly renew our commitment to community because we love the people we work with. It brings us great joy to work with such creative and enthusiastic people.

I want to thank those organizations and individuals that recommit their efforts to the community, even after heavy public criticisms. We are not the only company to do so. We are not the only individuals to do so.

Season of Giving Beyond Drupal

I want to thank those organizations and individuals that provide donations to charities throughout the year at different community events. This type of altruistic approach to charitable donations represents the quality of the people in the Drupal community.

Hook 42 has donated to the following charitable organizations chosen by our team members. Some of the organizations were selected by multiple members:

Learn how you can be a top contributor in our next Community Post: The How-to Guide to Successful Contribution.

Dec 10 2018
Dec 10

Nowadays everyone has an API and it's fairly common to want a website you're working on to fetch data from a 3rd party API. That's because pulling 3rd party data into your website can not only enriches your website's content, but doing so can prevent the need to duplicate commonly needed data.

API provided data could include displaying weather information, going through projects, looking through census results, or even displaying Magic the Gathering card data. In fact, every WordPress site comes with an active JSON API out of the box.

There really is an API for almost anything. It's no surprise that you'll eventually want to consume some random API while developing a Drupal website. Enough of the sales pitch, let's get started consuming JSON APIs.

The Plan:

  1. Look at what it takes to fetch and consume JSON data in general.
  2. Explore the popular Guzzle PHP library.
  3. Create a Drupal 8 module that consumes an API and displays the data on your website.

Seems pretty straightforward huh? I think so too, but before we go any further let's define some of the terms that appear throughout this post.

  • API - Application Programming Interface. Literally, "a thing developers can use to interact with another program".
  • Request - An interaction with a web API. Very similar to visiting a website in your browser. When you visit a website in your browser, you are making a "request" to the website's server.
  • Base URI - Part of a URL that is the root of a web API request. This tends to be a domain name such as "", but can also include a path such as "".
  • Endpoint - Part of the URL for an API request that usually defines what type of data you are requesting. For example, one of the most common WordPress API endpoints is "posts", which retrieves Posts from the WordPress website.
  • Query Parameters - Part of the URL for an API request that further describes the specific data you are requesting. Query parameters look like key-value pairs within the URL for the API request.

Here is an example on an API request URL:

And here is how that API request URL breaks down into the terms defined above:

  • Base URI -
  • Endpoint - posts
  • Query Parameters - ?per_page=2

Hopefully that helps clarify some of the terminology used throughout the rest of this post.

Getting Started: Fetching JSON in PHP

The first thing we want to look at are the basics of getting data from an API. We need the following things:

  1. A public API that will provide us with data.
  2. A way to visit the API and get its data.
  3. A method of converting the raw data the API gives us into an array so we can easily process and output it as we see fit.

Broken down into their tiniest pieces, each of the above needs are fairly straightforward. Out of the box, PHP provides us with a function that handles both visiting an API and getting its data in file_get_contents(), as well as another function for converting that raw string data into an array in json_decode().

As for the public API… I'd like to introduce you to Cat Facts, a public API that will provide us with all the facts about cats we could ever want!

Let's put all these pieces together and write a simple PHP script that will consume the Cat Facts JSON data.

$data = file_get_contents('');
$cat_facts = json_decode($data, TRUE);

foreach ($cat_facts as $cat_fact) {
  print "<h3>".$cat_fact['text']."</h3>";


There we go. Now we can use this technique to get as many random Cat Facts as we want (up to 500 per request). But before we continue, let's break down this script a bit and see what it's doing.

  1. First we use file_get_contents() to request the data from the API.
    (The response data comes back to us in the form of a string.)
  2. Next we convert it into an Array using the json_decode() function.
  3. Now that the data is an array, we can loop through it and output all of our brand new cat facts. Outstanding!

Note: I didn't make up the URL shown in this example, I read the documentation. You can visit that API request URL directly and see what the response data looks like. Go ahead, I'll wait here…

… Welcome back!

Check this out: Most APIs you interact with will have its own documentation that you should use when planning your project. If you find yourself struggling to figure out how to get data from an API, look for more documentation. Documentation is king when dealing with APIs. The better the documentation, the better the API in my opinion.

Object Oriented API Requests with Guzzle

Now that we have a decent understanding of the main points of requesting data from an API, let's take a look at how we might do that in a more practical and modern way. Let's use the very popular PHP HTTP client named Guzzle to do basically the same thing we just did above.

The main differences in using Guzzle are mostly around the abstractions provided by Guzzle's Client library. Rather than trying to describe each difference out of context, let's look at an example:

require 'vendor/autoload.php';

$client = new \GuzzleHttp\Client([
  'base_uri' => '',

$response = $client->get('facts/random', [
  'query' => [
    'amount' => 2,

$cat_facts = json_decode($response->getBody(), TRUE);

foreach ($cat_facts as $cat_fact) {
  print "<h3>".$cat_fact['text']."</h3>";

Let's paws for a moment and review what has changed and why:

  1. The first thing to note is that we've created a new instance of Guzzle's Client object and passed in some parameters as an array. Rather than provide the entire URI for the API's endpoint along with query parameters in one string like before (''), we will instantiate the client with just the base URI for the API in general. This way we can easily make multiple requests to multiple endpoints with the same Client object.
  2. Next, we use the Client's get() method to request a specific endpoint of 'facts/random'. Internally Guzzle will combine the endpoint with the base_uri we provided during object instantiation.
  3. Additionally, we provide an array of query parameters to the get() method. Internally Guzzle will convert this array into a query string that looks like this '?amount=2' and append it to the URL before submitting the request to the API.
  4. Unlike file_get_contents(), the Guzzle client returns a Response object. This object contains much more information about the reply from the API, as well as the contents of the response.
  5. Finally, we access the contents of the response by using the getBody() method on the Response object.

It may seem like a lot has changed from our first example, but I highly recommend becoming more comfortable with this approach. Not only is it significantly more powerful and flexible than the file_get_contents() approach, but also because Drupal 8 uses the Guzzle library.

Ultimately, both this and the previous example are doing the exact same things. They are both visiting the Cat Facts API and fetching data.

Now that we are comfortable with requesting data from an API (aka, visiting a URL), I think we're ready to do this in Drupal 8.

Guzzle in Drupal 8

The plan is simple; create a Drupal 8 module that fetches cat facts from the Cat Facts API and displays those facts in a Block.

There are a few ways to accomplish this, but we'll start with the most basic. Have a look at this custom Block:


namespace Drupal\cat_facts\Plugin\Block;

use Drupal\Component\Serialization\Json;
use Drupal\Core\Block\BlockBase;

 * Block of Cat Facts... you can't make this stuff up.
 * @Block(
 *   id = "cat_facts_block",
 *   admin_label = @Translation("Cat Facts")
 * )
class CatFacts extends BlockBase {

   * {@inheritdoc}
  public function build() {
    /** @var \GuzzleHttp\Client $client */
    $client = \Drupal::service('http_client_factory')->fromOptions([
      'base_uri' => '',

    $response = $client->get('facts/random', [
      'query' => [
        'amount' => 2,

    $cat_facts = Json::decode($response->getBody());
    $items = [];

    foreach ($cat_facts as $cat_fact) {
      $items[] = $cat_fact['text'];

    return [
      '#theme' => 'item_list',
      '#items' => $items,


Block Output:

At first this looks like a lot more code, but most of the new stuff is the code necessary to create a Drupal 8 block. Rather than focus on that, let's look at the important difference between this and the previous example.

  1. Drupal core provides a service designed to create HTTP clients: 'http_client_factory'. This service has a method named fromOptions() which accepts an array, just like the Guzzle Client constructor did before. We even passed in the exact same parameter.
  2. Instead of calling json_decode() function, we use the Drupal provided Json::decode() method.

Note: We could have instantiated our own Guzzle Client object, but the above approach has the following added benefits:

  • First, Drupal is going to merge our options array into a set of its own options that provide some HTTP request best practices.
  • Second, using this method (somewhat) future proofs us from major changes in the Guzzle library. For example, if Drupal improves its http_client_factory service, or even decides to switch libraries all together, we'd like to believe that the core developers will take on the burden of ensuring the http_client_factory service still works the way we expect.
  • The same reasoning applies to using the Json::decode() method Drupal provides as opposed to the json_decode() function.

Generally, whenever Drupal provides a way to do something, you should use the Drupal way.

Now this is all very good, we're making API requests the "Drupal Way" and we can place it almost anywhere on our site with this handy block.

But, I know what you're thinking. You're thinking, "Jonathan, Cat Facts shouldn't be contained to just a block. What if I want to use cat facts somewhere else on the site? Or what if another contributed module wants to make use of these awesome Cat Facts in their own module?"

And you're totally right to be thinking that. Hence...

Cat Facts as a Service (CFaaS)

There is no better way to make Cat Facts available to other non-block parts of your site and other contributed modules than to provide a Cat Fact service in our own module. I can see it now, with such a powerful feature our Cat Facts module will soon be a dependency of almost every other popular Drupal 8 module.

First thing we need to do is define our new Cat Facts service in our module's services file.

    class: Drupal\cat_facts\CatFactsClient
      - '@http_client_factory'


Next, we need to write this new CatFactsClient class. It will look relatively similar to the work we've done already; but, this time instead of calling the Drupal::service() method, we'll use dependency injection to provide our CatFactsClient class with the http_client_factory core service automatically.



namespace Drupal\cat_facts;

use Drupal\Component\Serialization\Json;

class CatFactsClient {

   * @var \GuzzleHttp\Client
  protected $client;

   * CatFactsClient constructor.
   * @param $http_client_factory \Drupal\Core\Http\ClientFactory
  public function __construct($http_client_factory) {
    $this->client = $http_client_factory->fromOptions([
      'base_uri' => '',

   * Get some random cat facts.
   * @param int $amount
   * @return array
  public function random($amount = 1) {
    $response = $this->client->get('facts/random', [
      'query' => [
        'amount' => $amount

    return Json::decode($response->getBody());


What we've done here is create a simple class that focuses solely on the Cat Facts API. It abstracts most of the work you would normally have to do when you need to request data from the API by providing a method named random(). This method performs the HTTP request and return a decoded array of data back to the caller.

Finally, all we need to do is update our Cat Facts block to allow our new service to be injected into it as a dependency.



namespace Drupal\cat_facts\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

 * Block of Cat Facts... you can't make this stuff up.
 * @Block(
 *   id = "cat_facts_block",
 *   admin_label = @Translation("Cat Facts")
 * )
class CatFacts extends BlockBase implements ContainerFactoryPluginInterface {

   * @var \Drupal\cat_facts\CatFactsClient
  protected $catFactsClient;

   * CatFacts constructor.
   * @param array $configuration
   * @param $plugin_id
   * @param $plugin_definition
   * @param $cat_facts_client \Drupal\cat_facts\CatFactsClient
  public function __construct(array $configuration, $plugin_id, $plugin_definition, $cat_facts_client) {
    parent::__construct($configuration, $plugin_id, $plugin_definition);
    $this->catFactsClient = $cat_facts_client;

   * {@inheritdoc}
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(

   * {@inheritdoc}
  public function build() {
    $cat_facts = $this->catFactsClient->random(2);
    $items = [];

    foreach ($cat_facts as $cat_fact) {
      $items[] = $cat_fact['text'];

    return [
      '#theme' => 'item_list',
      '#items' => $items,


And there we have it! Now our block has the cat_facts_client service injected into it during creation. And rather than the block making its own Guzzle Client and API calls, it uses our shiny new service.

Ya feline it?

View module code on GitHub.

Nov 08 2018
Nov 08

Now that I’ve settled back down in Alaska after a fun trip to Berkeley for BADCamp, I’m finally digesting all of the info I gathered throughout the week. As always, it was cool to look over the schedule and see what topics were getting a lot of attention; and, without a doubt, it seemed like GatsbyJS was the hot-ticket item this year. So here’s a primer on what GatsbyJS is and why the Drupal community seems so head-over-heels for this up and coming site generator.

What is GatsbyJS?

For the uninitiated, GatsbyJS is a static site generator for React which allows you to compose a website using React components and JSX. Then, with a “Gatsby build” command, the entire React app gets compiled into a set of static HTML, JavaScript, and CSS files.

However, this is nothing new. Static site generators like Jekyll or Hugo have been doing this for years. So, what makes Gatsby so popular, especially within the Drupal community? Judging by the sentiments I heard from the four sessions on Gatsby I attended at BADCamp, I noticed that folks tended to gravitate toward a few essential features that made Gatsby appealing, not only as an integration with a Drupal backend but also more broadly.

Gatsby’s Drupal Source Plugin

The feature most commonly cited in BADCamp talks about Gatsby was the source plugin ecosystem, which allows a developer to define a backend “source” from which Gatsby will build pages. There is a robust and well-developed plugin for Drupal 8 (gatsby-source-drupal), which allows Gatsby to programmatically create content from Drupal’s content types, taxonomies, as well as blocks and menus.

The plugin works like this: first, you must enable the JSON API module, which exposes routes and schemas that help Gatsby import your content into your Gatsby application. Then, on the Gatsby side, you are able to query the data from your Drupal site using GraphQL and render the query results to various React components, such as page templates.

Build/Deploy Workflow

Secondly, the architecture around deploying/building a Gatsby site lends itself well to working with Drupal - using something like the Webhooks module, you can have your Gatsby site rebuild (and thus, pull new content) on every node create, update, or delete operation, and so forth.

This is very important, considering that most static sites are perceived as being labor intensive (in the sense that every time content is updated, someone needs to recompile the site); but, to hear Gatsby co-founder Sam Bhagwat talk about it, the ready availability of on-demand build triggers and integrations makes your static site actually perform much more like a cache. However, it’s the sort of cache that doesn’t require maintaining a highly technical caching stack like Varnish or Memcache. After the minute or two it takes for the build step to complete, your changes have completely propagated and site visitors are being served the new content.


Love it or hate it, React is here to stay. It is rapidly becoming the most common front-end stack in web development. Although it may not be for everyone, most developers who have spent the time to learn React tend to fall hard for it. Heck, this year’s Stack Overflow Annual Developer Survey puts React as one of the most “loved” frameworks by developers this last year, with 69.4% of respondents reporting that they enjoy working with React. Obviously, something is working for React in terms of developer experience. Being able to implement a React front-end without the architectural concerns of a complete decoupled solution certainly seems to be one of the bigger motivating factors behind Gatsby’s adoption among Drupal developers.


Last, but certainly not least, Gatsby’s appeal comes largely from speed. As mentioned above, since everything is served from static files, Gatsby sites load really fast. Without any server-side code to execute, the only limitations on performance are in the size of HTML/CSS/JS bundles being served over the network. When folks in a traditional Drupal site (or any other monolithic CMS) concoct solutions for better performance there are a few usual suspects:

  • better caching
  • reducing bundle sizes (minifying JS and CSS, for example)
  • optimizing images
  • serving non-dynamic site files (such as images) from a CDN

Out of the gate, a Gatsby site effectively implements all of these features by default. Since the entire site is a set of static files, your content is effectively ‘cached’ to the state of your website as of the last executed build, and the flat files that are generated from the build perform similarly to cache catch. Likewise, because Gatsby runs a build step, our entire HTML/CSS/JS bundle is minified from source using Webpack. No configuration required! Gatsby also comes pre-wired with a bunch of image optimization, including using the Sharp image processing library and progressive image loading to get a contentful, interactive page rendered as quickly as possible. And lastly, with a completely static site the most common way of hosting the site is through a CDN - some popular ones among Drupalers who use Gatsby include Netlify and Amazon S3. On top of all of that, Gatsby also has some other nifty built-in features like prefetching, which means that after the initial page load you’ll get lightning-quick performance between internal pages on your site.


Of course, most folks discussing Gatsby + Drupal implementations at BADCamp were quick to acknowledge Gatsby’s limitations. First, and most notable among the limitations, is the inability to use conventional user-submitted data. If you wanted to define a webform and render those results into a views-generated table, that would be pretty straightforward in a conventional Drupal 8 site. In a Gatsby site, however, it would be much more complicated. Likewise, for many of the ‘nice to have’ out of the box things that Drupal gives us - authentication, custom user roles, and access restriction, etc. – they all need to be effectively re-engineered if we want to implement them on our Gatsby front-end. That said, we could certainly continue to do many of those things in Drupal, but in the emerging conventional patterns of using Gatsby and Drupal together, it is unclear what the ‘best practices’ method is for handling those use cases.

All in all...

I think it’s really interesting to see this attention and centralization on Gatsby as a defacto solution for decoupled Drupal sites. While there are plenty of limitations, Gatsby seems like an interesting solution for some of the characteristic decoupled problems that many decoupled Drupal devs are very familiar with by now.

And, as always, this year’s BADCamp was really great to get a chance to see the Hook 42 team – it’s amazing that we “see” each other so often online, but once we’re all together I’m reminded of what a smart, funny, and fun group of people we are. Can’t wait to see everyone again!

Oct 17 2018
Oct 17

Keyboard accessibility is vital, as many assistive devices emulate the keyboard. Using semantic HTML one can achieve an accessible User Interface (UI) with less code than non-semantic markup.

By managing and guiding focus with semantic HTML, developing an accessible UI is rather easy. Semantic HTML plays an important role in not only accessibility but SEO (Search Engine Optimization) as well. Although we are aware of it, it's often overlooked.

In September’s accessibility talk, Sarbbottam Bandyopadhyay shared the trade-offs of using semantic vs non-semantic markup with an everyday example. He also shared how to manage and guide focus. It was a brief presentation emphasizing the various aspects of keyboard accessibility. He concluded with a brief introduction to WAI-ARIA.

Sarbbottam is a frontend engineer, with more than 14 years experience. He currently works at LinkedIn. He is part of LinkedIn's core accessibility team, focusing primarily on web accessibility. He’s been involved with web accessibility since his Yahoo days.


Keyboard Accessibility is addressed in the “Operable” principle of the WCAG: Web Content Accessibility Guidelines.

Many users with motor disabilities rely on keyboard navigation. Using a mouse or trackpad can be difficult because it takes a lot of fine motor skills.

WCAG: Web Content Accessibility Guidelines 2.0 - P-O-U-R:

P - Perceivable: Information and user interface components must be presentable to users in ways they can perceive.

O - Operable: User interface components and navigation must be operable.

U - Understandable: Information and the operation of user interface must be understandable.

R - Robust: Content must be robust enough that it can be interpreted reliably by a wide variety of user agents, including assistive technologies.

The WCAG 2 Quick reference guide has done an excellent job organizing and categorizing the POUR guidelines.

Many assistive devices emulate the keyboard

To be keyboard accessible, the website’s user interface must be navigable and operable via the keyboard. Arrows are used for widgets and groups; for example, radio groups or dropdowns.

Tab and arrow keys are used primarily to navigate. 

Enter and space are the primary keys used to operate.

Most common issues:

Mouse only interaction:

This an interaction that can only be accessed using a mouse or pointing device. There is no way a keyboard user can access this functionality.

No focus indicator:

Focus indicators visually identify the current active element on the screen. The focus indicator is often suppressed using CSS. As a result, keyboard-only users are not being able to access content or know where they are on the screen.

Sarbottom has developed a Chrome extension, called Focus Indicator, which forces focus on active highlighted elements.

Focus indicator is the equivalent to mouse pointer, so, 'focus outline: none' is equivalent to 'cursor: none'. We wouldn’t use 'cursor: none', so we shouldn’t use 'focus outline: none'.

Non-deterministic navigation:

It is expected that a tab press will focus on the next visible element in a logical order. The tab order must be in sync with the visual order. When the tab order does not match a user’s expectations, it creates a cognitive overhead.

To have deterministic tab order, avoid using positive tab indexes and CSS to change the visual order. Rely on the DOM (Document Object Model) order for for visual and tab order.

Efficient navigation:

A keyboard user expects the actionable elements in a dynamic apps UI to be navigated by a subsequent tab press.

We can avoid these common issues and pitfalls

Use Semantic HTML

  • It is not only important for accessibility, it is important for SEO
  • Semantic HTML allows the markup to be system, software, or machine interpretable.
  • Using semantic HTML results in less code.


ARIA or WAI+ARIA (Accessible Rich Internet Application) is a set of additional HTML elements that enhance the accessibility of web content by providing extra information.

There are three areas of ARIA attributes:

  • Role - defines what an element is or what it does.
  • State - conveys the current state of the element.
  • Property - adds additional information to an element, like relationship.

Note: The semantic information provided by ARIA attributes supersedes the native HTML semantics.

The first rule of ARIA is to not use ARIA.

Focus management:

By managing focus, we can ensure that the dynamic interaction and UI transitions are accessible. On UI updates, focus the corresponding HTML node programmatically. An HTML element can be focused by JavaScript invoking the focus method upon it. Focusing a container programmatically serves as a guided context switch.

Any subsequent tab press will focus the next focusable element, which enhances the keyboard user’s experience.

Guided Focus Management:

Guided focus management enhances the keyboard user’s experience. It allows the screen reader to read out the textual content of the focused container letting a visually challenged user be aware of UI updates. There are situations when the focus cannot be shifted from the context.

WAI-ARIA can be used to provide spoken feedback.

To wrap it up...

Get romantic with semantic and focus on focusing.

YouTube Video

Accessibility Talks September 2018 - Sarbbottam Bandyopadhyay - Love Thy Keyboard

Links mentioned in the talk:

Drupal Accessibility Group

Join the Accessibility group on for hints, tips, discussions, and patch proposals to help make Drupal more inclusive.

A11yTalks on Twitter

Follow us on Twitter and use the hashtag #a11ytalks to follow the conversation.

Sep 23 2018
Sep 23

HubSpot provides a powerful combination of customer relationship management (CRM) features and insights that can help organize and maintain business processes tied to customers. Drupal is a key digital platform for businesses, especially for inbound customer engagement, marketing initiatives, and 3rd party integrations. The two systems are highly complementary and deserve consideration for logically separating the responsibilities of digital engagement and customer relationship management. Additionally, both HubSpot and Drupal are very flexible and customizable. As an example, both systems support extensible data structures through custom fields in HubSpot and through the entity system in Drupal that allow for implementation-specific data to be stored and maintained.

Federated Drupal + HubSpot Approach

So you like the idea of using a CRM, but is it really worth all the trouble to integrate it tightly with your Drupal site? Are you afraid of commitment? There’s an interim step you can take before getting married to using HubSpot as your CRM.

If your data isn’t updated multiple times a day, you can work with HubSpot without tightly coupling your data integration. This approach involves using HubSpot’s batch update API. For example, with a regularly scheduled job to grab your active records and upload the relevant fields, you can keep HubSpot aware of your more recent data such as contact information. You get all of the HubSpot goodness without having to change your Drupal code since you get the data directly from your database.

We applied this approach for a Drupal system that isn't really a standard "website" but, instead, a very complex web application with a regularly-updated, separate data warehouse. Users are selected for data inclusion after a series of prior steps involving the end user, customer relations, and third parties. There are hundreds of these records a day which is only a very tiny subset of the site's daily data.

This approach leveraged the data warehouse in AWS, but you could do it against your production database as long as you keep an eye on query efficiency and server load. A CRON job to retrieve updated data was implemented in AWS Lambda, their serverless code platform, but it could also be implemented with a CRON hook in Drupal. While Lambda offers lots of coding choices, PHP isn’t one of them. Fortunately Python is. This approach also allowed us to rapidly prototype and implement our solution without impacting the production system.

Lambda jobs automatically log their output with AWS CloudWatch. After becoming familiar with HubSpot API errors, we built CloudWatch alarms which report to Simple Notification Service (SNS) for notification.

Unified Drupal + HubSpot Approach

While it's more advanced and complex, Drupal’s APIs allow for a much more refined, tighter integration if it is desirable. HubSpot maintains web service APIs for all of its various data objects. Developers can leverage these APIs and the various hooks/events within Drupal to synchronize data bidirectionally.

One common use case is a form in Drupal that end users engage with. The HubSpot module offers Webform integration specifically to HubSpot’s Leads feature. This is a concise, but relevant, single-direction use case in which Drupal can send Webform submissions to HubSpot. This allows for capturing inbound leads within a Drupal system and synchronizing that data to HubSpot.

Drupal’s development framework also supports more nuanced and implementation-specific approaches beyond just the Drupal Webform and HubSpot Leads integration. The HubSpot API module leverages a Composer dependency and Drupal service to integrate a PHP SDK within the Drupal application. This service can be programmatically invoked in any Drupal hook or event. Most CRUD-related runtime hooks programmed into a module allow for any data or transaction to be sent to a corresponding HubSpot entity. For instance, having a user-related hook to synchronize specific Drupal users with HubSpot customers can allow for interactive Drupal applications (commerce, collaboration platforms, etc.) to automatically send customer-related information from Drupal user profiles.

Drupal offers other advanced integration options with HubSpot. Drupal’s CRON system can be used to routinely pull data from HubSpot. This is helpful for creating advanced dashboards and data visualization within Drupal that is potentially tied to a single user-based experience. For instance, a user in Drupal could have a unified experience in which their HubSpot campaign data can be shown in a single dashboard in Drupal without potentially having to log into multiple systems.

The user-based example can be extended with some other key features of Drupal’s provided framework:

  1. Drupal’s Entity API can be used to create a custom entity to track unprocessed users and the state of HubSpot-related operations within Drupal.
  2. Reports can be generated in Views to easily list the tracked entities, like when they were created, when they were processed, their state, and more.
  3. Drupal’s log subsystem can maintain the set of activities tied to the user tracking entities and store HubSpot-generated responses from the API. This helps with failures, which is common for large scale sites with HubSpot’s API rate limiting.
  4. Drupal’s queue subsystem can offer opportunities to leverage CRON in staggering user requests instead of at runtime. This is advantageous should the HubSpot API go down or have slow performance, as there is a built-in failure state. Additionally, operations can be batched which helps avoid hitting API rate limits.


Drupal and HubSpot have a lot to offer each other as complementary solutions. Whether you want a more lightweight, federated approach or a tightly-coupled integrated approach, both Drupal and HubSpot offer enough extensibility through their frameworks and APIs to make even the most complex of use cases happen.

Sep 21 2018
Sep 21

The BADCamp Circus is coming to town for 4 whole days! From cities near and far, Drupalists are converging in Berkeley very soon for this year’s circus-themed BADCamp!

Join Hook 42 under the bigtop for 3 unique sessions. We’ll be sharing our thoughts on redesigning the Stanford Cantor Arts Center website, accessibility tooling, and creating custom Drupal 8 modules. Of course, the whole team will be there too, collaborating with new and old friends alike.

Join us as we flex our Drupal muscles, perform daring acts of development, and add to the general merriment of the Drupal community. BADCamp 2018 is sure to not disappoint!


Drupal 8 Case Study – Stanford Cantor Arts Center Redesign

Ryan Bateman and Kristen Pol | Friday, October 26, 2:30 - 3:15 PM | Sibley

In the Spring of 2017, Stanford’s Cantor Arts Center came to Hook 42 with a project to redesign their aging website with a shiny new Drupal 8 website that would allow the museum’s exemplary visual arts exhibits and photographic assets take center stage. What followed was a development cycle full of rigorous content strategy, front-end design, and back-end development that culminated in the newly-launched Cantor Arts Center website.

This session will expand upon our methodology and thought process in arriving at each aspect of the site’s development, including:

Intended Audience:

Anyone interested in content strategy, migrations, and flexible components will benefit from this session.

Which Accessibility Tools Are Right For You?

Aimee Degnan | Saturday, October 26, 11:15 AM-12:00 PM | Tilden

As an organization who needs to step up their accessibility (a11y) compliance, accessibility testing and remediation is a big deal.

Accessibility testing has a lot of moving parts! There are so many tools. So many! Plugins, suites, crawlers, dashboards, CI tests, and more.

  • Which one is right for you?
  • Will only one fit all of your needs? ;)
  • Build vs. buy some vs. buy vs. free? Is "free" free?

This is not a session about "what tools did our team use". This is a broader overview of the a11y testing tool types, challenges and benefits of the different types, rough costs (when applicable), and the best use cases for them.

When searching for tools, you can find lists of tools, but not comprehensive comparisons of tools to make the decision of which one(s) to use and buy for your need.

We compared a vast amount of tools to analyze and choose the best for our need as a digital agency specializing in accessible design and development and for our clients' needs as public entities requiring multiple levels of compliance.

A developer's tool needs (and budget) may be much different than a larger organizations need for multi-site dashboards and reporting experiences.

All levels of experience can get value out of this session.

Target audiences:

  • Tool procurement teams 
  • Developers (get a list of tools for a11y testing)
  • Website "Owners" / Stakeholders responsible for compliance
  • Project Managers
  • Dev Team Managers

Drupal 8 Custom Module Architecture: What’s Going On?

Lindsay Gaudinier | Friday, October 26, 4:45 PM-5:30 PM | Sibley

It is all fun and games modifying existing code, but what about when you have to venture out to unknown waters and create your own custom module? Don’t worry! We can get through this together!

This talk is a deep dive into creating custom modules from scratch, and the role of each component in the final product.

Let’s consider when it is appropriate to leverage custom development, explore the anatomy of a custom module, the types of expected files in a custom module, and the wonderful world of what you can do with a custom module (spoiler - it is a lot!).

This talk will include: Composer uses, forms, theming within a module, custom pages, Drupal namespacing, object oriented conventions, plugins, controllers, routes and more!

Web Accessibility 101 Training - This training course is a crash-course in web accessibility concepts targeted towards both content managers and developers working in Drupal tasked to create an "accessible website".

Navigating the Issue Queue - A beginner's guide to contribution (half day training) - Most Drupalers dream of being a contributor to the Drupal project. But where do you begin? And more importantly, what are some of the tools to help navigate the adventure successfully?

We look forward to seeing you all there!

Stop by our booth in the expo hall to say hi and pick up some newly-designed stickers!


About Drupal Sun

Drupal Sun is an Evolving Web project. It allows you to:

  • Do full-text search on all the articles in Drupal Planet (thanks to Apache Solr)
  • Facet based on tags, author, or feed
  • Flip through articles quickly (with j/k or arrow keys) to find what you're interested in
  • View the entire article text inline, or in the context of the site where it was created

See the blog post at Evolving Web

Evolving Web