Archive

Archive for September, 2014

Corporate Design Made Easy: 30 Free Stationery Mockup Templates

September 16th, 2014 No comments

Establishing your company in the real as well as the virtual world is an essential step towards success. While websites, profiles in social media, and mobile apps help to conquer the internet, in the real world things are less simple and straightforward. Still you are blessed with a wide selection of choices. You can go for press/television advertisements or various public campaigns, but before that you should take care of creating a corporate identity design that will clearly and attractively stand for what you are standing for. Logotype, tagline and coloring will form your brand in users’ minds. To achieve this, printed material is simply irreplaceable. And that’s where we want to help you with today. Get inspired by our 30 free stationery mockup templates in PSD format…

Categories: Others Tags:

Essential Visual Feedback Tools For Web Designers

September 16th, 2014 No comments
InVision enables designers to collaborate and to showcase their work.

The creative process takes a lot of time, and web designers know it. When you factor in feedback from clients, the process takes even longer: numerous emails, revision notes, chats and meetings — that’s what it normally takes to find out precisely what the client wants.

Fortunately, today’s web provides various solutions to optimize the communication process. The first web services that allow users to report bugs on web pages appeared several years ago. Since then, tools and technologies have emerged to make the process more convenient and user-friendly. Today’s market offers several useful products for visual bug-tracking, each with its pros and cons.

We have selected our top five tools and compared their features, functionality and pricing. We hope that this review will simplify your workflow and speed up communication between your team and clients.

InVision LiveCapture

Invision1 is a prototyping tool that enables designers to easily collaborate on design projects and to showcase their work. Quite recently, the company announced the release of a new tool, InVision LiveCapture192. It grabs full-length snapshots of live websites and helps users provide feedback during the design process.

3
InVision enables designers to collaborate and to showcase their work. (View large version4)

User Experience

Getting started with InVision is easy. Just add your first project and install the extension for Google Chrome. To start commenting on a web page, click on the extension icon and select the project.

InVision LiveCapture extension.

When someone adds a comment, feedback appears on the normal screen in InVision, which would already be familiar to the designer.

InVision LiveCapture extension
InVision LiveCapture extension.

The service is targeted at web designers who are looking for an easy way to get feedback on their work in progress. Unfortunately, it cannot be used to comment on a live web page or integrated in a large team’s workflow or used as a bug-tracking tool. On the other hand, it’s free!

Pros

  • Easy to work with
  • Great for collecting inspirational ideas
  • Ideal for existing customers looking to get more out of Invision

Cons

  • Works with Google Chrome only
  • Browser extension required
  • Reporting bugs is difficult

Third-Party Integration

  • InVision
  • Doesn’t support third-party project-management or bug-tracking systems

Supported Browsers

  • Chrome

Pricing

The free plan is available for individual use. A subscription plan for teams with up to five members and unlimited projects costs $100 per month.

TrackDuck

TrackDuck5 is a visual feedback tool that is ideal for web designers and developers. Users can highlight issues on the page, comment and receive feedback in real time. Bug reports are sent directly to the dashboard, where you can chat with others, assign tasks and track progress.

TrackDuck Visual Feedback
With TrackDuck users can highlight issues on the page, comment and receive feedback in real time.

User Experience

Immediately after you register, which takes about a minute, a simple wizard helps you to get started with your first project in three simple steps: enter a website address, install the extension for capturing high-quality screenshots, and invite colleagues to collaborate on the project. The website that you add then opens in a new tab, and you can start commenting right on the web page by selecting and dragging the mouse wherever you notice a bug. You can appoint a colleague to fix the issue and assign a priority to the task.

TrackDuck visual feedback
TrackDuck visual feedback
It works even for responsive websites, and you can always check what a bug looks like on your smartphone6
It works even for responsive websites, and you can always check what a bug looks like on your smartphone. (View large version7)
All tasks and bug reports are available in the dashboard. Issues are also visible as pins on the web page itself
All tasks and bug reports are available in the dashboard. Issues are also visible as pins on the web page itself.

TrackDuck currently integrates with only a couple of systems: JIRA and Basecamp. The integration works both ways — tasks are sent and updated automatically in both systems, no double entry required.

Pros

  • Unlimited number of team members
  • Cross-browser
  • Technical details are collected automatically
  • Real time with WebSockets
  • No extensions needed
  • Anonymous feedback allowed

Cons

  • Extension required to capture high-quality screenshots
  • Few systems to integrate with

Third-Party Integration

  • Basecamp (both ways)
  • JIRA (both ways)
  • WordPress plugin
  • Modx plugin

Supported Browsers

  • Chrome
  • Internet Explorer
  • Safari
  • Firefox
  • bookmarklet (for other browsers)

Pricing

You can get a free 14-day trial of the fully functional version. The free version allows for one project and unlimited contributors. Paid subscription plans start at $19 per month. Custom enterprise plans are also available.

BugMuncher

Bugmuncher8 is a handy web application allows you to highlight problems on a website. Users can make notes on specific areas of a website where they notice issues. BugMuncher will automatically take a screenshot of the area where the highlight was made and send it to you.

BugMuncher9
BugMuncher allows you to highlight problems on a website.

User Experience

Installing and getting started with BugMuncher isn’t complicated. All you have to do is embed the code on your website. Anyone who has ever set up Google Analytics could handle it. There is no onboarding tour, which could be a problem for inexperienced users. Also, when you embed the code on your website, a small shortcut appears for all visitors to the page, allowing them to highlight or (if they need to hide personal data) to black out certain parts of the page. However, you cannot add separate text comments to the web page.

All tasks and bug reports are available in the dashboard
All tasks and bug reports are available in the dashboard. Issues are also visible as pins on the web page itself.

When testing this tool, I couldn’t scroll down the page and was confined to working within the visible area, which is a bit odd.

After you have highlighted an area of the page, you will be prompted to enter your email address, describe the bugs you’ve found and submit them. You can access all reports, configure email alerts and set up integration in the dashboard.

Pros

  • Cross-browser
  • Automatically attaches technical details
  • No extension needed
  • Allows for anonymous feedback

Cons

  • Not real time
  • Cannot select a particular area of a page
  • No way to comment on dynamic elements on the page

Third-Party Integration

  • GitHub
  • activeCollab
  • Bitbucket
  • Trello
  • Zendesk

Supported Browsers

  • Chrome
  • FireFox
  • Safari

Pricing

A free 30-day trial is available. After that, pricing starts at $19 per month for a personal subscription with one account. If your team has five members, you would pay $199 per month.

BugHerd

BugHerd10 is a simple bug-tracking and collaboration tool for web designers and their clients. It allows users to flag issues on web pages using a simple point-and-click interface and to submit reports of problems.

BugHerd Main Page11
BugHerd allows users to flag issues using a simple point-and-click interface and to submit reports of problems. (View large version12)

User Experience

You don’t need a credit card to sign up. Registration is pretty simple: You can try the tool by installing a browser extension or by adding JavaScript code to your website. Once you’ve done one of these two things, you’ll be able to add websites to work with. Don’t forget to include the http:// or https://, or else it won’t work.

After completing the short onboarding process, you’ll be all set and can pin issues and bugs directly to web pages. You can’t highlight random areas of the page; the tool is tied to DOM elements — a useful but questionable solution. We particularly had problems selecting big areas of the page.

While not a major issue, the indicator can be hard to notice on light and gray backgrounds, so you might have to refer to the task list to find it sometimes.

Another drawback is the size and location of the side panel, which occupies a big part of the page, hiding your pins and most of the page.

The side panel is a bit too big
The side panel is a bit too big.

BugHerd offers quite a lot of integration (we tried Basecamp and JIRA). Unfortunately, integration seems to work only one way for now — tasks created in Bugherd are sent to Basecamp, but if you update them directly in Basecamp, you won’t be notified of the changes in Bugherd.

Bugherd toolbar13
Bugherd’s toolbar. (View large version14)

Overall, the product is very good. The UX is questionable in places — as mentioned, the side panel is just too big. Prices are a little steep, too; prepare to pay almost $100 for a team of five.

Pros

  • Highlight bugs directly on the web page
  • Anonymous comments allowed
  • Screenshot automatically sent with every bug report
  • A lot of third-party integration

Cons

  • Sidebar is too big
  • Integration with third-party systems is one way
  • Quite expensive
  • Extension required to capture screenshots
  • Expensive for teams

Third-Party Integration

  • JIRA
  • Basecamp
  • GitHub
  • Redmine
  • Zendesk
  • Pivotal Tracker

Supported Browsers

  • Chrome
  • FireFox
  • Safari
  • Internet Explorer

Pricing

Pricing starts at $19 per month. A short free trial is available, after which you’ll have to pay for each user on the account.

Notable

Notable2315 is a web-based application for sharing feedback on images, mockups and live website designs. The user takes a screenshot of any interface, draws a box around the area they want to comment on and then types in their feedback.

Notable Main Page16
Notable is a web-based application for sharing feedback on images, mockups and live website designs.

User Experience

You start the registration process by entering your payment details, even if you’ve selected a trial account. If you want to skip this step, then you just have to watch a demo video of the service on YouTube and then install the required extension. Then, when you click the extension’s icon, the app automatically takes a screenshot and uploads it to the server. After the upload, you are redirected to the saved screenshot, where you can highlight any area and add comments.

Notable in action17
Notable in action. (View large version18)

It also saves HTML and CSS from the page, including meta tags, in text format. This separation of code, styles and images seems less useful than BugHerd and TrackDuck’s method, but it might appeal to some users.

Pros

  • Export custom PDFs
  • Unlimited team members
  • Ability to comment on source code

Cons

  • Credit card is required
  • Browser extension is required
  • Cannot mark up dynamic elements of web pages

Third-Party Integration

  • No information found

Supported Browsers

  • Chrome
  • Internet Explorer
  • Safari
  • Firefox
  • bookmarklet (for other browsers)

Pricing

Pricing starts at $19 per month, and a 30-day trial is available. A credit card is required for all plans.

Our Choice

Before visual feedback tools, it was difficult to imagine a project manager’s daily workflow without the endless emails and chats between designers and developers. Email was the primary means of communication, and it felt like a big waste of time.

A colleague of ours introduced us to BugHerd, which is an awesome tool for collaborating on web projects, and we started using it. Later, we switched to TrackDuck for a few reasons. First, the service is relatively new and takes advantage of modern web technology. It also offers the same functionality but is significantly more affordable for medium and large teams. In addition, we use Basecamp to manage projects, and the two apps integrate nicely. As a bonus, TrackDuck offers two-way integration, with updates being sent to both systems automatically.

Summary

Visual-feedback and bug-tracking services are becoming ever more popular, and integrating one of them into their workflow would simplify the communication process of any web developer. Taking the five that we’ve identified and that we think are the most useful, we’ve laid out the advantages of each in the table below to help you determine which is right for you.

Service Advantages Pricing
InVision LiveCapture192
  • Easy to work with
  • Great for collecting inspirational ideas
  • Ideal for existing customers looking to get more out of Invision
  • Free for InVision users
TrackDuck20
  • Unlimited number of team members
  • Cross-browser
  • Technical details are collected automatically
  • Real time with WebSockets
  • No extension needed
  • Anonymous feedback allowed
  • $0 – $49
  • 14-day trial
  • Free plan forever
BugMuncher21
  • Export custom PDFs
  • Unlimited team members
  • Ability to comment on source code
  • $19 – $199
  • 30-day trial
BugHerd22
  • Highlight problems directly on web page
  • Anonymous comments allowed
  • Screenshot sent automatically with each bug report
  • A lot of third-party integration
  • $29 – $180
  • 14-day trial
Notable2315
  • Export custom PDFs
  • Unlimited team members
  • Ability to comment on source code
  • $19 — $99
  • 30-day trial
  • Credit card required

If you have experience using visual feedback services, please let us know in the comments below.

(al, ml)

Footnotes

  1. 1 http://www.invisionapp.com/
  2. 2 http://www.invisionapp.com/new-features/25/livecapture-bring-the-web-into-invision
  3. 3 http://www.smashingmagazine.com/wp-content/uploads/2014/08/01-invision-opt.jpg
  4. 4 http://www.smashingmagazine.com/wp-content/uploads/2014/08/01-invision-opt.jpg
  5. 5 https://trackduck.com
  6. 6 http://www.smashingmagazine.com/wp-content/uploads/2014/08/06-trackduck-popover-opt.jpg
  7. 7 http://www.smashingmagazine.com/wp-content/uploads/2014/08/06-trackduck-popover-opt.jpg
  8. 8 http://bugmuncher.com
  9. 9 http://www.smashingmagazine.com/wp-content/uploads/2014/08/08-bugmuncher-opt.jpg
  10. 10 http://bugherd.com
  11. 11 http://www.smashingmagazine.com/wp-content/uploads/2014/08/10-bugherd-opt.jpg
  12. 12 http://www.smashingmagazine.com/wp-content/uploads/2014/08/10-bugherd-opt.jpg
  13. 13 http://www.smashingmagazine.com/wp-content/uploads/2014/08/12-bugherd-toolbar-opt.jpg
  14. 14 http://www.smashingmagazine.com/wp-content/uploads/2014/08/12-bugherd-toolbar-opt.jpg
  15. 15 http://notableapp.com
  16. 16 http://www.smashingmagazine.com/wp-content/uploads/2014/08/13-notable-opt.jpg
  17. 17 http://www.smashingmagazine.com/wp-content/uploads/2014/08/14-notable-opt.jpg
  18. 18 http://www.smashingmagazine.com/wp-content/uploads/2014/08/14-notable-opt.jpg
  19. 19 http://www.invisionapp.com/new-features/25/livecapture-bring-the-web-into-invision
  20. 20 https://TrackDuck.com
  21. 21 https://BugMuncher.com
  22. 22 https://BugHerd.com
  23. 23 http://notableapp.com

The post Essential Visual Feedback Tools For Web Designers appeared first on Smashing Magazine.

Categories: Others Tags:

Making Modal Windows Better For Everyone

September 15th, 2014 No comments

To you, modal windows1 might be a blessing of additional screen real estate, providing a way to deliver contextual information, notifications and other actions relevant to the current screen. On the other hand, modals might feel like a hack that you’ve been forced to commit in order to cram extra content on the screen. These are the extreme ends of the spectrum, and users are caught in the middle. Depending on how a user browses the Internet, modal windows can be downright confusing.

Modals quickly shift visual focus from one part of a website or application to another area of (hopefully related) content. The action is usually not jarring if initiated by the user, but it can be annoying and disorienting if it occurs automatically, as happens with the modal window’s evil cousins, the “nag screen” and the “interstitial.”

However, modals are merely a mild annoyance in the end, right? The user just has to click the “close” button, quickly skim some content or fill out a form to dismiss it.

Well, imagine that you had to navigate the web with a keyboard. Suppose that a modal window appeared on the screen, and you had very little context to know what it is and why it’s obscuring the content you’re trying to browse. Now you’re wondering, “How do I interact with this?” or “How do I get rid of it?” because your keyboard’s focus hasn’t automatically moved to the modal window.

This scenario is more common than it should be. And it’s fairly easy to solve, as long as we make our content accessible to all through sound usability practices.

For an example, I’ve set up a demo of an inaccessible modal window2 that appears on page load and that isn’t entirely semantic. First, interact with it using your mouse to see that it actually works. Then, try interacting with it using only your keyboard.

Better Semantics Lead To Better Usability And Accessibility

Usability and accessibility are lacking in many modal windows. Whether they’re used to provide additional actions or inputs for interaction with the page, to include more information about a particular section of content, or to provide notifications that can be easily dismissed, modals need to be easy for everyone to use.

To achieve this goal, first we must focus on the semantics of the modal’s markup. This might seem like a no-brainer, but the step is not always followed.

Suppose that a popular gaming website has a full-page modal overlay and has implemented a “close” button with the code below:

<div id="modal_overlay">
  <div id="modal_close" onClick="modalClose()">
    X
  </div>
  …
</div>

This div element has no semantic meaning behind it. Sighted visitors will know that this is a “close” button because it looks like one. It has a hover state, so there is some visual indication that it can be interacted with.

But this element has no inherit semantic meaning to people who use a keyboard or screen reader.

There’s no default way to enable users to tab to a div without adding a tabindex attribute to it. However, we would also need to add a :focus state to visually indicate that it is the active element. That still doesn’t give screen readers enough information for users to discern the element’s meaning. An “X” is the only label here. While we can assume that people who use screen readers would know that the letter “X” means “close,” if it was a multiplication sign (using the HTML entity ×) or a cross mark (), then some screen readers wouldn’t read it at all. We need a better fallback.

We can circumvent all of these issues simply by writing the correct, semantic markup for a button and by adding an ARIA label for screen readers:

<div id="modal_overlay">
  <button type="button" class="btn-close" id="modal_close" aria-label="close">
    X
  </button>
</div>

By changing the div to a button, we’ve significantly improved the semantics of our “close” button. We’ve addressed the common expectation that the button can be tabbed to with a keyboard and appear focused, and we’ve provided context by adding the ARIA label for screen readers.

That’s just one example of how to make the markup of our modals more semantic, but we can do a lot more to create a useful and accessible experience.

Making Modals More Usable And Accessible

Semantic markup goes a long way to building a fully usable and accessible modal window, but still more CSS and JavaScript can take the experience to the next level.

Including Focus States

Provide a focus state! This obviously isn’t exclusive to modal windows; many elements lack a proper focus state in some form or another beyond the browser’s basic default one (which may or may not have been cleared by your CSS reset). At the very least, pair the focus state with the hover state you’ve already designed:

.btn:hover, .btn:focus {
  background: #f00;
}

However, because focusing and hovering are different types of interaction, giving the focus state its own style makes sense.

.btn:hover {
  background: #f00;
}

:focus {
  box-shadow: 0 0 3px rgba(0,0,0,.75);
}

Really, any item that can be focused should have a focus state. Keep that in mind if you’re extending the browser’s default dotted outline.

Saving Last Active Element

When a modal window loads, the element that the user last interacted with should be saved. That way, when the modal window closes and the user returns to where they were, the focus on that element will have been maintained. Think of it like a bookmark. Without it, when the user closes the modal, they would be sent back to the beginning of the document, left to find their place. Add the following to your modal’s opening and closing functions to save and reenable the user’s focus.

var lastFocus;

function modalShow () {
  lastFocus = document.activeElement;
}

function modalClose () {
  lastFocus.focus(); // place focus on the saved element
}

Shifting Focus

When the modal loads, focus should shift from the last active element either to the modal window itself or to the first interactive element in the modal, such as an input element. This will make the modal more usable because sighted visitors won’t have to reach for their mouse to click on the first element, and keyboard users won’t have to tab through a bunch of DOM elements to get there.

var modal = document.getElementById('your-modal-id-here');

function modalShow () {
   modal.setAttribute('tabindex', '0');
   modal.focus();
}

Going Full Screen

If your modal takes over the full screen, then obscure the contents of the main document for both sighted users and screen reader users. Without this happening, a keyboard user could easily tab their way outside of the modal without realizing it, which could lead to them interacting with the main document before completing whatever the modal window is asking them to do.

Use the following JavaScript to confine the user’s focus to the modal window until it is dismissed:

function focusRestrict ( event ) {
  document.addEventListener('focus', function( event ) {
    if ( modalOpen && !modal.contains( event.target ) ) {
      event.stopPropagation();
      modal.focus();
    }
  }, true);
}

While we want to prevent users from tabbing through the rest of the document while a modal is open, we don’t want to prevent them from accessing the browser’s chrome (after all, sighted users wouldn’t expect to be stuck in the browser’s tab while a modal window is open). The JavaScript above prevents tabbing to the document’s content outside of the modal window, instead bringing the user to the top of the modal.

If we also put the modal at the top of the DOM tree, as the first child of body, then hitting Shift + Tab would take the user out of the modal and into the browser’s chrome. If you’re not able to change the modal’s location in the DOM tree, then use the following JavaScript instead:

var m = document.getElementById('modal_window'),
    p = document.getElementById('page');

// Remember that <div id="page"> surrounds the whole document,
// so aria-hidden="true" can be applied to it when the modal opens.

function swap () {
  p.parentNode.insertBefore(m, p);
}

swap();

If you can’t move the modal in the DOM tree or reposition it with JavaScript, you still have other options for confining focus to the modal. You could keep track of the first and last focusable elements in the modal window. When the user reaches the last one and hits Tab, you could shift focus back to the top of the modal. (And you would do the opposite for Shift + Tab.)

A second option would be to create a list of all focusable nodes in the modal window and, upon the modal firing, allow for tabbing only through those nodes.

A third option would be to find all focusable nodes outside of the modal and set tabindex="-1" on them.

The problem with these first and second options is that they render the browser’s chrome inaccessible. If you must take this route, then adding a well-marked “close” button to the modal and supporting the Escape key are critical; without them, you will effectively trap keyboard users on the website.

The third option allows for tabbing within the modal and the browser’s chrome, but it comes with the performance cost of listing all focusable elements on the page and negating their ability to be focused. The cost might not be much on a small page, but on a page with many links and form elements, it can become quite a chore. Not to mention, when the modal closes, you would need to return all elements to their previous state.

Clearly, we have a lot to consider to enable users to effectively tab within a modal.

Dismissing

Finally, modals should be easy to dismiss. Standard alert() modal dialogs can be closed by hitting the Escape key, so following suit with our modal would be expected — and a convenience. If your modal has multiple focusable elements, allowing the user to just hit Escape is much better than forcing them to tab through content to get to the “close” button.

function modalClose ( e ) {
  if ( !e.keyCode |s| e.keyCode === 27 ) {
    // code to close modal goes here
  }
}

document.addEventListener('keydown', modalClose);

Moreover, closing a full-screen modal when the overlay is clicked is conventional. The exception is if you don’t want to close the modal until the user has performed an action.

Use the following JavaScript to close the modal when the user clicks on the overlay:

mOverlay.addEventListener('click', function( e )
  if (e.target == modal.parentNode)
    modalClose( e );
  }
}, false);

Additional Accessibility Steps

Beyond the usability steps covered above, ARIA roles, states and properties3 will add yet more hooks for assistive technologies. For some of these, nothing more is required than adding the corresponding attribute to your markup; for others, additional JavaScript is required to control an element’s state.

aria-hidden

Use the aria-hidden attribute. By toggling the value true and false, the element and any of its children will be either hidden or visible to screen readers. However, as with all ARIA attributes, it carries no default style and, thus, will not be hidden from sighted users. To hide it, add the following CSS:

.modal-window[aria-hidden=”true”] {
  display: none;
}

Notice that the selector is pretty specific here. The reason is that we might not want all elements with aria-hidden="true" to be hidden (as with our earlier example of the “X” for the “close” button).

role=”dialog”

Add role="dialog" to the element that contains the modal’s content. This tells assistive technologies that the content requires the user’s response or confirmation. Again, couple this with the JavaScript that shifts focus from the last active element in the document to the modal or to the first focusable element in the modal.

However, if the modal is more of an error or alert message that requires the user to input something before proceeding, then use role="alertdialog" instead. Again, set the focus on it automatically with JavaScript, and confine focus to the modal until action is taken.

aria-label

Use the aria-label or aria-labelledby attribute along with role="dialog". If your modal window has a heading, you can use the aria-labelledby attribute to point to it by referencing the heading’s ID. If your modal doesn’t have a heading for some reason, then you can at least use the aria-label to provide a concise label about the element that screen readers can parse.

What About HTML5’s Dialog Element?

Chrome 37 beta and Firefox Nightly 34.0a1 support the dialog element, which provides extra semantic and accessibility information for modal windows. Once this native dialog element is established, we won’t need to apply role="dialog" to non-dialog elements. For now, even if you’re using a polyfill for the dialog element, also use role="dialog" so that screen readers know how to handle the element.

The exciting thing about this element is not only that it serves the semantic function of a dialog, but that it come with its own methods, which will replace the JavaScript and CSS that we currently need to write.

For instance, to display or dismiss a dialog, we’d write this base of JavaScript:

var modal = document.getElementById('myModal'),
  openModal = document.getElementById('btnOpen'),
  closeModal = document.getElementById('btnClose');

// to show our modal
openModal.addEventListener( 'click', function( e ) {
  modal.show();
  // or
  modal.showModal();
});

// to close our modal
closeModal.addEventListener( 'click', function( e ) {
  modal.close();
});

The show() method launches the dialog, while still allowing users to interact with other elements on the page. The showModal() method launches the dialog and prevents users from interacting with anything but the modal while it’s open.

The dialog element also has the open property, set to true or false, which replaces aria-hidden. And it has its own ::backdrop pseudo-element, which enables us to style the modal when it is opened with the showModal() method.

There’s more to learn about the dialog element than what’s mentioned here. It might not be ready for prime time, but once it is, this semantic element will go a long way to helping us develop usable, accessible experiences.

Where To Go From Here?

Whether you use a jQuery plugin or a homegrown solution, step back and evaluate your modal’s overall usability and accessibility. As minor as modals are to the web overall, they are common enough that if we all tried to make them friendlier and more accessible, we’d make the web a better place.

I’ve prepared a demo of a modal window4 that implements all of the accessibility features covered in this article.

(hp, il, al, ml)

Footnotes

  1. 1 http://www.smashingmagazine.com/2009/05/27/modal-windows-in-modern-web-design/
  2. 2 http://www.smashingmagazine.com/wp-content/uploads/2014/inaccessible.html
  3. 3 http://www.w3.org/TR/wai-aria/
  4. 4 http://www.smashingmagazine.com/wp-content/uploads/2014/accessible.html

The post Making Modal Windows Better For Everyone appeared first on Smashing Magazine.

Categories: Others Tags:

Exclusive Giveaway: Six Licenses of the Visual MotoPress Content Editor for WordPress (Comment to Win)

September 15th, 2014 No comments

Today we got a fantastic opportunity for our dear readers here at Noupe Magazine. We teamed up with MotoPress and came up with the idea to give away six licenses of their visual editor for WordPress. MotoPress Content Editor for WordPress lets you build your posts and pages in WYSIWYG mode. Forget about TinyMCE and its shortcomings and turn to the easiest and most powerful way to create with WordPress. All you need to do to secure your chance to win is leave a comment below this article. Easy, isn’t it?

Categories: Others Tags:

Are Your Internal Systems Damaging Your Business?

September 12th, 2014 No comments

The internal systems of many organizations have shocking user interfaces. This costs companies in productivity, training and even the customer experience.

Fortunately, we can fix this.

“How come I can download an app on my phone and instantly know how to use it, yet need training to use our content management system? Shouldn’t our system be intuitive?”

This was just one of the comments I heard in a recent stakeholder interview. People are fed up with inadequate internal systems. Many of those I interviewed had given up on the official software. Instead, they use tools like Dropbox, Google Docs and Evernote.

The problem seems to exist across the board. I am hearing the same thing from employees across many companies and sectors. I am also hearing it about almost all types of internal systems, from ones for customer relationship management (CRM) to ones for procurement. They are all painful to use.

Frustration will only increase as millennials enter the workforce. These people are digital natives, and they expect a certain standard of software. They expect software to adapt to them, not the other way around.

The result of this frustration is that employees are abandoning these systems. People use email instead of a CRM and put documents in Dropbox rather than on the intranet. This leads to systems being out of date and, thus, irrelevant to the organization.

How have things gotten to this state? Why is enterprise software so bad?

One Size Does Not Fit All

I think technology is often oversold. “A content management system is the solution to content!” “An intranet is the answer to improving efficiency!” “A CRM system will manage the customer relationship!” But that is just not true.

Unfortunately, in the eyes of senior management, once a piece of software is purchased, the problem is solved. Job done, move on to the next challenge.

One size rarely fits all. Organizations rarely work in the same way, even within the same sector. Even if a law firm purchases an intranet designed for the legal sector, the system won’t necessarily work well out of the box for that firm.

People work in different ways. The functionality required by the secretary to the CEO will be different from the functionality required by someone in accounting or HR. Yet many enterprise systems do nothing to streamline the experience for different groups. (Image source: opensourceway1)

Many of these systems could be tailored to the needs of individual organizations or employees, but they are not so out of the box. They need to be configured and optimized, which usually does not happen — or else the wrong system is purchased to begin with.

There must be a better way.

Starting With Users’ Needs

The procurement process for these systems too often begins with a list of desired features. This is the wrong starting point. We should approach internal software in the same way that we develop external applications: starting with users’ needs.

Regardless of whether you already have a system in place, identify your different user groups. Who will be using each system? Once you know that, shadow them for a while. Understand how they work. What do they do each day, and what system do they already use to get their work done?

Look for pain points in that system, and talk to them about where they get frustrated. Identify the information they need to do their job, and be aware of any clutter that gets in the way.

Finally, identify your users’ top tasks. Which tasks do your different user groups do again and again. These need to be super-accessible.

You might think that you now have enough information to buy a system. But just because something has the functionality you need does not mean it is easy to use. Before leaping for expensive software, design the user experience. We can do that with some simple prototyping.

Prototype Your Perfect System

Creating a prototype of how your ideal system would work does not need to be time-consuming or particularly expensive. Best of all, it could replace a long-winded and abstract specification of functions.

Using nothing but a bit of HTML, CSS and JavaScript, we can build a working prototype that can be tested with real users. Does this prototype match their workflow? Does it give them quick access to key tasks? Does it accommodate the differences between groups? Which parts of the prototype are having the biggest impact on productivity, and which are just nice to have?

We can iterate on the prototype based on user feedback until it offers the optimal experience.

With that vision in place, you can compromise intelligently.

Informed Compromise

A working prototype is a good standard by which to measure different software — much better than a specification.

Could your existing system be set up to mirror the prototype? If it can’t exactly, then which areas would you have to compromise on? Based on your user testing, are these compromises acceptable?

If your existing system cannot replicate the key functionality of the prototype, look at alternatives. Talk to other vendors and show them your prototype. Ask whether their system can replicate it, and once again, decide on areas of compromise based on user feedback.

Do you see the difference here? The experience is designed around the user, not around what the software provides. Also, if you cannot find software that meets the needs of your users, consider building a bespoke system.

Buying software off the shelf makes no sense if no one will use it or if it provides no business value.
Buying software off the shelf makes no sense if no one will use it or if it provides no business value. (Image source: opensourceway2)

I know what you’re thinking. This makes sense, but senior management won’t go for it. They won’t pay for a prototype or a bespoke system. Well, that depends on how you sell it.

Selling The Need For A User-Centric System

Convincing management to spend money on a prototype can be hard. It’s hard enough when a clever salesperson says that their software will solve all of the company’s problems — harder still if management has already paid for a fancy system. Nevertheless, solid business arguments can be made for this approach.

If your company has a system that is not fit for its purpose, you should be able to prove this. Collect data on how users interact with the system. Combine this with user testing and stakeholder interviews. This should be enough to establish a compelling case — at least compelling enough to justify some limited prototyping of an alternative approach.

Remember that you are not asking them to replace the system. You just want to prototype a potentially better solution and see whether the current software could be set up to match it. When managers see a better way, they will usually be open to change.

If the company does not already own a system, then your position is even stronger. Enterprise software is expensive, and so ensuring the right fit is important. Getting it wrong could mean hundreds or thousands of dollars wasted. A prototype will prove more effective than a specification at measuring the suitability of different products. It will also make it easier to compare software.

Of course, management could take the position that employees will just need to get used to what they have. This argument has some merit. Given time, users would adapt to even the most archaic of systems. But at what cost?

The Cost Of Failure

Poor user interfaces require more training and support. Both are a cost borne by the organization, not to mention the frustration it causes. Even more significant is the cost in lost productivity. Organizations are keen to maximize efficiency, and systems that are easy to use go a long way towards this.

Unfortunately, some managers seem to care little about internal processes. But they do care about customer satisfaction, which is becoming one of the most popular factors for organizations to measure. We now live in a world of consumers who are connected and have a voice through social media. That makes organizations sensitive to negative comments and experiences.

Internal systems weigh heavily on the performance of your employees. And they have a massive impact on the customer experience. These systems ensure timely responses; they help deliver the product; and they facilitate customer relationships. This is why internal systems are becoming the next big competitive advantage.

3Are you struggling to implement an effective digital strategy? Do you need help bringing about a digital transformation? The Digital Adaptation4 book can help you prepare and adapt your company for the new digital landscape, and teach you everything you need to know. — Ed.

(al, il)

Footnotes

  1. 1 https://www.flickr.com/photos/opensourceway/4371000486/
  2. 2 https://www.flickr.com/photos/opensourceway/4504724163/
  3. 3 http://www.digital-adaptation.com/
  4. 4 http://www.digital-adaptation.com

The post Are Your Internal Systems Damaging Your Business? appeared first on Smashing Magazine.

Categories: Others Tags:

Sequence.js: Responsive Content Slider with CSS3 Transitions and Gesture Control

September 12th, 2014 No comments

Plugins for content sliders are a dime a dozen, fish in the sea, you name it. Fewer, but still many are supporting CSS3 transitions and working responsively. Anyway „Sequence.js“ is something special. This JavaScript does not only support animations on the transition of slides as a whole. Instead all of the content of a slide, be it headlines or images, can be animated individually. Being a top-notch web tool, „Sequence.js“ even supports gesture control to be intuitively usable on smartphones and tablets as well. Now tell me, doesn’t this set that responsive content slider far enough apart to justify a closer look?

Categories: Others Tags:

Dropbox’s Carousel Design Deconstructed (Part 2)

September 11th, 2014 No comments
Carousel mobile app

Many of today’s hottest technology companies, both large and small, are increasingly using the concept of the minimum viable product (MVP) as way to iteratively learn about their customers and develop their product ideas. This two-part series, looks into the product design process of Dropbox’s Carousel.

Part 11 covered the core user, their needs and Dropbox’s business needs, and broke down existing photo and video apps. This second part is about Carousel’s primary requirements, the end product, its performance and key learnings since the launch.

Primary User Requirements

In a Wired article2 covering Carousel’s launch, Gentry Underwood, CEO and cofounder of Mailbox (which was acquired by Dropbox) and lead designer of Carousel, detailed some of the key requirements that his team prioritized.

Below is a list of some of them, as well as some requirements highlighted in media coverage of Carousel’s launch3 and from our evaluation of existing products and design patterns in part 1.

Back up all photos and videos

The app has to save not only the photos that users want to see in the gallery, but also ones they don’t want to see yet but might want to at a later date. Not to mention, this takes up more storage, which is ideal for Dropbox’s business. Most photo apps allow you only to delete photos, not hide them. “It’s a 100% destructive thing,” Underwood says. And the permanence of deleting photos requires a heavy two-step process of hitting the trash button and confirming the action. Underwood claims that this leads to users not deleting media and, ultimately, to sloppy media galleries with misfires, blurry selfies and many imperfect versions of the same shot.

Display all photos and videos

According to Underwood, another big problem with media gallery apps is that they seem to start from the last time you bought a smartphone. This is especially true for stock apps like Apple’s Photos. However, even with photo stream and other apps that sync a portion of your photos locally while saving the rest in the cloud, users can never see their entire media history — they have to go to their computer or the web for that.

Show the best photos and videos

The most obvious solution for this is to make it easy to manually hide undesired media, presumably with some quick swiping action. However, the app could also surface media that users would most likely want to see, like ones with faces or, more importantly, smiling faces. Beyond finding the best media, the app could also highlight one or more thumbnails of media that seem most interesting.

Enable quick navigation

Media should be automatically sorted in events based on common attributes such as time and location. The groupings should also show just a sample of the photos from that event in order to save space while navigating through a long list. Finally, users should have multiple ways to scroll through media (for example, slowly or quickly).

Feel native

Making it seem like everything is stored locally would set this application apart from the competition. After all, that snappy feeling is what makes Apple’s Photos more appealing than Facebook, Flickr, Instagram, Dropbox and the like. Among other things, fine-tuning the caching and other back-end tricks could help dramatically. But some clever perceptual tricks could also be done. For example, multiple thumbnails of each media file could be saved at various resolutions and be dynamically deployed based on how fast the user is scrolling through the gallery. Faster scrolling would trigger lower-resolution thumbnails so that they load instantly and make the app feel native. Moreover, adding, moving, changing and deleting media files from Carousel or Dropbox should happen lightning-fast.

Enable public and private sharing

Users should be able to share videos and photos with others easily without having to use platforms with storage limitations, such as email. Also, they should be able to easily select between public sharing (i.e. on social networks) and private sharing through email, SMS and private in-app chat. “Carousel’s sharing tools can be utilized through any email address or phone number, whether the recipient has a Dropbox account or not,” says Underwood.

Enable public and private discussion

Although in-app discussion is an option when media is shared privately, as mentioned above, it’s not necessary. However, allowing for focused discussion on a set of photos — particularly after an event, when users want to congregate and compare photos — can be valuable. As an alternative to Facebook Messenger, SMS and email, where many other conversations go on, offering a dedicated set of chat threads for users’ personal media and nothing else would be beneficial. It would also be a great way to acquire new users for Dropbox.

What Do Users Get?

Basically, users get a camera roll for Dropbox. As Federico Viticci from MacStories eloquently puts it4, the app is a clean and imaginative “alternative Camera Roll and Photo Stream based on Dropbox storage with built-in sharing for individual or group conversations.”

Carousel’s MVP is effectively two things for most users: a Dropbox uploader for backing up local photos and videos, and an enhanced version of Apple’s native Photos app, with improved viewing, sharing and discussion functionality. The app doesn’t let users take, edit or manage photos, other than hiding them (or deleting them, if they can find that feature), or view in anything other than chronological order.

For now, if users want to take and edit photos, then their mobile camera, Instagram or Camera+ are great options. To organize photos into folders, they’ll need to use Dropbox directly. And to view them in anything other than chronological order, they would sync Dropbox with a more advanced media gallery such as iPhoto, Picasa or Unbound. You will understand Carousel’s MVP much more easily by testing it out than by listening to me explain it ad nauseam. Below are four screenshots of what you can expect. To help you along, MacStories thoughtfully runs through5 what you can expect in your first experience.

6
Carousel mobile app (View large version7)

Results And Learning

Mills Baker, a product design analyst at Mokriya, paints a rather dismal picture of Carousel in “Designer Duds: Losing Our Seat at the Table8”:

It’s honestly hard to determine what should be interesting about it, even in theory; it takes mostly standard approaches to organization, display, and sharing, and seems to do little to distinguish itself from the default iOS Photos app + iCloud Photo Sharing, let alone apps and services like Instagram, VSCO Cam, Snapchat, iMessage, Facebook Messenger, and so on.

To get an idea of why Mills feels so strongly about Carousel’s shortcomings, let’s look at the results since its launch.

Rankings

Since topping the charts on and around launch day, Carousel has steadily lost attention, now ranking 456th in the “Photo and Video” category of Apple’s App Store and falling off in the overall rankings across all categories. It has basically been buried in the crowded photo and video app market, and Dropbox will need to make some non-trivial changes in subsequent iterations to make it bounce back to the top.

9
Carousel’s ranking has steadily declined since launch. (Image: AppAnnie25211310) (View large version11)

Upon launching in April 2014, the app certainly didn’t increase downloads of Dropbox’s main app, suggesting that Carousel’s main impact was on revenue or engagement, if anything.

Dropbox ranking hasn't been affected by Carousel12
Dropbox’s ranking hasn’t been affected by Carousel. (Image: AppAnnie25211310) (View large version14)

Downloads

As of 16 July 2014, Carousel appears to have been downloaded 174,000 times15 globally. If Dropbox currently has 300 million users16, then it has managed to get a paltry .06% of its total customer base to adopt Carousel. Clearly, it needs to make some improvements to increase adoption.

Carousel downloads are sufficient for testing the app, not for claiming mass adoption17
Carousel downloads are sufficient for testing the app, not for claiming mass adoption. (Image: XYO18) (View large version19)

Ratings

If we look at reviews in Apple’s App Store, non-target users almost unanimously consider Carousel to be a failure. “Not what I wanted,” “MASSIVE oversight” and “Completely useless” smatter the reviews section — all valid complaints if people are using it professionally. Meanwhile, average consumers like Owen and Nora have mixed reviews, ranging from “Amazing app!!!! This app is the best way to back up and privately share my photos on iOS!!!” to “Bring back Loom! Complete downgrade from Loom… Sad.”

While it wasn’t a runaway success upon launch, Carousel drew user reviews in the US and internationally that at least skew favorably. In fact, the reviews are as good as the ones for Dropbox and even Mailbox, both excellent standards for any productivity app.

Reviews for the first version of Carousel globally (left) and in the US (right)20
Reviews for the first version of Carousel globally (left) and in the US (right). (Image: AppAnnie25211310) (View large version22)

While these reviews make it difficult to dispute Baker about the lackluster adoption of Carousel upon launch, 174,000 downloads is more than enough to learn about how people use Carousel, what needs to be improved and how well various features help Dropbox achieve its business goals.

In-App Purchases

While these statistics are highly coveted and, thus, kept very private, you can at least generalize that Carousel is achieving its primary objective of upselling existing users to premium accounts. However, many details suggest that Dropbox will need to make some major improvements to scale downloads and usage for new and existing users.

With Dropbox charging roughly ten times the price of Google’s popular cloud storage alternative, Drive, it will be interesting to see how much price has stunted adoption of and engagement with Carousel. If we’re being realistic, anyone who wasn’t born yesterday would know that Carousel requires Dropbox’s Pro Plan23 to work reliably. Dropbox will certainly have to address this as companies continue to compete on price in building up their cloud-based apps on top of virtually free cloud storage.

Carousel and Dropbox apps, respectively24
Top in-app purchases for Carousel (left) and Dropbox (right). (Image: AppAnnie25211310) (View large version26)

Looking Forward To The Next Iteration

As expected, this MVP is far from being a full photo and video manager. It lacks some features that hold users back from adopting it, including:

  • better meta data and a better organizational structure for navigating photos,
  • more granular syncing options to reduce clutter,
  • a web viewer for making sharing easier,
  • lower pricing.

However, if you look closely at everything Dropbox has done with Carousel, it has been extremely disciplined in prioritizing many of the most important features for its business and its users. It has drawn from the best relevant design patterns that I could find, many of which are not to be found in the closest alternatives, including Apple’s Photos and Instagram Direct. And while most mobile photos galleries aren’t that complex, Dropbox has managed to edit out features that are less important, such as a camera, editing features, heavy organization options, chat outside of sharing, and friend lists.

It still has a ton of work to do on the web and mobile. Considering how much people wish Loom was still around, many of its features will probably be included. Additionally, well-designed and robust apps such as Picturelife offer a great deal of inspiration for a dramatically simplified alternative to Carousel.

And while Dropbox might have done better to wait for what Rand Fishkin, cofounder of Moz, calls an EVP27 — an exceptional viable product — Carousel has a promising future. Dropbox just needs to tweak what it’s got to get more people to download and use the app.

(al, ml)

Footnotes

  1. 1 http://www.smashingmagazine.com/2014/08/26/dropbox-carousel-design-deconstructed-part-1/
  2. 2 http://www.wired.com/2014/04/3-ingenious-design-details-in-carousel-dropboxs-new-photo-app/
  3. 3 http://techcrunch.com/2014/04/09/dropbox-debuts-carousel-aiming-to-be-the-go-to-storage-app-for-your-entire-photo-archive/
  4. 4 http://www.macstories.net/reviews/thoughts-on-dropbox-carousel/
  5. 5 http://www.macstories.net/reviews/thoughts-on-dropbox-carousel/
  6. 6 http://www.smashingmagazine.com/wp-content/uploads/2014/08/02-carousel-app-opt.jpg
  7. 7 http://www.smashingmagazine.com/wp-content/uploads/2014/08/02-carousel-app-opt.jpg
  8. 8 https://mokriya.quora.com/Designer-Duds-Losing-Our-Seat-at-the-Table?srid=h1hP&share=1
  9. 9 http://www.smashingmagazine.com/wp-content/uploads/2014/09/03-carousel-ranking-opt.jpg
  10. 10 http://www.Appannie.com
  11. 11 http://www.smashingmagazine.com/wp-content/uploads/2014/09/03-carousel-ranking-opt.jpg
  12. 12 http://www.smashingmagazine.com/wp-content/uploads/2014/08/04-carousel-ranking-opt.jpg
  13. 13 http://www.Appannie.com
  14. 14 http://www.smashingmagazine.com/wp-content/uploads/2014/08/04-carousel-ranking-opt.jpg
  15. 15 http://de.xyo.net/iphone-app/carousel-by-dropbox-mEYaRL4/
  16. 16 http://thenextweb.com/insider/2014/05/29/dropbox-reaches-300m-users-adding-100m-users-just-six-months/
  17. 17 http://www.smashingmagazine.com/wp-content/uploads/2014/08/05-carousel-downloads-opt.jpg
  18. 18 http://xyo.net/iphone-app/carousel-by-dropbox-mEYaRL4/
  19. 19 http://www.smashingmagazine.com/wp-content/uploads/2014/08/05-carousel-downloads-opt.jpg
  20. 20 http://www.smashingmagazine.com/wp-content/uploads/2014/08/06-carousel-ranking-opt.jpg
  21. 21 http://www.Appannie.com
  22. 22 http://www.smashingmagazine.com/wp-content/uploads/2014/08/06-carousel-ranking-opt.jpg
  23. 23 http://www.technologyreview.com/news/526606/review-dropboxs-carousel-photo-sharing-app/
  24. 24 http://www.smashingmagazine.com/wp-content/uploads/2014/08/07-carousel-dropbox-apps-opt.jpg
  25. 25 http://www.Appannie.com
  26. 26 http://www.smashingmagazine.com/wp-content/uploads/2014/08/07-carousel-dropbox-apps-opt.jpg
  27. 27 http://moz.com/rand/7-unlikely-recommendations-for-startups-entrepreneurs/

The post Dropbox’s Carousel Design Deconstructed (Part 2) appeared first on Smashing Magazine.

Categories: Others Tags:

SVG Fallback in Older Browsers: Alternatives to JavaScript

September 11th, 2014 No comments

SVG sees widespread support by recent browsers these days. Still plenty of people do not surf the web using one of these modern browsers. Especially the older versions of Internet Explorer are used in relevant numbers worldwide. And these older versions cause problems, not only, but also when it comes to SVG. IE simply doesn’t know SVG, so we need to offer PNG or JPEG as a fallback. Of course we have JavaScript with its numerous possibilities to care for proper fallback solutions, but what if JavaScript is not an option? Keep calm and read on. We have a row of alternatives for you. Some of which mean even lesser effort than coming forth with a full-fledged JavaScript…

Categories: Others Tags:

Creating Clickthrough Prototypes With Blueprint

September 10th, 2014 No comments
The completed Blueprint project shows the complexity of widget-based clickthrough prototypes.

In a previous article1, I discussed using POP2 to create sketch-based clickthrough prototypes in participatory design exercises. These prototypes capture well the flow and overall layout of early design alternatives.

The same piece briefly mentioned another category of clickthrough prototypes: widget-based mockups that are designed on the target device and that expand on sketches by introducing user interface (UI) details and increased visual fidelity. These prototypes can be used to pitch ideas to clients, document interactions and even test usability. In this article, I will teach you how to use the iPad app Blueprint to put together such prototypes in the form of concept demos, which help to manage a client’s expectations when you are aligning your visions of a product.

Given the software’s rich feature set, I will cover the most useful functionality that helps designers get up and running with the tool. To make the exercise more realistic, I will reuse the earlier POP scenario. A link to the Blueprint work file is shared in the “Resources” section at the bottom. An exciting exploration lies ahead of us, so let’s jump right in!

3
The completed Blueprint project shows the complexity of widget-based clickthrough prototypes. (View large version4)

Where Do Concept Prototypes Fit In The Design Process?

Clients as Knowledge Ambassadors

Stakeholders and user experience designers (UXers) come to participatory design meetings with experience from other projects, research knowledge and background information. Many clients bring a fresh perspective by offering specific ideas, but some need extra help from designers to translate business requirements into usable experiences. To do so, designers need to learn about the client’s domain. This is where stakeholders’ expertise becomes an invaluable resource for clarifying problematic aspects of the product.

Stakeholders and designers come together to make the end product even better.

Stakeholders will also gain insight into the design process and will feel that their voices are being heard. Regardless of their level of enthusiasm or participation, however, many will be ill-equipped to understand the activity’s outcomes: How many times have you been met with blank stares when explaining flow diagrams and UI layouts?

Don’t Just Explain: Tell a Story

To more clearly communicate the design direction of a project, you must revisit the communication from the perspective of a stakeholder: UXers must show how a concept will solve users’ problems and how it will do so by distinguishing itself from the competition through unique selling points. Storytelling, a very inclusive activity, welcomes the audience to the experience intended for end users.

Stories help an audience enter new worlds.
Stories help an audience enter new worlds.

One approach is to use widget-based clickthrough prototypes to show off various user scenarios in a story: The interactivity of the design concepts paint a picture of the envisioned product. You can reinforce the narrative with highly polished prototypes, but their visual fidelity should be driven by the motivation of your audience and the goals of the project. Just as storytellers did around campfires, use visual aids: Present the prototypes on the target device for greater impact. The demo might be interrupted by feedback from stakeholders, but remember that you are there to present a vision, not a complete product, so unsolicited input won’t affect the throwaway concept.

Building Concept Prototypes

Underlying Consideration

Personal experience has shown me that prototyping several key concept scenarios, which takes 45 minutes to 1 hour to walk through, leave the most lasting memory. If your delivery is longer, the audience will get uneasy. Show off a single flow with high interactivity or several more linear flows, but be cognizant of what you want to accomplish with the demo: Sometimes it is to sell the work, and other times to guide the team to the next design step.

Presenting an abundance of detail in a short period of time will block your participants' understanding.
Presenting an abundance of detail in a short period of time will block your participants’ understanding. Be brief!

Because concept prototypes communicate design vision, they must be of high fidelity. The fidelity, however, could become distracting: Stakeholders might grab onto less important details, such as a button’s color, rather than pay attention to the overall design. Avoid this situation by clearly setting their expectations for the demo up front: This is not a design critique. Rather, you are there to present a vision of the product. This will help to get agreement on the direction before you move to a large-scale evolutionary prototype as the final deliverable.

Designing Directly on the Device

Building concept designs directly on the target device has many benefits:

  • simulates UX of target device (for example, the platform’s input methods and the OS’ metaphors);
  • prototype is usable in different environments;
  • facilitates audience involvement;
  • easy to reproduce demo on external computers (wireless mirroring, wired video duplication, etc.);
  • easier access to visual assets (Dropbox, device’s photo gallery, etc.).

But it also has some inherent limitations:

  • Creating large widget-based clickthrough prototypes is not cost-effective.
  • Screen covers and enclosures can affect screen sensitivity.
  • A stylus is needed to avoid the fat-finger problem.
  • Neck and back fatigue can set in (leverage a stand to help).
  • Light reflection could also be a problem.

How Blueprint Fits In The Picture

Blueprint, a $20 app by groosoft5, enables you to create iPhone and iPad clickthrough prototypes on an iPad. The tool’s quality is best illustrated by building UIs with the ready-made widgets and the event model. The prototypes can be demoed in the application or via a free companion tool, Blueprint Viewer. There is also Blueprint Lite, but it limits the user to two projects and no external projects. Blueprint requires no user account because prototypes are distributed as a .blueprint file, a PDF specification or a series of PNG images. See the “Exploring the Export Options146” section below for more.

Create the Project’s Container

You are assigned to create a mobile news website! After meeting the stakeholders, you put some initial ideas for pages on paper, including the portal, individual articles and other ideas. Having heard about Blueprint, this new prototyping tool, you want to give it a shot! I will guide you by covering its main functionality, which we will use to build an interactive prototype. For detailed coverage of its features, feel free to browse groosoft’s “Tutorials7” section.

As with other design tools, you must store your project somewhere. To do this in Blueprint, you start by creating a project container first for all of your screens. In the “Home Screen,” tap the “+” (third icon in bottom toolbar). This will bring up a menu with two options (not shown here) to create a new project or duplicate an existing one. Duplicating an existing project is handy if you need to create different versions of the same project or to leverage assets in an existing prototype.

Options for importing, exporting, converting and deleting projects also appear on this screen.8
Options for importing, exporting, converting and deleting projects also appear on this screen. (View large version9)

Your stakeholders have data from Google Analytics showing an iPhone user base of over 30%! Upon selecting “New Project,” you have to select an iPhone app, mobile website or iPad app in portrait and landscape orientation. Given the large iPhone population, let’s select the entry for mobile website!

The top-right tab toggles between prototyping for iOS 6 and 7. As a good practice, pick the latest version of iOS because the majority of users upgrade quickly. For our example, let’s pick iOS 6, which will enable you to play with the iOS Converter later (a $10 add-on that updates the look and feel of iOS 6 projects to match iOS 7).

iOS 7's look and feel are applied by default, but you can switch to iOS 6.10
iOS 7’s look and feel are applied by default, but you can switch to iOS 6. (View large version11)

Once you select the target device, you will see the project’s first screen. Before we discuss it, let’s backtrack to the “Home Screen” for a second. Because you’re a designer, the quality of your deliverable speaks to your professionalism; therefore, you will need to provide details about the project. Tapping the “i” icon in the bottom-right corner reveals fields to capture the project’s title, a description, the author’s name and other information. It’s easy to forget to enter this data later on, so do this before you start to prototype. Tap the white checkmark to save.

Here you can also adjust the phone's aspect ratio by selecting iPhone 4 or iPhone 4 / 512
Here you can also adjust the phone’s aspect ratio by selecting “iPhone 4” or iPhone 4 / 5.” (View large version13)

Import an Existing Project

As a first time user, you have no reusable assets. However, a colleague who is experienced with Blueprint has offered to share their .blueprint files with you. To view these files, you will need to import them. Go to the “Home Screen” and tap on the second icon: You can import .blueprint files from iTunes or Dropbox.

You must grant Blueprint access to your Dropbox account for this method. More on this is shared in the “Exploring the Export Options146” section near the end of this article. Once you’ve granted permission, you will find the folder containing your .blueprint files and, upon tapping a .blueprint file, it will be added to your list of projects. For more information on using Blueprint with iTunes, consult groosoft’s FAQ15 page. As long as your iOS mobile device is connected to the computer, you can drag a previously saved .blueprint file from the computer to Blueprint or to Blueprint Viewer in iTunes “Apps.”

Currently Blueprint offers only two import options.16
Blueprint currently offers only two importing options. (View large version17)

Design Modes

You’re doing great! Let’s cover the design modes, which will help you to understand how Blueprint works. The app has two modes: the site map and the screen views. Both share functionality, including ways to center or view in full screen the workspace, to review the screen list and to take actions on items. You can toggle the views using the L13 icon in the “Local” toolbar (see the next section).

For most new projects, you will start in the screen view, with one working screen. At the screen level, you will be able to add widgets and cross-screen interactions. In contrast, the site map view enables you to organize screens spatially and to visualize the links (or paths) between screens in user flows.

Controls

Jumping to the screen design is easy, but a quick description of the controls will situate you in the application. Both views share the same toolbars, which have functionality specific to screens or their widgets. There are two of them: Global (named here “G”), which offers app-wide functionality, and Local (named “L”), which controls aspects of the current project. Throughout the prototype exercise, I will refer to entries from both toolbars. Notable entries in Global are “My Projects,” which returns you to “Home Screen” (G1), the self-explanatory “Add New Screen” (G3), and “Tools,” which contains help information and controls for on-screen guides (G5).

The controls are organized in two logical groupings, on either side of the project title.18
The controls are organized in two logical groupings, on either side of the project’s title. (View large version19)

The second toolbar lists tools associated with editing (some are disabled in site map view). A few less commonly used but practical features are the “Pen Tool” for drawing custom shapes in widgets (L1), the “Clock” to show the history of recently edited screens (L10), and the “Device Toggle” to change between iPhone 4S and 5 shells (L12).

The second tier of controls is organized in eight groups.20
The second tier of controls is organized in eight groups. (View large version21)

There is also the side panel, which is contextual. In the site map view, it shows screen links grouped by color (see the “Adding Interactivity22” section below). In the screen view, the panel updates with two tabs, “Widgets” and “Accessories.” The first displays configurable iOS components in the “Controls,” “Tables,” “Bars” and “Views” areas. The second shows annotation components, which are handy for capturing problems and questions.

Additionally, the side panel changes its contents according to whether the user is focused on a screen (in site map view) or a widget (in screen view). Two new tabs are revealed, “Properties” and “Actions.” The first includes configurable options for the selected screen or widget, while the second allows you to modify interactions. More on this in later sections!

Variations of the same side panel grant the user control over screens and individual widgets.23
Variations of the same side panel provide control of screens and individual widgets. (View large version24)

Using Images

Now that we have the project’s container, let’s create the individual screens and, lastly, layer on interactivity. Why do I say “create”? Are there no sketches from the earlier POP exercise? After meeting the stakeholders, you learn that you have additional time and so decide to improve the prototype by increasing its interactivity and visual fidelity (and not simply duplicate the POP sketches).

However, you can reuse the previously created images in Blueprint with a little trick. Paste the images into a background “View,” and layer transparent “Buttons” on top to link to other screens. This might be confusing now, but it will make sense when we build the first screen. Our prototype will have grayscale fidelity and (similar to POP) single-tap interactions. You can create colorful comp-like designs, and you are welcome to explore this as an exercise using the .blueprint file shared at the end of this article!

When using transparent Buttons, remember their placement because they will become hard to find.25
When using transparent “Buttons,” remember their placement because they will become hard to find. (View large version26)

Setting Up Your First Screen

Web experiences in Blueprint come with an initial empty screen, with the generic name “Screen.” For the experience you are designing, you will see a starting visitor portal. To navigate screens more easily, you’ll need to update their names to be human-readable. While in the site map view, under “Properties,” tap on “Title” and enter “1.0 Home.” To match the experience you are targeting, set how the status bar should be displayed by selecting “Black,” “White” or “None.” The “Start Screen” option is disabled because we have only one screen, but with multiple screens you can redefine the starting point.

Drag the workspace in the site map view to see all of its contents as you add more screens.27
Drag the workspace in the site map view to see all of its contents as you add more screens. (View large version28)

Populating the Screen With Widgets

You now know enough about Blueprint to start prototyping the concept! Let’s add some widgets to the screen. Double-tap the screen to enter the screen view. Add a background (the first entry in the “Views” collection) as the container for what’s to follow. This will give you control over the background color for the experience! Double-tap the widget in the panel or drag and drop it, thereby adding it to the screen.

A blue border highlights the container into which the widget is being dropped.29
A blue border highlights the container into which the widget is being dropped. (View large version30)

Don’t be confused by the updated side menu, which now shows the “Properties” and “Actions” tabs. What do I mean? We just dropped a “View” onto the “Screen.” You will notice that the side panel lists the options for “View,” then the options for “Screen.” This hierarchy helps when you’re deep-nesting widgets (for example, when building toolbars or list items).

Once you’ve dropped the widget onto the screen, you’ll see blue-dot handles to resize the widget. Tapping the widget again shows a flyout menu, with the options “Cut,” “Copy,” “Delete,” “Duplicate” and “Lock.” Your client is demanding, so these little features (especially “Select Subwidgets”) will help you to tackle changes. The folks behind Blueprint offer a shortcut to this via the gear icon, L9. For increased productivity, you can toggle between the “Properties” and “Actions” views by retapping a widget or the “i” icon, G4.

If you're viewing the start screen of the prototype, its title will be in white.31
If you’re viewing the start screen of the prototype, its title will be in white. (View large version32)

I’ll let you in on a little secret! Backgrounds come with a hidden extra: When you resize a background, all child widgets get resized accordingly, thus saving you even more time and keeping your client happy! Earlier, I hinted at reusing sketch captures if you are pressed for time. To do this, just pick “Images” under “Properties” in the side menu. “Camera Roll” is one of the options, giving you access to all images on the device.

Under “Image” in the new window, you will find several preloaded icon libraries.33
Under “Image” in the new window, you will find several preloaded icon libraries. (View large version34)

If you choose to show only the sketch on the screen, there is a way to hide the status bar. Turning it off is as easy as one, two, three: Go to “Properties” ? “Screen” ? “Status Bar” and voila! The sketch approach is limited because you are still locked to iOS’ resolution and aspect ratio. Use it wisely.

Blueprint has new popup screens for menu options.35
Blueprint has new popup screens for menu options. (View large version36)

You’ve just added your first widget, and now you want to create the remaining assets. Hold your horses, partner! Let’s first talk about a big problem. When you add closely positioned widgets, accurate placement becomes harder. Many a time I have tried to resize a widget only to end up moving it! Therefore, use a stylus to avoid the fat-finger problem. For extra precision, try the “Position” and “Size” adjustments under “Frame.”

Position and Size options are split into separate tabs.37
“Position” and “Size” options are split into separate tabs. (View large version38)

Pinching in and out of “1.0 Home” will zoom in and out of details, a helpful technique to align widgets. Maintaining your workspace is a must in Blueprint: You can fit the screen within the workspace area again via L4, and you can reveal more vertical space by entering full screen via L5 (then double-tapping the screen to exit).

View the screen at maximum zoom by pinching out.39
View the screen at maximum zoom by pinching out. (View large version40)

Awesome! You are fully armed to tackle the featured article’s hero space, the navigation toolbar and the month’s list of articles. First, change the color of the background to dark gray. Next — because we’ll want to show the client that rich imagery and meaningful titles will capture the visitor’s attention — drag an image widget, and resize it to fit the background widget, with gutter space of roughly 10 pixels. You can round the widget’s corners, or make it transparent if you are stacking layers of information. I will let you finish by adding the article’s title and the dot navigation. Refer to the .blueprint file for the completed widget!

The red line is a guideline, which was turned on via L4.41
The red line is a guideline, which was turned on via L4. (View large version42)

We anticipate a growing information architecture, so let’s select the side menu navigation pattern. To build the header toolbar that contains the hamburger toggle, drag another “View” and resize it to approximately 40 pixels in height. Then, drop a label widget on top of it for the title “News Site.” Next, add two text-free buttons with custom images. See whether you can figure out this part on your own. Here is a hint: Use the built-in icon libraries, and customize the images’ color to white!

After you’ve built the hero space and toolbar, you will want to move both of them at the same time via multi-selection. To add widgets with this method, tap and hold on the first widget and then, with another finger, tap on all following widgets. I recommend doing this with the tablet resting on a flat surface because you will need to use both hands. The tool has no alignment or distribution options — maybe in the next release!

You can change the alignment, style, font and many other options for each label.43
You can change the alignment, style, font and many other options for each label. (View large version44)

The geek in me is tempted to cover the remaining steps here, but I will let you continue working on the project on your own. No fear! I am still here to guide you with best practices as you wrap up. For example, remember to duplicate reusable components, and expect to spent time building custom widgets. Blueprint offers many options, and you will keep finding useful functionality as you become comfortable with the tool (cool features are buried in submenus). Once you’ve dragged all widgets to the screen, you will end up on the final “1.0 Home” screen. Congratulations! You’ve just finished your first screen!

One screen down, a few more to go!45
One screen down, a few more to go! (View large version46)

Maintaining Design Flexibility

You are ahead of schedule and want to finish the remaining screens, including the “Articles,” “Individual Article” and “Authors” views, but you notice that identifying a particular screen widget is hard. Blueprint nests widgets, and getting lost is easy if the widgets are of the same type. Before introducing any interaction and wowing your client, we should discuss features of the app that will make your design more flexible.

For example, the “Hierarchy” tool (L8) shows the nesting of a widget by using a top-down approach, with parent widgets shown on top. At each level, widgets are selectable and, when selected, are highlighted on the screen. You can also vary the depth of a widget via “Bring Forward” (L6) and “Send Backward” (L7). Lastly, it is worth reiterating L9, the gear icon and its “Select Subwidgets” option. This aids with copying multiple widgets without having to copy the parent. Phew, that was tiring!

Iterating Screens

Time is a wasting, and we don’t want to keep the client waiting. Let’s build the remaining screens already! Click the top “+” icon in the first toolbar (G3) to create a new screen or to duplicate the existing “1.0 Home” in either orientation. Unfortunately, Blueprint currently offer no master or template functionality. The duplication option will save you time because you won’t have to recreate the toolbar and background in other screens.

Duplicating an existing screen in landscape orientation rescales the screen widgets as seen in the preview.47
Duplicating an existing screen in landscape orientation rescales the screen’s widgets, as seen in the preview. (View large version48)

Designing clickthrough prototypes in Blueprint is iterative. You will complete one screen, then move on to the next, constantly switching between screen and site map view using the L13 icon. Upon finishing all screens, you will end up with a grid of thumbnails (as seen below) and with a sense of accomplishment for being closer to delivering a great presentation to the client. The screen’s layout may be modified to reflect the project’s flow(s). Making the design even more realistic is effortless: Toggle the device shell via the L2 icon for instantaneous results (in screen view only).

A grid layout helps with visualizing cross-screen links.49
A grid layout helps with visualizing cross-screen links. (View large version50)

Adding Interactivity

The concept demo has many different paths and flows, so let’s add some interactivity. Key tasks include accessing an article from the home portal, accessing author information from anywhere on the website, and providing global access to the side menu navigation. With little time left, you decide to enable single-tapping with no transitions.

Double-tap “1.0 Home” to view all of its widgets. We want the user to be able to view an article’s details by tapping the list item. So, select the list item for the top article (a “View” widget). This will update the side menu to the “Properties” and “Actions” view. Select “Actions” and, under “Tap Action” (i.e. single-tap), tap on the target.

The actions available will vary from widget to widget.51
The actions available will vary from widget to widget. (View large version52)

This will bring up a screen with a site map view of all screens and existing clickthrough links. The triggering list item is highlighted in yellow in “1.0 Home,” identifying where the tap comes from. Here, you can assign a target for the interaction by tapping on a different screen, by tapping “New Screen” in the top left of the title toolbar or, if you’ve changed your mind, by tapping the “No Target” option. Go ahead and tap on “2.0 Article”!

The accordion menu on the right allows you to select a screen from the side panel. The top-right hamburger icon collapses it.53
The accordion menu on the right allows you to select a screen from the side panel. The top-right hamburger icon collapses it. (View large version54)

Your first interaction is almost complete. After you’ve selected a target, you will notice that “Link Style” and “Transition” are shown. The “Link Style” lets you choose the color and format of the link line (remember the site map’s side panel from earlier?). This helps with labeling inbound and outbound scenario paths.

Different colors and styles are available.55
Different colors and styles are available. (View large version56)

“Transition” allows you to select an effect for switching between screens. “Dissolve” is the default choice, and “None,” “Move,” “Reveal,” “Push,” “Curl” and “Flip” are also available. If you re-enter the “Target” screen, you will see both the UI trigger and the link arrow to the target screen highlighted in yellow. Select “None” for the transition. You can test other transitions later!

The list options are scrollable, revealing additional transitions.57
The list options are scrollable, revealing additional transitions. (View large version58)

Manipulating Links

The visibility of links can be modified both in the screen and site map views. Earlier, I covered how the side panel in the site map view can be used to hide and show groups of color links. In contrast, all links may be hidden in the screen view via L3. Surprisingly, links pointing to their parent screen are not shown at all. I hinted at using custom hotspots in the section on “Using Images59”: To do this, drop a “Button” and make it transparent via “Properties” ? “Background.” Hide its border by setting the widget to “Custom” in “Properties” ? “Type” to complete the look.

Playing the Prototype

Layering interactions is fun because it brings the prototype to life. After you’ve added the clickthrough interactions to the remaining screens, you will be ready to test the concept demo! Press the play icon (G6) to start the demo in full screen with the device shell shown. As seen below, a two-finger tap either exits the demo or backtracks in the flow. The app does not highlight active screen links, so know your prototype scenarios well.

Once the clickthrough demo is perfected, you can rock the audience! Presenting the concept directly on the device is best. Sometimes your viewership will be larger — in which case, to keep everyone engaged, you’ll want to mirror the tablet’s output either via software (such as Reflector60) or hardware (such as a Lightning-to-VGA adapter61).

The notification disappears shortly after the demo begins.62
The notification disappears shortly after the demo begins. (View large version63)

By default, “Undo Last Action” is unavailable. It activates as soon as you navigate to a new screen.64
By default, “Undo Last Action” is unavailable. It activates as soon as you navigate to a new screen. (View large version65)

The presentation went off without a hitch! The demo clearly impressed the stakeholders because you received positive feedback and many relevant questions. Your client even asked to share the work with partners overseas. In this situation, you can prescribe the free Blueprint Viewer app and teach people how to load the sharable .blueprint source file. Let’s cover how to do that next!

The iPhone view is more compact.66
The iPhone view is more compact. (View large version67)

Viewing the source file on an iPad allows you to browse projects while viewing the contents of the current project.68
Viewing the source file on an iPad allows you to browse projects while viewing the contents of the current project. (View large version69)

Exploring the Export Options

You are ready to share the work with the geographically distributed team. Luckily, unlike POP’s cloud-based distribution, Blueprint allows users to freely share assets via email, Dropbox and iTunes. To export a project, in the “Home Screen” of a project, tap the leftmost icon to access the options.

iTunes and Dropbox options are grouped separately.70
iTunes and Dropbox options are grouped separately. (View large version71)

The overseas team consists of several departments: marketing, development and product management. Your stakeholders ask to send the interactive demo to the product manager and developers, whereas the marketing representatives have requested large images. You can send marketing a PDF of all screens or a ZIP archive of individual PNG images. As for the developers, that’s easy! Just send them the .blueprint file.

If “Export to Dropbox” is selected, a “Sign Out” button will be added to the top right.72
If “Export to Dropbox” is selected, a “Sign Out” button will be added to the top right. (View large version73)

The PDF and PNG options are handy for capturing any documentation included in the file. However, this is rarely done for concept prototypes because of their fluid nature. Both have settings for adjusting the outputted deliverable.

You can adjust the paper size, number of screens per page and other options.74
You can adjust the paper size, number of screens per page and other options. (View large version75)

The only option available for PNG is selecting which screens to export.76
The only option available for PNG is selecting which screens to export. (View large version77)

Having learned about the exporting options, you are ready to send your work to the team. “Send via Mail” is the logical choice because the team is not familiar with Dropbox. Tap this option to create two messages, with the relevant deliverables attached in each draft. When you send the .blueprint file to the developers, a link to the free Blueprint Viewer is embedded in the message’s body. All you have to do is tell them to download the app!

The “Subject” field is populated with the project's name.78
The “Subject” field is populated with the project’s name. (View large version79)

In the future, you might be working with avid Dropbox users, so let’s cover that option as well! Blueprint will redirect you to the Dropbox application if you have it installed on your iPad. After you log in, Blueprint will ask for permission to access all folders and files. You must grant this in order to export files to Dropbox. Afterwards, you can select where in your Dropbox account to store the .blueprint file, the ZIP file of PNGs or the PDF.

Tapping “Allow” returns you to Blueprint.80
Tapping “Allow” returns you to Blueprint. (View large version81)

Exporting to iTunes is best done for internal testing and for sharing with colleagues. Personally, I have used this feature also to back up .blueprint files on an external drive. For directions on how to use iTunes with Blueprint, read “How do I send a mockup to other people?” on groosoft’s FAQ82 page.

Related Solutions

You now have the basics down on how to put together a quick concept prototype with Blueprint. The tool can be used for larger, more complex prototypes, but these take much longer to create, and maintenance time must be factored in.

Other applications are on the market to help with creating iOS experiences directly on a tablet. Below, I’ll briefly discuss a couple of alternatives that I’ve come across! I am continuing my search for equivalent tools on other platforms, including Android.

AppCooker

AppCooker9183 is a $15 tool developed by Hot Apps Factory84. It lives in a similar ecosystem: The application is used to create experiences on an iPad that are viewable in AppCooker or the free AppTaster9285. The viewer is available for the iPhone and iPad, but tablet experiences are viewable on the iPad only.

AppCooker stands out with the following:

  • It includes an exporting option for Box, direct posting of projects to the viewer, and exporting to JPEG and PDF formats.
  • Each project includes features such as “Notepad” (to capture ideas), “Definition Statement” (to outline a project’s value proposition), “Revenue & Expenses Tracker” (to develop a distribution plan) and more.
  • The prototyping tool has support for taking multi-finger actions, customizing transitions, grouping widgets and specifying multiple link paths for a single hotspot.

Its advanced features make AppCooker a powerful tool for creating full app prototypes that illustrate complex interactions and that prove an app’s technical feasibility.

Interface HD

Interface HD9386, also known as Interface 3, is a $10 tool developed by LessCode87. Interface HD makes clickthrough prototypes for the iPad and iPhone. The app shares many of Blueprint’s features, but minor limitations exist. For example, the event model includes widget swipes and taps but no screen-level interactions (such as rotation); you have five transitions to choose from; and the software offers no way to visualize links between screens. The app is constantly being updated, so these features might be introduced soon!

Interface HD has many unique selling points:

  • It includes a “Stock Asset Manager” for downloading third-party icons and background patterns.
  • Password protection is built in, and web demonstrations require pin authentication.
  • The OS’ chrome can be customized in detail, including dynamic control of all aspects of the status bar (color, placement, icons, etc.).
  • Video tutorials are built in.

This tool is best suited for illustrating flows with light interaction and for designing UIs with customizable widgets. If you need to mock up a quick clickthrough prototype of high visual fidelity, then this is the tool for you!

Takeaways

Pros of Blueprint

  • The collection of transitions and actions is rich.
  • Customizable widgets are included.
  • Blueprint Viewer allows anyone to view prototypes for free.
  • Viewing prototypes requires no Internet connectivity.

Cons of Blueprint

  • The learning curve is noticeable at first.
  • iOS is the only platform supported out of the box.
  • Multi-finger actions and third-party widgets are not supported (at least, not yet).
  • Dynamic states and master templates are not provided.

Closing Thoughts

Widget-based clickthrough prototypes are great for communicating design concepts that emerge from sketching exercises. These prototypes bridge the gap between what the stakeholders envision and what the UXers plan to create. Blueprint, one tool that handles the creation of such prototypes, provides an effective way to capture UI details, while allowing for higher visual fidelity. Furthermore, it introduces a way to design directly on the device, allowing stakeholders to be more intimately involved in demos. If you have $20 lying around, then spend a weekend exploring this tool. It could bring many benefits to your design process. Prototype away, fellow designers!

Useful Resources

Here are the iPad prototyping tools we’ve discussed:

(al, ml)

Footnotes

  1. 1 http://www.smashingmagazine.com/2014/03/06/building-clickthrough-prototypes-to-support-participatory-design/
  2. 2 https://popapp.in/
  3. 3 http://www.smashingmagazine.com/wp-content/uploads/2014/09/01-final-prototype-opt.jpg
  4. 4 http://www.smashingmagazine.com/wp-content/uploads/2014/09/01-final-prototype-opt.jpg
  5. 5 http://www.groosoft.com
  6. 6 #export
  7. 7 http://www.groosoft.com/blueprint/#tutorials
  8. 8 http://www.smashingmagazine.com/wp-content/uploads/2014/09/05-bp-home-screen-opt.png
  9. 9 http://www.smashingmagazine.com/wp-content/uploads/2014/09/05-bp-home-screen-opt.png
  10. 10 http://www.smashingmagazine.com/wp-content/uploads/2014/09/06-bp-device-selection-opt.png
  11. 11 http://www.smashingmagazine.com/wp-content/uploads/2014/09/06-bp-device-selection-opt.png
  12. 12 http://www.smashingmagazine.com/wp-content/uploads/2014/09/07-bp-project-info-opt.png
  13. 13 http://www.smashingmagazine.com/wp-content/uploads/2014/09/07-bp-project-info-opt.png
  14. 14 #export
  15. 15 http://www.groosoft.com/blueprint/#faq
  16. 16 http://www.smashingmagazine.com/wp-content/uploads/2014/09/08-bp-import-options-opt.png
  17. 17 http://www.smashingmagazine.com/wp-content/uploads/2014/09/08-bp-import-options-opt.png
  18. 18 http://www.smashingmagazine.com/wp-content/uploads/2014/09/09-bp-top-toolbar-opt.png
  19. 19 http://www.smashingmagazine.com/wp-content/uploads/2014/09/09-bp-top-toolbar-opt.png
  20. 20 http://www.smashingmagazine.com/wp-content/uploads/2014/09/10-bp-secondary-toolbar-opt.png
  21. 21 http://www.smashingmagazine.com/wp-content/uploads/2014/09/10-bp-secondary-toolbar-opt.png
  22. 22 #interactivity
  23. 23 http://www.smashingmagazine.com/wp-content/uploads/2014/09/11-bp-combined-modes-opt-500.png
  24. 24
  25. 25 http://www.smashingmagazine.com/wp-content/uploads/2014/09/12-bp-using-images-opt.jpg
  26. 26 http://www.smashingmagazine.com/wp-content/uploads/2014/09/12-bp-using-images-opt.jpg
  27. 27 http://www.smashingmagazine.com/wp-content/uploads/2014/09/13-bp-initial-screen-setupInitial-opt.png
  28. 28 http://www.smashingmagazine.com/wp-content/uploads/2014/09/13-bp-initial-screen-setupInitial-opt.png
  29. 29 http://www.smashingmagazine.com/wp-content/uploads/2014/09/14-bp-drag-widget-opt.png
  30. 30 http://www.smashingmagazine.com/wp-content/uploads/2014/09/14-bp-drag-widget-opt.png
  31. 31 http://www.smashingmagazine.com/wp-content/uploads/2014/09/15-bp-widget-options-opt.png
  32. 32 http://www.smashingmagazine.com/wp-content/uploads/2014/09/15-bp-widget-options-opt.png
  33. 33 http://www.smashingmagazine.com/wp-content/uploads/2014/09/16-bp-widget-image-opt.png
  34. 34 http://www.smashingmagazine.com/wp-content/uploads/2014/09/16-bp-widget-image-opt.png
  35. 35 http://www.smashingmagazine.com/wp-content/uploads/2014/09/17-bp-status-bar-opt.png
  36. 36 http://www.smashingmagazine.com/wp-content/uploads/2014/09/17-bp-status-bar-opt.png
  37. 37 http://www.smashingmagazine.com/wp-content/uploads/2014/09/18-bp-widget-rescale-opt.png
  38. 38 http://www.smashingmagazine.com/wp-content/uploads/2014/09/18-bp-widget-rescale-opt.png
  39. 39 http://www.smashingmagazine.com/wp-content/uploads/2014/09/19-bp-screen-zoom-opt.png
  40. 40 http://www.smashingmagazine.com/wp-content/uploads/2014/09/19-bp-screen-zoom-opt.png
  41. 41 http://www.smashingmagazine.com/wp-content/uploads/2014/09/20-bp-second-widget-added-opt.png
  42. 42 http://www.smashingmagazine.com/wp-content/uploads/2014/09/20-bp-second-widget-added-opt.png
  43. 43 http://www.smashingmagazine.com/wp-content/uploads/2014/09/21-bp-fourth-widget-added-opt.png
  44. 44 http://www.smashingmagazine.com/wp-content/uploads/2014/09/21-bp-fourth-widget-added-opt.png
  45. 45 http://www.smashingmagazine.com/wp-content/uploads/2014/09/22-bp-completed-screen-opt.png
  46. 46 http://www.smashingmagazine.com/wp-content/uploads/2014/09/22-bp-completed-screen-opt.png
  47. 47 http://www.smashingmagazine.com/wp-content/uploads/2014/09/23-bp-new-screen-opt.png
  48. 48 http://www.smashingmagazine.com/wp-content/uploads/2014/09/23-bp-new-screen-opt.png
  49. 49 http://www.smashingmagazine.com/wp-content/uploads/2014/09/24-bp-completed-screens-opt.png
  50. 50 http://www.smashingmagazine.com/wp-content/uploads/2014/09/24-bp-completed-screens-opt.png
  51. 51 http://www.smashingmagazine.com/wp-content/uploads/2014/09/25-bp-no-target-opt.png
  52. 52 http://www.smashingmagazine.com/wp-content/uploads/2014/09/25-bp-no-target-opt.png
  53. 53 http://www.smashingmagazine.com/wp-content/uploads/2014/09/26-bp-target-selection-opt.png
  54. 54 http://www.smashingmagazine.com/wp-content/uploads/2014/09/26-bp-target-selection-opt.png
  55. 55 http://www.smashingmagazine.com/wp-content/uploads/2014/09/27-bp-link-customization-opt.png
  56. 56 http://www.smashingmagazine.com/wp-content/uploads/2014/09/27-bp-link-customization-opt.png
  57. 57 http://www.smashingmagazine.com/wp-content/uploads/2014/09/28-bp-link-transition-opt.png
  58. 58 http://www.smashingmagazine.com/wp-content/uploads/2014/09/28-bp-link-transition-opt.png
  59. 59 #images
  60. 60 http://www.airsquirrels.com/reflector/
  61. 61 http://store.apple.com/us/product/MD825ZM/A/lightning-to-vga-adapter?afid=p219%7CGOUS&cid=AOS-US-KWG-PLA
  62. 62 http://www.smashingmagazine.com/wp-content/uploads/2014/09/29-bp-preview-instructions-opt.png
  63. 63 http://www.smashingmagazine.com/wp-content/uploads/2014/09/29-bp-preview-instructions-opt.png
  64. 64 http://www.smashingmagazine.com/wp-content/uploads/2014/09/30-bp-preview_exit-opt.png
  65. 65 http://www.smashingmagazine.com/wp-content/uploads/2014/09/30-bp-preview_exit-opt.png
  66. 66 http://www.smashingmagazine.com/wp-content/uploads/2014/09/31-bp-bv-phone-opt.png
  67. 67 http://www.smashingmagazine.com/wp-content/uploads/2014/09/31-bp-bv-phone-opt.png
  68. 68 http://www.smashingmagazine.com/wp-content/uploads/2014/09/32-bp-bv-tablet-opt.png
  69. 69 http://www.smashingmagazine.com/wp-content/uploads/2014/09/32-bp-bv-tablet-opt.png
  70. 70 http://www.smashingmagazine.com/wp-content/uploads/2014/09/33-bp-export-options-opt.png
  71. 71 http://www.smashingmagazine.com/wp-content/uploads/2014/09/33-bp-export-options-opt.png
  72. 72 http://www.smashingmagazine.com/wp-content/uploads/2014/09/34-bp-export-file-format-opt.png
  73. 73 http://www.smashingmagazine.com/wp-content/uploads/2014/09/34-bp-export-file-format-opt.png
  74. 74 http://www.smashingmagazine.com/wp-content/uploads/2014/09/35-bp-export-pdf-options-opt.png
  75. 75 http://www.smashingmagazine.com/wp-content/uploads/2014/09/35-bp-export-pdf-options-opt.png
  76. 76 http://www.smashingmagazine.com/wp-content/uploads/2014/09/36-bp-export-png-options-opt.png
  77. 77 http://www.smashingmagazine.com/wp-content/uploads/2014/09/36-bp-export-png-options-opt.png
  78. 78 http://www.smashingmagazine.com/wp-content/uploads/2014/09/37-bp-export-email-opt.png
  79. 79 http://www.smashingmagazine.com/wp-content/uploads/2014/09/37-bp-export-email-opt.png
  80. 80 http://www.smashingmagazine.com/wp-content/uploads/2014/09/38-bp-export-dropbox-opt.png
  81. 81 http://www.smashingmagazine.com/wp-content/uploads/2014/09/38-bp-export-dropbox-opt.png
  82. 82 http://www.groosoft.com/blueprint/
  83. 83 http://www.appcooker.com/
  84. 84 http://www.hotappsfactory.com
  85. 85 http://www.appcooker.com/apptaster-play-mockups-wireframes/
  86. 86 http://interface.lesscode.co.nz/
  87. 87 http://lesscode.co.nz/
  88. 88
  89. 89 http://www.groosoft.com/blueprint/
  90. 90 https://itunes.apple.com/us/app/blueprint-viewer/id411622447
  91. 91 http://www.appcooker.com/
  92. 92 http://www.appcooker.com/apptaster-play-mockups-wireframes/
  93. 93 http://interface.lesscode.co.nz/

The post Creating Clickthrough Prototypes With Blueprint appeared first on Smashing Magazine.

Categories: Others Tags:

Improving Smashing Magazine’s Performance: A Case Study

September 8th, 2014 No comments
Tim Kadlec's article about SmashingMag's performance

Today Smashing Magazine turns eight years old. Eight years is a long time on the web, yet for us it really doesn’t feel like a long journey at all. Things have changed, evolved and moved on, and we gratefully take on new challenges one at a time. To mark this special little day, we’d love to share a few things that we’ve learned over the last year about the performance challenges of this very website and about the work we’ve done recently. If you want to craft a fast responsive website, you might find a few interesting nuggets worth considering. – Ed.

Improvement is a matter of steady, ongoing iteration. When we redesigned Smashing Magazine back in 2012, our main goal was to establish trustworthy branding that would reflect the ambitious editorial direction of the magazine. We did that primarily by focusing on crafting a delightful reading experience. Over the years, our focus hasn’t changed a bit; however, that very asset that helped to establish our branding turned into a major performance bottleneck.

Good Old-Fashioned Website Decay

Looking back at the early days of our redesign, some of our decisions seem to be quick’n’dirty fixes rather than sound long-term solutions. Our advertising constraints pushed us to compromises. Legacy browsers drove us to dependencies on (relatively) heavy JavaScript libraries. Our technical infrastructure led us to heavily customized WordPress plugins and complex PHP logic. With every new feature added, our technical debt grew, and our style sheets, markup and JavaScript weren’t getting any leaner.

Sound familiar? Admittedly, responsive web design as a technique often gets a pretty bad rap for bloating websites and making them difficult to maintain. (Not that non-responsive websites are any different, but that’s another story.) In practice, all assets on a responsive website will show up pretty much everywhere1: be it a slow smartphone, a quirky tablet or a fancy laptop with a Retina screen. And because media queries merely provide the ability to respond to screen dimensions — and do not, rather, have a more local, self-contained scope — adding a new feature and adjusting the reading experience potentially means going through each and every media query to prevent inconsistencies and fix layout issues.

“Mobile First” Means “Always Mobile First”

When it comes to setting priorities for the content and functionality on a website, “mobile first” is one of those difficult yet incredibly powerful constraints that help you focus on what really matters, and identify critical components of your website. We discovered that designing mobile first is one thing; building mobile first is an entirely different story. In our case, both the design and development phases were heavily mobile first, which helped us to focus tightly on the content and its presentation. But while the design process was quite straightforward, implementation proved to be quite difficult.

Because the entire website was built mobile first, we quickly realized that adding or changing components on the page would entail going through the mobile-first approach for every single (minor and major) design decision. We’d design a new component in a mobile view first, and then design an “extended” view for the situations when more space is available. Often that meant adjusting media queries with every single change, and more often it meant adding new stuff to style sheets and to the markup to address new issues that came up.

2
Shortly after the new SmashingMag redesign went live, we ran into performance issues. An article by Tim Kadlec from 20123 shows just that.

We found ourselves trapped: development and maintenance were taking a lot of time, the code base was full of minor and major fixes, and the infrastructure was becoming too slow. We ended up with a code base that had become bloated before the redesign was even released — very bloated4, in fact.

Performance Issues

In mid-2013, our home page weighed 1.4 MB and produced 90 HTTP requests. It just wasn’t performing well. We wanted to create a remarkable reading experience on the website while avoiding the flash of unstyled text (FOUT), so web fonts were loaded in the header and, hence, were blocking the rendering of content (actually it’s correct behaviour according to the spec5, designed to avoid multiple repaints and reflows.) jQuery was required for ads to be displayed, and a few JavaScripts depended on jQuery, so they all were blocking rendering as well. Ads were loaded and rendered before the content to ensure that they appeared as quickly as possible.

Images delivered by our ad partners were usually heavy and unoptimized, slowing down the page further. We also loaded Respond.js and Modernizr to deal with legacy browsers and to enhance the experience for smart browsers. As a result, articles were almost inaccessible on slow and unstable networks, and the start rendering time on mobile was disappointing at best.

It wasn’t just the front-end that was showing its age though. The back-end wasn’t getting any better either. In 2012 we were playing with the idea of having fully independent sections of the magazine — sections that would live their own lives, evolving and growing over time as independent WordPress installations, with custom features and content types that wouldn’t necessarily be shared across all sections.

6
Yes, we do enjoy a quite savvy user base, so optimization for IE8 is really not an issue. Large view.7

Because WordPress multi-install wasn’t available at the time, we ended up with six independent, autonomous WordPress installs with six independent, autonomous style sheets. Those installs were connected to 6 × 2 databases (a media server and a static content server). We ran into dilemmas. For example, what if an author wrote for two sections and we’d love to show their articles from both sections on one single author’s bio page? Well, we’d need to somehow pull articles from both installs and add redirects for each author’s page to that one unified page, or should we just be using one of those page as the “host”? Well, you know where this is going: increasing complexity and increasing maintenance costs. In the end, the sections didn’t manage to evolve significantly — at least not in terms of content — yet we had already customized technical foundation of each section, adding to the CSS dust and PHP complexity.

(Because we had outsourced WordPress tasks, some plugins depended on each other. So, if we were to deactivate one, we might have unwittingly disabled two or three others in the process, and they would have to be turned back on in a particular order to work properly. There were even differences in the HTML outputted by the PHP templates behind the curtains, such as classes and IDs that differed from one installation to the next. It’s no surprise that this setup made development a bit frustrating.)

The traffic was stagnant, readers kept complaining about the performance on the site and only a very small portion of users visited more than 2 pages per visit. The visual feedback when browsing the site was visible and surely wasn’t instant, and this lag has been driving readers away from the site to Instapaper and Pocket — both on mobile and desktop. We knew that because we asked our readers, and the feedback was quite clear (and a bit frustrating).

It was time to push back — heavily, with a major refactoring of the code base. We looked closely under the hood, discovering a few pretty scary (and nasty) things, and started fixing issues, one by one. It took us quite a bit of time to make things right, and we learned quite a few things along the way.

Switching Gears

Up until mid-2013, we weren’t using a CSS preprocessor, nor any build tools. Good long-term solutions require a good long-term foundation, so the first issues we tackled were tooling and the way the code base was organized. Because a number of people had been working on the code base over the years, some things proved to be rather mysterious… or challenging, to say the least.

We started with a code inventory, and we looked thoroughly at every single class, ID and CSS selector. Of course, we wanted to build a system of modular components, so the first task was to turn our seven large CSS files into maintainable, well-documented and easy-to-read modules. At the time, we’d chosen LESS, for no particular reason, and so our front-end engineer Marco8 started to rewrite CSS and build a modular, scalable architecture. Of course, we could very well have used Sass instead, but Marco felt quite comfortable with LESS at the time.

With a new CSS architecture, Grunt9 as a build tool and a few10time-saving11Grunt12tasks13, the task of maintaining the entire code base became much easier. We set up a brand new testing environment, synced up everything with GitHub, assigned roles and permissions, and started digging. We rewrote selectors, reauthored markup, and refactored and optimized JavaScript. And yes, it took us quite some time to get things in order, but it really wouldn’t have been so difficult if we hadn’t had a number of very different stylesheets to deal with.

The Big Back-End Cleanup

With the introduction of Multisite, creating a single WordPress installation from our six separate installations became a necessary task for our friends at Inpsyde14. Over the course of five months, Christian Brückner and Thomas Herzog cleaned up the PHP templates, kicked unnecessary plugins into orbit, rewrote plugins we had to keep and added new ones where needed. They cleared the databases of all the clutter that the old plugins had created — one of the databases weighed in at 70 GB (no, that’s not a typo; we do mean gigabytes) — merged all of the databases into one, and then created a single fresh and, most importantly, maintainable WordPress Multisite installation.

The speed boost from those optimizations was remarkable. We are talking about 400 to 500 milliseconds of improvement by avoiding sub-domain redirects and unifying the code base and the back-end code. Those redirects15 are indeed a major performance culprit, and just avoiding them is one of those techniques that usually boost performance significantly because you avoid full DNS lookups, improve time to first byte and reduce round trips on the network.

Thomas and Christian also refactored our entire WordPress theme according to the coding standard of their own theme architecture, which is basically a sophisticated way of writing PHP based on the WordPress standard. They wrote custom drop-ins that we use to display content at certain points in the layout. Writing the PHP strictly according to WordPress’ official API felt like getting out of a horse-drawn carriage and into a race car. All modifications were done without ever touching WordPress’ core, which is wonderful because we’ll never have to fear updating WordPress itself anymore.

Spam comments
We’ve also marked a few millions spam comments across all the sections of the magazine. And before you ask: no, we did not import them into the new install.

We migrated the installations during a slow weekend in mid-April 2014. It was a huge undertaking, and our server had a few hiccups during the process. We brought together over 2500 articles, including about 15,000 images, all spread over six databases, which also had a few major inconsistencies. While it was a very rough start at first — a lot of redirects had to be set up, caching issues on our server piled up, and some articles got lost between the old and new installations — the result was well worth the effort.

Our editorial team, primarily Iris16, Melanie17 and Markus18, worked very hard to bring those lost articles back to life by analyzing our 404s with Google Webmaster Tools. We spent a few weekends to ensure that every single article was recovered and remains accessible. Losing articles, including their comments, was simply unacceptable.

We know well how much time it takes for a good article to get published, and we have a lot of respect for authors and their work, and ensuring that the content remains online was a matter of respect for the work published. It took us a few weeks to get there and it wasn’t the most enjoyable experience for sure, but we used the opportunity to introduce more consistency in our information architecture and to adjust tags and categories appropriately. (Ah, if you do happen to find an article that has gotten lost along the way, please do let us know19 and we’ll fix it right away. Thanks!)

Front-End Optimization

In April 2014, once the new system was in place and had been running smoothly for a few days, we rewrote the LESS files based on what was left of all of the installs. Streamlining the classes for posts and pages, getting rid of all unneeded IDs, shortening selectors by lowering their specificity, and rooting out anything in the CSS we could live without crunched the CSS from 91 KB down to a mere 45 KB.

Once the CSS code base was in proper shape, it was time to reconsider how assets are loaded on the page and how we can improve the start rendering time beyond having clean, well-structured code base. Given the nightmare we experienced with the back-end previously, you might assume that improving performance now would have been a complex, time-consuming task, but actually it was quite a bit easier than that. Basically, it was just a matter of getting our priorities right by optimizing the critical rendering path.

The key to improving performance was to focus on what matters most: the content, and the fastest way for readers to actually start reading our articles on their devices. So over a course of a few months we kept reprioritizing. With every update, we introduced mini-optimizations based on a very simple, almost obvious principle: optimize the delivery of content, and defer the rest — without any compromises, anywhere.

Our optimizations were heavily influenced by the work done by Scott Jehl20, as well as The Guardian21 and the BBC22 teams (both of which open-sourced their work). While Scott has been sharing valuable insight23 into the front-end techniques that Filament Group was using, the BBC and The Guardian helped us to define and refine the concept of the core experience on the website and use it as a baseline. A shared main goal was to deliver the content as fast as possible to as many people as possible regardless of their device or network capabilities, and enhance the experience with progressive enhancement for capable browsers.

However, historically we haven’t had a lot of JavaScript or complex interactions on Smashing Magazine, so we didn’t feel that it was necessary to introduce complex loading logic with JavaScript preloaders. However, being a content-focused website, we did want to reduce the time necessary for the articles to start displaying as far as humanly possible.

Performance Budget: Speed Index <= 1000

How fast is fast enough?24 Well, that’s a tough question to answer. In general, it’s quite difficult to visualize performance and explain why every millisecond counts—unless you have hard data. At the same time, falling into trap of absolutes and relying on not truly useful performance metrics is easy. In the past, the most commonly cited performance metric was average loading time. However, on its own, average loading time isn’t that helpful because it doesn’t tell you much about when a user can actually start using the website. This is why talking about “fast enough” is often so tricky.

Comparing Progress25
A nice way of visualizing performance is to use WebPageTest to generate an actual video of the page loading and run a test between two competing websites. Besides, the Speed Index metric26 often proves to be very useful.

Different components require different amounts of time to load, yet some components of the page are more important than others. E.g. you don’t need to load the footer content fast, but it’s a good idea to render the visible portion of the page fast. You know where it’s heading: of course, we are talking about the “above the fold” view here. As Ilya Grigorik once said27, “We don’t need to render the entire page in one second, [just] the above the fold content.” To achieve that, according to Scott’s research and Google’s test results, it’s helpful to set ambitious performance goals:

What does it mean and why are they important? According to HCI research, “for an application to feel instant, a perceptible response to user input must be provided within hundreds of milliseconds30. After a second or more, the user’s flow and engagement with the initiated task feels broken.” With the first goal, we are trying to ensure an instant response on our website. It refers to the so-called Speed Index metric for the start rendering time — the average time (in ms) at which visible parts of the page are displayed, or become accessible. So the first goal basically reflects that a page starts rendering under 1000ms, and yes, it’s a quite difficult challenge to take on.

Browser Networking31
Ilya Grigorik’s book High Performance Browser Networking32 is a very helpful guide with useful guidelines and advice on making websites fast. And it’s available as a free HTML book, too.

The second goal can help in achieving the first one. The value of 14 KB has been measured empirically33 by Google and is the threshold for the first package exchanged between a server and client via towers on a cellular connection. You don’t need to include images within 14 Kb, but you might want to deliver the markup, style sheets and any JavaScript required to render the visible portion of the page in that threshold. Of course, in practice this value can only realistically be achieved with gzip compression.

By combining the two goals, we basically defined a performance budget that we set for the website — a threshold for what was acceptable. Admittedly, we didn’t concern ourselves with the start rendering time on different devices on various networks, mainly because we really wanted to push back as far as possible everything that isn’t required to start rendering the page. So, the ideal result would be a Speed Index value that is way lower than the one we had set — as low as possible, actually — in all settings and on all connections, both shaky and stable, slow and fast. This might sound naive, but we wanted to figure out how fast we could be, rather than how fast we should be. We did measure start rendering time for first and subsequent page loads, but we did that much later, after optimizations had already been done, and just to keep track of issues on the front-end.

Our next step would be to integrate Tim Kadlec’s Perf-Budget Grunt task34 to incorporate the performance budget right into the build process and, thus, run every new commit against WebPagetest’s performance benchmark. If it fails, we know that a new feature has slowed us down, so we probably have to reconsider how it’s implemented to fit it within our budget, or at least we know where we stand and can have meaningful discussions about its impact on the overall performance.

Prioritization And Separation Of Concerns

If you’ve been following The Guardian‘s work recently, you might be familiar with the strict separation of concerns that they introduced35 during the major 2013 redesign. The Guardian separated36 its entire content into three main groups:

  • Core content
    Essential HTML and CSS, usable non-JavaScript-enhanced experience
  • Enhancement
    JavaScript, geolocation, touch support, enhanced CSS, web fonts, images, widgets
  • Leftovers
    Analytics, advertising, third-party content

Separation of Concerns37
A strict separation of concerns, or loading priorities, as defined by The Guardian team. Large view.38

Once you have defined, confirmed and agreed upon these priorities, you can push performance optimization quite far. Just by being very specific about each type of content you have and by clearly defining what “core content” is, you are able to load Core content as quickly as possible, then load Enhancements once the page starts rendering (after the DOMContentLoaded event fires), and then load Leftovers once the page has fully rendered (after the load event fires).

The main principle here of course is to strictly separate the loading of assets throughout these three phases, so that the loading of the Core content should never be blocked by any resources grouped in Enhancement or Leftovers (we haven’t achieved the perfect separation just yet, but we are on it). In other words, you try to shorten the critical rendering path that is required for the content to start displaying by pushing the content down the line as fast as possible and deferring pretty much everything else.

We followed this same separation of concerns, grouping our content types into the same categories and identifying what’s critical, what’s important and what’s secondary. In our case, we identified and separated content in this way:

  • Core content
    Only essential HTML and CSS
  • Enhancement
    JavaScript, code syntax highlighter, full CSS, web fonts, comment ratings
  • Leftovers
    Analytics, advertising, Gravatars

Once you have this simple content/functionality priority list, improving performance is becoming just a matter of adding a few snippets for loading assets to properly reflect those priorities. Even if your server logic forces you to load all assets on all devices, by focusing on content delivery first, you ensure that the content is accessible quickly, while everything else is deferred and loaded in the background, after the page has started rendering. From a strategic perspective, the list also reflects your technical debt, as well as critical issues that slow you down. Indeed, we had quite a list of issues to deal with already at this point, so it transformed fairly quickly into a list of content priorities. And a rather tricky issue sat right at the top of that list: good ol’ web fonts.

Deferring Web Fonts

Despite the fact that the proportion of Smashing Magazine’s readers on mobile has always been quite modest (just around 15%—mainly due to the length of articles), we never considered mobile as an afterthought, but we never pushed user experience on mobile either. And when we talk about user experience on mobile, we mostly talk about speed, since typography was pretty much well designed from day one.

We had conversations during the 2012 redesign about how to deal with fonts, but we couldn’t find a solution that made everybody happy. The visual appearance of content was important, and because the new Smashing Magazine was all about beautiful, rich typography, not loading web fonts at all on mobile wasn’t really an option.

With the redesign back then, we switched to Skolar for headings and Proxima Nova for body copy, delivered by Fontdeck. Overall, we had three fonts for each typeface — Regular, Italic and Bold — totalling in six font files to be delivered over the network. Even after our dear friends at Fontdeck subsetted and optimized the fonts, the assets were quite heavy with over 300 KB in total, and because we wanted to avoid the frequent flash of unstyled text (FOUT), we had them loaded in the header of every page. Initially we thought that the fonts would reliably be cached in HTTP cache, so they wouldn’t be retrieved with every single page load. Yet it turned out that HTTP cache was quite unreliable: the fonts showed up in the waterfall loading chart every now and again for no apparent reason, both on desktop and on mobile.

The biggest problem, of course, was that the fonts were blocking rendering39. Even if the HTML, CSS and JavaScript had already loaded completely, the content wouldn’t appear until the fonts had loaded and rendered. So you had this beautiful experience of seeing link underlines first, then a few keywords in bold here and there, then subheadings in the middle of the page and then finally the rest of the page. In some cases, when Fontdeck had server issues, the content didn’t appear at all, even though it was already sitting in the DOM, waiting to be displayed.

LP font by Ian Feather40
In his article, Web Fonts and the Critical Path41, Ian Feather provides a very detailed overview of the FOUT issues and font loading solutions. We tested them all.

We experimented with a few solutions before settling on what turned out to be perhaps the most difficult one. At first, we looked into using Typekit and Google’s WebFontLoader42, an asynchronous script which gives you more granular control of what appears on the page while the fonts are being loaded. Basically, the script adds a few classes to the body element, which allows you to specify the styling of content in CSS during the loading and after the fonts have loaded. So you can be very precise about how the content is displayed in fallback fonts first, before users see the switch from fallback fonts to web fonts.

We added fallback fonts declarations and ended up with pretty verbose CSS font stacks, using iOS fonts, Android fonts, Windows Phone fonts and good ol’ web-safe fonts as fallbacks — we are still using these font stacks today. E.g. we used this cascade for the main headings (it reflects the order of popularity of mobile operating systems in our analytics):

h2 {
   font-family: "Skolar Bold",
   AvenirNext-Bold, "Avenir Bold",
   "Roboto Slab", "Droid Serif",
   "Segoe UI Bold",
   Georgia, "Times New Roman", Times, serif;
}

So readers would see a mobile OS font (or any other fallback font first), and it probably would be a font that they are quite familiar with on their device, and then once the fonts have loaded, they would see a switch, triggered by WebFontLoader. However, we discovered that after switching to WebFontLoader, we started seeing FOUT way too often, with HTTP cache being quite unreliable again, and that permanent switch from a fallback font to the web font being quite annoying, basically ruining the reading experience.

So we looked for alternatives. One solution was to include the @font-face directive only on larger screens by wrapping it in a media query, thus avoiding loading web fonts on mobile devices and in legacy browsers altogether. (In fact, if you declare web fonts in a media query, they will be loaded only when the media query matches the screen size. So no performance hit there.) Obviously it helped us improve performance on mobile devices in no time, but we didn’t feel right with having a “simplified” reading experience on mobile devices. So it was a no-go, too.

What else could we do? The only other option was to improve the caching of fonts. We couldn’t do much with HTTP cache, but there was one option we hadn’t looked into: storing fonts in AppCache or localStorage. Jake Archibald’s article on the beautiful complexity of AppCache43 led us away from AppCache to experiment with localStorage, a technique44 that The Guardian’s team was using at the time.

Now, offline caching comes with one one major requirement: you need to have the actual font files to be able to cache them locally in the client’s browser. And you can’t cache a lot because localStorage space is very limited45, sometimes with just 5Mb available per domain. Luckily, the Fontdeck guys were very helpful and forthcoming with our undertaking, so despite the fact that font delivery services usually require you to load files and have a synchronous or asynchronous callback to count the number of impressions, Fontdeck has been perfectly fine with us grabbing WOFF-files from Google Chrome’s cache and setting up a “flat” pricing based on the number of page impressions in recent history.

So we grabbed the WOFF files and embedded them, base64-encoded, in a single CSS file, moving from six external HTTP-requests with about 50 KB file each to at most one HTTP request on the first load and 400 KB of CSS. Obviously, we didn’t want this file to be loaded on every visit. So if localStorage is available on the user’s machine, we store the entire CSS file in localStorage, set a cookie and switch from the fallback font to the web font. This switch usually happens once at most because for the consequent visits, we check whether the cookie has been set and, if so, retrieve the fonts from localStorage (causing about 50ms in latency) and display the content in the web font right away. Just before you ask: yes, read/write to localStorage is much slower than retrieving files from HTTP cache46, but it proved to be a bit more reliable in our case.

Browserscope Graph47
Yes, localStorage is much slower than HTTP cache48, but it’s more reliable. Storing fonts in localStorage isn’t the perfect solution, but it helped us improve performance dramatically.

If the browser doesn’t support localStorage, we include fonts with good ol’ link href and, well, frankly just hope for the best — that the fonts will be properly cached and persist in the user’s browser cache. For browsers that don’t support WOFF49 (IE8, Opera Mini, Android <= 4.3), we provide external URLs to fonts with older font mime types, hosted on Fontdeck.

Now, if localStorage is available, we still don’t want it to be blocking the rendering of the content. And we don’t want to see FOUT every single time a user loads the page. That’s why we have a little JavaScript snippet in the header before the body element: it checks whether a cookie has been set and, if not, we load web fonts asynchronously after the page has started rendering. Of course, we could have avoided the switch by just storing the fonts in localStorage on the first visit and have no switch during the first visit, but we decided that one switch is acceptable, because our typography is important to our identity.

The script was written, tested and documented by our good friend Horia Dragomir50. Of course, it’s available as a gist on GitHub51:

<script type="text/javascript">
    (function () {
      "use strict";
      // once cached, the css file is stored on the client forever unless
      // the URL below is changed. Any change will invalidate the cache
      var css_href = './web-fonts.css';
      // a simple event handler wrapper
      function on(el, ev, callback) {
        if (el.addEventListener) {
          el.addEventListener(ev, callback, false);
        } else if (el.attachEvent) {
          el.attachEvent("on" + ev, callback);
        }
      }
      
      // if we have the fonts in localStorage or if we've cached them using the native browser cache
      if ((window.localStorage && localStorage.font_css_cache) || document.cookie.indexOf('font_css_cache') > -1){
        // just use the cached version
        injectFontsStylesheet();
      } else {
       // otherwise, don't block the loading of the page; wait until it's done.
        on(window, "load", injectFontsStylesheet);
      }
      
      // quick way to determine whether a css file has been cached locally
      function fileIsCached(href) {
        return window.localStorage && localStorage.font_css_cache && (localStorage.font_css_cache_file === href);
      }
 
      // time to get the actual css file
      function injectFontsStylesheet() {
       // if this is an older browser
        if (!window.localStorage || !window.XMLHttpRequest) {
          var stylesheet = document.createElement('link');
          stylesheet.href = css_href;
          stylesheet.rel = 'stylesheet';
          stylesheet.type = 'text/css';
          document.getElementsByTagName('head')[0].appendChild(stylesheet);
          // just use the native browser cache
          // this requires a good expires header on the server
          document.cookie = "font_css_cache";
        
        // if this isn't an old browser
        } else {
           // use the cached version if we already have it
          if (fileIsCached(css_href)) {
            injectRawStyle(localStorage.font_css_cache);
          // otherwise, load it with ajax
          } else {
            var xhr = new XMLHttpRequest();
            xhr.open("GET", css_href, true);
            on(xhr, 'load', function () {
              if (xhr.readyState === 4) {
                // once we have the content, quickly inject the css rules
                injectRawStyle(xhr.responseText);
                // and cache the text content for further use
                // notice that this overwrites anything that might have already been previously cached
                localStorage.font_css_cache = xhr.responseText;
                localStorage.font_css_cache_file = css_href;
              }
            });
            xhr.send();
          }
        }
      }
 
      // this is the simple utitily that injects the cached or loaded css text
      function injectRawStyle(text) {
        var style = document.createElement('style');
        style.innerHTML = text;
        document.getElementsByTagName('head')[0].appendChild(style);
      }
 
    }());
</script>

During the testing of the technique, we discovered a few surprising problems. Because the cache isn’t persistent in WebViews, fonts do load asynchronously in applications such as Tweetdeck and Facebook, yet they don’t remain in the cache once the window is closed. In other words, with every WebViews visit, the fonts are re-downloaded. Some old Blackberry devices seemed to clear cookies and delete the cache when the battery is running out. And depending on the configuration of the device, sometimes fonts do not persist in mobile Safari either.

Still, once the snippet was in place, articles started rendering much faster. By deferring the loading of Web fonts and storing them in localStorage, we’ve avoided around 700ms delay, and thus shortened the critical path significantly by avoiding the latency for retrieving all the fonts. The result was quite impressive for the first load of an uncached page, and it was even more impressive for concurrent visits since we were able to reduce the latency caused by Web fonts to just 40 to 50 ms. In fact, if we had to mention just one improvement to performance on the website, deferring web fonts is by far the most effective.

At this point, we haven’t even considered using the new WOFF2 format52 for fonts just yet. Currently supported in Chrome and Opera, it promises a better compression for font files and it already showed remarkable results. In fact, The Guardian was able to cut down on 200ms latency and 50 KB of the file weight53 by switching to WOFF2, and we intend to look into moving to WOFF2 soon as well.

Of course, grabbing WOFFs might not always be an option for you, but it wouldn’t hurt just to talk to type foundries to see where you stand or to work out a deal to host fonts “locally.” Otherwise, tweaking WebFontLoader for Typekit and Fontdeck is definitely worth considering.

Dealing With JavaScript

With the goal of removing all unnecessary assets from the critical rendering path, the second target we decided to deal with was JavaScript. And it’s not like we particularly dislike JavaScript for some reason, but we always tend to prefer non-JavaScript solutions to JavaScript ones. In fact, if we can avoid JavaScript or replace it with CSS, then we’ll always explore that option.

Back in 2012, we weren’t using a lot of scripts on the page, yet displaying advertising via OpenX depended on jQuery, which made it way too easy to lazily approach simple, straightforward tasks with ready-to-use jQuery plugins. At the time, we also used Respond.js to emulate responsive behaviour in legacy browsers. However, Internet Explorer 8 usage has dropped significantly between 2012 and 2014: with 4.7% before the redesign, it was now 1.43%, with a dropping tendency every single month. So we decided to deliver a fixed-width layout with a specific IE8.css stylesheet to those users, and removed Respond.js altogether.

As a strategic decision, we decided to defer the loading of all JavaScripts until the page has started rendering and we looked into replacing jQuery with lightweight modular JavaScript components.

jQuery was tightly bound to ads, and ads were supposed to start displaying as fast as possible, so to make it happen, we had to deal with advertising first. The decision to defer the loading of ads wasn’t easy to get agreement on, but we managed to make a convincing argument that better performance would increase click rates because users would see the content sooner. That is, on every page, readers would be attracted by the high-quality content and then, when the ads kick in, would pay attention to those squares in the sidebar as well.

Florian Sander54, our partner in crime when it comes to advertising, rewrote the script for our banner ads so that banners would be loaded only after the content has started rendering, and only then the advertising spots would be put into place. Florian was able to get rid of two render-blocking HTTP-requests that the ad-script normally generated, and we were able to remove the dependency on jQuery by rewriting the script in vanilla JavaScript.

Obviously, because the sidebar’s ad content is generated on the fly and is loaded after the render tree has been constructed, we started seeing reflows (this still happens when the page is being constructed). Because we used to load ads before the content, the entire page (with pretty much everything) used to load at once. Now, we’ve moved to a more modular structure, grouping together particular parts of the page and queuing them to load after each other. Obviously, this has made the overall experience on the site a bit noisier because there are a few jumps here and there, in the sidebar, in the comments and in the footer. That was a compromise we went for, and we are working on a solution to reserve space for “jumping” elements to avoid reflows as the page is being loaded.

Deferring Non-Critical JavaScript

When the prospect of removing jQuery altogether became tangible as a long-term goal, we started working step by step to decouple jQuery dependencies from the library. We rewrote the script to generate footnotes for the print style sheet (later replacing it with a PHP solution), rewrote the functionality for rating comments, and rewrote a few other scripts. Actually, with our savvy user base and a solid share of smart browsers, we were able to move to vanilla JavaScript quite quickly. Moreover, we could now move scripts from the header to the footer to avoid blocking construction of the DOM tree. In mid-July, we removed jQuery from our code base entirely.

We wanted full control of what is loaded on the page and when. Specifically, we wanted to ensure that no JavaScript blocks the rendering of content at any point. So, we use the Defer Loading JavaScript55 script to load JavaScript after the load event by injecting the JavaScript after the DOM and CSSOM have already been constructed and the page has been painted. Here’s the snippet that we use on the website, with the defer.js script (which is loaded asynchronously after the load event):

function downloadJSAtOnload() {
   var element = document.createElement("script");
   element.src = "defer.js";
   document.body.appendChild(element);
}
if (window.addEventListener)
   window.addEventListener("load", downloadJSAtOnload, false);
else if (window.attachEvent)
   window.attachEvent("onload", downloadJSAtOnload);
else
   window.onload = downloadJSAtOnload;

However, because script-injected asynchronous scripts are considered harmful56 and slow (they block the browser’s speculative parser), we might be looking into using the good ol’ defer and async attributes instead. In the past, we couldn’t use async for every script because we needed jQuery to load before its dependencies; so, we used defer, which respects the loading order of scripts. With jQuery out of the picture, we can now load scripts asynchronously, and fast. Actually by the time you read this article, we might already be using async.

Basically, we just deferred the loading of all JavaScripts that we identified previously, such as syntax highlighter and comment ratings, and cleared a path in the header for HTML and CSS.

Inlining Critical CSS

That wasn’t good enough, though. Performance did improve dramatically; however, even with all of these optimizations in place, we didn’t hit that magical Speed Index value of under 1000. In light of the ongoing discussion about inline CSS and above-the-fold CSS, as recommended by Google57, we looked into more radical ways to deliver content quickly. To avoid an HTTP request when loading CSS, we measured how fast the website would be if we were to load critical CSS inline and then load the rest of the CSS once the page has rendered.

scott-jehl58
Scott Jehl’s article59 explains how exactly to extract and inline critical CSS.

But what exactly is critical CSS? And how do you extract it from a potentially complex code base? As Scott Jehl points out60, critical CSS is the subset of CSS that is needed to render the top portion of the page across all breakpoints. What does that mean? Well, you would decide on a certain height that you would consider to be “above the fold” content — it could be 600, 800 or 1200 pixels or anything else — and you would collect into their own style sheet all of the styles that specify how to render content within that height across all screen widths.

Then you inline those styles in the head, and thus give the browser everything it needs to start render that visible portion of the page — within one single HTTP request. You’ve heard it a few times by now: everything else is deferred after the first initial rendering. You avoid an HTTP-request, and you load the full CSS asynchronously, so once the user starts scrolling, the full CSS will (hopefully) already have loaded.

Visually speaking, content will appear to render more quickly, but there will also be more reflowing and jumping on the page. So, if a user has followed a link to a particular comment below the “fold”, then they will see a few reflows as the website is being constructed because the page is rendered with critical CSS first (there is just so much we can fit within 14 KB!) and adjusted later with the complete CSS. Of course, inline CSS isn’t cached; so, if you have critical CSS and load the complete CSS on rendering, it’s useful to set a cookie, so that inline styles aren’t inlined with every single load. The drawback of course is that you might have duplicate CSS because you would be defining styles both inline and in the full CSS, unless you’re able to strictly separate them.

Because we had just refactored our CSS code base, identifying critical CSS wasn’t very difficult. Obviously, there are smart61tools62 that analyze the markup and CSS, identify critical CSS styles and export them into a separate file during the build process, but we were able to do it manually. Again, you have to keep in mind that 14 Kb is your budget for HTML and CSS, so in the end we had to rename a few classes here and there, and compress CSS as well.

We analyzed the first 800px, checking the inspector for the CSS that was needed and separating our style sheet into two files – and actually that was pretty much it. One of those files, above-the-fold.css, is minified and compressed, and its content is placed inline in the head of our document as early as possible – not blocking rendering. The other file, our full CSS file, is then loaded with JavaScript after the content has loaded, and if JavaScript isn’t available for some reason or the user is on a legacy browser, we’ve put a full CSS file inside noscript tag at the end of the head, so they don’t get an unstyled HTML page.

Was It All Worth It?

Because we’ve just implemented these optimizations, we haven’t been able to measure their impact on traffic, but we’ll publish these results later as well. Obviously, we did notice a quite remarkable technical improvement though. By deferring and caching web fonts, inlining CSS and optimizing the critical rendering path for the first 14Kb, we were able to achieve dramatic improvements in loading times. The start rendering time started circling around 1s for an uncached page on 3G and was around 700ms (including latency!) on subsequent loads.

webpagetest63
We’ve been using WebPageTest6428 a lot for running tests. Our waterfall chart was becoming better over time and reflected the priorities we had defined earlier. Large view.65

On average, Smashing Magazine’s front page makes 45 HTTP-requests and has 440 KB in bandwidth on the first uncached load. Because we heavily cache everything but ads, subsequent visits have around 15 HTTP requests and 180 KB of traffic. The First Byte time is still around 300–600ms (which is a lot), yet Start Render time is usually under 0.7s66 on a DSL connection in Amsterdam (for the very first, uncached load), and usually under 1.7s on a slow 3G67. On a fast cable connection, the site starts rendering within 0.8s68, and on a fast 3G, within 1.1s69. Obviously, the results vary significantly depending on the First Byte time which we can’t improve just yet, at the time of writing. That’s the only asset that introduces unpredictability into the loading process, and as such has a decisive impact on the overall performance.

Just by following basic guidelines by our colleagues mentioned above and Google’s recommendations, we were able to achieve the 97–99 Google PageSpeed score70 both on desktop and on mobile. The score varies depending on the quality and the optimization level of advertising assets displayed randomly in the sidebar. Again, the main culprit is the server’s response time — not for long, though.

Google PageSpeed score: 9971
After a fewoptimizations, we achieved a Google PageSpeed score of 99 on mobile72.

99 out of 100 points on desktop with the Google PageSpeed tool73
We got a Google PageSpeed score of 99 on the desktop74 as well.

By the way, Scott Jehl has also published a wonderful article on the front-end techniques75 FilamentGroup uses to extract critical CSS and load it inline while loading the full CSS afterwards and avoid downloading overheads. Patrick Hamann’s talk on “Breaking News at 1000ms”76 explains a few techniques that The Guardian is using to hit the SpeedIndex 1000 mark. Definitely worth reading and watching, and indeed quite similar to what we implemented on this very site as well.

Work To Be Done

While the results we were able to achieve are quite satisfactory, there is still a lot of work to be done. For example, we haven’t considered optimizing the delivery of images just yet, and are now adjusting our editorial process to integrate the new picture element and srcset/sizes with Picturefill 2.1.077, to make the loading even faster on mobile devices. At the moment, all images have a fixed width of 500px and are basically scaled down on smaller views. Every image is optimized and compressed, but we don’t deliver different images for different devices — and no, we aren’t delivering any Retina images at all. That is all about to change soon.

While Smashing Magazine’s home page is well optimized, some pages and articles still perform poorly. Articles with many comments are quite slow because we use a Gravatar78 for comments. Because each Gravatar URL is unique, each comment generates one HTTP request, slowing down the loading of the overall page. We are going to defer the loading of Gravatars and cache them locally with a Gravatar Cache WordPress plugin79. We might have already done it by the time you read this.

We’re playing around with DNS prefetching and HTML5 preloading to resolve DNS lookups way ahead of time (for example, for Gravatars and advertising). However, we are being careful and hesitant here because we don’t want to create a loading overhead for users on slow or expensive connections. Besides, we’ve added third-party meta data80 to make our articles a bit easier to share. So, if you link to an article on Facebook, Facebook will pull optimized images, a description and a title from our meta data, which is crafted individually for each article. We’ve also happily noticed that article pages scroll smoothly at 60fps81, and that with relatively large images and ads.

spdy82
Yes, we can use SPDY today83. We just need to install SPDY Nginx Module84 or Apache SPDY Module85. This is what we are going to tackle next.

Despite all of our optimizations, the main issue still hasn’t been resolved: very slow servers and the First Byte response times. We’ve been experiencing difficulties with our current server setup and architecture but are tied with a long-term contract, yet we will be moving to a new server soon. We’ll take that opportunity to also move to SPDY86 on the server, a predecessor of HTTP 2.0 (which is well supported in major browsers87, by the way), and we are looking into using a content delivery network as well.

Performance Optimization Strategy

To sum up, optimizing the performance of Smashing Magazine was quite an effort to figure out, yet many aspects of optimization can be achieved very quickly. In particular, front-end optimization is quite easy and straightforward as long as you have a shared understanding of priorities. Yes, that’s right: you optimize content delivery, and defer everything else.

Strategically speaking, the following could be your performance optimization roadmap:

  • Remove blocking scripts from the header of the page.
  • Identify and defer non-critical CSS and JavaScript.
  • Identify critical CSS and load it inline in the head, and then load the full CSS after rendering. (Make sure to set a cookie to prevent inline styles from loading with every page load.)
  • Keep all critical HTML and CSS to under 14 KB, and aim for a Speed Index of under 1000.
  • Defer the loading of Web fonts and store them in localStorage or AppCache.
  • Consider using WOFF2 to further reduce latency and file size of the web fonts.
  • Replace JavaScript libraries with leaner JavaScript modules.
  • Avoid unnecessary libraries, and look into options for removing Respond.js and Modernizr; for example, by “cutting the mustard88” to separate browsers into buckets. Legacy browsers could get a fixed-width layout. Clever SVG fallbacks89 also exist.

That’s basically it. By following these guidelines, you can make your responsive website really, really fast.

Conclusion

Yes, finding just the right strategy to make this very website fast took a lot of experimentation, blood, sweat and cursing. Our discussions kept circling around next steps and on critical and not-so-critical components and sometimes we had to take three steps back in order to pivot in a different direction. But we learned a lot along the way, and we have a pretty clear idea of where we are heading now, and, most importantly, how to get there.

So here you have it. A little story about the things that happened on this little website over the last year. If you notice any issues, please let us know on Twitter @smashingmag90 and we’ll hunt them down for good.

Ah, and thanks for keeping us reading throughout all these years. It means a lot. You are quite smashing indeed. You should know that.

A big “thank you” to Patrick Hamann and Jake Archibald for the technical review of the article as well as Andy Hume and Tim Kadlec for their fantastic support throughout the years. Also a big “thank you” to our front-end engineer, Marco, for his help with the article and for his thorough and tireless front-end work, which involved many experiments, failures and successes along the way. Also, kind thanks to the Inpsyde team and Florian Sander for technical implementations.

A final thank you goes out to Iris, Melanie, Cosima and Markus for keeping an eye out for those nasty bugs and looking after the content on the website. Without you, this website wouldn’t exist. And thank you for having my back all this time. I respect and value every single bit of it. You rock.

(al, vf, il)

Footnotes

  1. 1 http://www.guypo.com/mobile/performance-implications-of-responsive-design-book-contribution/
  2. 2 http://timkadlec.com/2012/01/work-to-be-done/
  3. 3 http://timkadlec.com/2012/01/work-to-be-done/
  4. 4 http://timkadlec.com/2012/01/work-to-be-done/
  5. 5 http://www.w3.org/TR/resource-priorities/#intro-download-priority
  6. 6 http://www.smashingmagazine.com/wp-content/uploads/2014/09/browser-stats.png
  7. 7 http://www.smashingmagazine.com/wp-content/uploads/2014/09/browser-stats.png
  8. 8 https://twitter.com/nice2meatu
  9. 9 http://www.smashingmagazine.com/2013/10/29/get-up-running-grunt/
  10. 10 https://github.com/gruntjs/grunt-contrib-less
  11. 11 https://github.com/nDmitry/grunt-autoprefixer
  12. 12 https://github.com/gruntjs/grunt-contrib-cssmin
  13. 13 https://github.com/gruntjs/grunt-contrib-watch
  14. 14 http://inpsyde.com/en/
  15. 15 https://twitter.com/markodugonjic/statuses/478980625215782912
  16. 16 https://twitter.com/smash_it_on
  17. 17 https://twitter.com/mel_in_media
  18. 18 https://twitter.com/indysigner
  19. 19 http://www.twitter.com/smashingmag
  20. 20 https://github.com/scottjehl
  21. 21 https://github.com/guardian
  22. 22 https://github.com/BBC-News
  23. 23 http://filamentgroup.com/lab/performance-rwd.html
  24. 24 http://timkadlec.com/2014/01/fast-enough/
  25. 25 https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index
  26. 26 https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index
  27. 27 http://www.lukew.com/ff/entry.asp?1756
  28. 28 http://www.webpagetest.org/
  29. 29 https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index
  30. 30 http://chimera.labs.oreilly.com/books/1230000000545/ch10.html#SPEED_PERFORMANCE_HUMAN_PERCEPTION
  31. 31 http://chimera.labs.oreilly.com/books/1230000000545
  32. 32 http://chimera.labs.oreilly.com/books/1230000000545
  33. 33 https://www.youtube.com/watch?v=YV1nKLWoARQ
  34. 34 http://timkadlec.com/2014/05/performance-budgeting-with-grunt/
  35. 35 https://speakerdeck.com/andyhume/anatomy-of-a-responsive-page-load-whiskyweb-2013
  36. 36 https://vimeo.com/77967591
  37. 37 http://www.smashingmagazine.com/wp-content/uploads/2014/09/separation-concerns.png
  38. 38 http://www.smashingmagazine.com/wp-content/uploads/2014/09/separation-concerns.png
  39. 39 http://ianfeather.co.uk/web-fonts-and-the-critical-path/
  40. 40 http://ianfeather.co.uk/web-fonts-and-the-critical-path/
  41. 41 http://ianfeather.co.uk/web-fonts-and-the-critical-path/
  42. 42 https://github.com/typekit/webfontloader
  43. 43 http://alistapart.com/article/application-cache-is-a-douchebag
  44. 44 https://github.com/ahume/webfontjson
  45. 45 http://www.html5rocks.com/en/tutorials/offline/quota-research/
  46. 46 https://github.com/addyosmani/basket.js/issues/24
  47. 47 https://github.com/addyosmani/basket.js/issues/24
  48. 48 https://github.com/addyosmani/basket.js/issues/24
  49. 49 http://caniuse.com/#search=woff
  50. 50 https://twitter.com/hdragomir
  51. 51 https://gist.github.com/hdragomir/8f00ce2581795fd7b1b7
  52. 52 https://gist.github.com/sergejmueller/cf6b4f2133bcb3e2f64a
  53. 53 https://twitter.com/patrickhamann/status/497767778703933442
  54. 54 http://www.kreativrauschen.de/
  55. 55 http://www.feedthebot.com/pagespeed/defer-loading-javascript.html
  56. 56 https://www.igvita.com/2014/05/20/script-injected-async-scripts-considered-harmful/
  57. 57 https://developers.google.com/web/fundamentals/performance/critical-rendering-path/page-speed-rules-and-recommendations
  58. 58 http://www.filamentgroup.com/lab/performance-rwd.html
  59. 59 http://www.filamentgroup.com/lab/performance-rwd.html
  60. 60 http://www.filamentgroup.com/lab/performance-rwd.html
  61. 61 http://css-tricks.com/authoring-critical-fold-css/
  62. 62 https://github.com/addyosmani/above-the-fold-css-tools
  63. 63 http://www.webpagetest.org/result/140904_H4_T5R/1/details/
  64. 64 http://www.webpagetest.org/
  65. 65 http://www.webpagetest.org/result/140904_H4_T5R/1/details/
  66. 66 http://www.webpagetest.org/result/140904_ZJ_T62/
  67. 67 http://www.webpagetest.org/result/140904_Y5_SXS/
  68. 68 http://www.webpagetest.org/result/140904_DB_T5Y/
  69. 69 http://www.webpagetest.org/result/140904_H4_T5R/
  70. 70 https://developers.google.com/speed/pagespeed/insights/?url=http%3A%2F%2Fwww.smashingmagazine.com&tab=desktop
  71. 71 https://developers.google.com/speed/pagespeed/insights/?url=http%3A%2F%2Fwww.smashingmagazine.com&tab=mobile
  72. 72 https://developers.google.com/speed/pagespeed/insights/?url=http%3A%2F%2Fwww.smashingmagazine.com&tab=mobile
  73. 73 https://developers.google.com/speed/pagespeed/insights/?url=http%3A%2F%2Fwww.smashingmagazine.com&tab=desktop
  74. 74 https://developers.google.com/speed/pagespeed/insights/?url=http%3A%2F%2Fwww.smashingmagazine.com&tab=desktop
  75. 75 http://filamentgroup.com/lab/performance-rwd.html
  76. 76 https://www.youtube.com/watch?v=dfweWyVScaI
  77. 77 http://scottjehl.github.io/picturefill/
  78. 78 https://en.gravatar.com/
  79. 79 https://wordpress.org/plugins/fv-gravatar-cache/
  80. 80 http://alistapart.com/article/like-able-content-spread-your-message-with-third-party-metadata
  81. 81 http://jankfree.org
  82. 82 http://caniuse.com/#search=SPDY
  83. 83 http://caniuse.com/#search=SPDY
  84. 84 http://nginx.org/en/docs/http/ngx_http_spdy_module.html
  85. 85 https://code.google.com/p/mod-spdy/
  86. 86 https://developers.google.com/speed/spdy/
  87. 87 http://caniuse.com/#search=SPDY
  88. 88 http://responsivenews.co.uk/post/18948466399/cutting-the-mustard
  89. 89 http://css-tricks.com/svg-fallbacks/
  90. 90 http://www.twitter.com/smashingmag

The post Improving Smashing Magazine’s Performance: A Case Study appeared first on Smashing Magazine.

Categories: Others Tags: