Daily Link Aggregating from the Best Design & Showcase Sites
13,363 Links to Search From

Predictive World

Posted by Awwwards - 2 hours ago
Influenced by Ubisoft WATCH DOGS 2’s ctOS 2.0 operating system, Predictive_World is an algorithm -based on research from the University of Cambridge- that demonstrates how our seemingly meaningless data can be processed to create accurate probabilities on who we are or what we're most likely to do.

Axel Gillino

Posted by 365 Awesome Designers - 15 hours ago


Posted by Web Creme - 23 hours ago

Quanta Group

Posted by Awwwards - 1 day ago
Discover the new website of Quanta Group, the Property investment group with a difference.

Get the Balance Right: Responsive Display Text

Posted by 24 Ways - 2 days ago

Richard Rutter shepherds a tea towel onto our collective heads and describes a technique for responsively scaling display text to maintain a consistent feel in both landscape and portrait screen orientations. That should put things back into proportion.

Last year in 24 ways I urged you to Get Expressive with Your Typography. I made the case for grabbing your readers’ attention by setting text at display sizes, that is to say big. You should consider very large text in the same way you might a hero image: a picture that creates an atmosphere and anchors your layout.

When setting text to be read, it is best practice to choose body and subheading sizes from a pre-defined scale appropriate to the viewport dimensions. We set those sizes using rems, locking the text sizes together so they all scale according to the page default and your reader’s preferences. You can take the same approach with display text by choosing larger sizes from the same scale.

However, display text, as defined by its purpose and relative size, is text to be seen first, and read second. In other words a picture of text. When it comes to pictures, you are likely to scale all scene-setting imagery - cover photos, hero images, and so on - relative to the viewport. Take the same approach with display text: lock the size and shape of the text to the screen or browser window.

Introducing viewport units

With CSS3 came a new set of units which are locked to the viewport. You can use these viewport units wherever you might otherwise use any other unit of length such as pixels, ems or percentage. There are four viewport units, and in each case a value of 1 is equal to 1% of either the viewport width or height as reported in reference1 pixels:

  • vw - viewport width,
  • vh - viewport height,
  • vmin - viewport height or width, whichever is smaller
  • vmax - viewport height or width, whichever is larger

In one fell swoop you can set the size of a display heading to be proportional to the screen or browser width, rather than choosing from a scale in a series of media queries. The following makes the heading font size 13% of the viewport width:

h1 {
    font-size: 13 vw;

So for a selection of widths, the rendered font size would be:

Rendered font size (px)
Viewport width 13?vw
320 42
768 100
1024 133
1280 166
1920 250

A problem with using vw in this manner is the difference in text block proportions between portrait and landscape devices. Because the font size is based on the viewport width, the text on a landscape display is far bigger than when rendered on the same device held in a portrait orientation.

Landscape text is much bigger than portrait text when using vw units.

The proportions of the display text relative to the screen are so dissimilar that each orientation has its own different character, losing the inconsistency and considered design you would want when designing to make an impression.

However if the text was the same size in both orientations, the visual effect would be much more consistent. This where vmin comes into its own. Set the font size using vmin and the size is now set as a proportion of the smallest side of the viewport, giving you a far more consistent rendering.

h1 {
    font-size: 13vmin;
Landscape text is consistent with portrait text when using vmin units.

Comparing vw and vmin renderings for various common screen dimensions, you can see how using vmin keeps the text size down to a usable magnitude:

Rendered font size (px)
Viewport 13?vw 13?vmin
320 × 480 42 42
414 × 736 54 54
768 × 1024 100 100
1024 × 768 133 100
1280 × 720 166 94
1366 × 768 178 100
1440 × 900 187 117
1680 × 1050 218 137
1920 × 1080 250 140
2560 × 1440 333 187

Hybrid font sizing

Using vertical media queries to set text in direct proportion to screen dimensions works well when sizing display text. In can be less desirable when sizing supporting text such as sub-headings, which you may not want to scale upwards at the same rate as the display text. For example, we can size a subheading using vmin so that it starts at 16 px on smaller screens and scales up in the same way as the main heading:

h1 {
    font-size: 13vmin;
h2 {
    font-size: 5vmin;
Using vmin alone for supporting text can scale it too quickly

The balance of display text to supporting text on the phone works well, but the subheading text on the tablet, even though it has been increased in line with the main heading, is starting to feel disproportionately large and a little clumsy. This problem becomes magnified on even bigger screens.

A solution to this is use a hybrid method of sizing text2. We can use the CSS calc() function to calculate a font size simultaneously based on both rems and viewport units. For example:

h2 {
    font-size: calc(0.5rem + 2.5vmin);

For a 320 px wide screen, the font size will be 16 px, calculated as follows:

(0.5 × 16) + (320 × 0.025) = 8 + 8 = 16px

For a 768 px wide screen, the font size will be 27 px:

(0.5 × 16) + (768 × 0.025) = 8 + 19 = 27px

This results in a more balanced subheading that doesn’t take emphasis away from the main heading:

To give you an idea of the effect of using a hybrid approach, here’s a side-by-side comparison of hybrid and viewport text sizing:

top: calc() hybrid method; bottom: vmin only
16 20 27 32 35 40 44
16 24 38 48 54 64 72
320 480 768 960 1080 1280 1440

Over this festive period, try experiment with the proportion of rem and vmin in your hybrid calculation to see what feels best for your particular setting.

  1. A reference pixel is based on the logical resolution of a device which takes into account double density screens such as Retina displays. ↩︎

  2. For even more sophisticated uses of hybrid text sizing see the work of Mike Riethmuller↩︎

About the author

Richard Rutter is a user experience consultant and director of Clearleft. In 2009 he cofounded the webfont service, Fontdeck. He runs an ongoing project called The Elements of Typographic Style Applied to the Web, where he extols the virtues of good web typography. Richard occasionally blogs at Clagnut, where he writes about design, accessibility and web standards issues, as well as his passion for music and mountain biking.

More articles by Richard


Posted by Site Inspire - 2 days ago

View | Direct link

Craig Gittins

Posted by 365 Awesome Designers - 2 days ago

Tom Lane

Posted by 365 Awesome Designers - 2 days ago

Melissa Meio-Fio

Posted by Site Inspire - 3 days ago

View | Direct link


Posted by One Page Love - 3 days ago
'Flow' is a One Page WordPress theme perfect for a photography or big image portfolio. The responsive theme features a horizontal scrolling project strip that loops and can host unlimited images. The real bonus of having this horizontal orientation is the slick handling of portrait imagery among regular landscape imagery - often difficult to arrange […]

Comics of the week #369

Posted by Web Designer Depot - 5 hours ago
Every week we feature a set of comics created exclusively for WDD. The content revolves around web design, blogging and funny situations that we encounter in our daily lives as designers. These great cartoons are created by Jerry King, an award-winning cartoonist who’s one of the most published, prolific and versatile cartoonists in the world […]


Posted by One Page Love - 22 hours ago
'Leeway' is a One Page WordPress theme suited for a freelancer or digital agency portfolio. Features include a fixed header navigation (that smooth scrolls to sections), intro big image slideshow, portfolio gallery with category filter, team, skills infographic, pricing table, big testimonial slider, blog feed, client logos and contact form. Awesome to know the WordPress […]

Affinity Photo 1.5 released, packed with new features and Windows support

Posted by Web Designer Depot - 24 hours ago
In a definite shift towards platform parity, Affinity Photo has finally been relased for Windows, delivering everything that the hugely popular Mac software does. The availability of a Windows version coincides with the release of version 1.5, which is a huge update packing the Photoshop rival with new features. Here’s a rundown of the best […]

Acne Studios

Posted by Site Inspire - 1 day ago

View | Direct link

Vincent Tantardini

Posted by 365 Awesome Designers - 2 days ago

HX-01: funded!

Posted by Featured / by - 2 days ago
HX-01: An Animated Short Film by Hexeosis _______ Eye warping journey through infinitely patterned space and grid time. Video in 1920×1080 HD. Funded!


Posted by Site Inspire - 2 days ago

View | Direct link


Posted by CSS Design Awards - 2 days ago
The world's first wearable that helps you ski better.

Outside Envy

Posted by css Drive - Gallery - 3 days ago

Studio Crême

Posted by One Page Love - 3 days ago
Minimal One Pager with focus on a full screen video showreel for London-based design and motion studio, Studio Crême.

Protest Sportswear

Posted by CSS Design Awards - 6 hours ago
Protest's mission is to let you ride more, so we made sure that their website is doing so.

Ryan Michael J.

Posted by One Page Love - 23 hours ago
Minimal, personal One Pager for Ryan Michael J - an Art Directory over at Nerdworx. Neat touch with the contact form overlay when clicking the contact link in his bio.

Maxi Albella

Posted by 365 Awesome Designers - 1 day ago

JC Desevre

Posted by 365 Awesome Designers - 1 day ago

Adblock Checker and Notifier

Posted by css Drive - News - 2 days ago
A simple script that detects when a visitor is using a common Ad Blocker on your page and displays an overlay to ask him to disable it.

Redesigning Pinterest

Posted by Featured / by - 2 days ago
Redesigning Pinterest, block by block by Andreas Pihlström Must read article about UX / UI design. _______ I first started to focus on a big problem that had developed with the design of Pinterest. Actually, 3 big problems: 1. Our UI was inconsistent 2. Our visual system was stale 3. Our marketing felt disconnected from our […]

14 simple tools for picking the perfect domain

Posted by Web Designer Depot - 2 days ago
It’s beyond question that coming up with a good domain name is very hard work these days. There are just so many websites in existence, and then there are all these ruthless profiteers buying up all the best TLDs in the hope of selling them on later, for a profit. Fortunately there are some tools around […]

A-dam Underwear

Posted by cssdsgn - 2 days ago

Stefanie Brückler

Posted by Site Inspire - 3 days ago

View | Direct link

Create the Perfect Hero Image Using Contrast

Posted by Web Designer Depot - 3 days ago
Want to make a great first impression? It starts with your website’s header. The image a user sees will leave an impression—good or bad—and determine whether that user clicks and continues, or leaves the site altogether. That’s a tall order for a single image. The key element to creating a hero image that will draw […]

CSS Conf

Posted by Best Web Gallery - 7 hours ago

Made Together

Posted by Web Creme - 23 hours ago

Epicurrence No.5

Posted by One Page Love - 1 day ago
Another banger One Pager by Dann Petty and his team for the fifth Epicurrence event, this time in Jackson Hole, WY. The Single Page website features a wonderfully subtle parallax effect with the layered mountains and logo - all while snow falls and clouds drift by - stunning. Other highlights include a slick colorful submission […]

#POPNOW By Stella McCartney

Posted by CSS Design Awards - 1 day ago
Choose a friend for a #PopNow adventure; An dynamic video experience powered in realtime by 3D webGL animation.

W+K London

Posted by css Drive - Gallery - 2 days ago

MOCCA is 17

Posted by Featured / by - 2 days ago
MOCCA is a well-known Indonesian band and I love the 17th anniversary illustration work created by Rio Adiwaluyo. _______

“Why All You Need Is One Page” WordCamp Talk Video

Posted by One Page Love - 2 days ago
Here is the quick 10 minute talk I gave at WordCamp Cape Town 2016. It’s on only needing a One Page website for your next idea. I touch on decluttering, diminishing attention spans, storytelling and some insight from running One Page Love for the past 8yrs – which is now my full time job! Funny […]


Posted by One Page Love - 2 days ago
Brutalist One Page website for Montreal-based record label, Acte. The Single Page site features a changing background color and a minimal approach to content with simple floating content blocks.

Justyna Stasik

Posted by 365 Awesome Designers - 3 days ago

Dirk Michel

Posted by Site Inspire - 3 days ago

View | Direct link

Watch Your Language!

Posted by 24 Ways - 14 hours ago

Annie-Claude Côté gathers us round the hearth to tell a tale of many languages. Like choosing the right Christmas sweater to wear while building a snowman, we must choose the language we code in wisely. Make a poor choice and risk getting left out in the cold as the darkness draws in.

I’m bilingual. My first language is French. I learned English in my early 20s. Learning a new language later in life meant that I was able to observe my thought processes changing over time. It made me realize that some concepts can’t be expressed in some languages, while other languages express these concepts with ease.

It also helped me understand the way we label languages. English: business. French: romance. Here’s an example of how words, or the absence thereof, can affect the way we think:

In French we love everything. There’s no straightforward way to say we like something, so we just end up loving everything. I love my sisters, I love broccoli, I love programming, I love my partner, I love doing laundry (this is a lie), I love my mom (this is not a lie). I love, I love, I love. It’s no wonder French is considered romantic. When I first learned English I used the word love rather than like because I hadn’t grasped the difference. Needless to say, I’ve scared away plenty of first dates!

Learning another language made me realize the limitations of my native language and revealed concepts I didn’t know existed. Without the nuances a given language provides, we fail to express what we really think. The absence of words in our vocabulary gets in the way of effectively communicating and considering ideas.

When I lived in Montréal, most people in my circle spoke both French and English. I could switch between them when I could more easily express an idea in one language or the other. I liked (or should I say loved?) those conversations. They were meaningful. They were efficient.

I’m quadrilingual. I code in Ruby, HTML/CSS, JavaScript, Python. In the past couple of years I have been lucky enough to write code in these languages at a massive scale. In learning Ruby, much like learning English, I discovered the strengths and limitations of not only the languages I knew but the language I was learning. It taught me to choose the right tool for the job.

When I started working at Shopify, making a change to a view involved copy/pasting HTML and ERB from one view to another. The CSS was roughly structured into modules, but those modules were not responsive to different screen sizes. Our HTML was complete mayhem, and we didn’t consider accessibility. All this made editing views a laborious process.

Grep. Replace all. Test. Ship it. Repeat.

This wasn’t sustainable at Shopify’s scale, so the newly-formed front end team was given two missions:

  • Make the app responsive (AKA Let’s Make This Thing Responsive ASAP)
  • Make the view layer scalable and maintainable (AKA Let’s Build a Pattern Library… in Ruby)

Let’s make this thing responsive ASAP

The year was 2015. The Shopify admin wasn’t mobile friendly. Our browser support was set to IE10. We had the wind in our sails. We wanted to achieve complete responsiveness in the shortest amount of time. Our answer: container queries.

It seemed like the obvious decision at the time. We would be able to set rules for each component in isolation and the component would know how to lay itself out on the page regardless of where it was rendered. It would save us a ton of development time since we wouldn’t need to change our markup, it would scale well, and we would achieve complete component autonomy by not having to worry about page layout. By siloing our components, we were going to unlock the ultimate goal of componentization, cutting the tie to external dependencies. We were cool.

Writing the JavaScript handling container queries was my first contribution to Shopify. It was a satisfying project to work on. We could drop our components in anywhere and they would magically look good. It took us less than a couple weeks to push this to production and make our app mostly responsive. But with time, it became increasingly obvious that this was not as performant as we had hoped. It wasn’t performant at all. Components would jarringly jump around the page before settling in on first paint.

It was only when we started using the flex-wrap: wrap CSS property to build new components that we realized we were not using the right language for the job. So we swapped out JavaScript container queries for CSS flex-wrapping. Even though flex wasn’t yet as powerful as we wanted it to be, it was still a good compromise. Our components stayed independent of the window size but took much less time to render. Best of all: they used CSS instead of relying on JavaScript for layout.

In other words: we were using the wrong language to express our layout to the browser, when another language could do it much more simply and elegantly.

Let’s build a pattern library… in Ruby

In order to make our view layer maintainable, we chose to build a comprehensive library of helpers. This library would generate our markup from a single source of truth, allowing us to make changes system-wide, in one place. No. More. Grepping.

When I joined Shopify it was a Rails shop freshly wounded by a JavaScript framework (See: Batman.js). JavaScript was like Voldemort, the language that could not be named. Because of this baggage, the only way for us to build a pattern library that would get buyin from our developers was to use Rails view helpers. And for many reasons using Ruby was the right choice for us. The time spent ramping developers up on the new UI Components would be negligible since the Ruby API felt familiar. The transition would be simple since we didn’t have to introduce any new technology to the stack. The components would be fast since they would be rendered on the server. We had a plan.

We put in place a set of Rails tools to make it easy to build components, then wrote a bunch of sweet, sweet components using our shiny new tools. To document our design, content and front end patterns we put together an interactive styleguide to demonstrate how every component works. Our research and development department loved it (and still do)! We continue to roll out new components, and generally the project has been successful, though it has had its drawbacks.

Since the Shopify admin is mostly made up of a huge number of forms, most of the content is static. For this reason, using server-rendered components didn’t seem like a problem at the time. With new app features increasing the amount of DOM manipulation needed on the client side, our early design decisions mean making requests to the server for each re-paint. This isn’t going to cut it.

I don’t know the end of this story, because we haven’t written it yet. We’ve been exploring alternatives to our current system to facilitate the rendering of our components on the client, including React, Vue.js, and Web Components, but we haven’t determined the winner yet. Only time (and data gathering) will tell.

Ruby is great but it doesn’t speak the browser’s language efficiently. It was not the right language for the job.

Learning a new spoken language has had an impact on how I write code. It has taught me that you don’t know what you don’t know until you have the language to express it. Understanding the strengths and limitations of any programming language is fundamental to making good design decisions. At the end of the day, you make the best choices with the information you have. But if you still feel like you’re unable to express your thoughts to the fullest with what you know, it might be time to learn a new language.

About the author

Annie-Claude Côté is a Senior Developer who actively gives a shit about UX. She works at Shopify based out of Ottawa, Ontario, Canada. She’s serious about code quality, optimization and finding all the edge cases. All of them.

More articles by Annie-Claude

Outside Envy

Posted by Web Creme - 23 hours ago


Posted by One Page Love - 1 day ago
Slick One Pager with crisp screenshots promoting a new macOS Github issue tracker called Gitscout. Had a good chuckle seeing the download link includes "marshmallows" in the URL:)

The Fine Line

Posted by Best Web Gallery - 1 day ago


Posted by Site Inspire - 2 days ago

View | Direct link

Design Techniques to Imply Scarcity

Posted by Design Shack - 2 days ago
How can you use design techniques to make things feel scarce? It’s an important concept, particularly in terms of creating a sense of urgency for e-commerce or clicking a call to action before it is too late. Flash sales, limited editions, “only 2 remaining” – these are all triggers of scarcity that make a user […]

Protest Sportswear

Posted by Awwwards - 2 days ago
Protest's mission is to let you ride more, so we made sure that their website is doing so. We designed their webstore as one big shopable look book

How to Make a Chrome Extension to Delight (or Troll) Your Friends

Posted by 24 Ways - 3 days ago

Leslie Zacharkow presents the purrfect solution for anyone who’s ever dreamt of creating their own Chrome browser extension. So kick back, and while your chestnuts roast on an open fire, roast your friends and colleagues in an open tab.

If you’re like me, you grew up drawing mustaches on celebrities. Every photograph was subject to your doodling wrath, and your brilliance was taken to a whole new level with computer programs like Microsoft Paint. The advent of digital cameras meant that no one was safe from your handiwork, especially not your friends. And when you finally got your hands on Photoshop, you spent hours maniacally giggling at your artistic genius.

But today is different. You’re a serious adult with important things to do and a reputation to uphold. You keep up with modern web techniques and trends, and have little time for fun other than a random Giphy on Slack… right?


If there’s one thing 2016 has taught me, it’s that we—the self-serious, world-changing tech movers and shakers of the universe—haven’t changed one bit from our younger, more delightable selves.

How do I know? This year I created a Chrome extension called Tabby Cat and watched hundreds of thousands of people ditch productivity for randomly generated cats. Tabby Cat replaces your new tab page with an SVG cat featuring a silly name like “Stinky Dinosaur” or “Tiny Potato”. Over time, the cats collect goodies that vary in absurdity from fishbones to lawn flamingos to Raybans. Kids and adults alike use this extension, and analytics show the majority of use happens Monday through Friday from 9-5. The popularity of Tabby Cat has convinced me there’s still plenty of room in our big, grown-up hearts for fun.

Today, we’re going to combine the formula behind Tabby Cat with your intrinsic desire to delight (or troll) your friends, and create a web app that generates your friends with random objects and environments of your choosing. You can publish it as a Chrome extension to replace your new tab, or simply host it as a website and point to it with the New Tab Redirect extension.

Here’s a sneak peek at my final result featuring my partner, my cat, and I in cheerfully weird accessories. Your result will look however you want it to.

Along the way, we’ll cover how to build a Chrome extension that replaces the new tab page, and explore ways to program randomness into your work to create something truly delightful.

What you’ll need

  • Adobe Illustrator (or a similar illustration program to export PNG)
  • Some images of your friends
  • A text editor

Note: This can be as simple or as complex as you want it to be. Most of the application is pre-built so you can focus on kicking back and getting in touch with your creative side. If you want to dive in deeper, you’ll find ways to do it.

Getting started

  1. Download a local copy of the boilerplate for today’s tutorial here, and open it in a text editor. Inside, you’ll find a simple web app that you can run in Chrome.
  2. Open index.html in Chrome. You should see a grey page that says “Noname”.
  3. Open template.pdf in Adobe Illustrator or a similar program that can export PNG. The file contains an artboard measuring 800px x 800px, with a dotted blue outline of a face. This is your template.

Note: We’re using Google Chrome to build and preview this application because the end-result is a Chrome extension. This means that the application isn’t totally cross-browser compatible, but that’s okay.

Step 1: Gather your friends

The first thing to do is choose who your muses are. Since the holidays are upon us, I’d suggest finding inspiration in your family.

Create your artwork

For each person, find an image where their face is pointed as forward as possible. Place the image onto the Artwork layer of the Illustrator file, and line up their face with the template. Then, rename the artboard something descriptive like face_bob. Here’s my crew:

As you can see, my use of the word “family” extends to cats. There’s no judgement here.

Notice that some of my photos don’t completely fill the artboard–that’s fine. The images will be clipped into ovals when they’re rendered in the application.

Now, export your images by following these steps:

  1. Turn the Template layer off and export the images as PNGs.
  2. In the Export dialog, tick the “Use Artboards” checkbox and enter the range with your faces.
  3. Export at 72ppi to keep things running fast.
  4. Save your images into the images/ folder in your project.

Add your images to config.js

Open scripts/config.js. This is where you configure your extension.

Add key value pairs to the faces object. The key should be the person’s name, and the value should be the filepath to the image.

faces: {
    leslie: 'images/face_leslie.png',
    kyle: 'images/face_kyle.png',
    beep: 'images/face_beep.png'

The application will choose one of these options at random each time you open a new tab. This pattern is used for everything in the config file. You give the application groups of choices, and it chooses one at random each time it loads. The only thing that’s special about the faces object is that person’s name will also be displayed when their face is chosen.

Now, when you refresh the project in Chrome, you should see one of your friends along with their name, like this:

Congrats, you’re off and running!

Step 2: Add adjectives

Now that you’ve loaded your friends into the application, it’s time to call them names. This step definitely yields the most laughs for the least amount of effort.

Add a list of adjectives into the prefixes array in config.js. To get the words flowing, I took inspiration from ways I might describe some of my relatives during a holiday gathering…

prefixes: [

When you refresh Chrome, you should see one of these words prefixed before your friend’s name. Voila!

Step 3: Choose your color palette

Real talk: I’m bad at choosing color palettes, so I have a trick up my sleeve that I want to share with you. If you’ve been blessed with the gift of color aptitude, skip ahead.

How to choose colors

To create a color palette, I start by going to a Coolors.co, and I hit the spacebar until I find a palette that I like. We need a wide gamut of hues for our palette, so lock down colors you like and keep hitting the spacebar until you find a nice, full range. You can use as many or as few colors as you like.

Copy these colors into your swatches in Adobe Illustrator. They’ll be the base for any illustrations you create later.

Now you need a set of background colors. Here’s my trick to making these consistent with your illustration palette without completely blending in. Use the “Adjust Palette” tool in Coolors to dial up the brightness a few notches, and the saturation down just a tad to remove any neon effect. These will be your background colors.

Add your background colors to config.js

Copy your hex codes into the bgColors array in config.js.

bgColors: [

Now when you go back to Chrome and refresh the page, you’ll see your new palette!

Step 4: Accessorize

This is the fun part. We’re going to illustrate objects, accessories, lizards—whatever you want—and layer them on top of your friends.

Your objects will be categorized into groups, and one option from each group will be randomly chosen each time you load the page. Think of a group like “hats” or “glasses”. This will allow combinations of accessories to show at once, without showing two of the same type on the same person.

Create a group of accessories

To get started, open up Illustrator and create a new artboard out of the template. Think of a group of objects that you can riff on. I found hats to be a good place to start. If you don’t feel like illustrating, you can use cut-out images instead.

Next, follow the same steps as you did when you exported the faces. Here they are again:

  1. Turn the Template layer off and export the images as PNGs.
  2. In the Export dialog, tick the “Use Artboards” checkbox and enter the range with your hats.
  3. Export at 72ppi to keep things running fast.
  4. Save your images into the images/ folder in your project.

Add your accessories to config.js

In config.js, add a new key to the customProps object that describes the group of accessories that you just created. Its value should be an array of the filepaths to your images. This is my hats array:

customProps: {
    hats: [     

Refresh Chrome and behold, accessories!

Create as many more accessories as you want

Repeat the steps above to create as many groups of accessories as you want. I went on to make glasses and hairstyles, so my final illustrator file looks like this:

The last step is adding your new groups to the config object. List your groups in the order that you want them to be stacked in the DOM. My final output will be hair, then hats, then glasses:

customProps: {
    hair: [     
    hats: [     
    glasses: [

And, there you have it! Randomly generated friends with random accessories.

Feel free to go much crazier than I did. I considered adding a whole group of animals in celebration of the new season of Planet Earth, or even adding Sir David Attenborough himself, or doing a bit of role reversal and featuring the animals with little safari hats! But I digress…

Step 5: Publish it

It’s time to put this in your new tabs! You have two options:

  1. Publish it as a Chrome extension in the Chrome Web Store.
  2. Host it as a website and point to it with the New Tab Redirect extension.

Today, we’re going to cover Option #1 because I want to show you how to make the simplest Chrome extension possible. However, I recommend Option #2 if you want to keep your project private. Every Chrome extension that you publish is made publicly available, so unless your friends want their faces published to an extension that anyone can use, I’d suggest sticking to Option #2.

How to make a simple Chrome extension to replace the new tab page

All you need to do to make your project into a Chrome extension is add a manifest.json file to the root of your project with the following contents. There are plenty of other properties that you can add to your manifest file, but these are the only ones that are required for a new tab replacement:

    "manifest_version": 2,
    "name": "Your extension name",
    "version": "1.0",
    "chrome_url_overrides" : {
        "newtab": "index.html"

To test your extension, you’ll need to run it in Developer Mode. Here’s how to do that:

  1. Go to the Extensions page in Chrome by navigating to chrome://extensions/.
  2. Tick the checkbox in the upper-right corner labelled “Developer Mode”.
  3. Click “Load unpacked extension…” and select this project.
  4. If everything is running smoothly, you should see your project when you open a new tab. If there are any errors, they should appear in a yellow box on the Extensions page.

Voila! Like I said, this is a very light example of a Chrome extension, but Google has tons of great documentation on how to take things further. Check it out and see what inspires you.

Share the love

Now that you know how to make a new tab extension, go forth and create! But wield your power responsibly. New tabs are opened so often that they’ve become a part of everyday life–just consider how many tabs you opened today. Some people prefer to-do lists in their tabs, and others prefer cats.

At the end of the day, let’s make something that makes us happy. Cheers!

About the author

Leslie Zacharkow is a designer/developer and the creator of Tabby Cat. She likes spending time outside and contemplating where to get the best soft pretzel. Follow her on Twitter at @lslez.

More articles by Leslie

Anonymous Hamburger Society

Posted by Site Inspire - 3 days ago

View | Direct link

Charles Patterson

Posted by 365 Awesome Designers - 3 days ago