Skip to content
Port of the Liquid template engine to Node.js (with support for asynchrony through Promises)
CoffeeScript Shell
Find file
New pull request
Latest commit 75702a8 @sirlantis added test for #40

Liquid with Node.js

NPM version Downloads GitHub Issues
Build Status Coverage Status Dependency Status devDependency Status

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

What does it look like?

<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) });

Usage with Connect

app.get(function(req, res) {
    .parseAndRender("hi {{name}}", { name: "tobi" })
    .nodeify(function(err, result) {
      if (err) {
        res.end("ERROR: " + err);
      } else {

Registration of new filters

  myFilter: function(input) {
    return String(input).toUpperCase()

Registration of new Tags

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

How to run the tests

npm test

Similar libraries


LiquidNode is released under the MIT license.

Something went wrong with that request. Please try again.