<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ember Ocean</title>
    <description>The latest articles on DEV Community by Ember Ocean (@ember-ocean).</description>
    <link>https://dev.to/ember-ocean</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F3319%2F3e889e6f-02a5-4bca-b9af-5a06e42e3046.png</url>
      <title>DEV Community: Ember Ocean</title>
      <link>https://dev.to/ember-ocean</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ember-ocean"/>
    <language>en</language>
    <item>
      <title>Debugging an Ember Octane App</title>
      <dc:creator>Robin Philip Thomas</dc:creator>
      <pubDate>Mon, 07 Dec 2020 07:36:18 +0000</pubDate>
      <link>https://dev.to/ember-ocean/debugging-an-ember-octane-app-4dih</link>
      <guid>https://dev.to/ember-ocean/debugging-an-ember-octane-app-4dih</guid>
      <description>&lt;p&gt;So you have been asked to fix a bug or to explore functionality in an Ember app. Have a humungous code-base and have no idea where to start! Well, you are in luck as I'll be showing you some tips on &lt;strong&gt;common debugging and reverser engineering ways in Ember&lt;/strong&gt; world.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 0
&lt;/h3&gt;

&lt;p&gt;For debugging with ease, make sure sourcemaps are generated for your builds. If they are not being generated, then go to &lt;code&gt;ember-cli-build.js&lt;/code&gt; and pass:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;sourcemaps:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="err"&gt;enabled:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;as options to &lt;code&gt;EmberApp()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;With this enabled, a special kind of file (aka sourcemaps) will be generated along with the bundled output, which the browser can use to understand the original source code you wrote from the bundled output.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While there are many ways to debug an ember app, we will be mostly looking at debugging with the help of &lt;a href="https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi" rel="noopener noreferrer"&gt;ember inspector&lt;/a&gt; in this blog.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Finding the component which has the bug
&lt;/h3&gt;

&lt;p&gt;Let's say you are debugging this page: &lt;a href="https://www.emberobserver.com/code-search" rel="noopener noreferrer"&gt;www.emberobserver.com/code-search&lt;/a&gt;.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp4eig0yl0uiqgdtq2fjw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fp4eig0yl0uiqgdtq2fjw.png" alt="Screenshot 2020-11-15 at 3.58.57 PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And you wanna figure out how the &lt;em&gt;code search&lt;/em&gt; section is built or debug it.&lt;/p&gt;

&lt;p&gt;To do that you have to find out what component is used to render the code search input box dom. But how do you find which component has the code for it?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The easiest way to find the respective component files is by using the &lt;strong&gt;&lt;em&gt;Ember Inspector&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Steps to install the extension for chrome or firefox can be found &lt;a href="https://guides.emberjs.com/release/ember-inspector/installation/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now with the extension installed, refresh the page and open dev-tools. You will see that a new tab named &lt;em&gt;ember&lt;/em&gt; has come in the dev-tools status bar. Click on it!&lt;/p&gt;

&lt;p&gt;Now click on the &lt;strong&gt;&lt;em&gt;Components&lt;/em&gt;&lt;/strong&gt; tab there&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmlhj0qpq6fhf1cjmq0wy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmlhj0qpq6fhf1cjmq0wy.png" alt="Screenshot 2020-11-15 at 3.57.14 PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will see a list of components used on the page.&lt;br&gt;
Click on the &lt;em&gt;mouse with a square in the background&lt;/em&gt; icon. &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7uj5m03469fefez4cl5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F7uj5m03469fefez4cl5t.png" alt="Screenshot 2020-11-15 at 4.08.59 PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now move your mouse to the code search dom element and click on it.&lt;/p&gt;

&lt;p&gt;The Ember inspector should have highlighted on the component used for rendering that particular code search section dom.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmjkclajn0jyrnj5ns10f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmjkclajn0jyrnj5ns10f.png" alt="Screenshot 2020-11-15 at 4.16.38 PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From what we can see, it seems to be a component named CodeSearch. To confirm if there exists a component in that name, let's search the ember-observer code-base for files which contains the name &lt;code&gt;code-search&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And voila there seem to files:&lt;br&gt;
&lt;a href="https://github.com/emberobserver/client/blob/master/app/components/code-search.js" rel="noopener noreferrer"&gt;github.com/emberobserver/client/blob/master/app/components/code-search.js&lt;/a&gt; and &lt;a href="https://github.com/emberobserver/client/blob/master/app/components/code-search.hbs" rel="noopener noreferrer"&gt;github.com/emberobserver/client/blob/master/app/components/code-search.hbs&lt;/a&gt; present.&lt;/p&gt;

&lt;p&gt;On the right side on the pane, you will get to see all the properties used in the component.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1pggtyzhctw70nleh0rx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1pggtyzhctw70nleh0rx.png" alt="Screenshot 2020-11-15 at 4.27.31 PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hover over one of the properties and click on the &lt;strong&gt;$E&lt;/strong&gt; text to inspect the prop value in the console.&lt;/p&gt;

&lt;h4&gt;
  
  
  Debugging the component
&lt;/h4&gt;

&lt;p&gt;Now that you know how to find what component is being used in a place, let me show you how to add debuggers or logger statements in the component code.&lt;/p&gt;

&lt;p&gt;The component mainly consists of two files:&lt;br&gt;
  the &lt;code&gt;component.js&lt;/code&gt; file and&lt;br&gt;
  the &lt;code&gt;template.hbs&lt;/code&gt; file&lt;/p&gt;

&lt;h5&gt;
  
  
  debugging the component.js
&lt;/h5&gt;

&lt;p&gt;Debugging the component.js file is same as debugging any other javascript file.&lt;br&gt;
You have &lt;code&gt;debugger&lt;/code&gt; statement to stop the code execution at that particular line and &lt;code&gt;console.log(variable name)&lt;/code&gt; to log variable values to the console.&lt;/p&gt;

&lt;h5&gt;
  
  
  debugging the template.hbs
&lt;/h5&gt;

&lt;p&gt;In the template file as well you have the ability to add debuggers and log statement. But using them is slightly different.&lt;/p&gt;

&lt;p&gt;You have helper methods to add debuggers and log statement here.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To add breakpoints in the template, you write the &lt;code&gt;{{debugger}}&lt;/code&gt; statement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the execution stops in a template breakpoint,&lt;br&gt;
you can use the &lt;code&gt;get(&amp;lt;path&amp;gt;)&lt;/code&gt; method in the console to get values of properties used in the template. For example, you can type &lt;code&gt;get(this.name)&lt;/code&gt; or &lt;code&gt;get(@value)&lt;/code&gt; to print those property values to the console.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;To log property values used in templates to the console, use the &lt;code&gt;{{log prop_name}}&lt;/code&gt; helper.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Finding the route and controller files for a page.
&lt;/h4&gt;

&lt;p&gt;As you saw in the last section, finding the component files was easy peasy. But most of our data and logic mostly would likely reside in the route and controller files respectively.&lt;/p&gt;

&lt;p&gt;One way to find the route and controller files is by looking at the URL of the page you are in. And then checking your &lt;code&gt;router.js&lt;/code&gt; file to find which route and controllers may be matched for the URL.&lt;/p&gt;

&lt;p&gt;But is there an easier way!. &lt;/p&gt;

&lt;p&gt;Well, there is, thanks to &lt;a href="https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi?hl=en" rel="noopener noreferrer"&gt;ember inspector&lt;/a&gt; once again.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In ember inspector, you do get a &lt;em&gt;routes tab&lt;/em&gt; which shows all the routes and respective controllers available. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What I usually like to do is enable &lt;em&gt;Current Route only&lt;/em&gt; filter so that we only see the routes and controller used in the current page we are on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9621qmflum7ccht6zndp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F9621qmflum7ccht6zndp.png" alt="Screenshot 2020-11-15 at 11.47.30 PM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is particularly handy in debugging pages which have nested routes involved in rendering it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Debugging ember data
&lt;/h4&gt;

&lt;p&gt;While working with ember-data one thing I do keep open is the &lt;em&gt;data tab&lt;/em&gt; in ember inspector. It shows the ember-data models available and the records stored in it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbcg0sudoms9gamatkf8c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fbcg0sudoms9gamatkf8c.png" alt="Screenshot 2020-11-16 at 12.15.17 AM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The pane even has filters like &lt;em&gt;New&lt;/em&gt; and &lt;em&gt;Modified&lt;/em&gt;, where &lt;em&gt;New&lt;/em&gt; shows ember-data records that have been newly created and not saved to the backend yet. And &lt;em&gt;modified&lt;/em&gt; are saved records that have properties modified in the client and not synced up with the backend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Extra tip
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Measuring render performance
&lt;/h4&gt;

&lt;p&gt;While building complex pages and components, I do recommend looking at the &lt;strong&gt;Render Performance&lt;/strong&gt; tab in the ember inspector.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftkna0h1mrmbfe53g08zc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ftkna0h1mrmbfe53g08zc.png" alt="Screenshot 2020-11-16 at 12.22.10 AM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It shows the time taken by each component to render on screen. &lt;br&gt;
If the render time is high, one thing you can do is optimise the logic and add loading state UI elements to the component.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;
I hope this blog post helped you in debugging your ember app with ease.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If you are still stuck…&lt;/strong&gt;&lt;br&gt;
hop on the &lt;a href="https://discord.com/invite/emberjs" rel="noopener noreferrer"&gt;Ember Community Discord&lt;/a&gt; and post you queries in the #help channel. Hopefully, somebody will be able to help you out.&lt;/p&gt;

</description>
      <category>ember</category>
      <category>frontend</category>
      <category>debugging</category>
    </item>
    <item>
      <title>How to integrate Netlify-CMS with Empress-blog</title>
      <dc:creator>Robin Philip Thomas</dc:creator>
      <pubDate>Mon, 07 Dec 2020 07:35:55 +0000</pubDate>
      <link>https://dev.to/ember-ocean/how-to-integrate-netlify-cms-with-empress-blog-39pm</link>
      <guid>https://dev.to/ember-ocean/how-to-integrate-netlify-cms-with-empress-blog-39pm</guid>
      <description>&lt;p&gt;So you use &lt;a href="https://github.com/empress/empress-blog"&gt;Empress-blog&lt;/a&gt; for your blog website. Do you edit and add blogs in local? What if you don't have your personal laptop? Do you then re-create the whole project just to add a new blog post? What if I told you there was a better way!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wouldn't be great if you could have a CMS for your blog and that too free of cost. Add and Edit blog posts from the browser itself. 🤩&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let me introduce you to &lt;strong&gt;&lt;a href="https://www.netlifycms.org/"&gt;Netlify CMS&lt;/a&gt;&lt;/strong&gt; your open source content management for your Git workflow.&lt;/p&gt;

&lt;h5&gt;
  
  
  OK just show me how!
&lt;/h5&gt;

&lt;h2&gt;
  
  
  1) Create a new Empress-blog project
&lt;/h2&gt;

&lt;p&gt;Let's first create a new ember project and convert it into a empress-blog project.&lt;/p&gt;

&lt;p&gt;Run the following commands in the terminal, in the folder where you'd like to create the blog.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ember new super-blog
&lt;span class="nb"&gt;cd &lt;/span&gt;super-blog
ember &lt;span class="nb"&gt;install &lt;/span&gt;empress-blog empress-blog-attila-template
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will ask you if you want to update the &lt;code&gt;index.html&lt;/code&gt; file and you should say yes 👍&lt;/p&gt;

&lt;p&gt;For this tutorial, we will be using the &lt;a href="https://github.com/empress/empress-blog-attila-template"&gt;empress-attila-template&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get to know Empress
&lt;/h2&gt;

&lt;p&gt;In your favourite code editor, open up the code generated, and take a look at the &lt;code&gt;content&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;You will see that there are multiple Markdown files that represent blog posts. Open one &lt;code&gt;.md&lt;/code&gt; file and you will see something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Welcome&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;to&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;empress-blog"&lt;/span&gt;
&lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/images/welcome.jpg&lt;/span&gt;
&lt;span class="na"&gt;imageMeta&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;attribution&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;attributionLink&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="na"&gt;featured&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;authors&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ghost&lt;/span&gt;
&lt;span class="na"&gt;date&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tue Jun 12 2018 18:59:59 GMT+0100 (IST)&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;getting-started&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;

Hey! Welcome to empress-blog, it's great to have you :)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can see above that each blog post has a title, image, author, body and other properties. We will be recreating this using Netlify CMS.&lt;/p&gt;

&lt;p&gt;Similarly, have a look at &lt;em&gt;author&lt;/em&gt; and &lt;em&gt;tags&lt;/em&gt; folder &lt;code&gt;.md&lt;/code&gt; files. We will need them for adding author(s) and tag(s) for your blog posts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; for other global configuration options, check out &lt;a href="https://github.com/empress/empress-blog"&gt;&lt;/a&gt;&lt;a href="https://github.com/empress/empress-blog#configuring"&gt;https://github.com/empress/empress-blog#configuring&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try running in local with &lt;code&gt;npm start&lt;/code&gt;  and your blog should be live in &lt;a href="http://localhost:4200/"&gt;http://localhost:4200&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Great things are working in local. Let's move on to the CMS part.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2) Add Netlify CMS to your site
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Update: you don't need to do step 2 anymore. Just &lt;code&gt;ember install empress-blog-netlify-cms&lt;/code&gt; and you are good to go. For more details check out &lt;a href="https://github.com/MalayaliRobz/empress-blog-netlify-cms"&gt;https://github.com/MalayaliRobz/empress-blog-netlify-cms&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's start giving your blog some superpowers. In the &lt;code&gt;public&lt;/code&gt; folder create &lt;code&gt;admin&lt;/code&gt; folder with &lt;code&gt;config.yml&lt;/code&gt; and &lt;code&gt;index.html&lt;/code&gt; files in it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;├── public
     ├── admin
         ├ index.html
         └ config.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your &lt;code&gt;config.yml&lt;/code&gt; file paste the following configuration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;git-gateway&lt;/span&gt;
  &lt;span class="na"&gt;branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
&lt;span class="na"&gt;media_folder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;public/uploads'&lt;/span&gt;
&lt;span class="na"&gt;public_folder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/uploads"&lt;/span&gt;
&lt;span class="na"&gt;collections&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;blog'&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Blog'&lt;/span&gt;
    &lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content/'&lt;/span&gt;
    &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{%&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;raw&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;%}{{year}}{{month}}{{day}}{{slug}{%&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;endraw&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;%----}"&lt;/span&gt;
    &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Title"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;imageMeta"&lt;/span&gt;
        &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ImageMeta"&lt;/span&gt;
        &lt;span class="na"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;object"&lt;/span&gt;
        &lt;span class="na"&gt;collapsed&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
        &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; 
          &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;attribution"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;attribution"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
          &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;attributionLink"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;attributionLink"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;featured"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Featured"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;boolean"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;true&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;authors"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Authors"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ghost"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tags"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tags"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;new"&lt;/span&gt;&lt;span class="pi"&gt;],&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Body"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;markdown"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Publish&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Date"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;date"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;datetime"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ddd&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;MMM&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;DD&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;YYYY&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;h:mm:ss&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;a"&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;author'&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Author'&lt;/span&gt;
    &lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;author/'&lt;/span&gt;
    &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{%&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;raw&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;%}{{name}}{%&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;endraw&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;%----}"&lt;/span&gt;
    &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Name"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;id"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Id"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cover"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cover"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Website"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;twitter"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Twitter"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;facebook"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Facebook"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;location"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Location"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Body"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;markdown"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tag'&lt;/span&gt;
    &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Tag'&lt;/span&gt;
    &lt;span class="na"&gt;folder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;tag/'&lt;/span&gt;
    &lt;span class="na"&gt;create&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;
    &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;{%&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;raw&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;%}{{name}}{%&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;endraw&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;%----}"&lt;/span&gt;
    &lt;span class="na"&gt;fields&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Name"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;string"&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;image"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
      &lt;span class="pi"&gt;&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt; &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Body"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;widget&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;markdown"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;required&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;false&lt;/span&gt; &lt;span class="pi"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For this tutorial, we will be using git-gateway as our backend for Netlify CMS. More details can be found &lt;a href="https://www.netlifycms.org/docs/backends-overview/"&gt;here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your &lt;code&gt;index.html&lt;/code&gt; file, paste in the following contents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!doctype html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1.0"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;Content Manager&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://identity.netlify.com/v1/netlify-identity-widget.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="c"&gt;&amp;lt;!-- Include the script that builds the page and powers Netlify CMS --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://unpkg.com/netlify-cms@^2.0.0/dist/netlify-cms.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Some more configuration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;While adding users to your CMS, netlify will send them an email with a link to your blog url containing an access token. We need to setup a watch for this and redirect them to the admin page so that netlify can verify them and add them as users. &lt;/p&gt;

&lt;p&gt;In &lt;code&gt;index.html&lt;/code&gt; file in the &lt;code&gt;app&lt;/code&gt; folder. Add &lt;code&gt;&amp;lt;script src="https://identity.netlify.com/v1/netlify-identity-widget.js"&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt; to the &lt;em&gt;&lt;/em&gt; tag. Also after the &lt;em&gt;&lt;/em&gt; tag add this small script.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;netlifyIdentity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;netlifyIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;init&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;netlifyIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/admin/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The whole index.html file should look something like this now.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;http-equiv=&lt;/span&gt;&lt;span class="s"&gt;"X-UA-Compatible"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"IE=edge"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"viewport"&lt;/span&gt; &lt;span class="na"&gt;content=&lt;/span&gt;&lt;span class="s"&gt;"width=device-width, initial-scale=1"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://identity.netlify.com/v1/netlify-identity-widget.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

    {% raw %}{{content-for "head"}}{% endraw %}

    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{% raw %}{{rootURL}}assets/vendor.css{% endraw %}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;integrity=&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"{% raw %}{{rootURL}}assets/super-blog.css{% endraw %}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

    {% raw %}{{content-for "head-footer"}}{% endraw %}
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    {% raw %}{{content-for "body"}}{% endraw %}

    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"{% raw %}{{rootURL}}assets/vendor.js{% endraw %}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"{% raw %}{{rootURL}}assets/super-blog.js{% endraw %}"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;

    {% raw %}"{{content-for "body-footer"}}{% endraw %}
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;netlifyIdentity&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;netlifyIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;init&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;netlifyIdentity&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;login&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;location&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;href&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/admin/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
          &lt;span class="p"&gt;});&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;🥳 we are almost done. Just a few more steps.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  3) Push to GitHub
&lt;/h3&gt;

&lt;p&gt;It's now time to commit your changes and push to GitHub. The ember new command does in-fact initialise a Git project automatically for you, so you only need to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Initial Commit"&lt;/span&gt;
git remote add origin https://github.com/YOUR_USERNAME/NEW_REPO_NAME.git
git push &lt;span class="nt"&gt;-u&lt;/span&gt; origin master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4) Add your repo to Netlify
&lt;/h3&gt;

&lt;p&gt;Go to Netlify and select 'New Site from Git'. Select GitHub and the repository you just pushed to. Click Configure Netlify on GitHub and give access to your repository. Finish the setup by clicking Deploy Site. Netlify will begin reading your repository and starting building your project.&lt;/p&gt;

&lt;h3&gt;
  
  
  5) Enable Identity and Git Gateway
&lt;/h3&gt;

&lt;p&gt;Netlify's Identity and Git Gateway services allow you to manage CMS admin users for your site without requiring them to have an account with your Git host or commit access on your repo. From your site dashboard on Netlify:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Settings &amp;gt; Identity&lt;/strong&gt;, and select &lt;strong&gt;Enable Identity service&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;Registration preferences&lt;/strong&gt;, select &lt;strong&gt;Open&lt;/strong&gt; or &lt;strong&gt;Invite only&lt;/strong&gt;. In most cases, you want only invited users to access your CMS, but if you're just experimenting, you can leave it open for convenience.&lt;/li&gt;
&lt;li&gt;If you'd like to allow one-click login with services like Google and GitHub, check the boxes next to the services you'd like to use, under &lt;strong&gt;External providers&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Scroll down to &lt;strong&gt;Services &amp;gt; Git Gateway&lt;/strong&gt;, and click &lt;strong&gt;Enable Git Gateway&lt;/strong&gt;. This authenticates with your Git host and generates an API access token. In this case, we're leaving the Roles field blank, which means any logged-in user may access the CMS. For information on changing this, check the &lt;a href="https://docs.netlify.com/visitor-access/identity/"&gt;Netlify Identity documentation&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  6) Accessing the CMS
&lt;/h2&gt;

&lt;p&gt;Your site CMS is now fully configured and ready for login!&lt;/p&gt;

&lt;p&gt;If you set your registration preference to "Invite only," invite yourself (and anyone else you choose) as a site user. To do this, select the &lt;strong&gt;Identity&lt;/strong&gt; tab from your site dashboard, and then select the &lt;strong&gt;Invite users&lt;/strong&gt; button. Invited users receive an email invitation with a confirmation link. Clicking the link will take you to your site with a login prompt.&lt;/p&gt;

&lt;p&gt;If you left your site registration open, or for return visits after confirming an email invitation, access your site's CMS at &lt;code&gt;yoursite.com/admin/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;After logging-in to the admin page, you should see a screen similar to 👇.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_mQ3Aqpr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.mylittletechlife.com/assets/uploads/screenshot-2020-05-30-at-8.35.18-pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_mQ3Aqpr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.mylittletechlife.com/assets/uploads/screenshot-2020-05-30-at-8.35.18-pm.png" alt="netlify cms dashboard screenshot"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  7) Start publishing
&lt;/h2&gt;

&lt;p&gt;It's time to create your first blog post. Click on &lt;code&gt;New Blog&lt;/code&gt; button and start adding the title, image and other properties right from the handy interface. When you click Publish, a new commit will be created in your GitHub repo with this format &lt;code&gt;Create Blog “year-month-date-title”&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Then Netlify will detect that there was a commit in your repo and will start rebuilding your project. When your project is deployed you'll be able to see the post you created.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; to add tags or authors, click on the respective collection name from the side menu and click on the &lt;code&gt;New&lt;/code&gt; button.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.netlifycms.org/docs/gatsby/#cleanup"&gt;&lt;/a&gt;Cleanup
&lt;/h3&gt;

&lt;p&gt;It is now safe to remove the default Empress blog posts. You can use the &lt;code&gt;delete entry&lt;/code&gt; option available in the CMS.&lt;/p&gt;

&lt;p&gt;That's it you have successfully connected your Empress-blog with Netlify CMS. 🎉&lt;/p&gt;

&lt;p&gt;Github repo: &lt;a href="https://github.com/MalayaliRobz/empress-netlify-cms-starter"&gt;https://github.com/MalayaliRobz/empress-netlify-cms-starter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more details on Empress, Netlify CMS check out &lt;a href="https://github.com/empress/empress-blog"&gt;https://github.com/empress/empress-blog&lt;/a&gt; and &lt;a href="https://www.netlifycms.org/docs/intro/"&gt;https://www.netlifycms.org/docs/intro/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ember</category>
    </item>
    <item>
      <title>Splitting &amp; Migrating your Ember project to a Monorepo</title>
      <dc:creator>Robin Philip Thomas</dc:creator>
      <pubDate>Mon, 07 Dec 2020 07:35:38 +0000</pubDate>
      <link>https://dev.to/ember-ocean/splitting-migrating-your-ember-project-to-a-monorepo-2380</link>
      <guid>https://dev.to/ember-ocean/splitting-migrating-your-ember-project-to-a-monorepo-2380</guid>
      <description>&lt;p&gt;Let's imagine a scenario where your ember project is getting fairly large in terms of code size and is getting hard to maintain. What do you do?&lt;br&gt;
You split your code into addons and ember engines right! &lt;em&gt;Monorepo is one good way to maintain these addons and engines without having to maintain multiple repos.&lt;/em&gt;&lt;/p&gt;
&lt;h5&gt;
  
  
  What is a Mono Repo?
&lt;/h5&gt;

&lt;p&gt;Monorepos are simply single repositories with separate npm modules organized into folders.&lt;/p&gt;
&lt;h4&gt;
  
  
  But why Mono?
&lt;/h4&gt;

&lt;p&gt;So the answer is really simple addons and engines. People love monorepos and the reason is that in such a repository, the code stays in sync with itself.&lt;br&gt;
So when you have multiple modules that live within that repository, the modules stay in sync.&lt;br&gt;
You can have a single PR or even a single commit that is able to orchestrate a change across multiple modules and you can also test these things together.&lt;br&gt;
Also tracking issues is much more convenient when you have modules are co-located inside the same repository.&lt;/p&gt;
&lt;h3&gt;
  
  
  Some advantages to having a monorepo in ember:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Addon modules dependencies become explicit.&lt;/li&gt;
&lt;li&gt;Addon modules have their own test cases.&lt;/li&gt;
&lt;li&gt;Addon modules become publishable if you wanna share it among teams.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Before we start: Splitting your project files into engines and addons
&lt;/h3&gt;

&lt;p&gt;Let's say you have an Ember project for a social media site. Let's call it Pacebook.&lt;br&gt;
Among the multiple pages it has, we are interested in the &lt;em&gt;feed page&lt;/em&gt; and the &lt;em&gt;chat page&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We are gonna split Pacebook into multiple &lt;a href="http://ember-engines.com/"&gt;engine projects&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;You could split the root level routes into separate engines or so. Any portion of your project that seems like it can run separately as a standalone app qualifies to be migrated to an engine.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For this project, we are gonna split &lt;em&gt;feed&lt;/em&gt; and &lt;em&gt;chat&lt;/em&gt; pages into separate engine projects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now find common code among these engines and move them to addons. You could also club common CSS as well. Good examples of these would be models, common logic, common css etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are gonna move some &lt;em&gt;common CSS(design system)&lt;/em&gt; and the &lt;em&gt;notifications widget&lt;/em&gt; into separate addons.&lt;/p&gt;

&lt;p&gt;Now you have something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pacebook
├── host-app
├── design-system-addon
├── notifications-widget-addon
├── feed-page-engine
└── chat-page-engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Where Host-app host is your original project and Engine-* are the ones you split.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Now let's get down to business.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Adding yarn workspace
&lt;/h4&gt;

&lt;p&gt;We will be using &lt;a href="https://classic.yarnpkg.com/en/docs/workspaces/"&gt;yarn workspace&lt;/a&gt; to create our monorepo.&lt;/p&gt;

&lt;p&gt;1) Move your file structure to this kinda layout (not necessary though)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pacebook
├── host-app
├── addons
│   ├── design-system
│   └── notifications-widget
└── engines
    ├── feed-page
    └── chat-page
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2) In your project's root create a &lt;code&gt;package.json&lt;/code&gt; file and add these lines&lt;/p&gt;

&lt;h6&gt;
  
  
  package.json
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "private": true,
  "workspaces": ["engines/*", "addons/*"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) Include engine and addon version's in package.json of the respective apps.&lt;br&gt;
one common trick is to keep engine and addon dependency as '*' in package.json to the host to keep them in the latest version always.&lt;/p&gt;

&lt;p&gt;4) Remove all node_modules and yarn-lock or package-lock files from all your folders in the project.&lt;/p&gt;

&lt;p&gt;5) run &lt;code&gt;yarn install&lt;/code&gt; from the root folder of Pacebook.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/MalayaliRobz/ember-monorepo-demo"&gt;Here is a sample repo with yarn workspace&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Congrats you have successfully migrated to yarn workspaces!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Adding Lerna to your workspace
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://lerna.js.org/"&gt;Lerna&lt;/a&gt; is a tool to help you to maintain your monorepo packages.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Lerna is a tool that optimizes the workflow around managing multi-package repositories with git and npm.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
&lt;li&gt;install lerna&lt;/li&gt;
&lt;li&gt;run &lt;code&gt;lerna init&lt;/code&gt; to create lerna.json file&lt;/li&gt;
&lt;li&gt;add these two lines to lerna.json to have it work with yarn workspaces
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{  
  ...
  "npmClient": "yarn",
  "useWorkspaces": true,
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lerna makes it easy to automate stuff like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;updating package version of addons or engines&lt;/li&gt;
&lt;li&gt;run commands in each workspace project in parallel&lt;/li&gt;
&lt;li&gt;find when the package had changed since the last release&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full list of lerna commands can be found &lt;a href="https://github.com/lerna/lerna"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These might come in handy in your CI where you would wanna run test cases or publish for just the changed engine or addon.&lt;/p&gt;

&lt;h4&gt;
  
  
  Why not use in-repo addons? (&lt;a href="https://medium.com/square-corner-blog/ember-and-yarn-workspaces-fca69dc5d44a"&gt;taken from here&lt;/a&gt;)
&lt;/h4&gt;

&lt;p&gt;Ember CLI’s original solution for simultaneously developing addons is in-repo addons, which have never required any npm link shenanigans. We have a few reasons for not using them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In-repo addons cannot have their own test suites. Test files go into the host application. We want our tests to be as decoupled as our application code.&lt;/li&gt;
&lt;li&gt;We may want to publish certain addons for use by other Ember applications. In-repo addons are not real NPM packages so they can’t be published on their own.&lt;/li&gt;
&lt;li&gt;Similarly, we want to allow teams to escape from the monorepo in the future if it makes sense for their product. Once their code is in a “real” addon with its own dependencies and test suite, they can move the files to another repository without much effort.&lt;/li&gt;
&lt;li&gt;Naming is hard—our “real” addons are inside the same git repository, so aren’t they “in-repo” addons? 🤯 To disambiguate the two patterns, we use the term “monorepo addon” for addons in our Yarn workspace&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Ok now you have adopted monorepo for you project. Now what?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Unity and move your eslint, prettier, template-list config to the root. That way you have only one config across modules.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ember-cli/ember-try#workspaces"&gt;Update ember try to take advantage to workspace&lt;/a&gt;. Believe me, your try test suit will run much faster now.&lt;/li&gt;
&lt;li&gt;While upgrading packages run &lt;code&gt;yarn upgrade-interactive&lt;/code&gt; and &lt;code&gt;yarn outdated&lt;/code&gt;. You don't have to update packages in multiple repos now. All the packages stay in sync.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Wrapping up
&lt;/h3&gt;

&lt;p&gt;While converting your project to a monorepo gives great advantages, it has some caveats as well such as settings up tooling to get it all working, not all tools may support this file structure, onboarding new member to the team etc...&lt;/p&gt;

&lt;p&gt;Sometime you might not even need monorepo especially when something like &lt;a href="https://github.com/embroider-build/embroider"&gt;embroider&lt;/a&gt; is on the rise.&lt;/p&gt;

&lt;p&gt;You mostly don't need a monorepo when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;your team size is small&lt;/li&gt;
&lt;li&gt;project source code is not that big&lt;/li&gt;
&lt;li&gt;Can't split code into modules or there is no need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end, it mostly up to developers working on a project and weighing up risks and benefits of monorepo for your project.&lt;/p&gt;

</description>
      <category>ember</category>
    </item>
    <item>
      <title>5 Things to do after building an Ember Addon</title>
      <dc:creator>Robin Philip Thomas</dc:creator>
      <pubDate>Mon, 07 Dec 2020 07:35:20 +0000</pubDate>
      <link>https://dev.to/ember-ocean/5-things-to-do-after-building-an-ember-addon-399k</link>
      <guid>https://dev.to/ember-ocean/5-things-to-do-after-building-an-ember-addon-399k</guid>
      <description>&lt;p&gt;Congratulation on building your ember addon. But the journey is not done yet. Don't you want your addon to be super easy to maintain and have a lot of collaborators? &lt;strong&gt;Follow this 5 steps to get you ember addon to the Next level:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Writing docs for your Addon
&lt;/h3&gt;

&lt;p&gt;Having an addon that solves a problem is not good enough sometimes, you need to have good documentation that tells how to use your addon.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Good documentation is always necessary for making your addon a success.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These days, a well-maintained Ember addon should:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Provide interactive demos of their components&lt;/strong&gt; in the context of an Ember app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show current and versioned guides,&lt;/strong&gt; ideally whose content is verified by automated tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show current and versioned API documentation&lt;/strong&gt; derived from structured comments in source code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make it easy for contributors to correct documentation errors&lt;/strong&gt; in addition to submitting code fixes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Thankfully we have &lt;a href="https://github.com/ember-learn/ember-cli-addon-docs"&gt;ember-cli-addon-docs&lt;/a&gt; that solves all these documentation problems&lt;/p&gt;

&lt;p&gt;It is easy to set-up and gives an awesome out of box layout for your interactive docs.&lt;/p&gt;

&lt;p&gt;You can even have your docs along-side you components, &lt;em&gt;so your docs always remain updated&lt;/em&gt;. How about that.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Having test cases and good test coverage
&lt;/h3&gt;

&lt;p&gt;Your addon may be working fine for now. But what after you have merged a couple of pull-requests. Did any of those mess up any existing functionality?&lt;/p&gt;

&lt;p&gt;The only way to test that is to have test cases and run them with each pull-request branch. That way you can be sure your addon's functionality stays intact even after a new feature is added. This is all the more necessary for an open-source addon.&lt;/p&gt;

&lt;p&gt;Ember has a robust and easy to learn &lt;a href="https://guides.emberjs.com/release/testing/"&gt;test framework(Qunit)&lt;/a&gt; installed by default that makes writing tests a breeze.&lt;/p&gt;

&lt;p&gt;You can also use the interactive docs page from addon-docs to write your test cases on top.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kategengler/ember-cli-code-coverage"&gt;ember-cli-code-coverage&lt;/a&gt; is a good tool to get code coverage reports for your code.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Speed up your test case runs
&lt;/h3&gt;

&lt;p&gt;Well, you have written your test case and they run fine. But wouldn't you love it if we could make &lt;strong&gt;tests run faster&lt;/strong&gt;... way faster. This becomes more use-full in step 4.&lt;/p&gt;

&lt;p&gt;Introducing &lt;a href="https://github.com/ember-cli/ember-exam"&gt;ember-exam&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It provides the ability to randomise, split, parallelise, and load-balance your test suite by adding a more robust CLI command.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Running tests for different ember versions
&lt;/h3&gt;

&lt;p&gt;Don't you want your addon to &lt;strong&gt;work with different ember versions&lt;/strong&gt;, and how do you test with different ember versions?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ember-cli/ember-try"&gt;ember-try&lt;/a&gt; is the answer to that.&lt;/p&gt;

&lt;p&gt;ember can run tests against multiple bower and npm dependencies, such as ember and ember-data.&lt;/p&gt;

&lt;p&gt;Coupled with ember exam can make ember try run faster.&lt;/p&gt;

&lt;p&gt;This way you can be sure your addon supports ember versions say.. 2.8 - 3.9 just by running the ember try command.&lt;/p&gt;

&lt;p&gt;ember try can also be used to run against other dependencies versions as well say, ember-data.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Having a CI system
&lt;/h3&gt;

&lt;p&gt;When pull-requests pour in for you open source addon, manually running test cases against them can be a pain in the ass.&lt;/p&gt;

&lt;p&gt;Thankfully there are good CI systems that run your test and show the results all inside GitHub.&lt;/p&gt;

&lt;p&gt;Some good CI systems are &lt;a href="https://travis-ci.org"&gt;travisci&lt;/a&gt;, &lt;a href="https://circleci.com/"&gt;circleci&lt;/a&gt; and both provide free plans to start.&lt;/p&gt;

&lt;p&gt;Ember by default comes with travis config files, so you can start using travis out of the box if you wish.&lt;/p&gt;

&lt;p&gt;There is also &lt;a href="https://jenkins.io/"&gt;jenkins&lt;/a&gt; through which you could build your custom ci server. But you would have to maintain that also !!&lt;/p&gt;




&lt;p&gt;You are now ready to open your addon to the wild, I mean the internet of-course&lt;br&gt;
.&lt;/p&gt;

&lt;p&gt;There are many other small things you can do to make your addon life easier. But there are the 5 steps I found should be done first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think, any other things to do, after building your ember addon?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ember</category>
    </item>
  </channel>
</rss>
