Harp is a free, open source static site server written in Node.js, It support EJS and Jade for templating and Sass,Scss, Less and Stylus for stylesheets pre-processing and Markdown for writing pages.

What do I mean by static site server?

A static site allows you to use pre-processor for writing templates, scripts, stylesheets, and pages, and output them into static content, at the same time serve those static content.

How different is a static site server from a static site generator?

A static site generator compiles the output once you are done writing them, and have to be deployed manually or through some automated script, some static site generators support deployment options like GitHub Pages, SSH and many other ways, but at the end these files have to be placed in some web root where a separate production server like NGINX or Apache have to serve them, and in most static site generators you have to compile the source manually, which might be a bit painful over a long term. How is Harp different? Harp is a static site server which means every time you make changes to a file it will recompile it, at the same time Harp has a built-in web server that can run in both development and production. In development Harp will recompile the whole source, while in production mode Harp keeps an eye on the timestamp of the files, So if a file has changes made to it, Harp will recompile it, but this time, not the whole source only that one specific file. So now you have a server that compiles and hosts your website. If you want to use Harp as a static site generator, you can do that.

Getting started

Since Harp is written in Node.js we need to get Node.js first. (If you have Node.js already installed skip this step). Visit nodejs Download the specific version of Node.js installer for your Windows, Mac, or Linux. If you are using Windows, you might need to reboot your PC so that the environment variables are set and NPM has the right permissions. If you prefer using NVM you can go ahead and follow the steps below.

curl -o- [https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh](https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh) | bash
Code language: JavaScript (javascript)

or

wget -qO- [https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh](https://raw.githubusercontent.com/creationix/nvm/v0.25.4/install.sh) | bash
Code language: JavaScript (javascript)

Downloading latest stable version of Node.js using NVM.

nvm install stable

Setting the stable release as the default version.

nvm alias default stable
Code language: JavaScript (javascript)

Installing Harp

If you are using Windows or NVM then you don’t need to run sudo before running this command.

sudo npm install -g harp

Once Harp is done installing, we can initialize a new Harp project.

harp init Website

Now set you current directory Website.

cd Website

If you want to create a Harp project in an existing folder, run.

harp init .

Running the Harp server.

harp server

If you want to compile the output to host it or prefer a different Web Server. You can compile the output by using. The output should be stored in a folder named www

harp compile

Now visit here You source folder structure inside Website should look like.

404.jade _layout.jade index.jade main.less
Code language: CSS (css)

Any file an underscore before the name will not be visible to the public for example a _data.json file. Harp does not have a logical module, so you really can’t use a for loop to list the child pages of a specific folder. You must use a _data.json file that stores all the data you require.

Creating a blog.

To create a blog, we need a completely new folder structure. The folder will contain all the files we require to create a basic blog.

.blog/ ..hello-harp.md .._layout.jade .._data.json ._layout.jade .index.jade harp.json

The harp.json file holds all the global variables like metadata website title and several types of global variables. Let’s delete the files in the Website folder first. Now let’s start by creating the harp.json file. Now open the harp.json file.

touch harp.json
Code language: CSS (css)

Add the following lines to the harp.json file.

{ 
	"globals": 
	{ 
		"site": 
		{ 
			"title": "Harp Blog", "description": "A simple blog powered by Harp" 
		} 
	}

}Code language: JSON / JSON with Comments (json)

Now you have your globals set. Creating the public folder, anything stored in the public folder will be accessible to the visitor unless it has an _ before the name for example _data.json

mkdir public
Code language: PHP (php)

We will be using Jade for templating. If you wan’t to use EJS you can go ahead and use EJS. Now create a _layout.jade inside the public folder.

touch _layout.jade
Code language: CSS (css)

Add the following lines to the _layout.jade file.

doctype html html head(lang=”en”) meta(charset=”utf-8″) meta(name=”description” content=”#{site.description}”) title #{site.title} body .content != yield

You must have noticed that inside the _layout.jade in the .content div, inside that div we have a != yield What does that do? It wrappers the _layout.jade file will be the patent of all the other templates, what does that mean? It means that you really don’t need to write all the Jade markup over and over in every new file you create in the folder that contains a _layout.jade, It saves a lot and lets you have a constant markup for multiple pages. Now that we have a _layout.jade, lets add a new index.jade file. The index.jade file is the file that will output as index.html, actually all the files except the _layout.jade file will be output would be as .html.

touch index.jade
Code language: CSS (css)

Now add the following lines to the index.jade

h2 Hello Harp p Powered by Harp

Now when you visit 127.0.0.1:9000, you should see the greeting that we just created. It time now to add the listing functionality to the index.jade file. As I said before, Harp will not list the pages all by itself, you need to feed this data manually using a _data.json file. Add the _data.json file.

touch _data.json
Code language: CSS (css)

Now we can add the pages data to the _data.json file you want to list.

{ 
	"hello-harp": { 
		"title": "Hello Harp", "description": "An example post" 
	} 
}
Code language: JSON / JSON with Comments (json)

Now we can edit the index.jade file to fetch this information.

for post, slug in public.blog._data 
	h2: a(href="/blog/#{slug}") 
		#{post.title} 
	p #{post.description}
Code language: PHP (php)

Now you should see the hyperlink-based title and the new description. It’s time to create the hello-harp.md in our blog folder.

touch blog/hello-harp.md

You can add this dummy text to the hello-harp.md file.

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.Code language: JavaScript (javascript)

You will now require a _layout.jade inside the blog folder, you can add the following lines to it.

doctype html 
html 
	head(lang="en") 
	meta(charset="utf-8") 
	meta(name="description" content="#{site.description}") 
	title #{site.title} 
body 
	.content 
		h2 #{title} 
		!= yield
Code language: PHP (php)

You now have a fully functional blog powered by Harp. This was a basic tutorial, I did not involve any style sheets, because I believe you are creative enough to implement your own style of stylesheet and wanted to give the reader to choose the preprocessor, he/she would want to use. If you like this tutorial, share or comment, if you have any questions.

I compiled a list of software and services that I use to improve my workflow, here is the link to the list.

Darryl Dias

I’m Darryl. I’m a 3D Artist, Programmer and Linux enthusiast. On this site I share my insights, tips and tricks, tutorials, methods and best practices.