1. Setting up

We’ll be using a bunch of tools namely: Ember.js, Ember-CLI, Firebase and Emberfire. To put the project online later we’ll use Surge. All are free tools and Surge and Firebase have premium features if you want to be pro.

For hobby projects however, we don’t need to as they have both have very generous plans, which we’ll gladly accept.

To install all of these, you need to have node.js and git running on your system. Unfortunately I don’t have the space to explain that here.

I’ve only been able to test on OS X but the ideas of the guide should hopefully pierce through platforms

Now we’ll create a new Ember project using Ember-CLI and see it working.

Creating a new project with Ember-CLI

Ember-CLI is the official build system and command-line interface for Ember.js projects. It makes developing Ember.js applications a lot easier. To install it globally on your system, open the command line:

npm install --global ember-cli

Then create a new project named ‘tagwall’:

ember new tagwall

Depending on your internet speed it might take ~1-10mins to download and install everything. With my connection it even fails sometimes but a second npm install usually does the trick. With everything done it should look like this:

Note: As of this writing, Ember-CLI was on version 1.13.7

The CLI has now bootstrapped everything and we can open the folder to check it out:

cd tagwall
open .

You’ll see tons of files and folders but we’ll mostly be concerned with the app folder. Let’s tell Ember-CLI that we want to use a pod structure. Pods allows us to group files by structure rather than type. For instance, instead of templates clamped together in app/templates/, they’ll be split out under their route such as app/posts/template.hbs. Don’t worry about it too much, it’ll make sense soon. If you want, see more on the pod structure.

To use pods, edit the hidden .ember-cli file to:

  "disableAnalytics": false,
  "usePods": true

Making sure it runs

Because our app was generated without pods, we’ll delete app/templates/application.hbs and the app/controllers folder. While it’s easy enough to delete files using the Finder in OS X, we’ll now do it using trash-cli, which is a lot safer than using rm.

npm install --global trash
trash app/templates/application.hbs app/templates/components app/controllers

Now it’s time to create a new application route and template. Here it is important to know that Ember CLI automatically knows about files inside app/. When using pods you place files by their route, if they have one. So to create a new “application” route and template we have to create a route.js and template.hbs in app/application.

But since we have Ember-CLI, we don’t need to do it ourselves. Make sure you are inside the tagwall folder that was created and run:

ember g route application

In the application template you’ll find an {{outlet}} which is where Ember renders our templates. To see your site, Ember-CLI can start a local server which will automatically refresh the browser every time you change a file. Very practical, try it out:

ember serve

Let’s edit the application template to test it out:

<h1>Rough Tagwall</h1>

Open up your browser on http://localhost:4200 and rejoice! It’ll look something like this:

Building and deploying

The last part of setting up is deploying the project with Surge.sh. A brilliant (free!) service for deploying static sites, exactly like ours. Stop the Ember-CLI server using ctrl+c in the Terminal, then build the project:

ember build --environment=production

Note, here we specify a production environment. This is what will minify all our files and prepare everything for deployment. When it’s done your project will be available in the dist folder. Check it out. This is what you should put online. You should never change anything in the dist folder yourself. If you haven’t already installed Surge, it’s one command away:

npm install --global surge

Now deploy using surge:

mv dist/index.html dist/200.html
surge dist

If it’s your first time using Surge you’ll need to supply a username as well to make sure no one else can overwrite your project. Note that we also rename index.html to 200.html for client-side routing. Without it, the server wouldn’t know that we want a URL as example.com/some/ember/route to be handled by example.com/index.html — and not go to the some/ember/route folder.

2. Building the tagwall