Thinking > story
Lightning Fast Prototyping with Harp

What is Harp?

Harp is a static web server built on Node. It serves Jade, Markdown, EJS, CoffeeScript, Sass, LESS and Stylus as HTML, CSS & JavaScript with no additional configuration or plugins. You get a powerful asset pipeline with a few extra perks. This makes it great for prototyping and as a frontend playground.

Why use Harp?

It's blazing fast, easy to get setup, and dead simple. It's also more powerful than things like CodePen or jsFiddle (more than just a "widget builder"). If you end up liking what you've built, you can then compile the static assets or actually deploy it to Harp's own dropbox based hosting platform. Because of it's speed and versatility, Harp is an efficient and effective tool for prototyping UI concepts and workflows.

Getting Started

  • Install Node or brew install node
  • Install Harp npm install -g harp
  • Create a new Harp project harp init project-name (will create a folder with your project name in the current directory)
  • Start Harp server harp server project-name
  • Access your site at localhost:9000

Now you can write using your favorite frontend technologies! (This article will be using Jade/Sylus for all code examples.)

Note: Any time you would like to generate the static files for your project, you can run harp compile and your site will be generated in the /www folder in the root of your project.

Public vs. Private

In Harp, anything prefixed with an underscore will not be publicly available via the server or compilation. This is useful for partials and/or private layout files. Anything without an underscore will be compiled and publicly available. Making things private when possible will also improve compile time (not that you need it). Folders that are prefixed with an underscore will be private as well as anything that is contained within.

Layouts and Partials

You'll have layout files which have the underscore prefix. The _layout file will be applied to anything on that folder level. eg: /_layout.jade would apply to anything on the root level. /posts/_layout.jade would be applied to any page view within the /posts directory.

Partials are just as easy. If you have a partial.jade file in the _partials/ folder you can simply:

!= partial("_partials/partial")

Static Data Structures

With Harp you also get flat JSON data structures to play with. You can create a _data.json file in any subdirectory and then have access to that data in your templates. Eg: if you have /posts/_data.json you can then iterate over that json collection.

with /posts/_data.json:

  "post1-slug" : {
    "name":      "Post 1",
    "author":    "John Doe",
    "content":   "Lorem ipsum..."
  "post2-slug" : {
    "name":      "Post 2",
    "author":    "Kevin Smith",
    "content":   "Some Post Content"

Then in your template:

each post, slug in public.posts._data
    h3"/posts/#{ slug }")=

This will enumerate over the top-level keys using the key name as the slug.


<div class="post">
  <h3><a class="link" href="/posts/post1-slug">Post 1</a></h3>

<div class="post">
  <h3><a class="link" href="/posts/post2-slug">Post 2</a></h3>

It should be noted here that the _data.json file is intended only for meta data. If you were blogging, like in this example, you would also need to include a view file in the posts directory (with a file name that's the same as the slug) that contains the actual post itself. The _data.json would include things like the slug, title, tags, etc. It's easy to see that you can use _data.json files to mimic database results for prototyping very easily.

You also get a global variables JSON file located at /_harp.json which is useful for layout variables (eg: site title) and other settings that you'll need available within scope.

The Current Object

On any template or layout you will have access to current which will give you brief information about the current location of the app. The current object has a path and source property. Eg: if you were accessing /posts/post-name the current object may look like:

  "path":   ["posts", "post-name"],
  "source": "post-name"

This is very useful if you would like to have an active-state in your site's navigation:

  li(class="#{ current.source == 'index' ? 'active' : '' }")
    a(href="/") Home
  li(class="#{ current.source == 'posts' ? 'active' : '' }")
    a(href="/posts") Posts

A Boilerplate Project

If you prefer to learn by example, you can clone my harp boilerplate. It will set you up with a layout, a partial, some useful stylus mixins, icon fonts, and other helpful examples.

For more information you should check out the harp documentation

Recent Posts