How to Host Static Sites for Free with an Automated Pipeline

Original Source:

Hosting Static Jamstack Sites for Free with an Automated Pipeline

Did you know that you can host static sites for free on a number of high-grade services? This doesn’t just save money, but also means you’re deploying to globally distributed CDNs and automating processes.

Provided: Netlify

In a previous article, we reviewed 100 Jamstack tools, APIs and services to power your sites, which included a lot of hosting services.

In this article, we’ll get hands-on and show you how to host static sites with an automated pipeline for deployment.

Does this sound complicated? It’s easier than you’d think.

Free Cloud Hosting, but with Strings Attached

You can actually host websites for free — even dynamic ones — with the AWS Free Tier (Amazon Web Services), the GCP Free Tier (Google Cloud Platform) and Windows Azure (with some workarounds).

But when you go to give that a try, you’ll come across a number of conditions, fine print considerations, and implementation constraints:

how much computing power do you need?
your credit card number, please?
where do you want to deploy to?
is your account brand new?
and not older than 1 year?
actually, what services?

Often this is more a tryout than an actual freebie (hence the reason why AWS Amplify Storage is not included in this list). And while some power users might take advantage of the goodies, if you aren’t well acquainted with these platforms beforehand, you’ll find out that the learning curve to start using these services is very steep, and that for every cloud service you intend to use you’ll need to find out first in which way each provider reinvented the wheel before you can actually spin it into any free deployment.

Let’s see now how a handful of smaller players rose to prominence with free hosting services that aren’t a hassle to implement and have fewer strings attached.

Continue reading
How to Host Static Sites for Free with an Automated Pipeline
on SitePoint.

22 Amazing Award-Winning Website Designs

Original Source:

You can browse templates all day long, but sometimes you just need to see a website in action to get inspired. That’s why we’ve put together this stellar collection of award-winning website designs. Each of these bring something unique to the table that’s worth evaluating and potentially worth emulating on your own site.

Each of these sites are featured on

Web Designer Toolbox: Unlimited Downloads Starting at $16.50/Month

Website Kits

Website Kits
16,000+ Web Designs

UX & UI Kits

UX & UI Kits
14,000+ UX & UI Kits

Graphic Assets

Graphic Assets
33,000+ Graphics

Envato Elements

Everyday Experiments

Example from Everyday Experiments

Upon visiting this site, you’re met with a highly interactive experience. Each “experiment” is interactive and more content unfolds as you scroll and click.

Un printemps suspendu

Example from Un printemps suspendu

Here’s another compelling design that’s sure to inspire. This site follows the journey of two mountain guides and skiers, as you’re fully immersed via full-screen video and 3D rendered, seemingly immersive menu options.


Example from Canvas

And then there’s Canvas. This site is for a design and development studio that’s presenting their portfolio in a unique way. A true marriage of form and function through innovative load screens, parallax effects, and cursor accents.

Example from is a website for a digital agency that offers a truly unique interactive experience. On hover, your cursor movements manipulate the main subject above-the-fold. But if you click the emoji hand, the object rotates and spins.


Example from Superfluid

This is another site with super interesting interactive effects that fade in, fade out, and swipe up. Product listings change upon hover and the entire browsing experience is designed to entice you into making a purchase.


Example from Blackmeal

This website for a motion design studio is fun, immediately. The large graphics interact upon hover and offer a warm greeting. Once clicked, you’re met with a portfolio that expands as you scroll.


Example from 14islands

Here’s a fun one! 14islands is a design and development studio. Their website is playful and informative. It features a custom cursor, unique hover effects, and parallax scrolling.


Example from Altermind

Get ready to go on a journey on the Altermind website. This consultancy website uses parallax effects that work both vertically and horizontally.

Khoa Lê

Example from Khoa Lê

Khoa Le is a filmmaker and this website serves as a digital portfolio. More parallax effects are featured here as well as full-width videos and interesting hover effects.


Example from Delassus

Delassus is a website for a producer of avocados, tomatoes, and other produce. The site is super colorful, compelling, and interactive.

Beans Digital Marketing Agency

Example from Beans Digital Marketing Agency

Another top choice is the Beans Digital Marketing Agency. This website offers a unique spin on the traditional marketing agency site with full-width videos and a fun and vibrant campaign to go along with the parallax effects and fascinating load effects.


Example from JazzKeys

Now this is a super cool website design! The JazzKeys site responds to your keyboard input, creating an impromptu jazz masterpiece.

Listening Together

Example from Listening Together

The Listening Together website by Spotify goes to new design heights. It features an interactive, three-dimensional graphic of a globe. Upon clicking one location, you can hear a song snippet currently being streamed from there. Then, the site will match you up with another location that’s currently playing the same song. Innovative!


Example from Moooi

What a delightful site design this is! The Moooi site offers a fully-immersive browsing experience with video and audio for showcasing the brand’s products.


Example from Portfolio

The Portfolio website is for a graphic and interface designer. It offers the cutest loading screen ever as well as interesting parallax, hover, and cursor effects.

Gucci Mascara Hunt

Example from Gucci Mascara Hunt

What a novel way to promote a product! This website is an interactive game that was used to promote a new mascara.


Example from underpromise

The website for underpromise provides an interactive experience that speaks to those who have a deep appreciation of both the visual and literary arts.


Example from Agora

Another site worth checking out is Agora. It’s designed to promote a payment processing service and app. It does so through the use of truly immersive and interactive parallax design.

Olivier Gillaizeau

Example from Olivier Gillaizeau

And if you need more portfolio site design inspiration, this one for a creative director uses a timeline-style layout with stylish hover effects, parallax scrolling, and an abundant use of color.


Example from Clmt.

Here’s a website for a photographer and art director that offers unique scrolling effects and an overall engaging appearance.


Example from &Tradition

And here’s another site example that promotes products in an innovative way. This site uses slideshow headers, hover effects, and large photos to capture visitor attention.


Example from HENGE

Last on our list is a site for a design agency with full-width videos, parallax effects, autoplay slideshows, and in-depth gallery-style presentations.

Use these Award-Winning Website Designs as Inspiration

If you’re trying to build a website right now, it can be difficult to know where to start. Thankfully, many award-winning website designs are out there to serve as solid inspiration for your next project. Wander in the dark no longer, this collection of sites should get your creative juices flowing.

Best of luck!

17 Tools I Can’t Design Without

Original Source:

I think of a creative practice as a combination of an approach (a design philosophy) and a series of techniques (craft skills); a good tool facilitates a technique, which in turn supports an approach.

It wasn’t until I sat down to write a list of tools I can’t design without, that I realized just how many tools I rely on as an integral part of my creative process. The danger of tools is that they promote certain techniques, and that bias can alter your approach.

First and foremost a good tool does no harm, it does not dictate, or obstruct your approach. Secondly, a good tool offers flexibility in the techniques you choose. Thirdly a good tool is invisible, it leaves no marks on the end product.

If I’d written this post a year ago the list would have been different, and I hope that in a year it will be different again. These are the tools that I currently find enabling, that have contributed to my craft, and supported my approach.

Affinity Designer

I’ve always used Adobe products. Photoshop and Illustrator were the de facto graphic tools for half my life. I’ve never had an issue with the subscription licensing of Creative Cloud, which I think is proportionate for a professional set of tools. Then, around 18 months ago I got very frustrated with how sluggish Illustrator had become.

I’d written an early review of Affinity Designer, I’d been impressed at the time, so I decided to give it another try expecting the sojourn to last an hour or two before I gravitated back to Illustrator. Running the latest version of Affinity Designer was a revelation, I’ve simply never wanted to switch back.

Why not Sketch? Well, I do occasionally jump into Sketch, especially for pure vector wireframing. I was an early adopter of Sketch, but the reliability issues (long since resolved) poisoned my relationship with it. Why not Figma? Well, Figma’s real strength is in collaboration, something that I get with Sketch, and personally I find some of Figma’s features unintuitive.

Affinity Designer isn‘t perfect. I dislike the color tools, especially the gradient tool, which I find clunky. But it’s the first design app I’ve used in years that syncs closely with my creative process.

Affinity Photo

I don’t do a lot of photo manipulation, so when I switched away from Creative Cloud for design work, I was relaxed about switching from Photoshop to Affinity Photo.

In my experience, Affinity Photo is stronger than Photoshop in some areas, and weaker in others. Affinity Photo’s bitmap scaling is much better than Photoshop’s, largely due to Lanczos 3 sampling.

Affinity Photo also solves a lot of little irritations that Adobe has chosen not to address for legacy or philosophical reasons, such as the toggleable ratio setting when resizing the canvas — I’ve lost track of the hours I’ve spent in Photoshop manually calculating vertical whitespace so that it’s proportionate to the horizontal.


Both Affinity Photo and Photoshop are poor at web format optimizations. Photoshop perhaps has the edge, but its output certainly isn’t acceptable for production.

I run bitmaps through TinyPng, which on average halves the size of the file without any appreciable loss of quality. (It stripped 66% off the images for this post.)


When I started to drift away from Creative Cloud, the one service that delayed me was Adobe Fonts (née Typekit). Not so much for the webfonts — which are faster and more reliable self-hosted — but for the ability to sync desktop fonts into my design apps.

I tried Fontstand when it was first released, and I loved the concept, but was worried about the small library. When I took a second look and discovered the library is now substantial for both workhorses and experimental typefaces, it was an easy decision to switch.

Fontstand is a desktop font rental service. Once you’ve found a typeface you’re interested in, you can activate an hour-long trial, then choose to rent the font for a small fee. You can auto-renew the rental if you need to, and if you rent the font for 12 months it’s yours forever.

If there’s one tool on this list I genuinely could not design without it’s this one. Fontstand makes working with fonts from independent foundries affordable for freelancers, and it’s enriched the typographic palette available to me.


Every designer has strengths and weaknesses. Since day one of art school, my weakness has been color. It just doesn’t come naturally to me, and I have to work quite hard at it.

An incredibly helpful tool that I’ve been using for a few months is Khroma. It helps my eyes warm up before approaching color, and helps me find a starting point that I can then refine. Comparing my design work before, and after Khroma, the latter color choices are cleaner, more vibrant, and more interesting.


A good code editor is essential, and I’ve never found one that I’m completely happy with. For years I’ve flitted back and forth between Brackets, Sublime Text, and BBEdit. I think that probably reflects the changes in the type of coding I’m doing.

For now, I’ve settled on Atom. It’s fast, reliable, and it’s not biased to front or back-end code.


I held out on compilers longer than I should have, using apps like Minify to minify CSS and JavaScript, and the command line to process Sass (see below). Then I found CodeKit and it’s been essential to my workflow ever since.

What I like best about CodeKit is that it’s a GUI. Which means I can change settings while coding, like toggling off the JavaScript linting, without switching mental gears into another language.


MAMP is a tool that allows you to run a local server environment, meaning I can run PHP and MySQL without the tedious process of FTPing to a server to test a change. Mac comes with Apache, so this isn’t strictly necessary, but it’s simple to use and works well with both CodeKit and Craft (see below).

There’s a pro version of MAMP, which allows you to switch seamlessly between projects, but it’s heavily geared towards WordPress. I’m still trying to find the time to evaluate Laravel Valet.


When you first start coding you try and memorize the entire language. It’s very possible to become fluent in the core of a language, but there are always nuances, defaults, and gotchas that you miss. As you grow more experienced, you realize that all professional coders Google the answer at least once per day.

When I got tired of Googling I started using Dash which is a superb app that combines the docs of numerous different languages into a searchable window. I use it daily for everything from SVG to Twig.


It doesn’t really matter what you’re building, even the indy-web needs to be tested. Ideally you’ll test on real devices, but if you can’t afford a device library — and who but the largest agencies can — you need a live testing solution.

There are a few upstarts, but your choice is basically between BrowserStack and LambdaTest. I went for LambdaTest because I prefer the style of the UI, but that’s entirely subjective. If you’re not sure, toss a coin, you’ll get the same results with both.


I can’t write CSS without Sass — and I mean that literally. If I try and write vanilla CSS I guarantee I’ll nest something with @at-root and it will throw an error.

Craft CMS

Stating any preference for a CMS online that is not WordPress inevitably invites impassioned protests from developers whose career is built on the WordPress platform. So let me say preface this by saying: if WordPress works for you, and more importantly for your clients, then more power to you; I think it’s a dog.

Shopping around for a CMS is challenging, and I’ve gone through the process several times. A good CMS needs to be in sync with your mindset, and it needs to be appropriate for your clients — all of them, because unless you’re in a large agency with multiple coders, you need to commit to a single solution in order to master it.

I have looked and looked, and finally settled on Craft CMS. Craft makes it easy to build and maintain complex, high-performance sites. It has a shallow learning curve that grows exponentially steeper, making it easy to get started with plenty of room to grow.


Way back when Flash went kaput I switched to jQuery, and that was a really easy route into JavaScript — ignore the people who tell you to master the core language first, do whatever it takes to start using a language, that’s how you learn. But jQuery is heavy, and I found I needed it less and less.

These days 90% of the JavaScript I write is progressive enhancements in vanilla JavaScript to keep the dependencies low. Occasionally I encounter a job that requires complex state management, and then I fall back on Vue.js. JavaScript developers are as partisan as CMS aficionados, so let’s just say I favor Vue.js because it’s not controlled by a mega-corp and leave it at that.


As editor at WDD, I cannot emphasize enough that the right way to write copy for the web is markdown.

Markdown is faster to write so you don’t lose the thread of your thought process, and it doesn’t impose formatting so you can easily migrate to a CMS. If you’ve ever spent 20 minutes stripping the class, id, and style tags out of a file created in Word, Pages, or (by far the worst offender) Google Docs, then you don’t need to be sold on this point.

There are a few markdown-based writing apps available, I tested half a dozen, and the one I settled on was Ulysses. I like its distraction-free mode, I love its clean exports. Everything I write, I write in Ulysses.

Screenshot Plus

Much like markdown editors, there’s no shortage of screenshot apps. My current favorite is Screenshot Plus.

Screenshot Plus has one feature that makes it standout for me, and that is its Workflows. It sounds like a small problem, but when you’re taking screenshots of a dozen sites, the extra clicks to save, switch to your editor, and open the file are laborious. I have several workflows setup in Screenshot Plus that allow me to take a screenshot, save it to a specified folder on my local machine, and then open it in Affinity Photo, all with a single click.


I get a lot of email, a lot. At one point the influx was so bad I was using multiple email apps to segment it. Yes, I use Slack daily, but it doesn’t eliminate the need for email.

I‘ve been using Spark for around six months and it’s radically sped up my workflow. I’m a big fan of the smart inbox that allows me to compartmentalize email like newsletters, and email that warrants a reply. I like that I can switch to a chronological list if I’m looking for something specific. I love the ability to pin, or snooze messages, which helps me triage my inbox.


I’m one of those people who can’t make it through the day without being organized. I need lists and sublists, and I need something native that opens automatically when I boot my Mac, and something that sits on the home screen of my Android.

There are as many to-do apps as there are things to do. When I’m working in a team I’ll use whichever task-tracking system it prefers. But by choice I always use Todoist thanks to its balance of simplicity and power. At this point it’s something of a meta-tool, and the app I open first every morning.


p img {display:inline-block; margin-right:10px;}
.alignleft {float:left;}
p.showcase {clear:both;}
body#browserfriendly p, body#podcast p, div#emailbody p{margin:0;}

Collective #615

Original Source:

Collective 615 item image

Inspirational Website of the Week: Sweet punk

Great visual content with a clear design and interesting details. Our pick this week.

Get inspired

Our Sponsor
Build websites with the most popular WordPress theme in the world

With the Divi Layout Packs you’ll get world-class designs ready to be used for your client projects.

Check it out

Collective 615 item image


Primo is an all-in-one IDE, CMS, component library, and static site generator.

Check it out

Collective 615 item image

What the f*** is …?

An opinionated glossary of computer science terms for front-end developers by Dan Abramov. Read more about it in the repo.

Check it out

Collective 615 item image

CSS easing

Adam Argyle shares 18 hip cubic-bezier easing functions in handy variables with us.

Check it out

Collective 615 item image

3D Hands gestures

An amazing free 3D hands gestures library with 12 hands gestures in 9 different skin tones and with 3 sleeve types.

Check it out

Collective 615 item image

3D Book Image CSS Generator

Fantastic tool: Generate an animated 3D image from a book cover and export to HTML/CSS to embed on your website.

Check it out

Collective 615 item image

@property: giving superpowers to CSS variables

Una Kravets introduces the Houdini Properties and Values API which is coming to your CSS file in Chromium 85.

Read it

Collective 615 item image

Things I Wish I’d Known About CSS

Some useful things to understand before starting out with CSS. By Dave Smyth.

Check it out

Collective 615 item image

Understanding CSS Multiple Backgrounds

In this article, Ahmad Shadeed explains the background-image property in detail, and provides a visual explainer on how multiple backgrounds can be stacked.

Read it

Collective 615 item image

CSS leaning card effect

A beautiful card effect made by Lynn Fisher.

Check it out

Collective 615 item image

A Simple Explanation of Event Delegation in JavaScript

Dmitri Pavlutin explains event delegation which is a useful pattern to listen for events on multiple elements using just one event handler.

Read it

Collective 615 item image

Import non-ESM libraries in ES Modules, with client-side vanilla JS

Lea Verou explores some strategies of importing non-ESM libraries in ES modules.

Read it

Collective 615 item image

A CSS only “click to animate gif” solution

Christian Heilmann shares a quick experiment in pure CSS how to cover a GIF with a play button instead of playing it

Check it out

Collective 615 item image

Warp SVG Online

A nice tool that can warp and distort SVGs.

Check it out

Collective 615 item image


A brand new way to write responsive CSS. Named breakpoints, DRY selectors, no scripts, no builds, vanilla CSS.

Check it out

Collective 615 item image

Modern CSS Techniques To Improve Legibility

Edoardo Cavazza covers how to improve websites legibility using some modern CSS techniques.

Read it

Collective 615 item image

A CSS-only, animated, wrapping underline

NickyMeuleman explores how to create wrapping underlines that can be animated.

Read it

Collective 615 item image

Building a self-updating profile README for GitHub

Simon Willison shows how to implement a GitHub Action to automatically keep a profile README up-to-date.

Check it out

Collective 615 item image

CSS Painting Order

An interesting article on how a browser determines what order to paint content in.

Read it

Collective 615 item image

Beyond screen sizes: responsive design in 2020

Kilian Valkhof thinks we’re now at a point where we can start considering a new type of responsiveness for websites.

Read it

Rich HTML in GitHub README

Learn how to create a rich HTML document enveloped in an SVG file.

Check it out

Collective 615 item image

Mars Explorer ScrollTrigger demo

Hai Le made this fantastic GSAP ScrollTrigger plugin example.

Check it out

Collective 615 item image


Stunningly realistic CSS droplets by Oscar Salazar.

Check it out

The post Collective #615 appeared first on Codrops.

Apple WWDC 2020: When is it and how to attend

Original Source:

Apple's Worldwide Developers Conference (WWDC) 2020 is just a few days away now, but this year, things look a little different. It was announced back in March that due to the coronavirus crisis, the Apple WWDC 2020 would be an online-only event, taking place on 22 – 26 June. 

But that's not the only change. Unlike other previous years, the week-long event will be free of charge. With no cost restrictions, more developers than ever are likely to attend. 

“WWDC20 will be our biggest yet, bringing together our global developer community of more than 23 million in an unprecedented way for a week in June to learn about the future of Apple platforms,” said Phil Schiller, Apple’s senior vice president of worldwide marketing.

Apple's past announcements at WWDC have seen some of the best laptops for graphic designers unveiled.

Browse all devices at

MacBook pro

The new MacBook Pro is already here

Apple WWDC 2020: How to attend and what time

Developers can access this year's WWDC via the Apple Developer app and the Apple Developer website. There's also a challenge for students, named the Swift Student Challenge, where coders can create their own "Swift playground" (although the prizes of a WWDC jacket and pin set seem a little measly coming from the likes of Apple).

As well as the conference for developers, Apple will hold a keynote presentation on the first day. Apple usually uses this session to unveil its latest and greatest products, and if recent rumours are anything to go by, we're in for a treat this year. We've already seen the MacBook Pro 2020, and a new iPad Pro this year, so who knows what else Apple has up its sleeve. 

The Apple WWDC keynote will kick off at 10am local time (PDT) on Monday 22 June. For those watching in the UK, you'll need to set a reminder for 6pm (BST) . To watch, Mac users need to be running Safari on macOS Sierra 10.12 or later, and can do so directly on To watch on an iPhone, iPad, or iPod touch, you'll need Safari on iOS 9 or later, and you can access the livestream via the Apple Event page.

Read more:

The best Apple Pencil deals Is this what Apple's new headphones will look like?The best cheap Apple laptops right now

CompTIA Network+ Certification: Is It for You and Is It Worth the Effort?

Original Source:

To increase your chances to succeed in an IT role, it is important to have a globally recognized certification that can verify that you have essential knowledge in the sphere. Today, there are numerous credentials for specialists of different specializations and if you want to build a career as a networking professional, then CompTIA Network+ […]

The post CompTIA Network+ Certification: Is It for You and Is It Worth the Effort? appeared first on

100 Jamstack Tools, APIs & Services to Power Your Sites

Original Source:

We’ve explained the Jamstack, a popular new way to build secure, scalable, high-performance sites. Now we’ll introduce you to the tools, services, and APIs that power Jamstack sites.

The A in Jamstack stands for API. APIs can do anything for you, from sending a form to authenticating a user, or from storing and retrieving data in real time to shopping for products.

In this article, we’ll do an extensive review of existing APIs and how they compare to one another. This review couldn’t possibly encompass the whole spectrum of third-party APIs that you can integrate into your website, but hopefully you’ll still find the coverage enlightening enough.

We’ll use the words “headless”, “detached”, and “serverless” a lot in this article. If you haven’t already, check out our introduction to the Jamstack, which covers all the basics.

Hosting (Mostly for Free)

Provided: Netlify

Hosting a Jamstack site usually involves automated deployment pipelines. For example, you might have a repository in GitHub which, on every push, automatically triggers an online deployment (via webhooks), running the necessary build tools (such as Jekyll) and regression tests (via Travis CI).

Sound difficult? It can be a surprisingly simple process!

Most of the services here include these goodies out of the box:

SSD drives
CDN deployments
free SSL (including for custom domains)
command line deployments and rollbacks

Note: look out for another article in this series, coming soon, covering how to use these services.

Google Firebase and AWS Amplify

<!– ![The Firebase logo](firebase-logo.png)

Image source –>

Firebase Hosting is Google’s take on a hosting service that’s easy to understand and implement, and it’s free to use (limits apply). Firebase’s backbone actually lies on top of the Google Cloud Platform (GCP), and you can in fact access and tweak some Firebase deployments through the GCP console. But by implementing something of an “gateway” (Firebase) that transparently handles GCP resources for us, Google gave developers a brand new and highly improved user experience (UX) … and the Firebase’s YouTube channel is just brilliant! 👏

AWS Amplify is also an effort to reduce the complexities of Amazon Web Services (AWS) for web and mobile deployment that doesn’t quite offer free hosting but 12 months of free use for new accounts for its Storage with Amplify as part of the AWS Free Tier.

Google really made a brilliant move with the Firebase family of products by “detaching” them from the GCP, but Amazon went half-way with AWS Amplify. It sure is a dramatic improvement from the regular AWS workflow, especially for novice users, and its documentation hub is superb and way more down-to-earth than the way Amazon usually documents services. But Amplify is still accessed from the same old (horrifically bloated) console. You still need a credit card to just open an account, deployments are still region-specific (no built-in CDN, seriously?), and the workflow isn’t as straightforward when compared to that of Firebase or Netlify.

GitHub Pages and GitLab Pages

Both hosting services for Git repositories also have a built-in service to host static pages right out of your codebases, 100% free: GitHub Pages and GitLab Pages.

In a future article we’ll cover how to use these services, but in the meantime make sure to check out these easy-to-follow guides:

Getting Started with GitHub Pages
Hosting on with GitLab Pages

Netlify and Heroku

In a very short period of time, Netlify not only coined the Jamstack term but also positioned itself as the place to go for all things static. While you could certainly accomplish more with an elaborated AWS pipeline, the simplicity and unparalleled ease of use that Netlify offers is unbeatable. Want to host a static site? Just drop it here and it’s online. Want automatic updates? Link a repo and just push a commit. And batteries are included — instant builds, worldwide CDN, free SSL, CLI tool, on-click rollbacks, and more.

Heroku is the only service in this list that allows you to host dynamic pages: Node.js, Ruby, Python, Java, PHP, Go, Scala and Clojure (check their Language Support page). So if you aren’t yet quite ready to go static, this might be a good way to test your dynamic sites online for free.

Other Services

With 194 data centers as of 2020, Cloudflare is — by many metrics — the company that offers the lowest latency for their DNS and CDN services around the world. They serve big companies but also have a number of services oriented to developers, like Workers Sites. The service isn’t free ($5/mo minimum charge) but it’s as top performant as you can get, and fairly easy to use.

Other tools targeted at static pages include Aerobatic, which offers a free trial with no credit card required and support for internationalization (i18n) and full-text search built-in plugins; with npm run scripts and CI services; and Vercel (formerly ZEIT Now) with an Edge Network serving big names such as Twilio and The Washington Post.


Free plan

1 month

Firebase Hosting
very good

GitHub Pages
completely free

GitLab Pages
completely free

somewhat easy
very good

extremely easy
very good

Storage with Amplify
1-year (new accounts)
somewhat easy
very good


Workers Sites
somewhat easy

Storing and Retrieving Data: Real-time NoSQL Databases

NoSQL solutions like MongoDB have been coexisting with relational databases like MySQL for some time (see the differences and how to choose), but real-time processing takes NoSQL to the next level by enabling cloud storage for state management, such as a user entering their name or clicking a radio button.

If you’re familiar with Redux and Vuex — React and Vue.js libraries for state management, respectively — think of integrating that concept with a cloud storage provider.


Amazon DynamoDB is a “fully managed, multiregion, multimaster, durable database with built-in security, backup and restore, and in-memory caching for internet-scale applications”. But as with many things AWS, it’s difficult to implement and very hard to debug (see Why Amazon DynamoDB isn’t for everyone, by Forrest Brazeal). In all fairness to Amazon, they also built DataStore into AWS Amplify (with GraphQL and REST API support) with a more straightforward approach, in line with the simplicity of the rest of Amplify’s products.

Google Firestore made real-time NoSQL databases — a fairly complex topic in and of itself — as simple as they can be, with pretty much all the capabilities DynamoDB has. It’s very well documented (with introductory clips that are fun to watch). And React and Vue.js have wrappers around Firestore with react-redux-firebase and Vuexfire, respectively.

Cloudflare sure knows how to take performance to the very extreme, and Workers KV, a serverless key-value storage for applications, is a fine example of what a well engineered product looks like. The premise of Workers KV is that you can access a key as if it were a local file within your app, and the content will be the value stored for that key. That’s it — no API to implement, no extra coding. And because of the unbeatable performance of the Cloudflare CDN, this approach can actually be faster than querying a NoSQL database. And as simple as it is, it scales seamlessly to millions of requests. 👏

And finally, there’s FaunaDB, a startup that crafted a solution with native GraphQL and a simple pricing (including a free plan) that can be implemented in minutes.

Managing Content: Headless CMS

In the “monolithic” way of doing things, whenever we used a given content management system — such as WordPress, Django, or Joomla! — it meant that we also needed to use the front-end engine that came attached to it, as back and front end were “coupled” components of a single piece of software (see our introduction to the Jamstack for more info about tightly vs loosely coupled sites).

Enter the headless CMS — a back end only without a front end. Since a headless CMS would normally expose an API or generate static content in the way of Markdown or HTML files, the front end can be anywhere really. In fact, multiple and simultaneous interfaces can be created for web sites, mobile apps, and Internet of Things (IoT) apps.

trends.embed.renderExploreWidget(“TIMESERIES”, {“comparisonItem”:[{“keyword”:”headless cms”,”geo”:””,”time”:”today 5-y”}],”category”:0,”property”:””}, {“exploreQuery”:”date=today%205-y&q=headless%20cms”,”guestPath”:””});

Products and Services

There are a number of headless CMSs, both as software you can download and configure where you do the deployments yourself, or offered in the software-as-a-service (SaaS) model where everything is taken care of for you.

Some features you can expect to find:

localization (l10n) and internationalization (i18n)
microservices architecture with a RESTful API
editor interface

* Since some headless CMS will integrate smoothly with your git repo, the versioning capability can actually be a remarkable improvement over a regular CMS.

Self-hosted Headless CMS

Ghost, “the #1 open source headless Node.js CMS”, is certainly the one with the most stars on GitHub. Not only can Ghost handle content, but it also offers a number of integrations to manage payments (Stripe), email lists (MailChimp), shopping (Shopify), and many more. And then there’s Ghost(Pro), which is the official managed hosting for Ghost with commercial support.

Fairly close to Ghost in popularity comes Strapi, with REST and GraphQL APIs, and 1-click deployments on Heroku, AWS, and DigitalOcean. It has “starters” (template projects) to work seamlessly with Gatsby, Vue.js with Nuxt.js, React with Next.js, and Angular. It also runs on Node.js and has support for a number of database engines.

Netlify CMS is also a popular option built as a single–page React app. There’s Directus, which wraps custom SQL databases with an API and provides an intuitive admin app to manage its content, and the commercial companion Directus Cloud. There’s also TinaCMS, which is also React-based, and Ponzu, Copckpit, and many more, which you can explore oin the comprehensive list provided by

SaaS Headless CMS

CloudCannon is the cloud CMS for Jekyll (we’ll review Jekyll later in the “static site generators” section), with smooth integration with GitHub, Bitbucket and Dropbox. They have a free plan as well but with no global CDN hosting.

Contentful is something different: a content hub where business owners, marketers, developers and project managers can all go to set and manage all of the data sources of an organization. And their headless CMS is just a part of that strategy. The Contentful platform is fully featured, very well documented, with plenty of open-source tools. And while the pricing is a bit confusing, there’s actually a free plan that only requires attribution.

There are other SaaS headless CMSs with free plans, such as DatoCMS and Sanity with a proposition similar to that of Contentful; Forestry, with support for a number of static generators; GraphCMS, with GraphQL support; and Prismic. These are just a few of the many options.

Sending Information: Forms without Code

Sending data through forms has forever been one of the main uses for server-side processing. There are essentially two approaches to addressing this problem on a static site, each with pros and cons.

From Builders, Embedded and Hosted Forms

Many times integrating a “powered by” external form is more than enough to collect email addresses or to receive feedback.

Google Forms have offered this possibility since 2008 entirely for free, with a simple interface that stores submissions on Google Sheets, and that can send alerts via email every time there’s a submission.

Formstack takes forms to another level by providing an integrated workflow supporting digital signatures, document generation, Salesforce integration, and more. They offer a free tryout but no free plans.

Then you have the extremely easy-to-use form builders JotForm and Wufoo, which integrate handling payments, among other things, or Typeform, which makes forms and surveys … pretty? All of them offer free plans.

External API: Form Processing as a Service (FPaaS)

Sometimes a builder won’t cut it, as you need more flexibility to present information and fields, or to fully integrate the look and feel of the form with the rest of your website. For this you will need to integrate an API.

The way these services work is surprisingly easy: you specify a URL for submission that will do the processing for you. At most you’ll have to set a few things up but most probably won’t need to do any extra coding.

There are a number of providers offering free plans, such as Form.IO, Formcarry, Formspark, and Netlify Forms. They all work in a similar way and are very easy to implement.

FormDen and FormKeep are also form builders that can otherwise be used just as back ends, though none of them offer free plans.

Programming Server-Side Logic: Function as a Service (FaaS)

Couldn’t find an API that does quite what you want? Create it! You don’t need to resort back to a hosted back-end system to process server-side logic, with all the hassle that comes with it (maintenance, bills, credentials, security patches). Instead, you can implement a micro-service in your language of choice (oftentimes JavaScript, Python, or Go), encapsulate that logic into functions, and offer them through a RESTful API.

As with pretty much everything else in this list, you won’t be paying anything for a function that’s not being actively used, so no worries for just leaving it sitting there (but beware that spikes in traffic might also trigger extra billing).


While the implementation details for AWS Lambda, Azure Functions and Google Cloud Functions may differ, they all work in pretty much the same fashion and you’ll need a degree of familiarity with AWS, Azure or GCP. AWS Lambda has the richest language support of them all (and also Amazon API Gateway to help you wrap your functions into a maintainable API with monitoring tools), while Azure — not surprisingly — has the best support for .NET Framework and .NET Core (with different versions supporting different runtimes and even TypeScript transpiled to JavaScript). But be aware that Azure systematically ranks as the slowest service by a margin.

Cloud Functions for Firebase and Netlify Functions are wrappers around Google Cloud Functions and AWS Lambda, respectively. They greatly simplify the management of functions on the cloud, as you effectively can get away without even having an account on such services. Code deployment and versioning become trivial with Netlify — which also has very good community support — as it will smoothly integrate with your repo offering stage, previewing, and rolling back at a click (or a commit). Simplicity naturally comes at the expense of losing some flexibility (see Firebase Cloud Functions: the great, the meh, and the ugly by Pier Bover).

IBM Cloud Functions (based on Apache OpenWhisk) and Cloudflare Workers are other services you might want to look at. IBM has an impressive list of supported languages, including the option to deploy Docker containers with your own runtime. However, it ranked somewhat poorly performance wise. And just as Netlify systematically manages to make things the simplest, Cloudflare again makes things the fastest (and by a difference).



AWS Lambda
C#, Go, Java, JavaScript, PowerShell, Python, Ruby
86 ms 🟢
589 ms
👍 very good

Azure Functions
C#, F#, Java, JavaScript and TypeScript, PowerShell, Python
760 ms 🔴
5,907 ms 🔴
👎 very poor

Cloud Functions for Firebase
JavaScript and TypeScript
642 ms 🔴
168 ms
👍 very good

Cloudflare Workers
JavaScript, COBOL
70 ms 🟢
76 ms 🟢

Google Cloud Functions
Go, Java, Node.js, Python
642 ms 🔴
168 ms
👍 very good

IBM Cloud Functions
.C#, Go, Java, JavaScript, PHP, Python, Ruby, Swift, and Docker containers
136 ms
2,103 ms 🔴
no info

Netlify Functions
Go, Node.js
86 ms 🟢
589 ms
very low
👍 very good

* As measured by λ Serverless Benchmark, the overhead is the time from request to response without the time the function took (for a concurrency of 50), and the coldstart is how long the servers takes to respond when queried are spanned every 3 hours; the lower the values, the better.

Authenticating Users: Identity as a Service

Identity as a Service (IDaaS), also called sometimes Authentication as a Service (AaaS), involves managing a full user registration, confirmation, and authentication with just APIs. The Geist of “stateless authentication” is that a user will authenticate against a third-party and come back to you with a valid “token” that you can verify, or revoke if need be.

In some cases, a provider might even offer a “drop-in” user interface (UI) that will work seamlessly across desktop and mobile, all of which could potentially save you very long hours of work.


Auth0 has been in business the longest and has quickstart guides for a number of scenarios. It’s an excellent provider if you want to implement a complex solution and already have some experience implementing authentication. But as they point out, “identity is complex, deal with it”. The large scope Auth0 services (universal login, single sign on (SSO), multifactor authentication, branch password detection, and so on) can be overwhelming if you’re just starting on the topic.

Firebase Authentication (with its ready-to-use UI) and Authentication with Amplify are also very comprehensive and flexible, and somewhat presented in a more straightforward manner than Auth0. Firebase also offers anonymous authentication! Curious? Check out this clip:

Once again, Netlify seems to come up with the easiest solution to implement with Netlify Identity and its open-source zero config netlify-identity-widget to create a secure login in 10 minutes! But of course, there are some limitations (check out Four Dealbreakers in Netlify Identity, by Jean Cochrane).

You can also check Okta, FusionAuth and LoginRadius, all of which have free plans. There are no freebies for Ping Identity, OneLogin, and Ubisecure, which are more oriented to the enterprise sector. Finally, consider Cloudflare Access, as everything Cloudflare does is rock solid.

Going F·A·S·T: Static Site Generators (SSG)

I can hear some of you saying “all of this might be okay for future projects, but my sites are already dynamic, so what to do?” Here’s when static site generators enter the picture.

You can have the best of both worlds — the convenience of a familiar CMS and static pages with code and data splitting, preloading, caching, image optimization, and all sorts of performance enhancements. An SSR will bridge that gap by querying your database and generating static output out of it (for example, Markdown pages), and with some settings to set your template, you’ll be all set.

The listing here is tiny compared to the ever increasing list of SSRs. Have a look at StaticGen for more info.

Main Products

GatsbyJS is powered by React.js and webpack, meaning that it can generate progressive web apps (aka PWAs, websites that look and feel like an apps). It also supports GraphQL (see Write Apps with Better Building Blocks) and it has +1,000 plugins to get data from anywhere (WordPress, Drupal, Contentful, GraphCMS, DatoCMS, and many more). See how GatsbyJS says it compares to its main competitors, Hugo and Jekyll.

All of this flexibility comes at a cost, as setting and customizing GatsbyJS can be a time-consuming process, and if you don’t have a decent understanding of React — and therefore JavaScript — you won’t be able to make much of it. That’s where Gatsby Cloud comes in, offering support to build and maintain Gatsby sites for free or for a fee, where you could automate your fast builds, access to previews, generate daily edits, and fire deployments with ease to Netlify, Cloudflare, AWS CloudFront or Akamai.

Hugo claims to be “the world’s fastest framework for building websites”, and it sure can generate massive sites in milliseconds. With built-in templates (literally hundreds of them available) and native support for internationalization (i18n), it’s also one of the most popular SSGs. Hugo is a Go app, and while Go isn’t hard to set and learn, you’ll definitely need to be checking the documentation often if you aren’t familiar with it.

Unlike GatsbyJS, configuring and deploying Jekyll is a rather straightforward process. Furthermore, Jekyll is the only SSR supported by GitHub Pages (Tom Preston-Werner, creator of Jekyll, is also a co-founder of GitHub), and can smoothly deploy static sites for free right out of your GitHub repos! Jekyll uses Shopify’s Liquid template language, which is also easy to learn. The downsides? As a Ruby app, Jekyll can be hard to set on a Windows environment, and optimizations such as minimizing JavaScript code and image preloading aren’t included by default. In fact, Jekyll doesn’t even aim at generating a PWA but just purely static sites — which might still be fine depending on what you need.


GitHub stars


Go (library)



WP2Static is an SSR designed specifically for WordPress (WP). It has a small but very interesting set of plugins, like Algolia search, and Cloudflare Workers and Netlify deployments. HardyPress is actually a SaaS solution to generate static WP sites, and for a fee you’ll have an admin panel from where you can enter some credentials to access your online WP installations to manage everything: shut down live WP installs that were already imported, transparent deployment to global a CDN, HTTPS, forms, search. Other WP-related SSGs with commercial support are Shifter, Strattic, and Sitesauce.

Since I am admittedly biased towards Vue.js, I had to include VuePress, which is intended to generate single page applications (SPAs) and has a minimal setup with markdown-centered files, and it’s also powered by webpack. Gridsome and Nuxt.js are more featured Vue.js powered frameworks with SSR capabilities.

Selling and Processing Payments: Headless Shopping Carts

The architecture and benefits of headless ecommerce is not that different from that of a headless CMS: massive cost reduction (hosting, licenses, maintenance), less time to market, seamless integration, and — a big one for commerce — “omnichannel” capabilities.

Continue reading
100 Jamstack Tools, APIs & Services to Power Your Sites
on SitePoint.

Create A Responsive Dashboard With Angular Material And ng2-Charts

Original Source:

Create A Responsive Dashboard With Angular Material And ng2-Charts

Create A Responsive Dashboard With Angular Material And ng2-Charts

Zara Cooper


Creating a dashboard from scratch is often pretty complicated. You have to create tools to collect data on items of interest. Once collected this data has to be presented in an easy to understand and meaningful way to your users. It involves intricate planning of what data to include and how to display it effectively. Once you have a plan, implementing the design is a massive task especially since it involves building multiple components.

With Angular Material and ng2-charts, you can take advantage of schematics to cut down the effort and time you may spend building a dashboard. Angular Material ships with a number of schematics that you could use to generate a dashboard. Similarly, ng2-charts provides schematics for generating multiple chart components. In this article, I’ll illustrate how to use both ng2-charts and Angular Material to set up a dashboard fairly quickly.

An Example

To illustrate how to build a dashboard, we’ll take the example of an online store selling leather goods like bags, wallets, key holders, and so on. The store owner would like to track information such as where customers come from to their online store, how their products sell, how traffic sources relate to sales, among other things.

We’ll build a dashboard to display this information and help the store owner analyze it. The dashboard will contain four small summary cards, four different kinds of charts, and a table listing most recent orders made. The four summary cards will display information such as total revenue from sales, average order value, the total number of orders, and number of returning customers. The charts will display the number of units sold for each product, sales by traffic source, online store sessions over time, and sales for the week.


To follow along, you’ll need to have Angular CLI installed. If you do not have it installed, you can find out how to get it at If you’re not starting from a pre-existing Angular project, you need to generate one by running ng new <your project name>. For instance, to create an admin panel for the aforementioned store, we’ll run:

ng new store-admin-panel

Your project also needs to have routes configured for it. If you’re starting from a new app, select yes when prompted on whether to add an Angular Routing module during your project setup above.

Add Angular Material And Ng2-Charts To Your Project

Angular Material ships with various schematics for generating a variety of useful components like address books, trees, tables, navigation, and so on. To add Angular Material to your project, run:

ng add @angular/material

Pick a theme from the options provided in subsequent prompts. Next, you’ll be prompted to choose whether to add Angular Material typography styles and browser animations. You do not need these and could just respond no.

Next, you’ll need to install ng2-charts. ng2-charts requires charts.js as a dependency. To install ng2-charts run:

npm install ng2-charts –save

Then install charts.js:

npm install chart.js –save

To access the charts, add the ChartsModule to the AppModule’s imports.

import { ChartsModule } from ‘ng2-charts’;

imports: [



Lastly, install ng2-charts schematics as a dev dependency because they do not ship with ng2-charts by default.

npm install –save-dev ng2-charts-schematics

Generating A Navigation Component

First off, we’ll need to add a navigation component to help users maneuver through the app comfortably. The navigation should contain links to the dashboard and other pages that will be part of the admin panel. Angular material provides a schematic that generates a navigation component. We’ll name this component nav. Adding a side nav to the application is accomplished by running:

ng generate @angular/material:navigation nav

To link other routes in the navigation, use the routerLink directive and change the page name in the toolbar depending on what route a user is on.

// nav.component.ts

menuItems = [‘dashboard’, ’sales’, ‘orders’, ‘customers’, ‘products’];


<a *ngFor=”let item of menuItems” mat-list-item [routerLink]=”‘/’+item”> {{item | titlecase}} </a>

To see this component, add it to app.component.html.


This is what the NavComponent looks like.

Navigation component

Navigation component (Large preview)

Since the nav will be displayed alongside other components, adding a router-outlet to it would help switch between the other different components. In the nav.component.html template, just after the closing </mat-toolbar>, replace the <!– Add Content Here –> comment with <router-outlet></router-outlet>.




In the screenshots that follow in this article, this nav component will be omitted to better highlight the dashboard we’ll be generating for the sake of the tutorial. If you’re following along while building this dashboard, the nav will still appear as pictured above in your browser with the dashboard within it.

Generate The Dashboard

The most important part of the dashboard is its layout. It needs to hold all the components mentioned earlier and be responsive when displayed on different devices. To generate the dashboard layout, you’ll need to run the @angular/material:dashboard schematic. It will generate a responsive dashboard component. Pass the preferred name for your dashboard to the schematic. In this instance, let’s name it dash.

ng generate @angular/material:dashboard dash

To view the newly generated dashboard within the nav component, add a route for it to the router.

// app-routing.module.ts
import { DashComponent } from ‘./dash/dash.component’;

const routes: Routes = [{ path: ‘dashboard’, component: DashComponent }];

imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]

Once done, to see the results, run npm start and head on over to localhost:4200/dashboard. You should see this:

generated dashboard component

Generated dashboard component (Large preview)

The schematic generates four cards in the template and displays them in a responsive grid. The Angular Material CDK uses the Layout package to style this responsive card grid. The BreakpointObserver utility of the Layout package assesses media queries and makes UI changes based on them. There are various breakpoints available but within the generated component, only two categories are catered for. The Breakpoints.Handset and other queries that do not match it. The Layout package specifies 14 breakpoint states that you can use to customize the responsiveness of your dashboard.

// dashboard.component.js

cards = this.breakpointObserver.observe(Breakpoints.Handset).pipe(
map(({ matches }) => {
if (matches) {



Going back to the dashboard, since four summary cards, four charts, and a table will be on the dashboard, we need nine cards in total. Breakpoints.Handset and Breakpoints.Tablet matches will display in a one-column grid where:

The four summary cards will span one row.
The charts will span two rows.
The table will span four rows.

Non-Breakpoints.Handset and non-Breakpoints.Tablet matches will display in four columns where:

The four summary cards will span one row and one column.
The charts will span two rows and two columns.
The table will span four rows and four columns.

It should look something like the screenshot below in non-Breakpoints.Handset and non-Breakpoints.Tablet matches. On Breakpoints.Handset and Breakpoints.Tablet matches, everything will just display in one column.

dashboard component with additional cards

Dashboard component with additional cards (Large preview)

Create A Card Component

In the dashboard component, all the cards are generated through iteration. To prevent repetition, when adding all the new components, we’ll create a reusable card component. The card component will accept a title as input and use ng-content to dynamically add the rest of the content. To create the card component, run:

ng g c card -m app –style css

From the dashboard component template, we’ll just take the markup enclosed within the <mat-card> tag and place it In the card template:

<mat-card class=”dashboard-card”>
<button mat-icon-button class=”more-button” [matMenuTriggerFor]=”menu” aria-label=”Toggle menu”>
<mat-menu #menu=”matMenu” xPosition=”before”>
<button mat-menu-item>Expand</button>
<button mat-menu-item>Remove</button>
<mat-card-content class=”dashboard-card-content”>

To add the title as input to the card:

// card.component.ts
import { Component, Input } from ‘@angular/core’;

export class CardComponent{
@Input() title: string;


To style the card:

.more-button {
position: absolute;
top: 5px;
right: 10px;

.dashboard-card {
position: absolute;
top: 15px;
left: 15px;
right: 15px;
bottom: 15px;

.dashboard-card-content {
text-align: center;
flex-grow: 1;
display: flex;
flex-direction: column;
align-items: center;
max-height: 100%;
justify-content: center;
align-items: stretch;

mat-card {
display: flex;
flex-direction: column;

Adding Cards To The Dashboard

Since the dashboard elements will be added individually and not through iteration, the dashboard component needs to be modified to account for this. In dashboard.component.ts, remove the cards property and replace it with a cardLayout property instead. The cardLayout variable will define the number of columns for the material grid list and how many rows and columns each of the dashboard cards will span. Breakpoints.Handset and Breakpoints.Tablet query matches will display in 1 column and those that do not match will display in 4 columns.

// dashboard.component.js

cardLayout = this.breakpointObserver.observe(Breakpoints.Handset).pipe(
map(({ matches }) => {
if (matches) {
return {
columns: 1,
miniCard: { cols: 1, rows: 1 },
chart: { cols: 1, rows: 2 },
table: { cols: 1, rows: 4 },

return {
columns: 4,
miniCard: { cols: 1, rows: 1 },
chart: { cols: 2, rows: 2 },
table: { cols: 4, rows: 4 },

In the dash.component.html template, replace the colspan and rowspan values of mat-grid-tile elements and the cols property of the mat-grid-list element.

<div class=”grid-container”>
<h1 class=”mat-h1″>Dashboard</h1>
<mat-grid-list cols=”{{ ( cardLayout | async )?.columns }}” rowHeight=”200px”>
<!–Mini Cards–>
<mat-grid-tile *ngFor=”let i of [1, 2, 3, 4]” [colspan]=”( cardLayout | async )?.miniCard.cols”
[rowspan]=”( cardLayout | async )?.miniCard.rows”>
<app-card title=”Card {{i}}”><div>Mini Card Content Here</div></app-card>
<mat-grid-tile *ngFor=”let i of [5, 6, 7, 8]” [colspan]=”( cardLayout | async )?.chart.cols”
[rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Card {{i}}”><div>Chart Content Here</div></app-card>
<mat-grid-tile [colspan]=”( cardLayout | async )?.table.cols” [rowspan]=”( cardLayout | async )?.table.rows”>
<app-card title=”Card 9″><div>Table Content Here</div></app-card>

The dashboard will end up looking exactly like the most recent screenshot linked above.

Generating The Charts

The four charts that we need for the dashboard are:

A radar chart of products by unit sold.
A pie chart of sales by traffic source.
A bar chart of online store sessions.
A line chart of sales across the year.

Similar to creating the dashboard, generating chart components involves running a schematic. Using the ng2-charts schematics, generate the four different charts. We’ll place them in a folder called charts. Run ng generate ng2-charts-schematics:<chart type> <chart name>.

ng generate ng2-charts-schematics:radar charts/product-sales-chart
ng generate ng2-charts-schematics:pie charts/sales-traffic-chart
ng generate ng2-charts-schematics:line charts/annual-sales-chart
ng generate ng2-charts-schematics:bar charts/store-sessions-chart

After running these commands, all four chart components are generated and are populated with sample data ready for display. Depending on what data you’d like to show, pick charts that most suit your data visualization needs. For each of the charts generated above, add the chartContainer class to the divs that enclose the canvas element in the chart templates.

<div class=”chartContainer”>
<canvas baseChart width=”400″ height=”400″>

Next, add this styling to styles.css so that they could be accessible to all the chart components.


.chartContainer canvas {
max-height: 250px;
width: auto;

height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;

Adding Data To The Charts

The generated chart components come with sample data already plugged in. If you have pre-existing services that provide your own data, you can add this data from them to the chart components. The charts take labels for the x-axis, data or data sets, a chart type, colors, a legend as well as other customization options. To provide the data and labels to the charts, create a service that will fetch data from a source of your choice and return it in a form that the charts accept. For instance, the AnnualSalesChartComponent receives its dataset and labels from the SalesService’s getSalesByMonth method which returns an array of sales for each month for the current year. You can find this service here and data it returns here. Inject the service as a private property to the AnnualSalesChartComponent constructor. Call the method that returns the required chart data from the service within the ngOnInit lifecycle hook.

// annual-sales-chart.component.ts
import { SalesService } from ’src/app/sales/sales.service’;

export class AnnualSalesChartComponent implements OnInit {
public salesChartData: ChartDataSets[] = [
{ data: [], label: ‘Total Sales’ },

public salesChartLabels: Label[] = [];

constructor(private salesService: SalesService) { }
ngOnInit() {
next: salesItems => {
salesItems.forEach(li => {


Adding Charts To The Dashboard

The next step involves adding the charts to the dashboard, in dash.component.html. Here’s what that looks like:


<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Monthly Revenue”>
<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Product Sales”>
<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Sales by Traffic Source”>
<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Online Store Sessions by Traffic Source”>

This is what the resultant responsive dashboard looks like.

dashboard with charts

Dashboard with charts (Large preview)

Generating A Table

We’ll add an orders table to give the shop owner an overview of the most recent orders placed and their status. To generate the orders table component, run the schematic:

ng generate @angular/material:table orders-table

This will generate a table component that will look like this.

table generated by Angular Material schematic

Table generated by Angular Material schematic (Large preview)

Tables with many columns may be difficult to make responsive for handset and tablet views. When adding the table to a card, make it horizontally scrollable so that all the data can be viewed properly and is not obstructed. You can do this by adding the styling below to your table component:

<div class=”mat-elevation-z8 small-table”>
<table mat-table class=”full-width-table” matSort aria-label=”Elements”>


overflow-x: scroll !important;

To add the table to the dash component:

<!– dashboard.component.html>

<mat-grid-tile [colspan]=”( cardLayout | async )?.table.cols” [rowspan]=”( cardLayout | async )?.table.rows”>
<app-card title=”Latest Orders”>

Adding Data To The Table

Like with charts, you can add data to the table in the ngOnInit method from a service. Additionally, you will need to modify your table’s generated data source to consume data from the service. To start off, inject the service in the table’s class constructor. Let’s take the example of a table listing the latest orders for this dashboard. To get data for the table, let’s inject the OrderService in the OrdersTableComponent constructor, change the MatTable type assertion of the table view child, and amend the list of displayed columns to reflect an order interface. If you’re interested in the data being added to the table, you can find it here. The last thing involves getting the total length of the data items available to be used to set the total in the table’s <mat-paginator>.

// orders-table.component.ts
import { OrderService } from ‘../orders.service’;
import { Order } from ‘../order’;

export class OrdersTableComponent implements AfterViewInit, OnInit {

@ViewChild(MatTable) table: MatTable;
dataLength: number;

displayedColumns = [

constructor(private orderService: OrderService){}

ngOnInit() {
this.datasource = new OrdersTableDataSource(this.orderService);
next: orderCount => {
this.dataLength = orderCount;



Next, we’ll need to modify the OrdersTableDataSource class to accept the OrderService as a parameter in its constructor. We’ll have to modify its connect and destroy methods as well. The connect method connects the data source to the table and updates the table when new data items are emitted from the stream it returns, in this case, an orders array observable. The dataMutations constant combines the first data load, pagination, and sorting events into one stream for the table to consume. Pagination and sorting are handled by the OrderService server-side. So we need to pass the offset and page size from paginator and the active sort field and sort direction of the sort property to the getOrders method of the OrderService. The disconnect method should be used to close any connections made and release resources held up in the connect method.

// orders-table.datasource.ts

export class OrdersTableDataSource extends DataSource<Order> {
paginator: MatPaginator;
sort: MatSort;

constructor(private orderService: OrderService) {

connect(): Observable<Order[]> {
const dataMutations = [
of(‘Initial load’),,

return merge(…dataMutations).pipe(mergeMap(() => {
return this.orderService.getOrders(
this.paginator.pageIndex * this.paginator.pageSize,

disconnect() {}

In the orders table template, insert the new columns and bind the length property of <mat-paginator> to the dataLength property. For the status column, use a <mat-chip> element for better visualization of the order status. To have access to <mat-chip>, add the MatChipsModule as an import to AppModule.

<!– orders-table.component.html –>
<div class=”mat-elevation-z8″>
<table mat-table class=”full-width-table” matSort aria-label=”Elements”>
<!– Id Column –>
<ng-container matColumnDef=”id”>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Id</th>
<td mat-cell *matCellDef=”let row”>{{}}</td>

<!– Date Column –>
<ng-container matColumnDef=”date”>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Date</th>
<td mat-cell *matCellDef=”let row”>{{ | date }}</td>

<!– Name Column –>
<ng-container matColumnDef=”name”>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Name</th>
<td mat-cell *matCellDef=”let row”>{{}}</td>

<!– Order Total Column –>
<ng-container matColumnDef=”orderTotal”>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Order Total</th>
<td mat-cell *matCellDef=”let row”>{{row.orderTotal | currency}}</td>

<!– Payment Mode Column –>
<ng-container matColumnDef=”paymentMode”>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Payment Mode</th>
<td mat-cell *matCellDef=”let row”>{{row.paymentMode}}</td>

<!– Status Column –>
<ng-container matColumnDef=”status”>
<th mat-header-cell *matHeaderCellDef mat-sort-header>Status</th>
<td mat-cell *matCellDef=”let row”>
<mat-chip color=”{{ row.status == ‘delivered’ ? ‘primary’ : ( row.status == ’shipped’ ? ‘accent’ : ‘warn’ ) }}” selected>

<tr mat-header-row *matHeaderRowDef=”displayedColumns”></tr>
<tr mat-row *matRowDef=”let row; columns: displayedColumns;”></tr>

<mat-paginator #paginator [length]=”dataLength” [pageIndex]=”0″ [pageSize]=”5″ [pageSizeOptions]=”[5, 10, 15, 20]”>

Once data has been added to the table, this is what the dashboard will look like:

dashboard with charts and table

Dashboard with charts and table (Large preview)

Creating A Mini Card Component

All that’s left to complete the dashboard is to populate the four small cards that sit at the top. Having smaller summary cards as part of the dashboard makes it easy to highlight brief pieces of information that do not need whole charts or tables. In this example, the four mini cards will display total sales, average order value, the total number of orders, and the number of returning customers that visited the store for the day. This is just an example. These mini cards cannot be generated like with the navigation, dashboard layout, charts, and the table. They have no schematics. Below we’ll briefly go through how to create them. Although we’re going to add data specific to the example, you can add whatever you want to them or decide to do away with them altogether. To start off, generate the mini-card component, run:

ng g c mini-card -m app –style css

You can find the template for the component linked here and its styling here. This component has eight input properties that you can find out how to add here. To get data to the mini card components, inject the service that provides data to them in the DashComponent constructor. Assign data received from the service to a property of the DashComponent. In this instance, we’ll get data from the StoreSummaryService and assign it to the miniCardData property. Here’s how:

// dash.component.ts
export class DashComponent implements OnInit{

miniCardData: StoreSummary[];

constructor(private breakpointObserver: BreakpointObserver, private summaryService: StoreSummaryService) {}

ngOnInit() {
next: summaryData => {
this.miniCardData = summaryData;

To add the mini-cards to the dash component and have them populated with data from the service:


<!–Mini Cards–>
<mat-grid-tile *ngFor=”let mc of miniCardData” [colspan]=”( cardLayout | async )?.miniCard.cols”
[rowspan]=”( cardLayout | async )?.miniCard.rows”>
<app-mini-card [title]=”mc.title” [textValue]=”mc.textValue” [value]=”mc.value” [color]=”mc.color” [percentValue]=”mc.percentValue”></app-mini-card>

The screenshot below is what the dashboard will look like with the mini cards populated.

dashboard with charts, tables, and mini-cards

Dashboard with charts, tables, and mini-cards. (Large preview)

Putting All Together

In the end, the dashboard component template should contain:

<!– dashboard.component.html –>
<div class=”grid-container”>
<h1 class=”mat-h1″>Dashboard</h1>
<mat-grid-list cols=”{{ ( cardLayout | async )?.columns }}” rowHeight=”200px”>
<!–Mini Cards–>
<mat-grid-tile *ngFor=”let mc of miniCardData” [colspan]=”( cardLayout | async )?.miniCard.cols”
[rowspan]=”( cardLayout | async )?.miniCard.rows”>
<app-mini-card [icon]=”mc.icon” [title]=”mc.title” [value]=”mc.value” [color]=”mc.color” [isIncrease]=”mc.isIncrease” duration=”since last month” [percentValue]=”mc.percentValue” [isCurrency]=”mc. isCurrency”></app-mini-card>
<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Monthly Revenue”>
<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Product Sales”>
<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Sales by Traffic Source”>
<mat-grid-tile [colspan]=”( cardLayout | async )?.chart.cols” [rowspan]=”( cardLayout | async )?.chart.rows”>
<app-card title=”Online Store Sessions by Traffic Source”>
<mat-grid-tile [colspan]=”( cardLayout | async )?.table.cols” [rowspan]=”( cardLayout | async )?.table.rows”>
<app-card title=”Latest Orders”>

Here’s what the resultant dashboard contains.

completed dashboard

Completed dashboard (Large preview)


Creating dashboards involves a fair amount of work and planning. A way to make building them faster is to use the various schematics provided by Angular Material and ng2-charts. With these schematics, running a command will generate a wholly complete component and can result in having a dashboard up and running fairly quickly. This leaves you a lot more time to focus on creating data services and adding them to your dashboard components.

If you want to learn more about some of the schematics provided by Angular Material, visit, and for those provided by ng2-charts, visit their site linked here.

Smashing Editorial
(ra, yk, il)

Popular Design News of the Week: July 20, 2020 – July 26, 2020

Original Source:

Every week users submit a lot of interesting stuff on our sister site Webdesigner News, highlighting great content from around the web that can be of interest to web designers.

The best way to keep track of all the great stories and news being posted is simply to check out the Webdesigner News site, however, in case you missed some here’s a quick and useful compilation of the most popular designer news that we curated from the past week.

4 Design Patterns that Violate “Back” Button Expectations


We Designed Something that Couldn’t Work


Appydev – Best Hand Picked Tools


Dark Mode for all the Things


15 Amazing Lego Re-Imagined Star Wars Scenes


37 SEO Tips all Web Designers Should Know


Medium is not the Home for your Ideas


How to Start Designing in Figma


Recursive Google Font


8 Popular UI Design Trends on Dribbble in 2020


Teenyicons — Tiny Minimal 1px Icons


Stripe: Building a Developer Cult


Fast Design will Kill your Product


How to Create a Strong Visual Identity for Digital Products


How to Create a Responsive Timeline with Image Thumbnails


Reploy – Instant, Shareable Previews of your Product


Wavium – Start a Blog and Newsletter in Under 5 Minutes


Can a Rebranding Make BMW Immune?




9 Epic Logo Designs Inspired by Famous Fictional Places


Create a Stunning Infographic with these 9 Tips and Tricks


How to Create a Web Design Portfolio with no Job Experience


5 Essential UX Design Principles that Great Designers Embrace


I Don’t Want to Be a Founder and I Don’t Think You do Either


Stop Worrying About People Stealing your Ideas


Want more? No problem! Keep track of top design news from around the web with Webdesigner News.


p img {display:inline-block; margin-right:10px;}
.alignleft {float:left;}
p.showcase {clear:both;}
body#browserfriendly p, body#podcast p, div#emailbody p{margin:0;}

Raw Design Inspiration: Hand-picked on Dribbble

Original Source:

Raw Design Inspiration: Hand-picked on Dribbble
Raw Design Inspiration: Hand-picked on Dribbble


We are back with another abdz. ‘Raw Design Inspiration’ No theme, absolutely ‘raw’ inspiration. As you may have been aware, inspiration is one of the biggest fuels in my everyday life. Whatever it is for life and work balance, it comes in many shapes and forms. For me, I do appreciate a good surf on Dribbble. It’s all about how we consume our feeds, I noticed a shift of change from designers on sharing their work on social media platforms like Instagram. I might be an old-timer but I am not too keen on sharing work for likes and shares, I do enjoy the good ‘old’ Dribbble. It’s always gratifying and you usually do find something to spark your mind and inspiration.

The concept of ‘Raw’ is to randomize what inspires me to kick off my week, maybe it could have the same effect on you. This is reasonably an homage to abdz. daily inspiration series. It’s an experiment, and we’ll see how it goes. If you do have a suggestion, you can submit your work.

More on


By Jona Dinges

By DStudio™

Empty UI gradient color app design empty space empty state mobile ui mobile app ios app ios card ui branding user experience design typography white product design clean ui-ux ux ui

By Yoga Perdana

Zebra Logo animal horse zebra branding logo

By Udhaya Chandran

By Anton Zaderaka

By Craftwork

Boom Illustrations + UI = 🚗 flying cinema4d png startup project elements ui design landing application presentation website web app scene colorful bright illustrations 3d

By MonpixDesign

Food Delivery App mobile fruits fruit food uiux mobile app mobile ui mobile app design ecommerce design app design ecommerce app ecommerce app ux design ui ui design minimal food delivery app

By Asish Sunny

Payment app clean ui trending cards ui credit cash hire freelancer wallet expence income finances web design website dark ui light ui mobile ui clean ux ui

By Lelevien


By B®andits

Play With Type - B Studio studio minimal branding logo brandits typeface geometric monogram letter typography type play

By Farzan Faruk 👑

watchOS 6 Landing Page - Mobile Concept minimal app design applepencil apple ios mockup apple watch design responsive design smartwatch apple watch 2018 trends ui ux website design product web design landing page homepage ecommerce website

By Sèrgi Mi

Mobile Banking graph balance payment pay illustration banking concept bank app kawaii design cards light mobile ui

By catalyst

music instruments... 🎵🎶🎹🎤🎺🎻🎷🎸🥁 concert cartoon logo icon illustration player musical trumpet violin piano drum song sing sound electric accoustic guitar microphone intrument music

By Laura Lhuillier ⎪ Arual ☺︎

Bottles collection 💧 packagingdesign branding moutain forest aquatic jungle adobe dimension bottle mockup bottle design animal kids illustration illustration art illustrator illustration

By MD Mahfuj

Niox | N letter logo design gradient logo modern logo logo design identitydesign website logo mark n letter logo n letter logos logo illustrator identity branding free logo mockup flat creative logo app vector logo process free logo

By David Kovalev ◒

Photos not flat logo branding agency unfold neuomorphism neuomorphic skeumorphism skeumorphic 3d soft soft3d fun flower colorful photo photos iconset icons icon apple

By UI8

Macbook Pro Mockup - 4K Freebie freebie 4k 3d sketch psd mockup apple macbook

By Benjamin Oberemok

Ping-pong logo design icon symbol mark unfold game paddle rackets table tennis tennis ping pong logo concept fun branding logo

By Fabio Sasso


By Nathan Riley