Mar 27 2020
Mar 27

In the previous blog, “Know-How To Manage Multi-Site Configurations in Drupal 8” (link of the same), we learned about managing configurations across multiple sites and acquiring features from the common core platform. 

Today, the II part of this blog series will give you deep insights into the implementation of "Configuration Management across multiple sites".

But before moving ahead, let’s revisit the problem statement as discussed in Part 1-

The objective was to create one profile, i.e., “Core Platform” and accumulate all common features for easy distribution and sharing across multiple brands. 

Additionally, these features were made pluggable as well available for use to each brand in the future.

But there were two major challenges ahead. They were-


  1. There can be a massive amount of files to manage across 18 brands that may require more work upon them
  2. Moving configurations would require extensive care and testing at each step to avoid any loss of data, critical for the brands.

The Solution-

There are two approaches to solve the challenges. Each one is discussed below in detail-

A.  Separate Configuration Files for Each brand

This approach will ensure that all the configurations are kept separately for every brand, with each one having their own set of YAML configurations files. And while synching the configurations also, it can also be fetched for that specific brand only.

Although using this approach would result in:

  1. Increase in repo size as new features will be developed
  2. In case there is something that needs to be developed/deployed for multiple brands, then configuration files will have to be copied in every brand sync directory, thereby resulting in additional efforts of developers for copying files over multiple directories
  3. And, what if a new brand site is requested by the client? New directories will have to be created from scratch to manage configurations, leading to a bulkier repo.

Thus, we had to come up with a better approach that would result in maximum configuration files in common core platform directory and fewer files in brand-specific directories, besides common features across all brands).

Text and Drupal 8 logo in white backgroundSource: Medium

The new approach is-

B. Splitting Configurations for brands using Config Split Module -

In this approach, Config Split module is used to create a separate configuration sync directory for each brand where module settings let you select configurations from brand folders whenever Configuration Import is executed.

The Config Split module is used to split the configurations into a specific set required for a different environment or a different site. The aim is to fetch the configuration either from the split folder or from the core folder (it is specified in site’s

This approach will help you in moving all the common configurations to the Core sync directory.

Below mentioned are the steps that have been taken to achieve the objective-

 1. Exported all the brand-specific configurations and kept them under the brand-specific config sync directory using the config split module =>

For example, we have the site named "BPB News" and the folder for this under config directory is named as bbp. Here, we will export all our configurations and keep them under config/bbp directory. We did this for all the 18 brands.

Doing this will help us to get started with drush cex and Drush cim workflow on all brands.

 2. Using the Configuration Split module settings, as explained above, brand-specific split folders have been created:

Text written in white background

Also, the help text of the field says: "Configuration related to the "filtered" items below will be split from the main configuration and exported to this folder".

To export all the configurations to split directory we added " * " wildcard in the module configuration here :

Text and a dialog box on white backgroundSince our priority is to look for configuration items that will always be found in brand-specific folders, we can pick it up from the core as well, the main configuration folder.

You can test its working mechanism by deleting the split directory, ensuring that the configurations will be then fetched from the “Main”, the core directory.

So far, this is what we have been able to accomplish-

  • Brand-specific split folders to maintain brand-specific configurations
  • All the configurations are exported and kept in these brand-specific split folders

And this is what we aim to achieve-

  • The brand-specific folder should only contain the configurations that are specific to brands and should not contain configurations more than the "main", i.e., the "core" configurations directory.
  • Only then we will be able to get the ideal case of "Pushing all features to Core and keeping only brand-specific features in brands". This means the number of configuration files in the brand should be less than that of Core

 3. This is the testing stage, where we deploy all the changes to the Stage environment to check if configurations are now synced and no changes are displayed when we run "CIM" on any brands.

Finally, all sites were showing "No Changes in configuration" upon running the "CIM".

 4. To move forward, having all (Common configurations) configurations in Core and fewer configurations in site-specific configurations, and in brand split folders, we created and picked tasks in every sprint and performed this operation in several different tickets, such as :

  • Task 1: Moved all image style configurations in Core (Common) Directory.
  • Task 2: Moved all common view configuration files in Core (Common) Directory.
  • Task 3: Moved all common field configuration files in Core (Common) Directory.
  • Task 4: Moved all common Ad entity configuration files in Core (Common) Directory.

You can take a walkthrough of the Drupal configuration management from here-

[embedded content]

Working on a New Feature Request

When working on a new feature such as creating a new content type, all the configuration files related to "New Content-Type" creation will be picked up from the "Main" (Core) configuration directory. 

And in case if there is something that only a specific brand is requesting as explained in part I, then the configurations will be placed in the brand sync directory.

Usage of Configuration Ignore Module

We used Config ignore to add YAML configurations in ignore Settings. The idea here is to ignore synchronizing configurations that are changed regularly.

These changes might be any of the following-

  1. Changing form settings in the admin configuration forms. (In our case we call these settings, "Brand Level Configurations"). These can be custom admin forms provided by contributed modules
  2. In our case, the brand editors can change the placement of the blocks from the admin/structure/block page settings
  3. System Site Settings

These changes are made by the brand level editors and should be part of ignore module as when made to run, these changes would be reverted and lost during import.


Sharing our journey and findings of configuration management might not be the best-case scenario for everyone but it resolves our problem statement and facilitates us to develop features and manage configurations successfully. 

There is no denying the fact that there can be a scope of improvement here also. You can also share your findings or provide us with your inputs in the comment section below for a more efficient approach.

Need help with revamping your enterprise platform? Drop us a line and our experts will get in touch with you.

Mar 27 2020
Mar 27

With modern software, it's easier than ever to build a website, load it with content, and maintain it. Software packages are more secure, much faster, and more user-friendly than they were just a decade ago!

However, one major drawback is that over time, the structure of the website and the sheer amount of data & content has led to an overloaded and messy site structure. Besides, older systems tend to fall behind, thereby failing to meet the demands placed on it by new features and modern technology.

Drupal is the premier CMS package for enterprises, with more installations than nearly any other package. NASA, FedEx, and countless other enterprises and governments rely on its security, ease for front-end & back-end users, and the vast support system developed over the years.

Considering the benefits that Drupal offers, you decided to migrate your content on Drupal CMS. But the question is, how would you prepare your business to perform that migration?

Planning Your Migration

There can be severe consequences if content and data doesn’t migrate between systems successfully.

  • Target systems break, rendering the website in-operational
  • Data isn't fully accessible or returns results improperly
  • You have to bear additional costs to rectify problems
  • Lost business from resources spent on the system instead of commerce

Careful planning and attention-to-detail will prevent these problems, making your migration to Drupal easier. You want to move content (pictures, charts, articles, blog) and data (website accounts, users, product information, inventory) into a new system. 

The objective is to improve the quality of the content and data while running your business without interruption.

Your plan needs to assign top priority to these goals-

  1. Maintain business continuity
  2. Improve information quality
  3. Minimize unnecessary costs


  1. Your Continuity MapCheck with other businesses in your market sector to see what tools or consultants they have used to migrate to Drupal. Research other Drupal websites for layout ideas and designs, themes, or functionality. Contact these companies for information on how to implement these ideas on your own site.

    Ask how they maintained the continuity of operations while performing the migration.

    1. Did they dedicate a project manager or assign it to their IT department?
    2. Did they hire an outside company or a new hosting provider  that did the work?
    3. Did they incur costs they feel that could have avoided?
    4. Looking back, is there anything they would have done differently?

      You need to be clear why you're doing this and where you want to go. Your plan should lay out performance, functionality, and appearance goals.

      Map your existing business operations into those goals. Determine project management duties, put protocols into place to avoid disruption of day-to-day operations, and provide for accountability.

  2. Consider Your Content
    Firstly, you need to evaluate the content that's on your website. Are there any functions or design elements that you can simplify or eliminate?

    Maybe you can start with a simple design and add to it once you have a basic platform. There might be features or pages on the website that visitors never use.

    On the back end, are there any complicated or ineffective processes that company staff often complains about? The simpler your requirements, the simpler the migration. In this stage, you're looking at two classes of information.

    1. Identifying content and data which are not needed anymore and anything that might be duplicated. This lets you slim down the sheer amount of information that needs to be handled
    2. Looking for information, data, and content that can be reorganized to function better or to return more relevant results.  You can redesign the way your site looks, cross-reference data that couldn't be linked before, get rid of features that nobody uses, and add new functionality provided by Drupal.
  3. Project Management and Quality Assurance
    The most expensive single proposition is managing the actual transfer from the old site to the new one. To minimize chances of data loss or disruption, you should store a complete operating copy of your existing website and associated data in the cloudBefore the actual transfer begins, it's crucial to ensure that the new network and server hardware have been serviced and upgraded. The operating system has to be installed, maintained, and fully updated. Any server software, network layers, and auxiliary office software troubleshooting should already be done before the transfer begins. This lets you take information in separate sets, clean it and slim it down, removing any duplicate content. The restructuring project will never have a chance to disturb current operations.

    Handle the overall process as smaller projects within the main project. Choose your smaller data sets first, allowing everyone to get used to working together and with the system.

    Review each stage of migration as accomplished. Evaluate the good and bad things about the process, improve them, and move on to the next larger set of data.

    The final stage of migration and quality assurance is performance testing. Your team needs to check the new website for grammatical errors, full functionality, and response time.

    You have to access every area of the site, every menu item, test every process from uploading and updating information to ordering, and account creation.

    While it may be too big of a task to check every detail for accuracy, you need to make sure a large enough portion of the site and a large number of pages and accounts are sampled randomly to ensure that everything seems to be right.

Rise to the Challenge

In the end, a successful migration to Drupal is a straightforward task. Assign clear goals and require accountability for reaching each goal step-by-step. Ensure your new system is ready for its new data load. Test and evaluate every step as you go.

Before you know it, your business and customers will be reaping the many benefits of an expandable, secure, modular CMS offering advanced functionality. You'll have mastered the challenge of migrating to Drupal.

**This post is written by our guest author Heather Redding. She's a freelance content writer.

Interested to write for us? Drop a mail at [email protected] with your awesome ideas.

Mar 26 2020
Mar 26

Working from home (aka telecommuting) can be great for productivity and employee happiness. But not everyone is used to it – or prepared to do it (and many have been forced to recently because of COVID-19). At Kalamuna, we work on a distributed team, which means that most of us already work from home – and some of us are also used to setting up temporary workstations while travelling. It’s not always easy (or ideal), but a few small adjustments can make a big difference. Here are some of our team’s top tips for working effectively from the homefront.

Health & Wellness Tips

Go for a pre-work walk

It’s easy to roll out of bed, eat breakfast, then jump on the computer and start working. But I always feel calmer, more focused, and more productive if I take some time in the morning to do something physical and grounding before work – like going for a walk. It makes me get dressed, get some fresh air and exercise, and clear my mind. (And if I can’t go outside, some kind of fun stress-relieving exercise works too: like dancing, yoga, chi gong, cleaning to music…). 

Bonus: Go for a walk after work! It signals the work day is over, gives you a chance to de-stress and connect with your body and the physical world out there.

– Patricia

Dress for success

One of the most impactful changes I made to my routine a few years ago was establishing the following rule for myself: I always get dressed for work as if I’m going into an office, and at the end of the workday, I get changed out of my work clothes to signal that mental shift back to “personal time”. This simple little routine has really helped me manage my remote working habits, and set clear signals and boundaries for myself about when I'm in "work mode" vs "off the clock". It also ensures that I always look professional when I go on video calls.

– Crispin

Create a routine

Knowing ahead of time what you’ll do the next day saves time and hampers a feeling of chaos. 
    •    You spend less time thinking: “what do I do now?”

    •    Builds life’s necessities (such as eating and drinking water) into your day

    •    Allows you to think more creatively about non-routine parts of life.

– Shannon

Keep the routine

It can be tempting, especially if you are not doing meetings on camera, to work in the comfort of your PJ’s. A shower, fresh clothes, breakfast, a cup of coffee and otherwise following the same routine you would keep as if you were going into the office will help motivate and energize you for the day. These are the things that prepare us for a normal day. When you start to slack on the morning basics you are no longer having a “normal” day and the chances of letting other areas of your work slide go up. Not to mention you’ll just feel better and that goes a long way.

– Jason

Stay hydrated & eat well

Stay hydrated - ensure you always have some water by your side. Along with water, keep your energy levels up with your favourite beverage, be it tea, coffee, or even a delicious smoothie.

Eat a healthy and nutritious lunch, away from your work environment. Keeping energy levels up is important, and having the time away from the work environment will keep you in the right mindset. While working remotely, it is possible to lose track of time, so schedule a lunch in your calendar, get away from your work environment, and go eat something delicious and nutritious. If your energy is getting low, let the team know, and take a break!

– Rob

Invest in ergonomic gear

Investing in a good chair will save your lower back. Back pain is real, and can be very distracting when trying to focus on getting things done. Standing workstations and ergonomic gear can be helpful too. Take the time to stretch, go for a walk, and ease your eyes off of the screen to reduce stress, and save your body down the line.

– Rob

Lily's ergonomic work station is built on top of a solid .stand-up deskLily's work station is built on an adjustable stand-up desk.

Discover how you thrive

We are all different, yet most of us are forced from a young age into a set way of learning and working. When we work from home, we shed the social pressure to work the way everyone else works. This can be an invaluable opportunity to discover how you thrive. For instance, I like to leave my house each morning (though not recently, of course, due to the COVID-19 pandemic) to complete focused work at a coffee shop, then take my meetings from my quiet home office in the afternoon. I also like to listen to long DJ sets on YouTube at my standing desk and dance while I work. These are ways I thrive that I may have never discovered without the freedom of working from home. 

– Lily

Tips For Staying Organized

Live Powerfully Through Your Calendar

If something is in your calendar, do it. If you need to do something that’s not in your calendar, add it in, and do it. Your calendar is your way to keep yourself accountable, and a history check of what you’ve been up to. Having it readily available at all times during the day will keep you focused and productive.

In addition, block off time when you’re heads down and working. Meetings are disruptive, so keeping them brief and action-focused will result in a more productive day.

– Rob

Become the master of your to-do list

I have a passion for personal tasking. This fervor originated when I entered agency life, and the associated constant plate spinning overwhelmed my workday. It endures as my notebook continues to be a natural extension of my brain, centering me in my days spent mostly with screens for company. I cannot imagine working without it, especially in my fully remote role. I had the opportunity to share a session on this topic titled “Piles of Post-Its – Staying Organized to Focus on What Matters” at last year’s Bay Area Drupal Camp and wholeheartedly recommend the recording. 

– Lily

Communication Tips

Rob and Sean sing a duet during a virtual team meetingRob and Sean sing a duet during a virtual team meeting

Email like a boss

I’ve found efficiency gains by focusing my email time windows to twice daily – once in the AM and again in the PM. This lets me write in a more focused and potent way that is freer from other distractions. I’m able to craft and refine messages better, perform more effective triage and feel more on top of things. The AM pass generally sees me cherry-pick the most urgent mail (from a filter I call “purest work – no projects” that hides email notifications from other PM tools)  and either respond or TODO them, and catch up on some newsletters or timely messaging. Later in the day, I do a bit more cleanup like unsubscribing, visiting less filtered lists and going back in time to emails that flew by. Most people don’t expect an email response within the hour. Phone, Slack, and meetings are more immediate forms of communication. And, if something’s urgent another member of my team will generally be cc’d and bring it to my attention via Slack. This technique may not be for everyone, but it helps me process triple digit email queues.

– Andrew

Over-communicate and track your time

I have been coworking for a while. Here are a couple of things that I learned early on that have really helped:
    •    Over-communicate. If you are unsure, or if you can make an opportunity to just say hi, it can work wonders.

    •    Track all of your time. Even if it is not billable. This reduces anxiety, and if you use a tool like Harvest you can run your own reports, which can be valuable info!

– Greg

Communicate your work schedule to your household

Apart from discussing the hours you are working from home with those you live with, it’s also important to let them know what times you will have calls at. In the past, I’ve been in awkward situations where one of my family members was shouting in another room while I was on a call. Dedicated home office spaces help avoid these situations but if you share the space you work in with others, it’s even more important to give them the heads up when you need things to be quiet. That way you can limit interruptions. But life happens and who knows, maybe your next work interruption will be a viral moment: children interrupt BBC News interview.

– Graciela

Make it clear you are working

You are home. When you’re home your family might be used to you being free – and that can mean interruptions. Communicate your work hours – and while yes you are at home, we need to treat this time as though you are at work. Don’t ignore them completely (as this could be the office chatter you need) but let them know that you cannot stop working every five minutes to help out with something. This will help you stay focused and more productive.

– Jason

Use video conference tools for meetings 

At Kalamuna we value being able to collaborate both internally and with our clients over video conferencing. It allows us to monitor non-verbal communication when something might be confusing or when a piece of functionality really wows a stakeholder. It helps create relationships and reminds us that we’re all humans. Creating a video-first culture ensures that our team is ready to face the agenda at hand and their attention is focused. Get yourself and your workplace camera ready and make sure your internet connection can handle the bandwidth. If you aren’t able to share your camera, explain to your team why: perhaps you're conserving bandwidth or not feeling well. 

– Kristin

Make your video look good

Yes, we are at home, but take some time to improve your environment for video presentations. Drag some lights over – you don't need to be Scorsese, but don't have clothes hanging in the background – make an effort!

– Greg

Use tech to stay connected

If you work in an office, odds are you have interactions with your co-workers. It is important to find ways to keep that interaction going. You don’t have to feel like you are alone on an island. Applications like Slack, Google Hangouts and other text or video applications can go a long way in feeling like you and your team are close. I have worked remotely for years now and some of my teammates and I have never met in person, but because of applications like these I’ve felt just as close to them as if we worked in an office together. You are not completely alone, reach out and keep the interactions alive.

– Jason

Environment Tips

Candice's work station includes a cat, an aquarium, and mood lightingCandice's cat awaits her return to work

Designate a work area (and careful with distractions)

The dishes need to be done, the laundry needs to be folded and there you are at home. Five minutes won't hurt right? The problem is that once you get into “cleanup mode” it can be difficult to break out. Yes we are home, but we are also at work. It’s important to create a worklike environment. If you have an office, use it, if not, designate a specific area in your home where you will work. In your “office” you are at work. This will help keep down the distractions and help you focus. 

Also, it does not happen for everyone, but it does to some, where the place you work in your home becomes associated with work. If you work from the couch that becomes the office and even when you try to relax all you can think of is work. Designating an area in your home for work, can help create a healthier work/home life balance.

– Jason

Put a veil on your workstation

When I lived with roommates, my workstation was in my bedroom. I could see my computer sitting on a desk from my bed. My computer had a “breathing” green light on it – which I had to cover with an opaque piece of tape so it wouldn’t illuminate the room in a rhythmic way. Having work associations in the bedroom was not great for sleeping, so I put a silky white piece of fabric over my workstation everyday when I was done work. Besides being a good ritual to indicate the work day was done, when I returned to my room to sleep I didn’t have to look at my computer (or the work clutter on my desk) and think about all the problems I had to solve.

– Patricia

Work together, apart

While you’re working away, if you thrive with others around, have an ongoing background video conference with the people you’re working with. Despite all working remotely, for some it’s great getting that coffee-shop vibe, while not at a coffee-shop. Make sure to mute yourself when not speaking though.

– Rob

Too quiet for you?

I am a big fan of having a video on YouTube playing on my second monitor to be extremely helpful in generating my own office buzz. Just to hear someone else's voice instead of silence goes a long way in feeling like you are not alone. If you’re not a video person, music or podcasts can be equally great in killing the silence. Just remember, don’t get too sucked in, you are still at work.

– Jason

Final tips + thoughts

By focusing on your health and well-being, staying organized, upping your communication skills, and tweaking your environment - you can work like a pro from home. To bring it all home, here’s some bonus advice:

“Try the tips we have listed here. Try other tips you find online. Make up your own tips. See what works for you and dance like nobody's watching, because they’re not.”

– Lily

“Working remotely can be a shift, and difficult to adjust to. Don’t let that stop you from being an absolute badass. Set up a legendary working environment that allows you to thrive and be the best version of yourself.”

– Rob

If you’re remotely interested and want to learn more, Lily wrote a post on how to Throw an Epic Remote Office Party.

We’d love to hear your tips too - please share them with us on Twitter

See you online :-)

Mar 26 2020
Mar 26

The Covid-19 pandemic has shaken the entire world. The future seems uncertain and things aren’t going the way as planned. Yet, businesses must hang in there and assure their users on what they should expect from them. We have helped some of our clients create banner announcements on their Drupal websites to let their customers know –

  • They are still operational 
  • Their working hours
  • How they can help better in these uncertain conditions
  • Precautionary actions that are underway
  • Restrictions on available services
     Great Southern Homes' Covid-19 Response Announcement

Of course, these announcement banners can be leveraged for any kind of informational messages that need to be displayed for a certain period of time. Let’s take you through this in two different ways. One is by creating a custom pop-up for announcements using Bootstrap modal in Drupal 8. This method offers more flexible customizations and detailing. The other option is a simpler one using the Drupal 8 Site Alert module.

Creating a custom pop-up for announcements using Bootstrap modal In Drupal 8

For a fully customized announcement banner with a decent theming, editable announcement based on the user’s selection, we can go with this option. Showing banners to the visitors depends on the selection made in the configuration form.

Step 1: Since we are building a custom announcement banner, we need to have a custom module as every feature in Drupal is a module. Build the custom module according to these instructions

Step 2: Also, the announcement needs to be configurable. We need to create an editable configuration form with required field. Follow these instructions to create configuration forms.  

Step 3: Create a plugin block for fetching the configuration form values in a custom module. Follow these instructions to create the custom block. All the validations and access should be handled within the plugin block. We will need to attach the configuration value to Javascript to build a modal pop-up in JS.

Step 4: Create a libraries.yml for defining the libraries for displaying the modal popup using bootstrap. Also Write a Javascript logic to render the announcement data into the modal. Follow these instructions to add JS to the Drupal 8 module. 

Step 5: Create a menu link for easy navigation in the custom module according to these instructions

Step 6: Place the created block in a region for the configurations provided in custom configuration form.

Now you should be able to see the pop-up in the region for the specified path based on the configuration selection.

Custom pop-up for announcements using Bootstrap modal In Drupal 8 
   Custom pop-up for announcements using Bootstrap modal In Drupal 8

Creating site announcement banners using the Site Alert Drupal module

This Drupal module has been around since Drupal 7. The Site Alert Drupal module is lightweight and simple which lets you create a site-wide informational message. It allows you to specify a start date and expiration date, severity of the alert message that is symbolized by the background color of the announcement and the content. 

Setup –

1.Enable the Site Alert module

Configuration->System->Manage Site Alerts in path

 2.Create the announcement/alert


3. Place and configure the Site alert block from block layout according to your requirements

Structure -> blocks
              Image source - drupal site alert                    
                                 Site Alert
Mar 25 2020
Mar 25
A blue heart with the Drupal icon in it

Today, I'm asking for your financial support for the Drupal Association. As we all know, we are living in unprecedented times, and the Drupal Association needs our help. With DrupalCon being postponed or potentially canceled, there will be a significant financial impact on our beloved non-profit.

Over the past twenty years, the Drupal project has weathered many storms, including financial crises. Every time, Drupal has come out stronger. As I wrote last week, I'm confident that Drupal and Open Source will weather the current storm as well.

While the future for Drupal and Open Source is in no doubt, the picture is not as clear for the Drupal Association.

Thirteen years ago, six years after I started Drupal, the Drupal Association was formed. As an Open Source non-profit, the Drupal Association's mission was to help grow and sustain the Drupal community. It still has that same mission today. The Drupal Association plays a critical role in Drupal's success: it manages, hosts Open Source collaboration tools, and brings the community together at events around the world.

The Drupal Association's biggest challenge in the current crisis is to figure out what to do about DrupalCon Minneapolis. The Coronavirus pandemic has caused the Drupal Association to postpone or perhaps even cancel DrupalCon Minneapolis.

With over 3,000 attendees, DrupalCon is not only the Drupal community's main event — it's also the most important financial lever to support the Drupal Association and the staff, services, and infrastructure they provide to the Drupal project. Despite efforts to diversify its revenue model, the Drupal Association remains highly dependent on DrupalCon.

No matter what happens with DrupalCon, there will be a significant financial impact to the Drupal Association. The Drupal Association is now in a position where it needs to find between $400,000 and $1.1 million USD depending on which scenario we are forced into.

In these trying times, the best of Drupal's worldwide community is already shining through. Some organizations and individuals proactively informed the Drupal Association that they could keep their sponsorship dollars or ticket price whether or not DrupalCon North America happens this year: Lullabot, Centarro, FFW,, Amazee Group and Contegix have come forward to pledge that they will not request a refund of their DrupalCon Minneapolis sponsorship, even if it will be cancelled. Acquia, my company, has joined in this campaign as well, and will not request a refund of its DrupalCon sponsorship either.

These are great examples of forward-thinking leadership and action, and is what makes our community so special. Not only do these long-time Drupal Association sponsors understand that the entire Drupal project benefits from the resources the Drupal Association provides for us — they also anticipated the financial needs the Drupal Association is working hard to understand, model and mitigate.

In order to preserve the Drupal Association, not just DrupalCon, more financial help is needed:

  • Consider making a donation to the Drupal Association.
  • Other DrupalCon sponsors can consider this year's sponsorship as a donation and not seek a refund should the event be cancelled, postponed or changed.
  • Individuals can consider becoming a member, increasing their membership level, or submitting an additional donation.

I encourage everyone in the Drupal community, including our large enterprise users, to come together and find creative ways to help the Drupal Association and each other. All contributions are highly valued.

The Drupal Association is not alone. This pandemic has wreaked havoc not only on other technology conferences, but on many organizations' fundamental ability to host conferences at all moving forward. Just this week, we learned that there will be no future O'Reilly conferences, including OSCON. For the many of us who attended OSCON in the past, this truly is the end of an era.

I want to thank all donors, contributors, volunteers, the Drupal Association staff, and the Drupal Association Board of Directors for helping us work through this. It takes commitment, leadership and courage to weather any storm, especially a storm of the current magnitude. Thank you!

March 25, 2020

2 min read time

Mar 25 2020
Mar 25

Update: Project founder Dries Buytaert has put out his call for your support, as well.

I want to thank you for your patience as the Drupal Association continues to manage the shifting landscape for nonprofits in light of COVID-19. In my last update, I explained that our ability to pivot our plans for DrupalCon depends on governmental intervention, which has not yet occurred for the time period in which DrupalCon Minneapolis is scheduled. Unfortunately this means we're still in a holding pattern as I write this.

That said, we're not spending this time idly. Many hours are being spent with our contracted providers and modeling financial outcomes for the Association and the project.  Through all of this, it has become clear that, regardless of what happens next, we have to deal with the hard reality that DrupalCon revenue is a substantial part of what keeps the Drupal Association vital.   We estimate the revenue loss to range anywhere from $400,000 to $1.1 million.

I’m now reaching out to you to help us close this gap so we may continue to support Drupal, thrive and serve you.

As an organization, join our Supporting Partner Program or join our DrupalCon sponsor pledge to commit your funds regardless of the outcome of the current crisis.

Join as a Supporter

Join the Sponsor Pledge

As an individual, join our membership program, or if you're already a member, consider making an additional donation and/or upgrading your membership level.

Join as a Member

Both individuals and organizations can also simply make a charitable donation.

Make a Donation

Well before this crisis hit, the board and our team have focused on decreasing our dependence on event-based revenue by launching new initiatives such as Drupal Steward, increasing our focus on digital partnerships, and revamping current programs including individual and organizational memberships.  In addition, the board’s strategic planning includes continued diversification of revenue with an eye toward programs requested by our community like organizational certification and more visibility of those contributing to Drupal with time, talent, and treasure.  A pipeline of products and services are in development, but they simply aren’t ready to launch yet. 

Quite frankly, I’m heartbroken because the Drupal Association was on track to achieve many of our strategic goals, leading the organization down a more solid financial path while also expanding our capacity to meet our mission and serve our community.    Only a few months ago, I found great energy and inspiration from the vision of presenting our strategic plans and reporting on our progress to you, in person, at DrupalCon. Absent the effects of COVID-19, I would have more good news to share with you about what we are accomplishing together. 

Instead, we, like most of the world around us, are facing an unprecedented challenge that will only be solved with an unprecedented community effort.

Despite the difficulty of this news and understanding that these are uncertain times for everyone, we continue to cherish our amazing community. As I ask for your support, I want to thank those organizations who have stepped up to confirm their financial commitment: Acquia, Amazee Group, Centarro, Contegix, FFW, Lullabot, Palantir, Srijan and Third and Grove

I hope that you will join them.

Heather Rocker
Executive Director, Drupal Association

Mar 25 2020
Mar 25

The joy of e-commerce is that there are myriads of products that differ in particular details so every customer can find what suits them perfectly.

As an online store owner, you will just need to help them a little — and this will be a win-win! Flexible product management is one of the reasons to choose Drupal Commerce, an e-commerce platform for Drupal websites. Today, we will discuss one of its useful opportunities — the option to set up product attributes in your Drupal online store.

A glimpse at how to increase online sales

In the ocean of recommendations to boost onlines sales on your e-commerce website, you will find anything from providing the smooth and simple checkout process to using cross-selling techniques or offering a choice of payment options. However, every recommendation is focused on usability and engagement.

That’s why, one of the useful ways to increase sales is to provide your customers with a convenient choice between your product variations. Read on to find out how it works on Drupal Commerce websites.

What are product attributes?

Products in online store often come in more than one option. They may differ in size, color, fabric, shape, volume, or whatever other characteristics that customers might need to select when shopping.

These characteristics are called product attributes. Their unique combination makes a product variation in Drupal (e.g. “I love Drudesk” T-shirt of size M and white color). The product is actually the same, but it differs by attributes.

The benefits of using product attributes

Here is what makes the use of product attributes so convenient — especially in the updated and improved system of Drupal Commerce 2.

  • You easily add different product variations within the same product page by specifying their attribute values. No need to create separate products.
  • You easily track items in stock and otherwise manage your products thanks to the fact that every combination of attributes (product variation) is assigned a separate SKU — a machine-readable ID.
  • Your online store customers can easily pick the right product variation according to the desired attributes and add it to cart, with no need to go to a page with a different product.

Setting up product attributes in Drupal

If your e-commerce websits sells products that differ in some characteristics (or this is in your plans), read on. Here is how the process of setting up the Drupal product attributes looks.

Adding a new product attribute

Find the Product Attributes link on your Drupal Commerce store dashboard. Then you click “Add product attribute,” give it a name (e.g. “Dress color”).

Adding product attributes in Drupal Commerce

Adding attribute values

Your online store customers will need to be choosing between some color options (“White,” “Blue,” “Green,” etc.). As soon as you save the form, you will be able to add these as your attribute values. Add them one by one, clicking “Add value” every time. You can reorder them by dragging. If your store is a multilingual Drupal website, don’t forget to check “Enable attribute value translation.”

Adding attribute values in Drupal Commerce

Configuring how the attributes will look

On the same form, configure how it will look on the add-to-cart form (“Select list,” “Radio buttons,” or “Rendered attribute”). For the standard setup, the “Select list” or “Radio buttons” will be ok. Be sure to save the whole thing.

If you want to give your e-commerce website admins and customers a fuller view — for example, with the actual color swatch instead of color names, you should choose the “Rendered attribute” instead and install an additional contrib module such as the Color Field. It will allow you to set the color name and its HEX value when editing the attribute.

Drupal Color Field module

You can add fields to your attribute on the Product Attributes page by clicking “Manage fields” on the attribute editing menu. In this case, it will be the “Color” field.

Managing product attribute fields in Drupal Commerce

When the field is added, you can configure how it should look to your online store admins and your customers on the “Manage form display” and the “Manage display” tabs respectively. You can set the display as “Color swatch” and brush up the shape and size of the colors that will appear on your website.

Attaching the attribute to the product variation type

Attributes need to be added to a particular product variation type that requires them. Product variation types are another important Drupal Commerce concept. You can create or edit them on the Product Variation Type page and also add your attributes to them. Or you can use the “Default” variation type. After that, you will be able to add product variations by specifying their color.

Adding product attributes to product variation types in Drupal Commerce

Let our team help you with the Drupal Commerce setup

The above is just the basic setup. We know from our experience that Drupal Commerce is a powerful platform with plenty of capabilities and plenty of possible settings for your online store. They are able to facilitate the e-commerce website management and boost online sales.

You can make your product selection work exactly as you need. For example, the image and price dynamically without a page reload every time a user clicks on a new attribute — using the decoupled Drupal Commerce approach or a decoupled shopping cart and benefiting from the capabilities of JavaScript frameworks to boost online sales.

Let our Drupal support and maintenance team guide you through the options and help you create the smooth setup depending on your requirements. What cannot be configured by built-in features, we will cover by the use of contributed modules or write custom ones specifically for you. Of course, we can also build an online store from scratch.

Use the best CMS features to boost online sales!

Mar 25 2020
Mar 25


  • Dozer -- Hide status bar icons on macOS

  • Bitbar -- Put anything in your Mac OS X menu bar


Can't get (real-time) notifications without checking mailbox or logging into when

  1. An issue having a new comment,
  2. A documentation page gets updated
  3. A new post is published to Planet Drupal
  4. A new Change Record is published

The 4 cases can be classified into two types:

  • Login required: 1.2, 3 is available on user's dashboard page, logging in is required
  • Login optional: 4 do not have to login, anonymous ussers is able to access Change Record list pages.

Proposed resolution

Using Bitbar, which can put anything in the menu bar by using any programing langage. and put Drupalicon in your macOS's menu bar!

See the demo: or

Login required

Using a HTTP client to visit the target page which contains information we care, further more, the HTTP client handles over the page content to a DOM parser to extract information we want, The last stop is to output them to a proper format following Bitbar's documentation. and display icon(s) in the menu bar.

An example:

By changing your credentials in the code, you should be able to see issue/documentation links of "My posts" and posts of "Planet Drupal" from you dashboard page as menu items on your macOs menu bar.

  1. # Change your credentials here

  2. username = 'YOUR_DRUAP.ORG_ACCOUNT'

  3. password = "YOUR_PASSWORD"

Read the documentation to get the example working for you.

Login optional

The process is similar to the above, just do not have to handle logging in.

See example:

This example pulls Change Records(CR) from, all three types of CR are pulled and display each item as menu item. The three types of CR are:

  • Published
  • Reviews
  • Draft

Also see the in the repo of the examples.


As more menus are putting into the menu bar, it's going to get crowded soon. So Here comes Dozer to hide some of them when necessary.

Dozer is a free and open-source project, an alternative of Bartender which is a payware.

PS: Python3 is used to write the examples.

Remaining tasks

Get ready your own Drupal menu bar.

User interface changes

Drupalicon conquers your menu bar.

Release notes snippet

  • Target OS: macOS
  • Target readers : Drupal contributors/Core contributors.
  • Target goal: Happy Drupaling!
Mar 25 2020
Mar 25

Every digital business owner strives to provide the most engaging experiences both for desktop and mobile users. They might want to build a mobile app. However, the task of great web development companies is to offer alternatives to every idea.

One of these interesting choices here is a progressive web app (PWA). Read on to learn more about PWAs, what they are, what makes them beneficial, as well as progressive web apps and Drupal integration.

What is a progressive web app (PWA)?

A progressive web application is a web application that loads like a usual website but delivers modern experiences similar to those in native apps. They include push notifications, offline work, device hardware access, etc. PWAs unite the features provided by modern browsers and the pros of mobile experiences.

Progressive web app example

Why use PWA? The PWA benefits

  • By integrating a PWA into your Drupal website, you enrich the latter with cool technologies and provide app-like experiences. This can boost your business significantly. Let’s go into more details and list some of the PWA benefits:
  • The cost of developing a PWA is lower than with native applications.
  • A progressive web app is also faster to build than a native app.
  • PWAs work for all users regardless of their browsers thanks to the progressive enhancement approach.
  • Progressive web apps can be easily added by users to the homescreen with no need to go to an app store.
  • They are responsive so they deliver smooth experiences across desktop, tablet, and mobile devices.
  • Features like push notifications are huge attention catchers able to significantly increase your user engagement.
  • PWA can work offline or on slow networks and load fast thanks to the use of service worker scripts, which improves user experiences and expands your reach.
  • PWA is secure thanks to the use of HTTPS that prevents data manipulations.

What’s inside? The PWA components

Every progressive web application has three key components:

  1. The app shell stores the basic JavaScript, CSS, and HTML needed for your application UI and quickly serves it from the cache.
  2. The service workers are JavaScript files that run on the background of browsers and serve the response from the cache to offline users, and can be scripted to provide push notifications, etc.
  3. The web manifest is a manifest.json file that holds your app configuration (name, look, color, logos, etc.) and allows your users to add the app to their home screen.

How to add PWA functionality to Drupal

There is a module for everything in Drupal. The integration of a progressive web application with Drupal is no exception. This integration can be provided with the Progressive Web App Drupal module.

The Progressive Web App module in Drupal

The Progressive Web App Drupal module injects the PWA features into your Drupal site without any complexities. It creates the standard setup, and JS developers are able to additionally write service worker scripts to further customize the app-like behavior of the PWA.

Here are some of the module’s features for the smooth Drupal and PWA integration:

  • The module has a service worker that takes care of caching and offline work. When active, the service worker makes the pages load faster. It provides the serving of pages from the cache. Among the additional tweaks, there are fallback images showing for uncached images.
  • The Drupal module creates a configurable manifest.json file with all the needed metadata. It allows the "add to home screen" prompt in eligible browsers.
  • Site admins are able to configure the manifest from the Drupal UI.
  • Other modules on the Drupal website can add their modifications to the manifest.

The module’s configuration page is found at admin/config/pwa/settings where you can fill in the necessary data in the manifest or change the provided defaults (your app name, description, default language, start URL, theme and background color, and much more). This page also includes the settings for your PWA’s service worker that out-of-box deals with caching.

Progressive Web App module in Drupal

Progressive Web App module in Drupal

Progressive Web App module in Drupal

System requirements for the Progressive Web App module

In order to use this PWA integration module, you will need to fulfil these two key technical requirements:

The PHP version on your server should be 7.2 or higher. The module creators plan to further raise this minimum PHP requirement in line with the upcoming PHP updates.

Your server has to support secure connections using HTTPS. This is required by the W3 specification.

Let our team help you with progressive web app and Drupal integration

If you are interested in a fast, engaging, and secure PWA for your Drupal site, our Drupal development team is ready to assist you.

We will perform the smooth integration and configure your PWA to behave in accordance with all your requirements, including the creation of custom service worker scripts. In addition, we will take care of the technical requirements for the integration (update your PHP and switch your site to HTTPS if it hasn’t yet).

Let’s discuss the details of your successful progressive web app and Drupal integration. Try a progressive web app and may it help your business progress!

Mar 25 2020
Mar 25

Laravel is a PHP framework that has witnessed comparatively less attention than CMS heavyweights like Drupal and WordPress and frameworks like Symfony, but it nonetheless offers several compelling advantages for enterprise website implementations. Recently, a large organization worked with Tag1 to move legacy databases into a more modern approach that, coupled with Laravel and Vue.js, led to considerable improvements in not only developer experience but also user experience.

Moreover, Laravel is an excellent tool for architecting custom applications with complex logic, all without any complexity offloaded onto the developer experience. Thanks to the Laravel ecosystem, you can have a working PHP application with APIs and a functional single-page JavaScript application in Vue.js with minimal overhead. Instead of having to define low-level properties like in Symfony or deal with too many premade assumptions like in Drupal or WordPress, you can focus on user workflows in Laravel and benefit from a more reasonable learning curve as well.

In this Tag1 Team Talks episode, László Horváth (Senior Laravel Developer at Tag1) joins guests Fabian Franz (Senior Technical Architect and Performance Lead at Tag1), Michael Meyers (Managing Director at Tag1), and your host Preston So (Editor in Chief at Tag1 and Senior Director, Product Strategy at Oracle) for a deep dive into why Laravel should be your choice when building a mission-critical PHP architecture that encompasses a decoupled front end in JavaScript and multi-level access control and permissioning.

[embedded content]

Mar 25 2020
Mar 25

Drupal CMS offers a rich user interface and powerful content editing experience. There are a lot of contributed modules that enhance the system and its editing experience. One of the projects I was working with called for concurrent editing implementation. Concurrent editing simply means allowing multiple editors to edit the same content at the same time, without the possibility of conflicts arising due to concurrent actions.

In today’s editorial landscape, content creators can not only access a document countless times to revise and update content but also work with distributed teams. For this reason, concurrent editing has become among the most essential and commonly requested features for any content management solution.

The project (Layout Engine) involved configuring pages and blocks of a mobile application through Drupal.

A single page of a mobile application consists of multiple sections, these sections could contain data as per user’s locations or any other criteria. A page in Drupal was primarily a content type. We used paragraphs to configure blocks which we call widgets. So basically, a banner on the homepage of a mobile application is a widget.

These pages and widgets were configured by our client’s marketing team. Any page on the mobile app could consist of 'N' number of widgets. Due to a large number of widgets present, it was difficult for a single user to be familiar with all of them. Multiple members of the marketing team worked on the app simultaneously, making it difficult to edit the layouts/widgets. 

Thus the client needed a system where multiple users could simultaneously edit the layouts and their widgets independently.

Collaborative editing has long existed as a concept outside the content management system (CMS). It is a limitation of Drupal at the moment, and we don’t see any solution for it in Drupal core soon. A big thanks to the members of the community who contribute their code in the form of modules making solutions available to the world in a quick google search. 

We explored a couple of modules which fulfilled our requirements to some extent.

| Paragraph Frontend UI

This module provides quick editing of widgets on the view page itself. 

A user won’t have to go to the edit page and then search for the widget to update and then save the whole node. He can do it quickly on the view screen. We believed this would allow multiple users to quickly edit the widgets and will solve the issues. But, it turned out that the module throws a deadlock error when multiple users are updating different paragraphs of the same node. Therefore, we discarded the possibility of using the Paragraph Frontend UI  module.

The next module we explored was the Paragraph Edit module. It provides a separate page to edit the paragraphs through the contextual links. It does not break when multiple users attempt to edit different paragraphs simultaneously. But the issue with this approach was that it supported separate editing only. So if a user had to create a new paragraph/widget, he/she had to go to the edit node form. The tricky part here is, if an editor is on the node edit form while some other editor made changes through the quick link, the current form will contain the old data. In this case, when a user saves the node, it will revert those changes to the previous version. We did not want that either.

| Conflict

It does not have any additional configuration attached to it. I am adding two screenshots below to show how it works. This is what the second user will see when the first user has already saved the node and content is in the database. To know more visit -

     Concurrent editing in Drupal 8           

Once the user clicks on the 'resolve conflicts' button, it shows two versions of each field, something like in the following screenshot. Users have to manually update the field accordingly and need to save the content again.

Concurrent editing in Drupal 8

This module is a good solution under the following instances:

  1. If the node form has a simple structure and the user can afford to update the content manually. In a complex architecture where we use paragraphs to provide flexibility to the editors, this will create a lot of confusion.

  2. It only works for two users as you can see in the screenshot above, it shows what is the difference in the server. If a third user is editing the content at the same time, it will override the changes of the second user.

| Content Lock (anti-concurrent editing)

As the name suggests this module locks the content for the first editor who started to edit the content. Any other editor will see the message and all the fields will be disabled for him/her.

Features of Content Lock (anti-concurrent editing): 

  1. The lock will break when the user saves the content. The other user will see the message and will know who is editing the content at the moment.

  2. If a user doesn’t save the content, it has a submodule called content_lock_timeout where we can set a time for the content to hold the lock. It breaks the lock on cron run as well as when the second user comes to the edit node.

  3. It has an option to manually break the lock as well, so a user with the permission to break the lock can also free the content from the editor.

The content lock was used until we had a proper solution for concurrent editing.

After countless discussions with the marketing team, we decided to provide a solution to overcome the concurrent editing problem. We decoupled all the widget creation as a separate node and referred those nodes into the Layouts. This way, everybody had control on their own widgets and they did not need to wait for the content lock to end.

If you happen to have a better solution for concurrent editing, we would love to hear about it! 

Mar 24 2020
Mar 24

If you have studied some form of software design or are into designing, you should be familiar 
with the terms - "UI" and "UX". Yet, sometimes we tend to use both these words interchangeably. 
So, what sets UI apart from UX?
UX design is what makes an interface functional in its simplest forms and UI design is what makes an interface appealing and beautiful.

UI-UX Design

What is a UI Design? 

User Interface is something that a user uses to interact with a product or a service. As with the design of user experience, user interface design is a complex and challenging task. It is responsible for translating the creation, analysis, content, and layout of a product into an appealing, guiding, and responsive user interface.

  • User Interface design is all about how the product’s interface looks. This considers all of the interface's visual and interactive elements— including buttons, icons, spacing, typography, color schemes and responsive design.
  • The aim of UI design is to visually direct the user through the interface of a product. It's all about having a good experience that doesn't take too much thought and effort from the consumer.
  • A good UI design ensures the design is consistent and aesthetically pleasing. 

 What is a UX Design?

User Experience is an overall experience of a user when they interact with the products or services.

  • User experience design is a method of improving and enhancing the functionality of the user-interaction.
  • UX concept is NOT about visuals; it's based on the overall experience.
  • UX isn't just about making the consumer satisfied, however. It is about helping the customer to accomplish their activities in the best possible way and attain business objectives.
Dribbble                                             Image source - Dribbble

User experience design is the process of designing and enhancing the consistency of a user's engagement with all facets of a business and thereby improving the user experience.
As of the current situation within the digital globe, every business tries to make an impact on user in order to multiply its sale and to provide a happening experience for a consumer all with help of User Experience and User Interface design.

How can a CMS like Drupal 8 help enhance the UX of a website? 

A Content Management System plays a key role in the success of a website’s UX design. Drupal 8 offers flexibility in customizing content as well as design. Let’s look at how is Drupal 8 a great choice of CMS if you are looking at creating compelling UX designs.

  • Page Speed – Fast-loading websites not only enhances the performance but also the overall user experience. Drupal 8 provides performance boosting features like advanced caching options, image optimization, code optimization, database optimization and more.
  • Responsive – With Drupal 8, responsiveness runs in the blood. Which means that all Drupal 8 websites are responsive out-of-the-box! And without a responsiveness, the UX of a website is incomplete.
  • Personalization – It has been proven that websites that offers personalized experiences see more conversions than websites without it. Drupal 8 offers various modules that let you personalize your content based on the user’s demographics, device information, date and time of login and more.
  • Multi-lingual – Did you know that only 20% of the world’s population can speak / understand English? To be able to provide a personal touch through the UX of a website, it is important to speak with the user in the language they are comfortable with. Drupal 8 offers multi-lingual support out-of-the-box with over 100 languages to choose from.
  • Headless Drupal – Decoupling Drupal gives UI/UX designers a lot more control over the design elements of a website. When front-end frameworks like ReactJS and Angular JS are leveraged with Drupal 8, the user experience can be enriched. 
  • Themes – The Drupal community has built hundreds of themes that can be adapted to any business requirements. You can find Drupal core themes that come out-of-the-box with Drupal 8 as well as third-party Drupal 8 themes. If none of them suit your needs, you can also customize a theme to have them tailor fit.

How does UX differ from UI?

Here is an analogy I like to use to describe the difference between both.
If you imagine the human body to be a product. The organs reflect the UX design: measuring and optimizing to support life and UI design reflects the body's cosmetics; their appearance, their senses yet their reactions. 
The key distinction to remember is this: UX design is all about the overall feel of the user while UI design is all about how the interfaces of the product look and work.

Dribbble                         Image source - Dribbble 

For instance, User Experience (UX) is mostly emotional and is the consumer's mental actions, like how a user reacts when using a product or what emotions he feels during the usage of a product.

It mostly deals with what goals users are trying to achieve via the product, what their needs are, what feelings are they experiencing, what strategy is to be applied, and what interactions are they likely to perform in order to reach their goals.

Whereas User Interface (UI) is tangible. It mostly deals with the visual hierarchy of the product, including buttons, typography, colors etc. UI designers basically have to deal with scalable designs and have to improve the user flows by reducing the time required for a user to reach his goal while making the product aesthetically pleasing and visually beautiful for the user.

Good and Bad UI/UX Examples

Let’s talk about a few bad examples of UI/UX

Distractions create bad first impressions                    Distractions create bad first impressions

When looking at the above example at the first sight, it gets rather confusing about what the website is all about. A user is shown various ads and unwanted information and is presented with a lot of information that is difficult to be processed, hence making users bounce off the website without even reading the news posting which they were looking for in first place.

bad ui/ux experiencebad-ui-ux

These are some more bad examples of UI/UX.

When looking at the above two images, a user gets confused and is likely to be diverted from his actual goals. In 2020, responsive designs are not a trend but a necessity. The above examples show the bad and harsh usage of colors and typography leading to confusion.

But not every design is bad. Let’s also talk about some of the very good examples of UI/UX.
The above example shows how a simple micro-interaction can make a user happy and engaged, leading to some immersive experience.

Mar 24 2020
Mar 24

Configuration management is one of the most prominent features of Drupal 8. You can easily import and export configurations using YAML files and also store them in the “config” table of the database. 

Given this, it has become a cakewalk now to pass commands in Drush and follow the steps required to export configurations from one environment and import it to another, thereby making it easier to manage them in code-base using the version-control system.

However, things turn out complicated when it comes to managing multiple site configurations that employ a “single” platform for streamlining common features across various brands.

For instance, there is information in the article that all brands want to use on their respective sites. The twist is that each brand wants to use different sets of fields and display pattern to showcase it on their site.

Thus,  the problem of this solution is to create one profile, “Core Platform” and place all common features for easy distribution and sharing across multiple brands. Further, these features should be pluggable as well available for each brand to use in the future.

This blog series (Part I & II) will help you understand the development process and maintenance of -

  1. common configuration across multiple sites
  2. Different configurations as per brands’ requirements
  3. Configurations as per the environment, and
  4. Usage of configuration Split Module and Configuration ignore


Please note that if configuration management is a new business for you, it’s highly recommended to go through the Drupal documentation first to acquaint yourself with configuration export and import commands.


Moving forward, let’s consider two cases to determine whether a feature should be brand specific or need to be pushed as part of a Core platform to become available for multiple brands. 


Case 1 :

Multiple brands have requested to introduce a new content type, “companies on the move” section, which lets anonymous users submit their entries in the same and complete the process by going through a checkout process. This will display users’ submitted profile on /company-on-the-move listing page.

So, these are the following questions that crop up, considering the case I:


  1. Which multiple brands have requested this new content type?
  2. Is there anything specific that brands need to be configured or displayed differently for them?
  3. Are the display items (fields) on /company-on-the-move listing page the same across all brands?


Now, if answers to the above questions involve “brand A, B, C, D, and Nothing”, i.e., nothing specific needs to be developed and displayed for any brand, then it is an indication for core platform features.

Besides, these features in the core can be employed by any brand, anytime in the future.


Case 2 :

Brand A and B want to add a specific new field for their editors to company content type, which would be accessible for them only. In this case, we’ll have the following info available across all brands:

  • Company Content type with all the required fields.

It is obvious that only Brand A & B require this feature, so it will be known as “Brand Specific”.

It can be achieved through the following steps-

  1. Create the requested fields in the "Common Core" platform and push it to all brands and write hook_form_alter() to hide that specific field for all other brands except Brand A and Brand B.
  2. Create the requested field just for Brand A and Brand B and push the configuration for these 2 brands.


Since our objective is to manage configurations across multiple brands, we’ll take forward the 2nd approach from here onwards.

Learn more about building a Drupal multisite from here-

Development Process 

With a clear understanding of the features’ availability and unavailability for multiple brands, developers can find it easy to jump onto the implementation part.

Colorful balls in various shelves

Case 1 :

  1. Create the new content type on our "Core platform" local site and place the configurations exported (field storage, field, view, panel page for company listing page, form display, view display) under the Core configuration sync folder.
  2. Upon successful code merge and deployment, run CIM on all brands to get the new content type across all brands.

Case 2:

  1. Create fields for just Brand A and Brand B
  2. Export and keep the field.field..... and core.entity_form_display... YAML configuration file in brand-specific configuration sync folders.
  3. On deployment, run drush cim --uri and drush cim --uri=brand_b to import the required configuration files for just these 2 brands.
  4. In this case, other brands will continue using the form display configuration file from Core (the main) configuration sync folder.

Summing up-

Thus, you can decide and develop Core/ brand-specific features hassle-free by following the above-mentioned steps. 

And to learn more about the development process and implementation methods, stay tuned for the next part of the blog, “Configuration Management in Action”.

Keep Coding!

Mar 23 2020
Mar 23

With Drupal 9 coming this summer, my team at the Eberly College of Science at Penn State felt it necessary to get all of the custom modules we have written (or are mission critical contrib modules) updated and as future-ready as possible. A happy side effect of that process is that we've taken the time to modernize the code in the Drupal 8 version of Cosign ( After joining the Cosign project, I'm happy to announce that we have released an official Alpha version of the Drupal 8 version of Cosign. 

There is still room for work to be done, primarily documentation and unit tests, but the functionality is there. Cosign is now correctly using dependency injection and has had any (D9) deprecated code replaced. We're also doing our best to follow Drupal code standards across the board. 

If you are using Cosign and have some time to help with testing, writing tests, or documentation, please let me know! 


Mar 23 2020
Mar 23

We did it!

  • 3370 Zoom sessions
  • 2086 minutes of recordings (& captions!)
  • 234 peak simultaneous participants
  • 143 new Slack members
  • 41 Discord accounts 
  • 18 first-time contributors trained
  • 3 movies watched remotely
  • 1 incredible virtual event!

MidCamp 2020 is in the bag, and what a whirlwind it was. Over the course of 10 days our volunteer organizers and speakers worked tirelessly to pivot our usual in-person format to 100% virtual, and it wouldn’t have been possible without every single one of you who joined us. 

Through the hard work of the Drupal Recording Initiative and with thanks to Bounteous, you can catch up on anything you missed on YouTube and In a few days, those videos will be supplemented with professional captions by ACS Captions, with thanks to Clarity Partners and Pantheon.

As you’re reviewing sessions, please help our speakers by providing feedback for any sessions you attended or watch via their session page on Finally, please let us know what you thought of the event as a whole on our MidCamp 2020 Survey. The reviews are already coming in, and we’re happy to have had the opportunity to share these days with you.

A+++ would MidCamp again.
- Todd Ross Nienkerk, CEO, Co-Founder at Four Kitchens

MidCamp will return. Stay tuned as we will announce 2021 dates when we can.

Mar 23 2020
Mar 23

In my previous blog post about a few of my favorite Webform things, I expressed my appreciation for the fact that that "most of the code within the Webform module is reusable and extendable." Writing that blog post helped me re-organize and improve my presentation titled, Webforms for Everyone. While updating my presentation, I found explaining and showing how the Webform module’s APIs are reusable is very challenging. As the Webform module has grown and gotten more complicated, I have continually improved the examples and demos included in the module. These examples have helped developers understand how to extend the Webform module. As a result, I decided the best way to show how the Webform module's APIs - specifically form elements and behaviors - are reusable, was to create an example.

The Webform Custom (Configuration) Form example

The goal of the Webform Custom (Configuration) Form example is to show how to leverage Webform APIs outside of the Webform module. For instance, webform elements can be used within a Drupal configuration forms. A very basic reusable enhancement is attaching the Webform module’s JavaScript to warn users about unsaved changes.

A more advanced example is reusing the Webform module's multiple element widget to collect rich data. Recently, I had to create an arbitrary list of node ids stored within a configuration file. In doing so, I was able to use Drupal’s entity autocomplete element combined with the Webform module’s multiple element support.

The below example shows how to use a multiple entity autocomplete element with the unsaved changes behavior within a configuration form.

Webform Form API example

Webform Form API example

The above example was created using the below code snippet.

Using a code generator to create examples

Code generators like Drupal Console are incredibly valuable for creating boilerplate code, particularly for complex APIs or concepts. Drupal Console can also create an entire skeleton of a custom module, which inspired me add a code generator to the Webform Devel module. The Webform Devel module's code generator shows how to convert a Webform to Form API form.

The Webform Devel module, included with the Webform core module, now adds a 'Form API' tab within the configuration 'Export' tab. The 'Form API' tab includes all the boilerplate code required to take a Webform and convert it to a custom configuration form. The generated code consists of the form class definition, route definition, default configuration, and even the custom module's info file. All of the example code can be downloaded as a zipped archive, which can then be installed on any Drupal 8 website.

The below screencast recaps some of the examples discussed and illustrates the workflow and concept behind exporting and converting a Webform into a custom Drupal configuration form.

Something about this feature is pretty mind-blowing. When I included the above demo at the end of my "Webforms for Everyone" presentation at DrupalCampNJ, I managed to get every multitasking developer to look up from their laptops.

I am excited about this new feature and approach because it makes our job as developers a little easier, and people's end-user experiences a little better.

I hope you have fun building out awesome Webform and then exporting them as configuration forms into a custom module.

Backing the Webform module

Open Collective is providing us, Drupal, and Open Source, with a platform to experiment and improve Open Source sustainability. If you appreciate and value what you are getting from the Webform module, please consider becoming a backer of the Webform module's Open Collective.

Almost done…

We just sent you an email. Please click the link in the email to confirm your subscription!


Mar 23 2020
Mar 23

Duplicating content has been a challenge of epidemic proportions on the internet since ages. In fact, it has become a child’s play for everyone to copy-paste a webpage’s online content without even realizing the intricacies of such issues.

Besides, keeping duplicate or similar copies of the same content online implies that you are competing against yourself at the loss of your search engine visibility. Google has explicitly stated that any site that uses/ keeps duplicate content will be penalized.

This blog will shed light on the reasons that cause duplicate content, it’s common reasons, and Drupal modules that can help enterprises in dealing with the same issue.

What Causes Duplicate Content?

Duplicate content is generated when multiple versions of a single page are created. In layman's terms this generally happens when two page share similar content.

However, it happens multiple times that the user unintentionally copies the content from the existing web page, yet it can happen and they have to face the consequences.

Which leaves us with two types of major categories that these sources fall into:

  1. Malicious
    This comprises those scenarios where spammers post content from your website without your permission.
  2. Non-malicious
    The non-malicious duplicate content can have different origins.
    1. Discussion forums that generate both the standard as well as stripped-down pages (targeted for mobile users)
    2. Printer-only web page versions, or
    3. Same products displayed on multiple pages of the eCommerce site

Additionally, Duplicate content can be either identical or similar as well. Given this, below are the 7 most common types of duplicate content mentioned-

1. Scraped Content

Some websites scrape content from other reputable websites thinking that an increased volume of pages on their site will be a good marketing strategy, irrespective of the relevance or creative spirit of that content. 

Rather, this action fails to add value for your users if you are not providing additional useful services or content on your site. in fact, it may also lead to copyright infringement in some cases. 

Some examples of scraping include-

  1. Sites that replicate and republish content from other sites without adding any original content or value to it.
  2. Sites that copy content from other sites, tweak it  a bit, and republish it
  3. Sites that regenerate content feeds from other sites without offering any benefit to the user 
  4. Sites aimed at embedding content such as video, images, or other media from other sites without considerable added value to the user.


2. WWW & non-WWW, and HTTP and HTTPs Page Versions Of Website

When both versions of the site, i.e., WWW or non-WWW, are accessible, it leads to duplication of content.

Being the oldest trick, search engines also get confused at times and get it wrong. 

Another scenario is HTTP vs HTTPS - these two versions also lead to serving out duplicate content to users.

3. Printed-Friendly Versions

If your CMS is capable of generating printer-friendly pages which you link with your article pages, Google can easily find them, unless you specifically block them. 

Now, which version would you like Google to show? The one with your ads and peripheral content, or the one that shows your article only?

4. User Session IDs 

Keeping a tab on your visitors and allowing them to store, add, and buy products from their shopping cart, you need to give them a session.

A session comprises details in brief about the visitor like what he did on your site and can also contain things like the items in their shopping cart.

To retain that session as a visitor hops from one page to another, the unique identifier for that particular session, called the Session ID needs to be stored somewhere.  The usual place to do so is cookies. However, search engines don’t usually store cookies.

During that point, few systems slip back while using Session IDs in the URL. This implies that every internal link on the website gets that Session ID added to its URL, and since that Session ID is unique to that session, it generates a new URL, and thus duplicate content.

5. URL Parameters Used For Tracking and Sorting

Another reason for duplicate content is the URL parameters that don’t update the content of a page, for example, in tracking links-

These two above shown URLs are not the same URLs for the search engine. 

Though the latter one allows you to track the source of traffic on your site, but it might also make it harder for you to rank well, an unwanted after effect!

This is not limited to tracking parameters only but with every parameter than you can add to a URL without changing the important information. Whether the parameter being used is for” changing the sorting on a set of products or for “showing another sidebar”- all of them cause duplicate content.

Modules That Help Deal with Duplicate Content in Drupal

Following Drupal modules can prove useful in dealing with duplicate content-

  1. Global Redirect Module The issue that comes up with the alias system in Drupal is that the default URL remains there, i.e., you can still find 2 URLs pointing towards the same content on your website. However, search engine bots are also smart enough to find out duplicate content easily, thereby lowering your website rank on search engines.

    Thus, the Global redirect module checks if there is an alias already for the existing URL and if it does, then it redirects to the alias URL.

    The module is also responsible for eliminating the trailing slash in the URL, cross-checking that clean URLs are being used correctly and checking permission and access to nodes, URLs.

  2. PathAuto One of the prominent modules of Drupal, Pathauto, dedicates itself in creating the path/URL aliases automatically for the contents (nodes, taxonomy, terms, users) depending on the configurable patterns.

    For example, you configured a blog entry like /category/my-node-title, so Pathauto will instantly generate an SEO friendly URL, which uses tokens and can be altered by administrators.

  3. Intelligent Content Tools An  important tool for website designers and content editors, Intelligent Content Tools module offers three functionalities-
    1. Auto-Tagging
    2. Text Summarization, and
    3. Identifying Duplicate Content

      This smart module, based on Natural Language Processing, keeps you up-to-date on any duplicate content present on the site and then, accordingly identifies and corrects the plagiarized content.

      However, this module does not come under the security advisory policy of Drupal.

  4. Taxonomy Unique Drupal, by default, allows its users to create identical terms in the same vocabulary. To resolve this, Taxonomy unique ensures that no taxonomy term is saved when there is already one existing with the same name in the same vocabulary. Thus, it assures that the names saved are unique.White background with text over itFurther, you can configure it individually for each vocabulary alongside setting up custom error messages in case a duplicate is found.
  5. Suggest Similar Titles Suggest Similar Titles module ensures that titles are not duplicated for any type of content. Its mechanism encompasses matching the proposed titles with the node titles of the existing content type to ensure that they are not similar to the already existing ones.Module working shownThis aids admins/users to avoid replication of content at the site. Additionally, it provides settings page where you can tweak the following settings-
    1. Activate this feature for any content type(s)
    2. Enter the keywords in title comparison that you want to be ignored
    3. Choose the maximum number of titles that you want to show up as a suggestion
    4. Select whether this module should consider node permissions before showcasing node title as a suggestion
    5. You can enter the percentage of similarity between the titles. For instance, if you enter 68, then at least 68% matching titles will be considered similar.

Wrapping up

Search engines are always looking out for unique and quality content that is engaging and informative at the same time. Enterprises might find it difficult to create a 100% duplication free website but Drupal and its modules can be your silver lining for your company. Besides, your search engine rankings can improve greatly if you avoid the mistakes mentioned above.

Planning to migrate your website to Drupal? Drop us a line and our experts will be happy to assist you.

Mar 23 2020
Mar 23

Agiledrop is highlighting active Drupal community members through a series of interviews. Now you get a chance to learn more about the people behind Drupal projects.

Meet Tara King, Developer Outreach Manager at Pantheon. Her work focuses mostly on working with the community and helping to make it more diverse and inclusive. Check out our interview to learn more about the power of the Drupal community and what initiatives are taking place to improve its health even further.

1. Please tell us a little about yourself. How do you participate in the Drupal community and what do you do professionally?

I’ve always loved the Drupal community, but I really found my home in Drupal Diversity & Inclusion (DDI). It’s an all-volunteer community group dedicated to making the Drupal community a safer and more welcoming place for under-represented Drupalists. I’m currently serving as the leader of DDI.

I’m also passionate about the Core Mentoring team--DrupalCon contribution days are exhilarating, and the mentoring team makes that environment productive and fun for newcomers. And I assist the CWG with membership by recruiting subject matter experts and people with an interest in community health.

Professionally, I’m the Developer Outreach Manager at Pantheon. I’m responsible for supporting our developer community (including on our forums & our community Slack). I serve as a bridge between our internal teams and our customer base, with a particular focus on diversity, inclusion, equity & accessibility. I also attend Drupal and WordPress events to connect with our community, share best practices, and generally spread the open source CMS love. 

2. When did you first come across Drupal? What convinced you to stay, the software or the community, and why?

I discovered the Drupal community by attending local Drupal Meetups when I was in Minneapolis, MN. I was gifted a Drupal 6 site as the home for my dance company...but the site needed a lot of maintenance. As I learned how to use it, I got really curious about how the whole thing worked. I remember the first time I figured out how to make a view! Powerful stuff.

Over time, I kept attending events, started going to DrupalCon and eventually became a self-taught (or, as I prefer, community-taught) backend developer. I worked at a variety of agencies as well as in-house at Universal Music Group before coming to Pantheon. 

But I’d say that the community really sealed the deal. I went to DrupalCon Portland and fell in love with the whole experience: the people, the work they were doing, and the way they all worked together. 

3. What impact has Drupal made on you? Is there a particular moment you remember?

Drupal has changed my life! I used to have a job without a lot of prospects for growth and no sense of community or purpose. Leaving that industry and entering the Drupal community opened really exciting doors for me, provided me with challenging work, and (to be totally forthright) has really increased my financial stability. That last part is a big driver in why I want to open up Drupal to as many under-represented folks as I can. It’s been a privilege to enter this community and it’s something I’d like to extend to others.

4. How do you explain what Drupal is to other, non-Drupal people?

Short answer: It’s a tool for making websites!

But most of the people who spend any time with me get curious about why I have so many Drupal t-shirts and talk so much about this weird Drupal thing, so I usually get to go into it a little more. I like to explain, if I have the chance, about what it means to work on an open-source project, and the amazing power of Drupal to easily build a robust website. 

5. How did you see Drupal evolving over the years? What do you think the future will bring?

Since I started with Drupal 6, there have obviously been major changes both from a software and from a community perspective. I’m really excited about integrated composer support in the 8.8 release--Drupal 8 is so easy to use and I think integrated composer will make it even better.

I hope the future brings a substantially more diverse Drupal community. Our software powers websites used by people around the world: I want to see the developer community reflect all the people who are already end users of the Drupal software. 

6. What are some of the contributions to open source code or to the community that you are most proud of?

I’m really proud of my role in starting the Drupal Diversity Contrib Team. Contribution and community involvement have been such a big part of my success in Drupal, so I wanted to find a way to help marginalized people learn to contribute to Drupal. 

The group is currently revamping the Gender Field module under the leadership of Alex McCabe, and we have contribution tables at DrupalCon North America & DrupalCon EU every year.

7. Is there an initiative or a project in Drupal space that you would like to promote or highlight?

DDI has been working hard to provide speaker training for all underrepresented Drupalists. The training was created by Jill Binder from the WordPress community where it had a lot of success, so we’ve brought it to Drupal to improve the diversity of people speaking at our events. 

We just offered it as a virtual half-day training at MidCamp--obviously it’s been a bit challenging to find out where else we can offer it right now. If you’d like to bring the workshop to your community virtually, let us know! 

I’m also excited about the CWG expanding into more proactive community health work. With all the disruption currently happening, it’s a great time to get involved in our global Drupal community and give back.

8. Is there anything else that excites you beyond Drupal? Either a  new technology or a personal endeavor. 

I’m really excited to be launching the second year of a table-top gaming convention I co-founded: MañanaCon! We may be rescheduling the con to later in the year, but I’m still excited for it. We wanted to contribute to our local community while having some fun, and it’s been a great adventure so far.

We invite you to come play table-top games of all kinds (board games, collectible card games, role playing games, and more!) for a weekend in the high desert of Albuquerque, New Mexico! 

Mar 22 2020
Mar 22

We talk with Tearyne Almendariz, Frontend developer for Lullabot about empowering volunteers, Albert Hughes, Sr. Manager of Marketing Technology for Memphis Basketball, LLC the parent company of the Memphis Grizzlies, and Chris Weber is back with another episode of The Change Record.

Drupal is a box of opportunity.

URLs mentioned

DrupalEasy News



Subscribe to our podcast on iTunes, Google Play or Miro. Listen to our podcast on Stitcher.

If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or corrections. If you'd rather just send us an email, please use our contact page.

Mar 20 2020
Mar 20

Huge thanks for responding to our call for contributors posted at the beginning of the month. All must-have beta requirements have been completed, so, we've released Drupal 9.0.0-beta1! Drupal 8.9.0-beta1 will be released next week (the week of March 23).

The release of the first betas is a firm deadline for all feature and API additions. Even if an issue is pending in the Reviewed & Tested by the Community (RTBC) queue when the commit freeze for the beta begins, it will be committed to the next minor release only.

  • Developers and site owners can begin testing the betas after their release.

  • Sites must be on 8.8 or later to update to 9.0.0-beta1. Therefore, we will also provide bugfix releases of 8.8 and 8.7 that resolve known upgrade path criticals, so sites that have not been able to update to 8.8 can test the upgrade.

  • Once 8.9.0-beta1 is released, the 9.1.x branch of core will open for development. This branch is where feature and API additions should be made. All outstanding issues filed against 8.9.x will be automatically migrated to 9.1.x.

  • Alpha experimental modules have been removed from the 8.9.x and 9.0.x codebases (so their development will continue in 9.1.x only).

  • Additional fixes will be committed to 9.0.x under the beta allowed changes policy through the end of the beta phase on April 28.

  • The release candidate phase will begin the week of May 4th.

See the summarized key dates in the release cycle, allowed changes during the Drupal 8 and 9 release cycle, and Drupal 8 and 9 backwards compatibility and internal API policy for more information.

Drupal 9.0.0 and Drupal 8.9.0 are both scheduled to be released on June 3, 2020.

Bugfixes and security support of Drupal 8.8 and 8.7

Drupal 8.8 will receive additional bugfix releases through May 4, 2020, and it has security coverage through December 2, 2020. Drupal 8.7 has security coverage until the release of 8.9.0 on June 3.

Mar 20 2020
Mar 20

Huge thanks for responding to our call for contributors posted at the beginning of the month. All must-have beta requirements have been completed, so, we've released Drupal 9.0.0-beta1! Drupal 8.9.0-beta1 will be released next week (the week of March 23).

The release of the first betas is a firm deadline for all feature and API additions. Even if an issue is pending in the Reviewed & Tested by the Community (RTBC) queue when the commit freeze for the beta begins, it will be committed to the next minor release only.

  • Developers and site owners can begin testing the betas after their release.

  • Sites must be on 8.8 or later to update to 9.0.0-beta1. Therefore, we will also provide bugfix releases of 8.8 and 8.7 that resolve known upgrade path criticals, so sites that have not been able to update to 8.8 can test the upgrade.

  • Once 8.9.0-beta1 is released, the 9.1.x branch of core will open for development. This branch is where feature and API additions should be made. All outstanding issues filed against 8.9.x will be automatically migrated to 9.1.x.

  • Alpha experimental modules have been removed from the 8.9.x and 9.0.x codebases (so their development will continue in 9.1.x only).

  • Additional fixes will be committed to 9.0.x under the beta allowed changes policy through the end of the beta phase on April 28.

  • The release candidate phase will begin the week of May 4th.

See the summarized key dates in the release cycle, allowed changes during the Drupal 8 and 9 release cycle, and Drupal 8 and 9 backwards compatibility and internal API policy for more information.

Drupal 9.0.0 and Drupal 8.9.0 are both scheduled to be released on June 3, 2020.

Bugfixes and security support of Drupal 8.8 and 8.7

Drupal 8.8 will receive additional bugfix releases through May 4, 2020, and it has security coverage through December 2, 2020. Drupal 8.7 has security coverage until the release of 8.9.0 on June 3.

Mar 20 2020
Mar 20

In previous article we have seen how we create a very simple theme with 1 main content region.

theme admin

Lets look now at the custom module to handle theme switch and content display.

Part 2: the custom module

The module called "land_page" structure is as follow:


Lets look at the most important parts specific to the land page. : this is the standard module info settings.

land_page.rounting.yml : in this file we will define our land page routes. Those route will be the reference to switch theme. I.e.

path: '/land-page _controller: '\Drupal\land_page\Controller\Controller::defaultLandPage'
_access: 'TRUE'

The next important part is the class that manage the theme switching in ThemeNegotiator.php (see Drupal):

 * @file
 * Contains \Drupal\land_page\Theme\ThemeNegotiator
namespace Drupal\land_page\Theme;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Theme\ThemeNegotiatorInterface;
class ThemeNegotiator implements ThemeNegotiatorInterface {
     * @param RouteMatchInterface $route_match
     * @return bool
    public function applies(RouteMatchInterface $route_match)
        return $this->negotiateRoute($route_match) ? true : false;
     * @param RouteMatchInterface $route_match
     * @return null|string
    public function determineActiveTheme(RouteMatchInterface $route_match)
        return $this->negotiateRoute($route_match) ?: null;
     * Function that does all of the work in selecting a theme
     * @param RouteMatchInterface $route_match
     * @return bool|string
    private function negotiateRoute(RouteMatchInterface $route_match)
        if ($route_match->getRouteName() == 'default_land_page')
            return 'ek';
        return false;

When the visitor navigate on the website, the theme negotiator will check if the route = land page route and sitch to the appropriate theme.

In order to achieve the above you need to declare a service. :

        class: Drupal\land_page\Theme\ThemeNegotiator
          - { name: theme_negotiator, priority: 1000 }

In the Controller.php we will create the function that is called in the land_page.routing.yml (defaultLandPage()):

 * Default land page
 * @return array
 public function defaultLandPage() {   
    $items = [];
    $items['asset'] = drupal_get_path('module', 'land_page') . "/assets/";   
    return array(
        '#theme' => 'land_page',
        '#items' => $items,
        '#title' => '',
        '#attached' => array(
            'library' => array('land_page/land_page'),

In this function we define which template to use, we pass some $items for content and attach our library.

The them template is defined in land_page.module :

 * Implementation hook_theme().
function land_page_theme() {
  return array(
    // default
    'land_page' => array
      'template' => 'land_page',
      'variables' => array('items' => array(), 'data' => array()),

The library is defined in land_page.libraries.yml . Library will be very important as it will define all the custom css, js or external resources needed to render the page. A simple example of library  that include custom css, js and fonts will be:

  version: 1
      //,500,600&display=swap: { type: external }
      css/land_page.css: {}
    js/js.min.js: {}
    js/land_page.js: {}

In the hook_theme(), the template called is "land_page" which is a twig template under template folder: land_page,html.twig. In this template you will build your html content to render the actual land page. This is where your creativity will start.

On big advantage of twig templates is that you can insert content from other Drupal source like webform or existing blocks directly into the land page.

Now you can install your module, navigate to your /land-page url and access to your land page content.

Mar 19 2020
Mar 19

It's a very sad week for us at Hook 42. COVID-19 has hit our clients and our families hard, and we regret to announce that we're closing up shop at the end of the month.

Hook 42 has been driven by our core values since we started in 2012: honesty, quality, community, ongoing improvement, work/life balance, and humor. We've loved being part of the open source community, in particular, the Drupal community all these years. We will always have fond memories of working with an amazing team, great clients, and wonderful community members.


drupal drop held up by community members with phrase it takes a village

The biggest reason we focused on Drupal all these years was because of the awesome people in the Drupal community. We've had so many fun and interesting times at Drupal events around the world, both big and small. From so many DrupalCons to the Santa Cruz and SF Drupal User Groups to BADCamp to Stanford Web Camp, it's always been a joy to hang out with the community at BoFs, sessions, after-hour events, and our favorite "hallway track".

We sincerely hope that we've made a positive impact on the Drupal community. We have engaged in many ways, through speaking, organizing, volunteering, mentoring, training, and code contributions, because we believe in open source and we believe in actively participating in the community to make it a better place for everyone.

As individuals, we hope to continue to be involved in open source communities in the future and look forward to seeing your wonderful faces again. Please feel free to reach out to us individually to connect.

Clients & Partners

We've had some amazing clients and partners along the way and want to give a big thanks to those both past and current. We wish you all the best. Please keep in touch!


We'll miss the Hook 42 team so much! We want to thank everyone on the team from the bottom of our hearts for being part of the Hook 42 family. We also sincerely thank all past "alum" team members as you are an essential part of our history.

The team has been an amazing bunch to work with, and you'd be lucky to work with them too. They are brilliant and supportive and always determined to do a great job. They go above and beyond to help each other, even now, during these difficult and trying times.

Here they are in alphabetical order with a short blurb that doesn't do them justice. Please reach out to them if you are looking for amazing team members. Contact us directly if you want any additional information. They all have our sincere endorsements.

Note: We've worked with many other great team members not listed here but we've focused on people who are either current employees or contractors who've recently worked 15+ hours/week for several months.

Chris Darke | Senior Developer

Chris is a veteran on the team and is open to working on almost anything. He's a versatile full stack developer who's got strong expertise in Drupal, React, Elasticsearch, and AWS microservices. When not geeking out, he's also keen on the outdoors and enjoys scuba diving, biking, surfing, and photography. We'll miss Chris' British accent and warm humor.

For more details, check out Chris' profiles: Hook 42 | LinkedIn |

Darryl Richman | Senior Developer

Darryl's been creating awesome Drupal sites since 2007 and has been with Hook 42 since 2013! With an eye for detail, he's a solid backend developer who's well versed in module development, site building, databases, and migrations. When not coding, Darryl is often traveling around the US and Europe on his motorcycle. We'll miss hearing about Darryl's grand adventures and getting his advice on beer and BBQ.

For more details, check out Darryl's profiles: Hook 42 | LinkedIn |

Ellen Doornbos | Developer

While one of our newer team members, we've been super impressed with Ellen's attention to detail, communication, and positivity. She's a certified accessibility expert and a great backend developer. She has helped our team with automation tools, migrations, audits, custom modules, and even some front-end theming. When not doing tech, Ellen can be found crafting or in the garden cultivating her wildflowers. We'll miss Ellen's earnestness and helpfulness.

For more details, check out Ellen's profiles: Hook 42 | LinkedIn |

Jason Flatt | Senior Developer

Jason has been with the team a long time and his attention to detail and dedication is amazing. He's a strong backend developer who can architect great solutions with Drupal or Backdrop, and has been working with Drupal since 2004. When Jason's not working, he's spending time with his family, or working on personal software projects because he enjoys software development so much. We'll miss Jason's dry humor and straightforwardness.

For more details, check out Jason's profiles: Hook 42 | LinkedIn |

Jonathan Daggerhart | Architect

Jonathan is a very experienced architect and full stack developer who can tackle any Drupal or WordPress project with ease. He can create solid modules, plugins, and themes of any complexity with smart architectures that follow best practices. Jonathan has been a great mentor to others on the team, taking personal interest in the growth and success of every team member who reaches out for help. When not doing tech, he enjoys role-playing games and watching movies. We'll miss Jonathan's Southern accent and charm.

For more details, check out Jonathan's profiles: Hook 42 | LinkedIn |

Joseph Flatt | Developer

Joseph is one of the youngest Drupal developers we've known, but don't let that fool you. He's a very experienced backend developer who started programming in his teens. Joseph is skilled with both Drupal and Backdrop. Joseph has a passion for improving website performance and solving Rubik's cubes. We'll miss hearing about Joseph's latest personal record-breaking Rubik's cube solves on meetings.

For more details, check out Joseph's profiles: LinkedIn |

Kristen Littlefield | Project Manager

As one of the newest team members, Kristen dove in and picked up a bunch of client projects without missing a beat. She's a veteran PM, mostly in the web development space, whether it be a Drupal or WordPress website and a focus on digital accessibility. When not managing web projects, she gracefully manages a busy household and enjoys hosting football parties. We'll miss her compassion and fun-loving spirit.

For more details, check out Kristen's profiles: Hook 42 | LinkedIn

Melissa Kraft | Project Manager

Melissa joined the team when there was a huge need for project management and she didn't even bat an eye. We were amazed at how little time it took to transition the projects to her and getting feedback from the clients on how impressed they were with her skills. Melissa has worked with web projects for many years and it shows. She's also great at whipping up new recipes for her family and friends. We'll miss Melissa's candor and upbeat attitude.

For more details, check out Melissa's profiles: Hook 42 | LinkedIn |

Lindsey Gemmill | Senior UX Designer

Lindsey's title is Senior UX Designer, and she has amazing design, UX, branding, and accessibility skills (a Certified Web Accessibility Professional). If that isn't enough she has also been our entire marketing department. She ran our social media, created landing pages, wrangled the team to write blog posts, created marketing roadmaps, rebranded the company, and much more. She's incredibly fast, creative and proactive. When unplugging, Lindsey likes to go to the beach and camping with her dogs. We'll miss Lindsey's can-do attitude and passion.

For more details, check out Lindsey's profiles: Hook 42 | LinkedIn |

Michelle Darling | Front End Developer

Michelle is our newest team member and in a very short time has shown us that her capabilities extend well beyond our expectations. Michelle showed off her serious front-end mastery by jumping right into projects that needed her expertise. Whether it's Drupal, WordPress, or Shopify, she's got the front-end covered while ensuring accessibility and usability are front and center. When not at work, Michelle can be found outdoors on a hike, reading, and enjoying music. We'll miss Michelle's determination and good attitude (and her great hair!).

For more details, check out Michelle's profiles: Hook 42 | LinkedIn |

Ryan Bateman | Architect

Ryan Bateman started with Hook 42 as a developer and quickly proved his chops to be promoted to senior developer and then architect. He's a very skilled full stack developer in Drupal, React, Gatsby, among other web systems and frameworks. When not producing awesome websites or mentoring team members, Ryan can be found doing all-things-outdoors in Alaska, or even hosting his own radio show. We'll miss Ryan's conscientiousness and thoughtfulness.

For more details, check out Ryan's profiles: Hook 42 | LinkedIn |

Ryan Nelson | Director of Operations & Projects

Ryan Nelson has been an integral part of the team for almost a year and worked closely with Aimee in a previous company. He is a master of calm and can talk with anyone about anything. With 20 years' industry experience under his belt, he helped with so many things that it's hard to list but includes strategy, hiring, operations, HR, project management, process improvement, accounting, and people management. He's been the "go to" person on the management team for anything and everything. When not at work, Ryan enjoys traveling the globe (he has been to 5 continents!) and spending quality time with his wife. We'll miss Ryan's pleasantness and good humor.

For more details, check out Ryan's profiles: Hook 42 | LinkedIn |

Will Long | Senior Developer

Will's a very seasoned senior Drupal and PHP developer who you can throw any project at. Whether its complex business logic, a difficult migration, or streamlining a CI environment, he thrives on solving difficult problems. When not in the tech world, Will enjoys hanging out with his family and friends. We'll miss Will's positivity and grit.

For more details, check out Will's profiles: LinkedIn |

What's Next?

As one door closes, others open. What's next for the amazing people that were part of the Hook 42 adventure?


We were planning on going to DrupalCon Minnesota as a team. Sadly, that won't happen. But Hook 42 has four confirmed speakers: Jonathan, Ryan, Aimee & Kristen. Aimee & Kristen still plan to speak at DrupalCon, and we're hoping to meet up with Hook 42 alums at the event when it does happen. We have other events penciled in as well such as Stanford Webcamp, GovCon, and BADCamp, so we're sure we'll see you in the Drupalverse in the future.

If you are looking for speakers, mentors, volunteers, trainers, etc., ping us and we'll see what we can do!


We're placing some clients with the team members to continue projects. For other clients, we've been reaching out to web agencies who might be a good fit for future support.

If you are potentially interested in client introductions, please let us know and provide your current rate sheet or typical blended rate, so we can see if it aligns with current contracts. We will only introduce clients if it is a good fit for the client and for the agency or contractor.


The team members above are open to new opportunities. We can vouch for them and they'll vouch for each other. Maybe grab a few and you'll have a ready-made team! :)

If you have contract or employee opportunities, you can also send them to us directly and we'll pass along the information as we'll be in communication with the team in the coming weeks to help find them new work homes.

Aimee and Kristen

illustration of kristen and aimee

With Hook 42 going away, Aimee & Kristen will be spending time with their families and figuring out what the future holds. We could not have created such a wonderful company without the love and support of our friends and family. Thank you for the many hours of support you have given the both of us over the years.  We are open to discuss opportunities!

Aimee is passionate about accessibility, multilingual, and web architectures. After a much-deserved break to care for herself, her family and to dance. Aimee is looking forward to opportunities to follow her passions to support learning, growth, and community. She’ll be finally back in the Drupal issue queues instead of mentoring and supporting other’s contributions in the queues - she’s missed the hands-on work and loves the technology. 

To connect, check out Aimee's profiles: Hook 42 | LinkedIn |

Kristen is planning for some much-needed rest and reconnecting with her kids, husband, and mom. Then, she's hoping to get back into the Drupal issue queues for a bit because she finds that fun! :) After recharging and contributing, she'll be looking for something different in the next chapter, and is open to ideas, however crazy they may seem!

To connect, check out Kristen's profiles: Hook 42 | LinkedIn |

Both of us hope to say "hi" in person to former Hook 42 and client team members as well as community members as soon as the quarantines are over!

so long and thanks for all the fish


the word bye in 8 languages around the drupal drop
Mar 19 2020
Mar 19
Abstract image representing an infinite wave

The world is experiencing a scary time right now. People feel uncertain about the state of the world: we're experiencing a global pandemic, the OPEC is imploding, the trade war between the US and China could escalate, and stock markets around the world are crashing. Watching the impact on people's lives, including my own family, has been difficult.

People have asked me how this could impact Open Source. What is happening in the world is so unusual, it is hard to anticipate what exactly will happen. While the road ahead is unknown, the fact is that Open Source has successfully weathered multiple recessions.

While recessions present a difficult time for many, I believe Open Source communities have the power to sustain themselves during an economic downturn, and even to grow.

Firstly, large Open Source communities consist of people all around the world who believe in collective progress, building something great together, and helping one another. Open Source communities are not driven by top-line growth -- they're driven by a collective purpose, a big heart, and a desire to build good software. These values make Open Source communities both resilient and recharging.

Secondly, during an economic downturn, organizations will look to lower costs, take control of their own destiny, and strive to do more with less. Adopting Open Source helps these organizations survive and thrive.

Open Source continues to grow despite recessions

I looked back at news stories and data from the last two big recessions — the dot-com crash (2000-2004) and the Great Recession (2007-2009) — to see how Open Source fared.

According to an InfoWorld article from 2009, 2000-2001 (the dot-com crash) was one of the largest periods of growth for Open Source software communities.

Twenty years ago, Open Source was just beginning to challenge proprietary software in the areas of operating systems, databases, and middleware. According to Gartner, the dot-com bust catapulted Linux adoption into the enterprise market. Enterprise adoption accelerated because organizations looked into Open Source as a way to cut IT spending, without compromising on their own pace of innovation.

Eight years later, during the Great Recession, we saw the same trend. As Forrester observed in 2009, more companies started considering, implementing, and expanding their use of Open Source software.

Red Hat, the most prominent public Open Source company in 2009, was outperforming proprietary software giants. As Oracle's and Microsoft's profits dropped in early 2009, Red Hat's year-over-year revenue grew by 11 percent.

Anecdotally, I can say that starting Acquia during the Great Recession was scary, but ended up working out well. Despite the economic slump, Acquia continued to grow year-over-year revenues in the years following the Great Recession from 2009 to 2011.

I also checked in with some long-standing Drupal agencies and consultancies (Lullabot, Phase2 and, who all reported growing during the Great Recession. They attribute that growth directly to Drupal and the bump that Open Source received as a result of the recession. Again, businesses were looking at Open Source to be efficient without sacrificing innovation or quality.

Why Open Source will continue to grow and win

Fast forward another 10 years, and Open Source is still less expensive than proprietary software. In addition, Open Source has grown to be more secure, more flexible, and more stable than ever before. Today, the benefits of Open Source are even more compelling than during past recessions.

Open Source contribution can act as an important springboard for individuals in their careers as well. Developers who are unemployed often invest their time and talent back into Open Source communities to expand their skill sets or build out their resumes. People can both give and get from participating in Open Source projects.

That is true for organizations as well. Organizations around the world are starting to understand that contributing to Open Source can give them a competitive edge. By contributing to Open Source, and by sharing innovation with others, organizations can engage in a virtuous and compounding innovation cycle.

No one wants to experience another recession. But if we do, despite all of the uncertainty surrounding us today, I am optimistic that Open Source will continue to grow and expand, and that it can help many individuals and organizations along the way.

March 19, 2020

2 min read time

Mar 19 2020
Mar 19

All fields are equal in Drupal 8! Back in Drupal 7 we had two different systems for data on entities, which worked fairly differently: entity properties that were defined as database fields and controlled by hardcoded form elements, and user-created fields on entities that had widgets and formatters. But now in Drupal 8, every value on an entity is a field, with the same configuration in the UI, access to the widgets and formatters, and whose data is accessed in the same way.

Is this the end of the story? No, not quite. For site builders, everything is unified, and that's great. For code that consumes data from entities, everything is unified, and that's great too. But for the developer actually working with those fields, whether a field is a base field or a config field still makes a big difference.

Config fields are easier...

Config fields are manipulated via a UI, and that makes them simple to work with.


Config fields win easily here: a few clicks in the UI to create the field, a few options to choose in dropdowns for the widget and formatter options and you're set. Export to config, commit: done!

Base fields are more fiddly here. You need to be familiar with the Entity system, and understand (or copy-pasta!) the base field definitions. Then, knowing the right widget and formatter to use and how to set their options requires close reading of the relevant plugin classes.


Config fields win again: change in the UI, export to config, deploy!

For base fields, you once again need to know what you're doing with the code, and you now need a hook_update_N() to make the change to the database (now that entity updates are longer done automatically).


This is maybe a minor point, but while removing a config field is again just a UI click and a config export, removing a base field will again require a hook_update_N() to tell the Entity API to update the database tables.

...but base fields are more robust

Given the above, why bother with base fields? Well, if your field just sit there holding data, you can stop reading. But if your fields are involved in your custom code, as a developer, this should give you an unpleasant feeling: your code in modules/custom/mymodule is dependent on configuration that lives in the site's config export.


The fact that config fields are so easy to change in the UI is now a mark against them. Another developer could change a field without a full understanding of the code that works with it. The code might expect a value to always be there, but the field is now non-required. The code might expect certain options, but the field now has an extra one.

Instead of this brittle dependency, it feels much safer to have base fields defined closer to the code that makes use of them: in the same module.


The solution to the dependency problem is obviously tests, which would pick up any change that breaks the code's expectations of how the fields behave. But now we hit a big problem with config fields: your test site doesn't have those fields!

My first attempt at solving this problem was to use the Configuration development module. This allows you to export config from the site to a module's /config/install folder. A test that installs that module then gets those config items imported.

It's a quick and simple approach: when a test crashes because of a missing field, find it in the config folder, add it to the right module's .info.yml file, do drush cde MODULE and commit the changes and the newly created files.

This approach also works for all other sorts of config your test might need: taxonomy vocabularies, node types, roles, and more!

But now you have an additional maintenance burden because your site config is now in three places: the site itself, the config export, and now also in module config. And if developers who change config forget to also export to module config, your test is now no longer testing how the site actually works, and so will either fail, or worse, won't be actually covering what you expect any more.

Best of both worlds: import from config

To summarize: we want the convenience of config fields, but we want them to be close to our code and testable. If they're testable, we can maybe stand to forego the closeness.

My best solution to this so far is simple: allow tests to import configuration direct from the site config sync folder.

Here's the helper method I've been using:

 * Imports config from a real local site's config folder.
 * TODO: this currently only supports config entities.
 * @param string $site_key
 *   The site key, that is, the subfolder in /config in which to find the
 *   config files.
 * @param string $config_name
 *   The config name. This is the same as the YML filename without the
 *   extension. Note that this is not checked for dependencies.
 * @throws \Exception
 *   Throws an exception if the config can't be imported.
protected function importSiteConfig(string $site_key, string $config_name) {
  $storage = $this->container->get('');

  // Code cribbed from Config Devel module's ConfigImporterExporter.
  $config_filename = "../config/{$site_key}/{$config_name}.yml";

  if (!file_exists($config_filename)) {
    throw new \Exception("Unable to find config file $config_filename to import from.");

  $contents = @file_get_contents($config_filename);

  $data = $storage->decode($contents);
  if (!$data) {
    throw new \Exception("Failed to import config $config_name from site $site_key.");

  // This assumes we only ever import entities from site config for tests,
  // which so far is the case.
  $entity_type_id = $this->container->get('config.manager')->getEntityTypeIdByName($config_name);

  if (empty($entity_type_id)) {
    throw new \Exception("Non-entity config import not yet supported!");

  $entity = $this->container->get('entity_type.manager')->getStorage($entity_type_id)->create($data);

Use it in your test's setUp() or test methods like this:

  // Import configuration from the default site config files.
  $this->importSiteConfig('default', '');
  $this->importSiteConfig('default', 'field.field.node.article.field_my_field');

As you can see from the documentation, this so far only handles config that is entities. I've not yet had a use for importing config that's not an entity (and just about all config items are entities except for the ones that are a collection of a module's settings). And it doesn't check for dependencies: you'll need to import them in the right order (field storage before field) and ensure the modules that provide the various things are enabled in the test.

I should mention for the sake of completeness that there's another sort of field, sort of: bundle fields. These are in code like base fields, but limited to a particular bundle. They also have a variety of problems as the system that support them is somewhat incomplete.

Finally, it occurs to me that another way to bridge the gap would be to allow editing base fields in the UI, and then export that back to code consisting of the BaseFieldDefinition calls. But hang on... haven't I just reinvented Drupal 7-era Features?

Mar 19 2020
Mar 19

Drupal 9 is expected to be released on time in June 2020. Are the most popular modules ready? How are we at MD Systems helping in the D9 readiness effort?

It’s more and more likely that Drupal 9 will be released on the first possible date: June 3rd 2020. After the extensive work done before the initial beta deadline, it has been extended by two weeks and that has paid off. The community has made impressive progress in the last three weeks, managing to fix almost 50 beta blockers. This means that Drupal 9.0.0-beta1 will be released this week and we will most likely see a stable Drupal 9.0.0 release on the 3rd of June this year.

What about modules and themes?

The contrib space is not lagging much behind. Looking at the 20 most used modules, half of them have either a stable or a dev version that is Drupal 9 compatible and almost the entire other half has a working patch. 

10 have compatible stable or dev versions: 

  • Admin toolbar, 
  • Token, 
  • Ctools, 
  • Pathauto, 
  • Entity Reference Revisions, 
  • Paragraphs, 
  • Redirect,
  • Inline entity form, 
  • Simple sitemap,
  • Mailsystem

Video embed field is now compatible as well but encourages migrating to core provided solutions.

The other 10 have either a patch ready to be committed or need additional work:

Note: this is the status as of 17th March, with the beta release almost upon us, we expect that most of these modules will soon be ready as well.

The Global contribution weekend organized in January helped move things forward, with the Swiss community playing an important role adding almost 20% of the contributions.

Helping with Drupal 9 readiness

At MD Systems we maintain multiple internal install profiles that cumulatively rely on more than 120 contrib modules. This means that we have been actively working on, or at least closely monitoring, the progress of those modules.

If we look for example at the state of our Primer distribution we see that 44 of the 75, or 58% of the modules used now have either a stable or a development release that is D9 compatible. 31% of the modules have patches that are waiting to be committed. And work is needed on only 11% of those modules. These numbers are based on deprecation inspection tools and automated tests, so it’s likely that new issues will surface with manual reviews after the update. 

We maintain or help maintain 5 of the 10 most used D8 modules, therefore we have focused especially on those. All of these 5 modules are now Drupal 9 compatible. Besides that, almost half (49%) of the 47 modules we maintain are D9 compatible and 21% have issues ready, leaving 30% needing additional work. 

Next steps

We are committed to pushing the D9 readiness effort further on both the modules we help maintain and the ones we use. 

We already started testing with the current Drupal 9 branch and identifying various issues that didn't surface from either drupal-check or simpletest runs. That already lead to fixing multiple issues in the install profile itself, as well as some issues in the modules we use.

We are also available for consulting with updating sites to Drupal 9 as well as working on specific contributed projects.

When can projects use Drupal 9?

As we’ve explained in a previous blog post, most projects will likely be able to update to Drupal 9 quite soon after the initial release. Still, many projects use dozens to a hundred or more contributed projects and every single one of them will need to be Drupal 9 compatible (at the very least, that involves defining that in its .info.yml file).

Until that is the case for all dependencies of a project, we recommend to build projects based on Drupal 8.8 and 8.9 once it is released. Ensure not to use any deprecated APIs in custom code, keep an eye on Drupal 9 compatibility when deciding on which modules to use and update once it is possible. Almost all APIs from Drupal core are also available in Drupal 8.8 and 8.9, with the exception of the underlying frameworks like Symfony, Twig and JS libraries.

Drupal 9 testing for early adopters

To start testing Drupal 9 in our projects, you can use an alias to install it as Drupal 8 for the modules that do not yet declare themselves as compatible with Drupal 9:

composer require "drupal/core:9.0.0-alpha2 as 8.8.4"

However, be prepared to also require a lot of development versions and extra patches in the current state.

Mar 19 2020
Mar 19

Drupal 9 is just around the corner. Here's what you need to do to ensure a smooth upgrade.

Changes from Drupal 8 to Drupal 9

Unlike the Drupal 7 → 8 update, which required a rebuild and migrate, Drupal 9 is a simple incremental update from Drupal 8.

Third-party Dependencies

Drupal 8 is built upon 30+ third-party libraries. In order to keep Drupal stable, these have been kept at major version numbers throughout the Drupal 8 release cycle. Some of these will be end-of-life in coming years, so Drupal 9 is bumping these to newer versions in order to maintain long-term support coverage. The major dependency changes are:

  • Symfony 3.4.x  → 4.4.x
  • Twig 1.x → 2.x

In addition, Drupal 9 requires Drush 10.x or later.

Deprecated Code Removal

Drupal 8 introduced a backwards compatibility policy that required public APIs to remain stable while new features or improvements were added. The old APIs were marked as deprecated, but kept in place for backwards compatibility. This gives developers fair warning that code will be removed in future versions of Drupal giving them time to move to the new APIs.

Drupal 9 removes all deprecated code that has built up during the Drupal 8 release cycle.

Platform requirement changes

In addition, platform requirements have changed. Most importantly, this includes new minimum versions of:

  • PHP 7.3 or later
  • MySQL 5.7 or later

Getting Your Site Ready

Fortunately, there are only a few steps you need to follow in order to get your site ready for Drupal 9.

Update Contributed Modules to their Latest Version

Drupal 9 will work with modules that worked on Drupal 8, so there are no major rewrites required. This means the current module version naming scheme (e.g. 8.x-1.0) doesn't make much sense any more. It will gradually be replaced with a semantic versioning scheme (e.g. 2.1.0) as new module releases are published.

If you are a site builder, the easiest way to ensure your site is compatible with Drupal 9 is to keep your contributed modules up to date. You can check the status of your contributed modules using Acquia's Drupal 9 Deprecation Status page.

Replace Deprecated API Usage

Of course, many Drupal sites include custom modules. In order to get your own modules ready, you need to:

  • replace any usages of deprecated API usage
  • specify core version requirement to include Drupal 9

To automatically find usages of deprecated API usage, there is the excellent Drupal Check tool by Matt Glaman. Follow the installation instructions, then from the command line, run it against your custom module:

drupal-check web/modules/contrib/address

Almost all Drupal deprecations have handy instructions on the newer alternative API methods to use as well as a link to the change record that describes it in more details. For example:

drupal_set_message() is deprecated in Drupal 8.5.0 and will be removed before Drupal 9.0.0. Use \Drupal\Core\Messenger\MessengerInterface::addMessage() instead. See

Reading the change notice, we just need to change:

drupal_set_message("example message");


\Drupal::messenger()->addMessage("example message")

You can run drupal-check again and again until you have no more deprecation messages.

If you aren't comfortable with the command line, there is the excellent Upgrade Status module that you install to give you a user friendly report of what needs updating. There is also Drupal 8 Reactor which can automate some of this for you.

Specify Core Version Requirement

The last step is to specify your modules core compatibility. As per the change record there is a new key to add you your module info.yml file:

core_version_requirement: ^8 || ^9

This new key allows you to use composer-style version constraints and tells Drupal your module is compatible with Drupal 8 and 9.


That's it! There aren't many steps required to get your site ready for Drupal 9, and the best news is you can do it now and be ready the day Drupal 9 is released.

Photo of Kim Pepper

Posted by Kim Pepper
Technical Director

Dated 19 March 2020

Mar 18 2020
Mar 18

by David Snopek on March 18, 2020 - 3:22pm

As you may know, Drupal 6 has reached End-of-Life (EOL) which means the Drupal Security Team is no longer doing Security Advisories or working on security patches for Drupal 6 core or contrib modules - but the Drupal 6 LTS vendors are and we're one of them!

Today, there is a Moderately Critical security release for the CKEditor module to fix a Cross Site Scripting (XSS) vulnerability.

The CKEditor module provides one way to integrate CKEditor into Drupal.

Due to the usage of the JavaScript eval() function on non-filtered data in the admin section, it was possible for a user with permission to create content visible in the admin area to inject specially crafted malicious script.

The problem existed in CKEditor module for Drupal, not in JavaScript libraries with the same names, however, it's highly recommended that you update to the latest version of the CKEditor JavaScript library as well, because it also recently fixed some XSS vulnerabilities.

See the security advisory for Drupal 7 for more information.

Here you can download the Drupal 6 patch or the full release.

If you have a Drupal 6 site using the CKEditor module, we recommend you update immediately! We have already deployed the patch for all of our Drupal 6 Long-Term Support clients. :-)

If you'd like all your Drupal 6 modules to receive security updates and have the fixes deployed the same day they're released, please check out our D6LTS plans.

Note: if you use the myDropWizard module (totally free!), you'll be alerted to these and any future security updates, and will be able to use drush to install them (even though they won't necessarily have a release on

Mar 18 2020
Mar 18

MidCamp is almost here!  We’re thrilled to kick-off sessions tomorrow (3/19) and have a full line-up from 9:00am - 3:45pm CDT. We’re leveraging a virtual format for the first time, so each session page has a direct link to join the presentation via Zoom. We encourage you to share the following schedule with colleagues and look forward to having you join us!  No need to register – the more, the merrier!

How will it work?

Each session page has a direct link to join the presentation via Zoom. The rooms will open shortly before the first presentation each day and stay open throughout the day.

Here’s what you need to attend the sessions: 

  • Any device that can run Zoom (computer, phone, tablet)
  • Headphones (recommended)
  • Good internet/wifi
  • Zoom - downloaded on your device

Thursday's Schedule

9:00am - 9:30 am CDT

  • Welcoming Words

9:45am - 10:45am CDT

  • Build it better, stupid:  Using design systems for scalability
  • Live Captioning:  Make your next event accessible for everyone
  • Your data model is terrible! Let me show you why
  • Battle for online privacy
  • Caching Large Navigation Menus in Drupal

9:45am - 12:00pm CDT

  • [Half-day] Getting started with Drupal 8

11:00am - 12:00pm CDT

  • MUDdying the waters:  Creating text-based adventure games using Drupal and Slack
  • Scope in CSS with and without JavaScript
  • When there’s not a module for that
  • Maximum PhpStorm

1:15pm - 1:45pm CDT

  • Embracing usability and accessibility:  a Pace case study
  • Surviving the Drupal learning curve
  • Decoupling Drupal commerce to multiple and scale the front-end
  • How content editors use the layout builder:  What the user research shows

2:00pm - 2:30pm CDT

  • Bringing chart-making out of the back-end
  • Custom Drupal data migration: a Georgia GovHub story
  • Preparing custom and contributed code for Drupal 9

2:45pm - 3:45pm CDT

  • Planning for personalization:  Tips for Dev, Design, and I&A
  • Taking maximum advantage of Drupal core’s composer template
  • Automate Drupal 9 upgrades:  Addressing deprecated code as a community
  • From squiggles to straight lines:  Sketch to make decisions & get on with it

To join any of these presentations, you can check out our Thursday session schedule and click the Zoom link.

Volunteers needed!

Be a part of something BIG! Help MidCamp go virtual by volunteering! We have plenty of space for those who want to contribute. We need room monitors and hosts to keep the Zoom presentations running smoothly! After all, there are many ways to give back to #Drupal besides code. Fill out our volunteer survey if you're interested. We'll have a training at 4PM CDT today, and it will be recorded for folks who aren't able to join. Check #volunteers in the MidCamp Slack for more info.

Virtual game night sponsored by

Don’t forget to join us tomorrow (3/19) evening, from 6-9pm CDT, to take part in a gaming session group. There will be digital adaptations of tabletop games available directly from your web browser. Look forward to gaming with you!

Mar 18 2020
Mar 18

Automatic website updates are incredibly convenient, whatever CMS your site is built on. Unfortunately, the automation of Drupal website updates used to be impossible. But now we have great news for all Drupal 7 and Drupal 8 website owners — automatic website updates are already there! Read on to discover more details.

The most desired Drupal feature: benefits of auto updates

When asked what they would like to see in Drupal, website owners and users have always mentioned automatic updates. In the long-term competition between Drupal and WordPress, the latter had this trump card in its sleeve — even despite certain risks with unattended processes.

Every Drupal website owner or admin often sees a frustrating warning on the dashboard that a new release is available. However, they do not touch it because they know the procedure can be cumbersome. What if all could be done automatically? This would give website owners the unquestionable benefits such as:

  • being able to easily keep up with the Drupal release cycles on their own
  • never having to worry about security updates
  • never having to deal with Composer that is a bit cumbersome for users

The automation was really needed in order to make Drupal more user-friendly, safer thanks to timely security updates, and more competitive on the market. They have become one of the strategic initiatives highlighted by Drupal’s creator Dries Buytaert in the “State of Drupal” presentation. The Automatic Updates initiative now celebrates great success that we can now describe!

Drupal automatic updates as one of strategic priorities

How Drupal automatic updates work

There is a new contributed module that is headed for inclusion into the Drupal core — Automatic Updates. It is meant to auto-update Drupal simply and as cleanly as possible. When you see the update steps, you will notice they really have plenty of measures for cleanliness and safety. Let’s now take a closer look at how it performs both Drupal 7 and Drupal 8 automatic updates.

The key automatic Drupal update steps:

Displaying the security release announcements

The new module will let you know several days in advance about the security announcements (PSAs) for the core and contributed modules. The respective notices will be posted on the admin dashboard. This will be implemented as a PSA.json feed from

Making sure your website is ready for the update

Next, the module checks whether your website is ready for a smooth update and there is nothing to mess with it. These checks are made through the Drupal Cron runs. Upon the check, it displays errors explaining what necessarily needs to be fixed or just warnings. Here are some examples of issues that can be listed:

  • the site uses a read-only filesystem
  • ongoing database updates
  • insufficient disk space

Performing the in-place Drupal update

Here comes the key step in the automatic update process — the actual update. The module downloads a ZIP archive from For security reasons, it is hashed and signed. With the help of the Libsodium library, its signature is verified to make sure this is the official archive. Next, all files meant for the update are backed up. Finally, they are overwritten with the new ones using the PHP copy function.

Do automatic website updates need your interference?

The release announcements and website readiness checks are all automatic. The actual update part depends on your choice:

  • you can manually start the update on the module configuration page
  • or you can check the box on the same page that allows automatic updates run with the help of Cron

The current state of automatic Drupal updates

Right now, automatic updates are in active development and their amazing team keeps adding more features. The module is currently focused on automatic Drupal core updates according to security releases. Adding other types of updates, the support for contributed modules, and better work with Composer are in its roadmap.

In order to be added to the Drupal core, the module needs to get a feature called the A/B front-end controller. It will be able to swap between the two codebases and go back to the backed-up one in case something goes wrong during the automatic update, which will add even more safety and reliability to the process.

Apply for any help will automatic website updates

If you are impressed with the news and are ready to try the automatic website update feature, we encourage you to contact our Drupal support and maintenance team.

  • We will help you install and configure the Automatic Updates module and resolve all the update-hampering issues it may discover on your website.
  • As an option, we can inform you when the module gets into the Drupal core and update your website so it is there already.

Enjoy smooth, easy, and safe automatic Drupal updates!

Mar 18 2020
Mar 18
Project: Drupal coreVersion: 8.8.x-dev8.7.x-devDate: 2020-March-18Security risk: Moderately critical 13∕25 AC:Complex/A:User/CI:Some/II:Some/E:Proof/TD:DefaultVulnerability: Third-party libraryDescription: 

The Drupal project uses the third-party library CKEditor, which has released a security improvement that is needed to protect some Drupal configurations.

Vulnerabilities are possible if Drupal is configured to use the WYSIWYG CKEditor for your site's users. An attacker that can create or edit content may be able to exploit this Cross Site Scripting (XSS) vulnerability to target users with access to the WYSIWYG CKEditor, and this may include site admins with privileged access.

The latest versions of Drupal update CKEditor to 4.14 to mitigate the vulnerabilities.


Install the latest version:

Versions of Drupal 8 prior to 8.7.x have reached end-of-life and do not receive security coverage.

The CKEditor module can also be disabled to mitigate the vulnerability until the site is updated.

Note for Drupal 7 users

Drupal 7 core is not affected by this release; however, users who have installed the third-party CKEditor library (for example, with a contributed module) should ensure that the downloaded library is updated to CKEditor 4.14 or higher, or that CDN URLs point to a version of CKEditor 4.14 or higher. Disabling all WYSIWYG modules can mitigate the vulnerability until the site is updated.

Mar 18 2020
Mar 18

Table of Contents

Claro's bright future
--Rethinking the layout of administration pages
--Simplifying complex user interfaces
--A dream state for Claro?
--Why Drupal is a perfect place for UI development
Conclusion: How to get involved

Drupal has seen a range of administrative experiences over its history, starting with early Drupal mainstays like the Garland theme and Seven, perhaps the most recognizable iteration of Drupal's editorial experience in its history. Recently, another administration theme joined the pantheon of administration themes in Drupal core that have had an outsized influence on how users interact with Drupal not only for the first time but for countless times afterwards. The Claro administration theme is a new theme for Drupal 8, now available in Drupal core, which offers a more modern user experience thanks to its emphasis on usability and accessibility during the design and development process.

A short time ago, Cristina Chumillas (Claro maintainer and Front-End Developer at Lullabot), Fabian Franz (Senior Technical Architect and Performance Lead at Tag1) and Michael Meyers (Managing Director at Tag1) joined your correspondent (Preston So, Editor in Chief at Tag1 and author of Decoupled Drupal in Practice) for a wide-ranging conversation about why Claro is such a compelling new addition to Drupal's editorial experience and how Claro focused on enabling accessibility and user experience outcomes that would permit a narrowly scoped development cycle while also yielding the potential for a variety of other initiatives to extend Claro's design to encompass other use cases. In this multi-part blog series, we explore some of what we learned during this Tag1 Team Talks episode. In this fourth and final installment, we unlock some of the features ahead in Claro's roadmap and share how you too can contribute to the exciting future ahead of the Claro theme.

Claro's bright future

Before we proceed, if you have not yet taken a look at the first, second, and third installments of this blog series on Claro, I highly recommend you do so to better understand some of the context behind the history of Claro, the motivations behind a new administration theme, some of the data in the Drupal community that lent urgency to certain features, and how Claro's design took shape. In this upcoming section, we discuss some of the improvements and future roadmap items that Claro could see in the coming few years.

Rethinking the layout of administration pages

Claro: Drupal Node Add During our Tag1 Team Talks episode, we asked Cristina to share what the most significant improvements are that she would like to see in Claro's future. Cristina responded by citing the layouts of administration pages, namely the forms and other user interface components that constitute much of the editorial experience in Drupal. After all, she asks, "who hasn't wanted to create a node edit form that places something on the right sidebar?" This question is pressing not solely because of the possibilities such layout manipulation would unlock but also due to the fact that developer-friendly administration themes are typically the only way for Drupal users to heavily influence the layout of administration pages in Drupal.

Whereas in other content management systems this requirement might be considered superfluous, in Drupal it is a basic need, as this functionality has been available for quite some time to developers. Cristina also envisions an experience that would allow even greater flexibility by offering users the flexibility to determine a particular layout depending on the content on which an editor is currently working. Due to Drupal's high degree of customization when it comes to content types and their fields, node edit forms could feasibly have anywhere from two to forty fields that, especially in the latter case, test the limits of what is possible within an administration theme's design. In many scenarios, the person who decides how the content model should appear is the site builder, rather than the Drupal community enforcing a rigid approach to content modeling.

Simplifying complex user interfaces

Claro: Drupal Permissions Revamping the appearance of certain user interfaces in Drupal that have reputations for being overly complex is also a key roadmap item for the Claro theme. Views UI, for instance, is regularly cited as one of the most challenging and incomprehensible user interfaces in Drupal despite its powerful strengths. Other pages, such as the modules list page and the user roles and permissions page, are robust for a small number of modules or user roles but quickly become noticeably unwieldy as soon as the list reaches dozens or hundreds of items. Though there was an attempt to redesign these pages in the past, much of the work did not move forward due to the monumental amount of work involved.

Cristina also discusses the prospect of many of these complicated user interfaces becoming initiatives in their own right, and she recommends that motivated contributors add to the Ideas queue to make them a reality and find other interested parties. The first step, in Cristina's view, is to examine the user interface's requirements and determine from there the next best steps to realize ambitious experiences that include JavaScript-driven interactivity and modern design patterns.

A dream state for Claro?

Claro: Extend One of the questions we posed to Cristina during our Tag1 Team Talks episode had to do with what her ideal vision for Claro would look like — what is the dream state for Claro? Cristina responded by recommending a distinction be made between Claro and the concept of modernizing the administrative interface, as Claro has more of a focus on the aesthetic renewal of the administrative interface rather than enabling snazzy features like JavaScript-driven interactivity and animations. Now, concludes Cristina, "we can focus on the rest of the things we'll need."

To make Claro stable for the next release of Drupal, a substantial amount of work remains, but beyond that milestone, the Claro team is interested in pursuing an exploration of how Claro's components could work in complex environments like Views UI and other similar interfaces on Drupal's docket. Stress-testing Claro's components would also enable those components to target more of the foundational cases that user interface developers need, in addition to underpinning initial development of redesigned interfaces. Cristina's hope is that many in the Drupal community view Claro's components as a robust foundation on which diverse user interfaces can be implemented.

Why Drupal is a perfect place for UI development

Cristina argues during our Tag1 Team Talks episode that "Drupal is the perfect place to do lots of things from the UI perspective." And the vision she shared with us in the previous section is only one step on the way to an ambitious future state for Drupal. Cristina shares that she wants to see not only two- and three-column layouts but also JavaScript-driven interactions that are commonplace across the web these days.

WordPress's Gutenberg project has served as a valuable source of inspiration for Claro's architects, but Cristina acknowledges that many of Gutenberg's goals are not viable in the Drupal context due to Drupal's emphasis on modular and structured content that does not match Gutenberg's more full-page approach. For example, Cristina argues that having a drag-and-drop Gutenberg-like user interface on a content entity in Drupal with only five fields could be overkill for the node's requirements. Nonetheless, one of the most compelling next steps for Claro and other front-end modernization efforts in Drupal could be to facilitate several different ways of editing content based on its characteristics.

In the end, Drupal's focus on experimentation is part of what makes the community and ecosystem so rich. Experimenting with new user interfaces and new ways to interact with content is key to the success of any application, and Drupal's administrative interface is no exception. By shedding some of the anachronistic approaches implemented by the Seven theme, Claro represents an exciting next stage in Drupal's front end and user experience. Cristina concludes by restating the primary purpose of Drupal's administration layer: not to be a fancy front end but to provide the most robust solutions possible to manage content in an efficient way.

Conclusion: How to get involved

The Claro administration theme is an exciting new development for Drupal core, and I'm excited to see how users respond across a variety of use cases and personas to the biggest update to Drupal's administrative interface in quite some time. But best of all, you too can get involved in Claro's development and propose and contribute your own ideas. All conversations about Claro take place in Drupal's Slack organization. Design considerations are discussed in the #admin-ui-design channel, whereas the larger-scale work around revamping the administrative interface is centered around the #admin-ui channel. For discussions about JavaScript and its role in driving richer interactions, the #javascript channel has seen discussion around this topic. These channels are the most direct way available to communicate with other contributors online.

As for, Claro has its own component in Drupal core, searchable in issues on and assignable to issues that you create. In addition, the initiative's coordinators are not only active and prolific but also friendly and approachable. Lauri Eskola (lauriii) and Cristina attend Drupal events regularly and also are available at many times on Drupal's communication channels. As for me, I plan to apply the Claro administration theme to the editorial interfaces on my own personal site. Thanks to the Claro theme, Drupal enters a new decade with a modern look and feel and a carefully considered approach that evokes the best of open-source communities: deep collaboration and thoughtful innovation.

Special thanks to Cristina Chumillas, Fabian Franz, and Michael Meyers for their feedback during the writing process.

Photo by Rachel Ren on Unsplash

Mar 17 2020
Mar 17

Current realities are rapidly shifting for all of us. What to do now? What can we expect? 

During a time of crisis, the quality of communications can have a huge impact, and not just in the moment. The effects of what is said and what is not said will linger, and reveal much about the organization, its leadership, and individuals involved. 

A crisis and challenge on the magnitude of a global pandemic stands to bring out the best in us or the worst in us. There are the immediate concerns surrounding staying safe and helping to ensure the health and well-being of those around us. Then, of course, there are a myriad of business and financial concerns. Life goes on. Promises still need to be kept.

At Promet Source, we are committed to reaching out and being our best selves during this time. It’s a commitment that starts at the top with clear and honest communications.  

This commitment calls for a higher degree of empathy and outreach. What are people going through? What do they need to know? How can we help?

Empathy PLUS Honesty

During times of uncertainty, people look for answers and reassurance, and it’s tempting to want to provide that. Keep in mind that making promises and commitments that may not be kept is likely to be interpreted as dishonesty and deception, both of which are particularly difficult to forgive. Now is the time for integrity.

As businesses around the world scramble to meet obligations and keep teams productive and connected while working from remote locations, the right messaging matters more than ever before. 

Great communication also calls for a focus on connectedness: focusing on what it is that we have to offer and how that translates into our role as corporate citizens.

Resources and Expertise

At Promet Source, we’ve reached out to our sphere recently, pointing out that our team is distributed and that due to our well-established business processes for working remotely, we’re positioned to consult on the systems and technical tools that we’ve found to be the most effective for staying connected and optimizing productivity. 

Our communications team can also serve as a critical resource during this trying time, helping with strategic messaging and communications plans for optimizing culture and strengthening client relationships.

New Concerns, New Paradigms

It's important that we actively acknowledge that team members are facing new sets of challenges that extend beyond working at home. In many cases, school-aged children are at home. There are likely to be constant interruptions and new expectations for homeschooling. 

There are also big concerns about coronavirus symptoms and the impact of recent exposures. 

Even among those who remain healthy and symptom-free, let there be no doubt that this pandemic is having a major impact on everyone’s lives. Team members with high-stakes deliverables who are now facing a whole new set of realities need to know that they are not alone. 

These new realities call for new ways of connecting, being present, and adding value. It’s a challenge that few could have anticipated, but that many are working through and revealing considerable character in the process.

Did you know that Promet’s communication team can help with strategic communications support? Contact us today to schedule a workshop, or simply to start a conversation. 

Mar 17 2020
Mar 17

I heard a lot of good things about Midwest Drupal Camp (MidCamp) throughout the years. I also had the chance to follow Avi Schwab sharing best practices from it at various events. It is one of the real model events. I never had a chance to attend unfortunately.

In 2020, due to the ongoing pandemic, they did not have the opportunity to run the camp as usual. While that is sad, they decided to turn it around entirely and made MidCamp all digital and free to attend. This means you and I can attend finally and not just admire the event from afar! Let's do that! There is no registration or tickets required anymore, so sign up for details via email, or keep up on the site.

MidCamp - No ticket or registration required

Great Drupal 9 content

While there are lots of great sessions to participate in, I am really excited about the Drupal 9 content. Presentations will be streamed over Zoom with links being provided later in the week.

Let's get contributing

Following sessions on Thursday and Friday, there will be a virtual contribution day on Saturday from 3pm to 9pm UTC. I am really excited about these three contribution topics and would love to see you join in them! I will swap a workday out this week with Saturday to participate in this event and still have personal time for my family while they all stay at home due to the pandemic.

Olivero theme screenshot

  • Working on automation rules to fix deprecation issues in Drupal 8 projects. This is the practical application of Dan Montgomery's session. Dan and Ofer Shaal will be available and lead this topic. Rector saves a lot of manual work by automating code upgrades from Drupal 8 to Drupal 9. The immediate goal is to create Rector rules for the 15 most popular deprecations. Those 15 rules will cover 50% of all Drupal deprecations so a lot less manual work would be needed!
  • Work on contributed project Drupal 9 compatibility. Applying the above tooling combined with manual work to make contributed projects compatible with Drupal 9. Mike Lutz will be leading this topic. I would also love to help anyone interested. I maintain the overview of contributed project readiness on (thanks for the source data to the Drupal Association), which can be used to find what to work on effectively.
  • Improve the proposed new Drupal 9 default frontend theme Olivero. Various members of the team will be available to work on outstanding issues for the proposed new Olivero frontend theme. Putra Bonaccorsi, Aubrey Sambor and Brian Perry indicated they would be there.

Contribution will be coordinated on Slack I believe, more information to come later this week. Sign up for details via email, or keep up on the site. See you (virtually) there!

Mar 17 2020
Mar 17

Table of Contents

Shared editing in Drupal?
     How collaborative editing could become a reality in Drupal
     Yjs across ecosystems
Challenges of building collaborative editing
Other alternatives for shared editing

One of the seemingly intractable difficulties in content management systems is the notion of supporting collaborative editing in a peer-to-peer fashion. Indeed, from an infrastructural standpoint, enabling shared editing in a context where server-side CMSs rule the day can be particularly challenging. All of this may soon change, however, with the combination of Yjs, an open-source real-time collaboration framework, and Gutenberg, the new editor for WordPress. With the potential future outlined by Yjs and collaborative editing in WordPress, we can open the door to other thrilling potentialities such as shared layout building or even collaborative drawing in the CMS context.

On an episode of the Tag1 Team Talks show, your correspondent (Preston So, Editor in Chief at Tag1 and author of Decoupled Drupal in Practice) chatted with Kevin Jahns (creator of Yjs and Real-Time Collaboration Systems Lead at Tag1) and Michael Meyers (Managing Director at Tag1) about how WordPress is enabling shared editing in Gutenberg. In this multi-part blog series, we summarize some of the concepts we discussed. In this third installment of the series, we examine how shared editing could become a reality in Drupal and the unique challenges of implementing shared editing in the CMS context.

Shared editing in Drupal?

If you haven’t already, I recommend checking out the first and second installments of this blog series on shared editing with Gutenberg, because those blog posts outline some of the motivations for collaborative content creation in CMSs and some of the difficulties the intiative faced in supporting shared editing. In addition, over the course of those blog posts we inspected how key features like peer-to-peer collaboration and offline editing need to be part and parcel of any out-of-the-box implementation of collaborative editing in content management systems.

How collaborative editing could become a reality in Drupal

Drupal may have a similar background to WordPress’s, but its shared editing story is comparatively immature. Nevertheless, there are contributed working implementations of shared editing in Drupal, including ProseMirror, a shared editing tool that we covered in a previous Tag1 Team Talks episode. Tag1 Consulting recently evaluated ProseMirror along with a host of other solutions that would enable such use cases in Drupal, including a complete integration with Drupal’s roles and permissions system.

Tag1 recently produced an implementation of shared editing in Drupal for a top Fortune 50 client that leverages a client–server model without peer-to-peer capabilities. In addition, this Tag1 client needed to edit code collaboratively in addition to content, a use case enabled by CodeMirror, complete with code hints that provide next steps for editors. Michael cites this as yet another fascinating example of how Yjs can enable effective collaborative editing in a variety of settings. Fortunately, even Drupal sites are now implementing shared editing across the ecosystem, lending even more weight to the notion of collaborative content creation eventually becoming table stakes in content management.

Yjs across ecosystems

Many existing editors such as ProseMirror now integrate gracefully with Yjs. Fortunately, the y-webrtc plugin in the Yjs ecosystem is a relatively lightweight and straightforward add-on that could be part of the Drupal and WordPress ecosystems in the form of plugins as well. Once communication can be successfully established between peers with these plugins, we can enable collaboration on any shared editor that Yjs supports, including ProseMirror, Quill, and others. This idea will doubtlessly be interesting to people who use different content editors, because this feature can be easily enabled in the CMS.

Challenges of building collaborative editing

As Kevin attests from experience, implementing shared editing is particularly challenging. Someone who builds collaboration with JavaScript may require a different server algorithm in JavaScript to handle communication between client and server. Consider, for instance, the case of implementing text collaboration that leverages operational transformation (OT), a topic covered in a previous Tag1 Team Talks episode. OT is a particularly challenging algorithm to implement, and this same algorithm needs to be made available in the client-side context on rich text editors as well, which is a difficult proposition. In other words, it becomes double the work to support OT in any universal manner.

Most of the time, especially given the advent in recent years of universal JavaScript (also known as isomorphic JavaScript), architects would replicate the same client-side implementation of OT on a server environment. This sharing of code makes testing easier, because you can reuse the same libraries. You can ensure that the encoding of operations is precisely the same as what you would use in the server context. There are a host of issues with any universal approach, and WebSockets have not historically been well-supported in well-worn content management systems like Drupal and WordPress.

Other alternatives for shared editing

One of the important considerations in Gutenberg’s implementation of collaborative editing was determining whether there are any other compelling alternative solutions available. Kevin states during our Tag1 Team Talks episode that CKEditor 5 is an exceptionally well-built tool for editing and seamlessly communicates with CKEditor’s back-end solution, CKSource, to make any content become collaborative. CKEditor, in fact, leveraged the ideas behind collaborative editing much earlier, albeit with a centralized server approach. Unfortunately, however, one of the most significant issues inherent to CKEditor is that you can only use their proprietary CKSource server environment in order to enable shared editing. Nevertheless, CKSource washes away many of the concerns around shared editing such as scalability.

Worse still, CKEditor and CKSource are not viable solutions for content management systems like Drupal and WordPress, because every Drupal or WordPress implementation would need to set up CKSource and pay for a subscription. Kevin also highlights the issue of data ownership and asks whether collaborators can truly own their content if it is always sent to a separate central server. If the server goes offline and the content is lost, there is no way to restore the content, particularly from a local version.

As an example, many companies employ intranets to host content. Consider, for example, a company that routinely works with important government documents and secret information, all of which is kept secure through various means. Now, if you want this content to be collaboratively edited, but the content is comprised of highly privileged information, you need to host it either on a third-party server or pay a platform to host it on-premise. This makes maintainability, security, and software upgrades a potentially intractable challenge to solve.

Michael also cites the fact that CKSource was implemented first and foremost for CKEditor, and without CKEditor as a text editor available by default in a content management system, like it is in Drupal, there is no way to couple shared editing with CKSource for these open-source projects. Because Yjs is not only network-agnostic but also editor-agnostic, the same technology can enable the transformation of any aspect of your application into something collaborative. Whereas Yjs supports collaborative use cases beyond text such as layout building and drafting, CKSource makes this much more difficult.

Nonetheless, Kevin states during our show that CKSource and CKEditor, together, have led the market and offer the most robust end-to-end solution for collaborative text editing specific to those systems leveraging CKEditor. This exemplifies one of the key advantages of Yjs; not only can Yjs enable collaboration beyond text with use cases like drawing or even three-dimensional modeling, its agnosticism also means that integrations with a rich variety of editors is not only possible but easy to implement.


The concept of collaborative editing is nothing new to content editors around the world, but it is certainly a new idea for content management systems like Drupal and WordPress, which have never had such a feature available in the form of shared editing. Nonetheless, the motivations are clear, particularly in this modern age when offline editing and decentralized applications are in vogue. Thanks to the open-source real-time collaboration framework Yjs, however, Drupal and WordPress may soon have new approaches available to support shared editing out of the box. With the help of Yjs’ creator Kevin Jahns, Tag1 has enabled collaborative editing to become a reality in Gutenberg, one of the most important projects ever to emerge on the WordPress landscape.

In this third installment of this multi-part blog series on shared editing in Gutenberg, we examined some of the challenges that face a similar approach in Drupal. Nonetheless, Drupal and WordPress, along with Yjs, both benefit from rich ecosystems that could enable the sort of exciting innovation that comes with the prospect of shared editing. In the next and final installment of this series, we discuss the future of collaborative editing in Gutenberg, the reaction of the Gutenberg team, and how you yourself can get involved.

Special thanks to Kevin Jahns and Michael Meyers for their feedback during the writing process.

Photo by CoWomen on Unsplash

Mar 17 2020
Mar 17

Drupal 8 custom modules can range from being super simple to highly complex, depending on the need for the customization. The true power of Drupal can be unlocked with custom modules in Drupal 8. Irrespective of the complexity of a custom module, following some best practices can help you create more efficient custom modules. So, let’s get started!

Recently, I was looking for a module in Drupal and something just crossed my mind. In the Drupal world, when you are looking out or considering solutions, the first thing you might hear is, "there is a module for that!". While there are close to 70 core modules in Drupal, it is the additional contributed modules built by the Drupal community that extends the platform's functionality. And with Drupal 8, there is a completely different architecture and modernized approach towards CMS, with a shift towards object orientation to improve the overall efficiency and software quality. Creating a Drupal 8 Custom Module to further extend Drupal’s capabilities is not the same as it was in Drupal 7.  

What is a custom module in Drupal 8? Why create one?

A Drupal 8 custom module is basically a module that is made up of customized functionalities. The Drupal custom module could start with a contributed module that needs small customizations or a completely new Drupal 8 module with new sets of non-existent functionalities custom fit to the project. Or sometimes, a migration from Drupal 7 to Drupal 8 will call for a custom module because the Drupal 7 module isn’t available in Drupal 8. A Drupal 8 custom module is essentially built to extend the core functionality of Drupal, which by itself comes with built-in set of core modules. 

Regardless of how your experience has been with the previous versions of Drupal, module development in Drupal 8 has its own set of challenges. To give you a fair idea, there are some differences between Drupal 7 and Drupal 8, the key ones being that Drupal 8 requires the latest version of the PHP 7 to run and it uses Symphony, a PHP framework that relies on Object Oriented Programming. Nonetheless, Drupal 8’s new approach is a futuristic approach and has opened doors to a wider set of developers who are well-acquainted with OOP and MVC concepts.

Also, there are changes in the way a module is built and there are certain best practices to keep up with the community standards. Let us talk more about this.

Change in the Drupal 8 File Structure

One important point to remember is that in Drupal 8 modules development the file structure is quite different from the one in Drupal 7. Custom modules in Drupal 8 are stored in the /modules directory, unlike in Drupal 7 where this directory was reserved for the core modules. The core Drupal 8 modules now go into the /core directory.
Next up, to let Drupal 8 know that your custom module exists, you need to create an .info.yml file which provides the meta data. This process is similar to the one used for Drupal 7.

name - This key is to provide a name for your custom module.
type - This key defines the type of the extension (module/theme/profile).
description - This key provides the detailed description about the custom module (displayed on the module list page).
package - This key specifies the package in which the module should be included.
version - Specifies the version of the module. 

If your file looks something like '', the syntax will be as follows-
name - blogexmple Module
type – module
description - A simple demo module
package – Custom
version - 1.0
core - 8.x

Use of Configuration before code

Having to rewrite the code every time you make any changes is quite a task. Instead of hard coding a class into a theme, set the values in the configuration and apply it with the code. This ensures easy and faster ways to code and results in high quality modules. With reusable codes being the norm in writing quality software, configurations in the code ensure advanced functionality and "easy to modify" features.

Use What Drupal Offers

Once you have built your module, you should know that Drupal comes with various built-in admin functionalities to store and display module data and settings. The module settings page can be defined with hook menu. This hook enables modules to register paths in order to define how URL requests are handled. With the drupal_get_form page callback usage, all you must do in the callback function is define and return the settings that are to be stored.

Too Many Cooks Spoil the Broth

Having worked on large scale Drupal sites for a long time, Drupal developers would have learnt that hundreds of modules can work their magic together to produce an effective large-scale project. But when working on enterprise Drupal websites, it is important to note that avoiding a single poor module has greater effects than avoiding 30 well-developed Drupal modules (in an attempt to use lesser modules). Developers then tend to favor programming their own modules over reusing existing modules. The higher the number of custom modules you write for a project, the more work it takes to maintain and modify your Drupal site later. Instead, consider publishing your modules on Github. This allows you to avoid usage of a large collection of custom modules and instead encourages you to create reusable code that has the required configuration.

Environment & Coding Standards

Development environment is an important influence as it ensures that a Drupal project runs without any hassle. Drupal development companies ensure that the entire team works in an exact same development environment for an efficient workflow.

While working in such an environment, one of the biggest issues to handle is to make sure that the code is clean and maintainable. Drupal developers need to make sure that their code is readable and makes sense to everyone they are working with. And this doesn't apply only to the team members or to anyone from your organization, but also to the larger Drupal community itself. With community involvement being an essential part of Drupal development and a key aspect in distributed teams working together efficiently, following the coding standards helps in achieving a project's goals and objectives.

Mar 17 2020
Mar 17

In this post, we’ll take a look at what’s meant by the term digital experience framework, or DXF, present some types of DXF, and discuss how to select the correct one(s) to set your business up for success today and in the future. Let’s get started.

First off - what is a digital experience framework (DXF)? 

You’ve no doubt encountered terms such as digital transformation, digital experience, or even the more recently introduced digital experience platform, or DXP for short. What’s this “digital experience framework”, then?

Well, put simply, the term can refer to any kind of digital framework for creating and managing digital experiences. It’s a concept that’s broader than that of a content management system or a programming language, but more narrow than, say, the DXP, which would incorporate various of these frameworks.

The relationship between the three can be roughly represented in the following way: 

What’s important to note here is that certain frameworks (most typically programming languages) can be used to build other frameworks. A great example is PHP, which serves as the foundation of both WordPress and Drupal. Then you also have, of course, the innumerable front-end frameworks which are based on JavaScript, each with their own niche specificities. 

Python, another widely known and utilized programming language, is for example used for developing a wide range of different DXF in addition to its use as a powerful back-end language. The 3D art frameworks Blender and Maya are built in Python, while it is also utilized to power the machine learning capabilities of platforms such as Netflix.

Given the importance of the digital and the amount of time we dedicate to it on a daily basis, the need for compelling digital experiences has never been greater. Add to that our acquired tendency to want everything, everywhere, and it becomes even clearer that having the right tools to craft the right experiences can be an incredible business advantage. 

Types of DXF

There are numerous types of DXF. While this post will mainly concentrate on DXF utilized in web development and similar spheres, we shouldn’t completely discount mobile and game development frameworks, such as for example Facebook’s React Native or Google’s Flutter, and .NET, C# or the Unity game engine, respectively.

The most common ones for the web are front-end development frameworks, such as Angular or React, and content management systems/frameworks, such as Drupal or WordPress. There are also more specific examples, e.g. e-commerce digital experience frameworks such as the Magento open-source DXF.

In addition to those, you also have various personalization and design tools, but, very often, front-end frameworks can take care of that job. Moreover, Drupal and WordPress can be used for mobile development by going “headless”, or in the form of a PWA (progressive web app); and, for another fun fact, Drupal was also recently used to develop an arcade game.

Which one(s) you choose largely depends on your audience’s needs, but other factors play into this decision, such as the popularity or market share of the framework, etc. 

One thing’s for certain, though: in the current DX landscape, relying on a single DXF to power your digital experiences is not enough - you need several of them to really tailor the experience to individual users and achieve notable business results. 

Choosing the right digital experience framework(s)

This is all very well - but, chances are that you’re now asking yourself “How can I choose the right frameworks for me, then, if there are so many options?”

Well, that largely depends on what your needs are, and how forward-thinking your business is. Since this is a post centered around driving business growth, let’s assume that the general idea is that your business is quite forward-thinking.

What this means is that you’ll need DXF that are well established but future-ready enough as to still be relevant 5 or 10 years down the line when new trends emerge and old ones are abandoned. 

While there are a lot of niche frameworks that have greatly streamlined certain aspects, be that API integrations, excellent preview options for editors, or a great developer experience, most of these are relatively new and as of yet unestablished. 

That’s why we would definitely recommend going with either of the two giants in the content management space - WordPress and Drupal - as your foundational DXF.

WordPress and Drupal can both be used for channels other than just the website, or even just the web - the headless capabilities both of them offer through their API extendability make them viable contenders in the multichannel digital sphere. This becomes especially relevant as we’re embracing IoT (the Internet of Things) more and more.

Namely, WordPress’s REST API and Drupal’s REST, JSON and GraphQL APIs make them solid candidates for any kind of digital experience - especially when coupled with a powerful frontend framework such as Angular, resulting in a “decoupled” CMS, where the presentation layer is separate from the data (a concept similar to “headless”). 

Another thing to note: the magic of digital experience frameworks is that they can be easily integrated with different ones in order to achieve additional functionality. 

For example, a content management system such as Drupal can be combined with one or more front-end frameworks to achieve the best of both worlds, receiving structure and stability with the CMS and spice with the framework such as Angular.  In fact, it could even be combined with a second back-end framework such as the e-commerce DXF Magento.

This means that you’ll rarely be using just a single framework; much more often, you’ll rely on a base one, then leverage others to add additional functionality and spice up the user experience.

Why we chose what we chose

As a predominantly web development company, we mainly work with 3 digital experience frameworks at Agiledrop:

We’ve been working with Drupal for a number of years, ever since our company’s inception; as a robust and highly customizable framework, it’s ideal both for our own website(s) and the services we offer to our clients. Drupal is the framework of choice for many enterprise digital platforms which require a more complex system and strict adherence to industry standards.

However, most SMBs (small-to-medium businesses) also want to profit from these same features, but without needing an architecture as complex as that of a Drupal website or application. This is where the WordPress CMS comes into play.

By following the same enterprise practices in WordPress, with custom development and high-end QA, we’re able to offer our clients the simplicity they lack with Drupal, while maintaining the level of quality that they desire and deserve.

Finally, the most important piece of the puzzle here is the front-end framework Angular. By 2020, it’s become pretty obvious that powerful front-end frameworks are vital to crafting great digital experiences, and any renowned brand that strives for a good customer experience should have one or more of these in their arsenal.

Having worked with some of the most notable ones (namely, React, Vue and Angular), we were the most impressed by Angular: it was the one that managed to perfectly merge good development standards with capability, with stellar performance on top of that, even more so thanks to the recently released Ivy renderer shipped with Angular 9. 

It became no doubt that Angular was to be the front-end framework of choice for Agiledrop. We’ve even recently revamped our internal tools with Angular, greatly facilitating the daily tasks of our project and office managers thanks to the smooth interactive dashboards built with the framework.


A key takeaway here is to stop thinking in terms of content management and web development, and instead transition to viewing both of these as aspects of digital experience management.

So, when deciding for a technology that will drive your digital experience, think bigger than just the CMS - think in the context of the digital experience framework, and how to select the framework(s) that will help your business grow.

Because - your success of tomorrow greatly depends on the choices you make today. And, by choosing the right suite of digital experience frameworks for your services, you’ll guarantee future relevance as well as position yourself as an industry leader who is simultaneously on top of today’s advancements and future ready.

If you’d like to know more about how Agiledrop can help you craft amazing digital experiences with our extensive expertise in the just discussed DXF, give us a shout out and we’ll provide the perfect team for and solution to your needs. 

Mar 17 2020
Mar 17

Like many companies, PreviousNext didn't expect the Coronavirus crisis to hit so hard or quick, nor did we anticipate the rapid effects on the global economy. However, we have always run our company based on sustainable principles, so feel well prepared to deal with what's coming over the next few months. We hope sharing our approach might help others weather the coming storm too!

First and foremost, the wellbeing of our team is our number one priority and our immediate steps were to ensure everyone is as safe as possible from contracting or spreading COVID-19, including:

  • While our team is already highly distributed with most working from home offices, we were quick to enforce a full work from home policy, including no in-person client meetings or unnecessary travel. This was communicated to clients, with video conferencing and chat tools becoming the standard form of interaction.
  • Making sure our team knew we were taking things seriously and reiterating official guidelines on personal hygiene and social distancing.
  • Noting that attending conferences and personal travel were likely to be affected well before official lockdowns started coming into force, and to plan ahead accordingly.
  • Understanding that many staff will have reduced availability due to school closures and having children at home.
  • Outlining clear provisions for staff to use personal and annual leave in the event they became ill themselves or needed to care for family members. We also made it clear that if leave allowances were exhausted due to COVID-19, leave credits would be extended until individual team members were able to return to work. The last thing we want is our team worrying that their personal finances or long term roles might be in jeopardy due to something completely outside their control.
  • Asking team members to privately notify us if anyone close to them becomes ill which may indicate their own health could be at risk in coming weeks if they've had exposure. This then allows us to forward plan potential contingencies for reduced team availability.

We also took a close look at the likely impact of an economic slowdown on the overall business, such as:

  • Identifying which clients may reduce budgets and starting conversations early with these clients around the likely impact to projects we're working on. This demonstrates that we understand things are likely to change and are willing to work with clients so that neither party is left in the lurch.
  • Working with clients to build larger backlogs of project work so that we can continue working if key people on the client side become unavailable to move a project forward.
  • Assessing what operational expenses can be reigned in the short and medium term to ensure our cash flow stays healthy. This includes evaluating current rental arrangements, subscription based services that may not be critical to operations and other non essential expenses.
  • Establishing a clear overview of our current project pipeline, what our break-even costs would be if projects are scaled back and how long we could maintain that state.
  • Understanding what trigger points we'd have to start drawing on our cash reserves to ride out a few slower months.

Another key consideration is our commitment to the Drupal open source project while the world moves into crisis mode. As we saw in the years following 2007's Global Financial Crisis, Drupal is well placed to thrive as a cost effective alternative to proprietary Content Management Systems and we expect similar things will occur this time around. Obviously, without a strong Drupal we don't have a strong business, so initiatives in this regard are:

  • Maintaining our open source contribution policy so that our team is consistently pushing code into the Drupal ecosystem. This is particularly important with the imminent release of Drupal 9. We would encourage other Drupal services companies to adopt similar contribution policies, especially if their teams are suddenly finding they have extra time on their hands due to the economic downturn.
  • Ensuring that the Drupal community remains strong and unified. There'll obviously be many cancellations or postponements of key conferences in coming months, but we can still collaborate closely through Drupal's issue queues and remote events, like live-streamed meetups.
  • While some initiatives are likely to be delayed, maintaining the continuity of operations for our local DrupalSouth committee and the global Drupal Association is of paramount importance. We can achieve this through donating both our time and funding as specific needs arise. Again, we'd urge other Drupal services companies to share this commitment.

This is the third major economic crisis I've lived through in my professional life, and while things will definitely get tough, they will definitely get better again in the long run. By taking pre-emptive steps now, maintaining the confidence of your team and clients and staying committed to Drupal's long term success, there will be light at the end of the tunnel!

Mar 16 2020
Mar 16

Ten months ago I created the first version of "State of Drupal 9" and published it as an open source slideshow for anyone to review and present. It has been presented by myself and various other people since then. I kept it up to date and I got lots of feedback to improve it. Since we are closing in on the Drupal 9.0.0-beta1 release where milestone dates are better defined and the release itself is quite close, I decided to rework the whole slideshow with a more practical approach in mind focusing first on what happens to Drupal 7 and outlining the concrete practical upgrade paths for what people should do coming from Drupal 8.

I was slated to present this new version of it at DrupalCamp London, DevDays Ghent and DrupalCon Minneapolis (with Amber Himes Matz). Due to the ongoing pandemic I did not attend DrupalCamp London anymore and further events are being gradually cancelled or postponed. So I don't know if I or someone else will have a chance to present this in person anytime soon. (Which I think is for the better of our health). However, you can still review the content yourself and present it virtually on a remote Drupal meetup or conference or at your virtual company meeting. I did present the slides for DrupalCamp London remotely myself and the camp made the recording kindly available:

I added plenty of speaker notes. You can present/review it from or fork it (even with a free registration) and replace the "About me" slide as well as the opening and closing thanks slide with your attribution. Please keep the rest of the attribution intact. Instructions are in the slides.

I'll keep this version updated from now on and archived the old version with a note pointing to this.

Mar 16 2020
Mar 16

One of the important aspects of keeping your Drupal 8 site up-to-date, secure and performing well is to remove unused modules.

There are a number of reasons why you would want to do this:

  • Security - Every module should be kept up-to-date.  If you're not using a particular feature, you're just giving yourself more work to do.
  • Performance - Drupal is an event-based CMS so at every point in the page-build process, Drupal is checking to see if any module on your site wants to do something.  All of this adds up!
  • Site clutter - The "Extend" menu is long enough!  Not to mention any configuration menu items that a module might add.
  • Fluff - Some modules just don't belong - Some development modules such as Devel should never be on a production server.  It's always best to remove those completely.

Step 1:  Uninstall

When you install a module on your site, depending on the module, a number of things happen.  Obviously the code is added to the /modules folder.  However, if that module stores data in the database, then tables are created and sample data may be installed.  It's important to uninstall a module before you remove the code so the module's uninstall configuration file can perform it's tasks.  

It's also worthy to note that if you simply delete the code without uninstalling, you might encounter a huge performance regression which stems from Drupal recursively searching through the site for the "missing" module on every page load.

Caution:  When you uninstall a module that does write data to the database, all your data will be deleted.

uninstall module - How to Remove Unused Modules in Drupal 8

To uninstall a module:

  1. Log into your Drupal site and click on Extend -> Uninstall
  2. Find the module you wish to uninstall and put a checkmark in the box.
  3. Scroll down to the bottom of the page and click "Uninstall".

If a module has dependencies, you'll need to uninstall the module that requires something else first, then the main module second.  For example, Admin Toolbar can not be uninstalled until Admin Toolbar Extras is uninstalled.

uninstall module 2

Step 2:  Remove the module code from the codebase

As you may know, uninstalling a module in Drupal doesn't actually remove the code from the codebase.  The code stays in the /modules folder, ready to be installed again.  It's always safest to completely removed the code from your codebase.

If you do not have access to the codebase, you will need to ask your IT department or web host to do that for you.  If your website is hosted on something like Acquia Cloud or Pantheon, those tools are built-in.  If your site is hosted on a popular hosting service such as Hostgator, Hostmonster or Bluehost, you can do that via CPanel.  If your site is hosted on a service such as Digital Ocean, you'll need SSH access to delete the files.  It's beyond the scope of this tutorial to dive into every service, but suffice it to say, the files should be deleted.

Once you gain access to the codebase, you'll look for the modules folder.  Your module will be listed via the machine name.  Just delete the entire folder.  In the illustration below, to delete the Asset Injector module, you would delete the asset_injector folder.

uinstall module 3

One Final Thought

While it might be tempting to uninstall Core modules that you're not using, it really won't help. The modules you remove will be reinstalled on the next Drupal update regardless.

About the author

Rod holds two masters degrees and has been training people how to do "things" for over 25 years. Originally from Australia, he grew up in Canada and now resides just outside Cincinnati, Ohio.


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