Category Archive for: Blog

rfp-robotRFP ROBOT: Website Request for Proposal Generator

The time has come for a new website (or website redesign), which means you need to write a website request for proposal or web RFP. A Google search produces a few examples, but they vary wildly and don’t seem to speak really to your goals for developing or redesigning a new website. You need to write a website RFP that will clearly articulate your needs and generate responses from the best website designers and developers out there. But how?

Have no fear, RFP Robot is here. He will walk you through a step-by-step process to help you work through the details of your project and create a PDF formatted website design RFP that will provide the information vendors need to write an accurate bid. RFP Robot will tell you what info you should include, point out pitfalls, and give examples.

Redesigning a website using CSS Grid and Flexbox

For the last 15 years, I’ve been using floats for laying out a web pages on This approach to layout involves a lot of trial and error, including hours of fiddling with widths, max-widths, margins, absolute positioning, and the occasional calc() function. I recently decided it was time to redesign my site, and decided to go all-in on CSS Grid and Flexbox. I had never used them before but was surprised by how easy they were to use. After all these years, we finally have a good CSS layout system that eliminates all the trial-and-error. I don’t usually post tutorials on my blog, but decided to make an exception. What is our basic design? The overall layout of the homepage for is shown below. The page consists of two sections: a header and a main content area. For the header, I use CSS Flexbox to position the site…

Read More →

Hey! Chris here, with a big thanks to WordPress, for not just their sponsorship here the last few months, but for being a great product for so many sites I’ve worked on over the years. I’ve been a web designer and developer for the better part of two decades, and it’s been a great career for me. I’m all about learning. The more you know, the more you’re capable of doing and the more doors open for you, so to speak, for getting things done as a web worker. And yet it’s a dance. Just because you know how to do particular things doesn’t mean that you always should. Part of this job is knowing what you should do yourself and what you should outsource or rely on for a trustworthy service. With that in mind, I think if you can build a site with, you should build your…

Read More →

Lazy Loading Images with Vue.js Directives and Intersection Observer

When I think about web performance, the first thing that comes to my mind is how images are generally the last elements that appear on a page. Today, images can be a major issue when it comes to performance, which is unfortunate since the speed a website loads has a direct impact on users successfully doing what they came to the page to do (think conversation rates). Very recently, Rahul Nanwani wrote up an extensive guide on lazy loading images. I’d like to cover the same topic, but from a different approach: using data attributes, Intersection Observer and custom directives in Vue.js. What this’ll basically do is allow us to solve two things: Store the src of the image we want to load without loading it in the first place. Detect when the image becomes visible to the user and trigger the request to load the image. Same basic lazy…

Read More →

Really good.

Too good. Just read it. These are good things to have in one’s life and working towards them for (and in) your work: Autonomy: the feeling that you have control over your day, and that your actions are important. Competence: the feeling that you are good at what you do. Relatedness: the feeling of connection to other people. The great thing is that you don’t have to have much of each, respectively, to actually feel great about the work that you do and the environment in which you work. Currently, in my work right now, I feel a lot of #1 and #3 but I’m struggling with #2; more specifically, my role as a leader in my small company is stretching me in uncomfortable ways (and that’s a good thing). My goal is to seriously level-up my skills as a leader through practice, coaching, and being open to feedback from my team. This…

Read More →

A fresh look for

In 1999, I decided to start (formally as a place to blog, write, and deepen my thinking. While I ran other websites before, my blog is one of my longest running projects. Working on my site helps me relax, so it’s not unusual for me to spend a few hours now and then making tweaks. This could include updating my photo galleries, working on more POSSE features, fixing broken links, or upgrading to the latest version of Drupal. The past month, a collection of smaller updates have resulted in a new visual design for my site. If you are reading this post through an RSS aggregator or through my mailing list, consider checking out the new design on Before (left) and after (right). The new may not win design awards, but will hopefully make it easier to consume the content. My design goals were the…

Read More →

Web Scraping with BeautifulSoup

Python’s BeautifulSoup library makes scraping web data a breeze. With a basic understanding of HTML and Python, you can pull all the data you need from web pages. In this article, I go through an example of web scraping by pulling text data from Warning Before you begin scraping a site, make sure not to violate the site’s Terms of Service. Don’t violate the rules in the site’s robots.txt, and don’t use an overly aggressive crawl rate. Read Benoit Bernard’s blog post about the legality behind web scraping before you start, and consult your legal team before scraping or crawling a site. End of warning The easiest sites to scrape are those with a consistent HTML structure. Let’s look at as an example. If I wanted to pull the author name from each article, I could search each document for the class name ‘credit__author-name,’ and I would find…

Read More →

Decoupled Drupal Authentication with OAuth 2.0

Perhaps the most critical component of any decoupled Drupal architecture is a robust authentication mechanism that protects data transmitted between a Drupal site and API consumers like JavaScript applications and native mobile applications. While Drupal core makes available HTTP Basic Authentication and cookie-based authentication, both easy to use, neither of these approaches is sufficiently secure when it comes to best practices. Fortunately, the Drupal contributed ecosystem contains several highly useful modules that leverage more recent authentication standards like OAuth 2.0 Bearer Token and JSON Web Tokens (JWT), both of which are seeing wide use in the Drupal community among decoupled Drupal practitioners. In the next two installments of Experience Express, we take a breather from voyaging to conferences and inspect authentication best practices in decoupled Drupal, starting with OAuth 2.0. OAuth 2.0 Bearer Token authentication At present, OAuth represents one of the most commonly found authentication methods as an open…

Read More →

Using Event Bus to Share Props Between Vue Components

By default, communication between Vue components happen with the use of props. Props are properties that are passed from a parent component to a child component. For example, here’s a component where title is a prop: <blog-post title=”My journey with Vue”></blog-post> Props are always passed from the parent component to the child component. As your application increases in complexity, you slowly hit what is called prop drilling here’s a relate article that is React-focused, but totally applies). Prop drilling is the idea of passing props down and down and down to child components — and, as you might imagine, it’s generally a tedious process. So, tedious prop drilling can be one potential problem in a complex. The other has to do with the communication between unrelated components. We can tackle all of this by making use of an Event Bus. What is an Event Bus? Well, it’s kind of summed…

Read More →

From a world wide web to a personal web

Last week, I had a chance to meet with Inrupt, a startup founded by Sir Tim Berners-Lee, who is best known as the inventor of the World Wide Web. Inrupt is based in Boston, so their team stopped by the Acquia office to talk about the new company. To learn more about Inrupt’s founding, I recommend reading Tim Berners-Lee’s blog or Inrupt’s CEO John Bruce’s announcement. Inrupt is on an important mission Inrupt’s mission is to give individuals control over their own data. Today, a handful of large platform companies (such as Facebook) control the media and flow of information for a majority of internet users. These companies have profited from centralizing the Open Web and lack transparent data privacy policies on top of that. Inrupt’s goal is not only to improve privacy and data ownership, but to take back power from these large platform companies. Inrupt will leverage Solid,…

Read More →

Should I Re-use Existing Drupal Fields?

Sometimes we’re able to give really clear advice: “Do this!” or “Don’t do that!” This is not going to be one of those blog posts. Drupal gives you the ability to re-use fields. If you have an “Image” field, you could choose to use that same field on every content type on your site. However, it’s not always clear whether re-using fields is a good idea. Sometimes it is, sometimes it isn’t. Here’s an overview of the advantages and disadvantages to consider before re-using Drupal fields. Source:

Blog via Google Docs

There are some great new products that allow folks to get into blogging without the complexity of working through a difficult CMS is pretty encouraging. Why use WordPress? I encountered one the other day which allows you to blog via Google Docs, which is kind of neat. They are framing it in an interesting way, but, that’s besides the point. Here’s a quick look at the dashboard, the editor, and a live post that I quickly created: A Simple Dashboard Create that new blog post! Google Docs much? And finally the published piece: Well… there you have it. Kind of brilliant. Give it a spin if you’d like. Whatever it takes to get you to start writing more publicly. The post Blog via Google Docs appeared first on John Saddington. Source:

Developing With Automad

Selecting the right CMS for a blog or website can be difficult. Every web project has its own needs and requirements, meaning one CMS may be a better fit for one site but not so much for a different site. Simple solutions might be lacking some essential features, while more complex systems can create easily overhead for a given task. I want to cover Automad, a CMS that is less-known than, say, a behemoth like WordPress, but still offers some powerful features like it while maintaining the nimbleness of smaller, simpler solutions, like static site generators. Specifically, Automad fills a gap between larger and smaller offerings in a few key ways: It is file-based, but does not require a database. This ensures quick setup, portability, security, speed, and easy deployment. Even without a database, it offers database features like searching, tagging, filtering, and sorting. A multi-layer caching engine caches content…

Read More →

Nested Links

The other day I posted an image, quite literally as a thought exercise, about how you might accomplish “nested” links. That is, a big container that is linked to one URL that contains a smaller container or text link inside of it that goes to another URL. That’s harder than it might seem at first glance. The main reason being that… <!– this is invalid and won’t render as expected –> <a href=”#one”> Outside <a href=”#two”> Inside </a> </a> Eric Meyer once called for more flexible linking, but even that doesn’t quite handle a situation where one link is nested inside another. Here’s what happens with that HTML, by the way: The nested link gets kicked out. My first inclination would be to simply not nest the links in the markup, but make them appear nested visually. Some folks replied to the tweet, including Nathan Smith, who shared that same…

Read More →

Thinking in Bets

About a month or so ago I wrote a post about Annie Duke and a podcast that I had listened to that had her as a guest; in short, it was so good that I immediately bought her new book, Thinking in Bets, and it really has changed my life, zero hyperbole. It’s been so good that I’ve told a dozen folks about it and the book ranks very high on my must-read list. It has not only changed the way that I think through decisions but it also has changed the very speech and psychological patterns that I’ve developed over many, many years. I don’t want to talk it up too much, but, I did want to capture a few things here on my blog that I want to be able to reference in the future – my blog often times functions as a repository of thoughts (both complete and mostly incomplete) but also…

Read More →

State of Drupal presentation (September 2018)

Last week, nearly 1,000 Drupalists gathered in Darmstadt, Germany for Drupal Europe. In good tradition, I presented my State of Drupal keynote. You can watch a recording of my keynote (starting at 4:38) or download a copy of my slides (37 MB). Drupal 8 continues to mature I started my keynote by highlighting this month’s Drupal 8.6.0 release. Drupal 8.6 marks the sixth consecutive Drupal 8 release that has been delivered on time. Compared to one year ago, we have 46 percent more stable Drupal 8 modules. We also have 10 percent more contributors are working on Drupal 8 Core in comparison to last year. All of these milestones indicate that the Drupal 8 is healthy and growing. Next, I gave an update on our strategic initiatives: Make Drupal better for content creators © Paul JohnsonThe expectations of content creators are changing. For Drupal to be successful, we have to…

Read More →

Blog Compass App (for Android)

Google released a new app called “Blog Compass” and I decided to give it a spin… until I realized that it’s Android-only, at least for now: Blog compass is an app that helps bloggers manage their site and find topics to write about. Blog Compass suggests trending topics based on your interests and posting history. You can track site stats, approve comments, and read tips for how to make your blog more successful all in one place. The app is compatible with blogs using,, or self hosted WordPress blogs using the Jetpack plugin. A few screenshots from their homepage about what you can do: But… I couldn’t help but try anyway (you can actually run Android Apps via Chrome if you’re motivated enough to do it) via tools like this. Overall, I’m not really impressed but you could find it useful. To be honest, there are a ton…

Read More →

HTML elements, unite! The Voltron-like powers of combining elements.

Guides, resources and discussions about Semantic HTML are often focused around specific elements, like a heading, or a sectioning element, or a list. It’s not often that we talk specifically about how we can combine HTML elements to increase their effectiveness. Normally, when we introduce HTML, we talk about how it is used to apply meaning to content in a document, and we do this by using examples like: “Is it a paragraph?” “Is it a heading?” “Is it a numbered list” “Is it a button” We use these examples because they are easy to understand — it’s a single piece or chunk of the same content that needs to be represented in a particular way. This is useful, but it only scratches the surface of how we can use and combine elements to provide more context and meaning. You remember Voltron, right? Each member of the Voltron force was…

Read More →

We made Drupal a lot easier to evaluate

Seven months ago, Matthew Grasmick published an article describing how hard it is to install Drupal. His article included the following measurements for creating a new application on his local machine, across four different PHP frameworks: Platform Clicks Time Drupal 20+ 15:00+ Symfony 3 1:55 WordPress 7 7:51 Laravel 3 17:28 The results from Matthew’s blog were clear: Drupal is too hard to install. It required more than 15 minutes and 20 clicks to create a simple site. Seeing these results prompted me to launch a number of initiatives to improve the evaluator experience at DrupalCon Nashville. Here is the slide from my DrupalCon Nashville presentation: A lot has happened between then and now: We improved the download page to improve the discovery experience on We added an Evaluator Guide to We added a quick-start command to Drupal 8.6 We added the Umami demo profile to Drupal 8.6…

Read More →

Coding with Cache Tags in Drupal 8

Cache tags are a game changer for your caching strategy in Drupal 8. Expiry vs invalidation Up until Drupal 8, Drupal has had one caching strategy called cache expiration. It cached computed output for a fixed period of time (e.g. 1 hour). There are two downsides to this approach: You cannot see newer content until the expiration time (time-to-live or TTL) had lapsed. You would have to compute output again after the expiration period even if nothing had changed. Drupal 8 introduced another option called cache invalidation. This is where you set the cache lifetime to be permanent and invalidate (purge) that cached item when its no longer relevant. Drupal 8 does this by storing metadata about the cached item. Then, when an event occurs, such as an update on a node, the metadata can be searched to find all cache items that contain computed data about the updated node,…

Read More →

Back to Top