---
title: "Announcing the New Lullabot.com"
url: "/articles/announcing-new-lullabotcom"
type: article
date: 2019-02-08
updated: 2020-03-16
---

# Announcing the New Lullabot.com

#  Announcing the New Lullabot.com 

 Decoupling Drupal has many benefits, but is also more complex than a standard Drupal architecture. To accommodate our marketing needs and available resources, we built a new Drupal 8 site.

 By

 [  Mike Herchel   ](/about/mike-herchel) 

 February 8, 2019

  

Welcome to the latest version of Lullabot.com! Over the years (since 2006!), the site has gone through at least seven iterations, with the most recent launching last week at the 2019 Lullabot team retreat in Palm Springs, California.

   

   

 ![Smartphone and computer showing the new Lullabot.com](/sites/default/files/styles/wide_xs/public/2019-02/lullabot-mock.jpg.webp?itok=vS4QivY0)

## Back to a more traditional Drupal architecture

Our previous version of the site was one of the first (and probably *the* first) decoupled Drupal ReactJS websites. [It launched in 2015](https://www.lullabot.com/news/announcing-the-new-lullabotcom).

Decoupling the front end of Drupal [gives many benefits](https://www.lullabot.com/articles/should-you-decouple) including easier multi-channel publishing, independent upgrades, and less reliance on Drupal specialists. However, in our case, we donâ&#128;&#153;t need multi-channel publishing, and we donâ&#128;&#153;t lack Drupal expertise.

One of the [downsides of a decoupled architecture](https://www.lullabot.com/articles/the-hidden-costs-of-decoupling) is increased complexity. Building blocks of our decoupled architecture included a Drupal 7 back end, a CouchDB middle-layer, ReactJS front end, and Node.js server-side application. Contrast this with a standard Drupal architecture where we only need to support a single Drupal 8 site.

The complexity engendered by decoupling a Drupal site means developers take longer to contribute certain types of features and fixes to the site. In the end, that was the catalyst for the re-platforming. Our developers only work on the site between client projects so they need to be able to easily understand the overall architecture and quickly spin up copies of the site.

## Highlights of the new site

In addition to easily swapping in and out developers, the primary goals of the website were ease of use for our non-technical marketing team (hi [Ellie](https://www.lullabot.com/about/ellie-fanning)!), a slight redesign, and to maintain or improve overall site speed.

### Quickly rolling developers on and off

To aid developers quickly rolling on and off the project, we chose a traditional Drupal architecture and utilized as little custom back-end code as possible. When we found holes in functionality, we wrote modules and contributed them back to the Drupal ecosystem.

We also standardized to [Lando](https://docs.devwithlando.io/) and created in-depth documentation on how to create a local environment.

### Ease of use

To enable our marketing team to easily build landing pages, we implemented Drupalâ&#128;&#153;s new experimental Layout Builder module. This enables a slick drag-and-drop interface to quickly compose and control layouts and content.

We also simplified Drupalâ&#128;&#153;s content-entry forms by removing and reorganizing fields (making heavy use of the [Field Group module](https://www.drupal.org/project/field_group)), providing useful descriptions for fields and content types, and sub-theming the Seven theme to make minor styling adjustments where necessary.

   

   

 ![Screenshot of content type listings showing very long winded (and hilarious) content type descriptions](/sites/default/files/styles/wide_xs/public/2019-02/Content_types___Lullabot_and_VLC_media_player.png.webp?itok=wv71nzOi) With excellent content type descriptions such as this, how can the user experience ever go wrong?

## Making the front end lean and fast 

Normally, 80% of the delay between navigating to a webpage and being able to use the webpage is attributed to the front end. Browsers are optimized to quickly identify and pull in critical resources to render the page as soon as possible, but there are many enhancements that can be made to help it do so. To that end, we made a significant number of front-end performance optimizations to enable the rendering of the page in a half-second or less.

- Using vanilla JavaScript instead of a framework such as jQuery enables the JS bundle size to be less than 27kb uncompressed (to compare, the previous versionâ&#128;&#153;s bundle size was over 1MB). Byte for byte, JavaScript impacts the performance of a webpage more than any other type of asset.
- We heavily componentize our stylesheets and load them only when necessary. Combined with the use of lean, semantic HTML, the browser can quickly generate the render-treeâ&#128;&#148;a critical precursor to laying out the content.
- We use HTTP2 to enable multiplexed downloads of assets while still keeping the number of HTTP requests low. Used with a CDN, this dramatically lowers the time-to-first-byte metric and time to download additional page assets.
- We heavily utilize [resource-hints](https://w3c.github.io/resource-hints/) to tell the browser to download render-blocking resources first, as well as instructing the browser to connect third-party services immediately.
- We use the [Quicklink module](https://www.drupal.org/project/quicklink) to pre-fetch linked pages when the browser is idle. This makes subsequent page loads nearly instantaneous.

 ![Chrome Developer Tools performance timeline showing 400ms initial page-load](/sites/default/files/styles/max_900/public/2019-02/DevTools_-_www_lullabot_com.jpg.webp?itok=6EhQqWxl) Chrome Developer Tools performance timeline showing 400ms initial page-load

There are still some performance *@todos* for us, including integrating WEBP images (now supported by Chrome and Firefox), and lazy-loading images.

## Contributing modules back to the Drupal ecosystem

During the development, we aimed to make use of contributed modules whenever it made sense. This allowed us to implement *almost* all of the features we needed. Only a tiny fraction of our needs was not covered by existing modules. One of [Lullabotâ&#128;&#153;s core values](https://www.lullabot.com/values) is to *Collaborate Openly* which is why we decided to spend a bit more time on our solutions so we could share them with the rest of the community as contributed modules.

### Using Layouts with Views

Layout Builder builds upon the concept of layout regions. These layout regions are defined in custom modules and enable editors to use layout builder to insert these regions, and then insert content into them.

Early on, we realized that the Views module lacked the ability to output content into these layouts. Lullabotâ&#128;&#153;s Director of Technology, [Karen Stevenson](https://www.lullabot.com/about/karen-stevenson), created the [Views Layout module](https://www.drupal.org/project/views_layout) to solve this issue. This module creates a new Views row plugin that enables the Drupal site builder to easily select the layout they want to use, and select which regions to populate within that layout.

### Generating podcast feeds with Drupal 8

Drupal can generate RSS feeds out of the box, but podcast feeds are not supported. To get around this limitation, Senior Developer [Mateu AguilÃ³ Bosch](https://www.lullabot.com/about/mateu-aguilo-bosch) created [the Podcast module](https://www.drupal.org/project/podcast), which complies with podcast standards and iTunes requirements.

This module utilizes the Views interface to map your siteâ&#128;&#153;s custom Drupal fields to the necessary podcast and iTunes fields. For more information on this, [checkout Mateuâ&#128;&#153;s tutorial video here](https://www.youtube.com/watch?v=ApQ3P0XI3S4).

### Speeding up Layout Builderâ&#128;&#153;s user interface

As stated earlier, Layout Builder still has â&#128;&#156;experimentalâ&#128;&#157; status. One of the issues that we identified is that the settings tray can take a long time to appear when adding a block into the layout builder.

Lullabot [Hawkeye Tenderwolf](https://www.lullabot.com/about/hawkeye-tenderwolf) identified the bottleneck as the time it takes Drupal to iterate through the complete list of blocks in the system. To work around this, Karen Stevenson created the [Block Blacklist module](https://www.drupal.org/project/block_blacklist), in which you can specify which blocks to remove from loading. The result is a dramatically improved load time for the list of blocks.

### Making subsequent page loads instantaneous 

A newer pattern on the web (called [the PRPL pattern](https://web.dev/apply-instant-loading-with-prpl/)) includes pre-fetching linked pages and storing them in a browser cache. As a result, subsequent page requests return almost instantly, making for an amazing user experience.

Bringing this pattern into Drupal, Senior Front-end Dev [Mike Herchel](https://www.lullabot.com/about/mike-herchel) created [the Quicklink module](https://www.drupal.org/project/quicklink) using Googleâ&#128;&#153;s [Quicklink JavaScript library](https://github.com/GoogleChromeLabs/quicklink). You can view the result of this by viewing this siteâ&#128;&#153;s network requests in your developer tool of choice.

### Keeping users in sync using the Simple LDAP module

Lullabot stores employee credentials in an internal LDAP server. We want all the [new hires](https://www.lullabot.com/jobs) to gain immediate access to as many services as possible, including Lullabot.com. To facilitate this, we use the [Simple LDAP module](https://www.drupal.org/project/simple_ldap) (which several bots maintain) to keep our website in sync with our LDAP directory.

This iteration of Lullabot.com required the development of some new features and some performance improvements for the D8 version of the module.

## Want to learn more?

- To learn more about the new Lullabot.com, [listen to the latest Lullabot Podcast.](https://www.lullabot.com/podcasts/drupalizeme-podcast/developing-latest-version-lullabotcom)
- [Karen](https://www.lullabot.com/about/karen-stevenson), [Putra](https://www.lullabot.com/about/putra-bonaccorsi), [Wes](https://www.lullabot.com/about/wes-ruvalcaba), and [Ellie](https://www.lullabot.com/about/ellie-fanning) are speaking on [Layout Builder in the Real World](https://events.drupal.org/seattle2019/sessions/layout-builder-real-world) at DrupalCon Seattle. Theyâ&#128;&#153;ll be talking about many of the improvements made on Lullabot.com, as well as Ellieâ&#128;&#153;s thoughts on its user interface.
- [Mike](https://www.lullabot.com/about/mike-herchel) will be talking about web performance (including many of the enhancements made on this site) at Florida DrupalCamp, DrupalCamp London, DrupalCon Seattleâ&#128;&#153;s Performance and Scalability Summit, as well as giving a 90-minute Front-end Web Performance Clinic at DrupalCon Seattle.

## Built by Bots

While the site was definitely a team effort, special thanks go to [Karen Stevenson](https://www.lullabot.com/about/karen-stevenson), [Mike Herchel](https://www.lullabot.com/about/mike-herchel), [Wes Ruvalcaba](https://www.lullabot.com/about/wes-ruvalcaba), [Putra Bonaccorsi](https://www.lullabot.com/about/putra-bonaccorsi), [David Burns](https://www.lullabot.com/about/david-burns), [Mateu AguilÃ³ Bosch](https://www.lullabot.com/about/mateu-aguilo-bosch), [James Sansbury](https://www.lullabot.com/about/james-sansbury), and, last but not least, [Jared Ponchot](https://www.lullabot.com/about/jared-ponchot) for the beautiful designs.

   

   

 ![Cake with Lullabot logo](/sites/default/files/styles/wide_xs/public/2019-02/lullabot.com-cake.jpg.webp?itok=zOzieTEY)

 Published in:

- [  Business   ](/topics/business)
- [  Drupal Development   ](/topics/drupal-development)
- [  Front-end Development   ](/topics/frontend-development)
- [  News   ](/topics/news)

 

   You must have JavaScript enabled to use this form.

## Get in touch with us

### Tell us about your project. We'd love to hear from you!

 First Name  

 Last Name  

 Your email address  

 Your organization  

 How you heard about us  

 Tell us more 

     Leave this field blank