Node.js port of Tobias Lütke's Liquid template engine.

Liquid with Node.js

LiquidNode is a port of the original Liquid template engine from Ruby to Node.js. It uses Promises to support non-blocking/asynchronous variables, filters, and blocks.

  • Supports asynchronous variables, tags, functions and filters (helpers)
  • Allows you to add custom tags and filters easily
  • Uses bluebird for super-fast Promises/A+
  • Supports full liquid syntax
  • Based on original Ruby code
  • Written in CoffeeScript
  • High test coverage
<ul id="products">
  {% for product in products %}
      <h2>{{ }}</h2>
      Only {{ product.price | price }}
      {{ product.description | prettyprint | paragraph }}
  {% endfor %}
npm install liquid-node --save

Liquid supports a very simple API based around the Liquid.Engine class. For standard use you can just pass it the content of a file and call render with an object.

Liquid = require("liquid-node")
var engine = new Liquid.Engine
  .parse("hi {{name}}")
  .then(function(template) { return template.render({ name: "tobi" }); })
  .then(function(result) { console.log(result) });
// or 
  .parseAndRender("hi {{name}}", { name: "tobi" })
  .then(function(result) { console.log(result) });
app.get(function(reqres) {
    .parseAndRender("hi {{name}}", { name: "tobi" })
    .nodeify(function(errresult) {
      if (err) {
        res.end("ERROR: " + err);
      } else {
  myFilterfunction(input) {
    return String(input).toUpperCase()

Since the code is based on the Ruby implementation we use CoffeeScript's class which is a little bit difficult to write in pure JavaScript. Take a look at the existing tags to see how to implement them.

class MyTag extends Liquid.Tag
  render: ->
    "that's me!"
engine.registerTag "MyTag"MyTag
npm test

LiquidNode is released under the MIT license.