Skip to content

Instantly share code, notes, and snippets.

@magnars
Created January 23, 2014 10:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save magnars/32dbca91bdb0987ea4ba to your computer and use it in GitHub Desktop.
Save magnars/32dbca91bdb0987ea4ba to your computer and use it in GitHub Desktop.

Stasis

A Clojure library of tools for developing static web sites.

Another static site framework? Why?

Well, that's exactly it. I didn't want to use a framework. I don't like the restrained feeling I get when using them. I prefer coding things over messing around with configuration files.

I want to

  • code my own pages
  • set up my own configuration
  • choose my own templating library
  • create my own damn stylesheets

Statis offers a few functions that are pretty useful when creating static web sites.

No more. There are no batteries included.

If you want a framework that makes it really quick and easy to create a blog, you should take a look at these:

  • misaki is a Jekyll inspired static site generator in Clojure.
  • Madness is a static site generator, based on Enlive and Bootstrap.
  • Static is a simple static site generator written in Clojure.
  • Ecstatic creates static web pages and blog posts from Hiccup templates and Markdown.
  • incise is an extensible static site generator written in Clojure.

They generally come with a folder where you put your blog posts in some templating language, and a set of configuration options about how to set up your blog. They often generate code for you to tweak.

Usage

The core of Stasis is two functions: serve-pages and export-pages. Both take a map from path to contents:

(def pages {"/index.html" "<h1>Welcome!</h1>"})

The basic use case is to serve these live on a local server while developing - and then exporting them as static pages to deploy on some server.

Serving live pages locally

Stasis can create a Ring handler to serve your pages.

(ns example
  (:require [stasis.core :as stasis]))

(def app (stasis/serve-pages pages))

Like with any Ring app, you point to your app in project.clj:

:ring {:handler example/app}

and start it with lein ring server-headless.

Exporting the pages

To export, just give Stasis some pages and a target directory:

(defn export []
  (stasis/export-pages pages target-dir))

When you've got this function, you can create an alias for leiningen:

:aliases {"build-site" ["run" "-m" "example/export"]}

and run lein build-site on the command line. No need for a lein plugin.

Example apps?

The static page that prompted me to write Stasis is currently closed source, but I'm in the process of turning my 4 other static sites over. The simplest, and first to be done, is:

I'm also working on the Emacs Rocks! webpage, where I'll use hiccup instead of Enlive.

Is it stable?

It's still on a 0.x release, but I feel the API has jelled enough now to open source it. I don't expect any major changes at this point. I'll likely push it to 1.0 at the end of the month.

Again, why not use one of the existing frameworks?

I think the existing frameworks are great if they fit your style. Stasis imposes no styles. There are very few decisions made for you - no markdown vs asciidoc, no enlive vs hiccup. No configuration options. You have to make them.

So, yeah ... I think Stasis would be a great starting point if you want to create the 6th static site framework to go in that list at the top. :-)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment