cliffano/jazz

OG template engine for Node.js

JavaScript

60

64 commits

updated Sep 16, 2026

See the code

README

Avatar

Build Status Dependencies Status Code Scanning Status Coverage Status Security Status Published Version

Jazz

Jazz is a minimalistic template engine with zero runtime dependency.

One of the OG template engines with first commit from 2010.

Installation

npm install jazz

Usage

import jazz from "jazz";
import sys from "sys";

const template = jazz.compile("my template source code {someVariable}");
template.eval({"someVariable": "lolmuffin"}, function(data) { sys.puts(data); });

This example would output the following:

my template source code lolmuffin

Printing variables

{someVariable}

This works for any type of expression, so the following should also work:

{users.fred}
{"hello"}
{45}
{a eq b}

Filter functions

You can call filter functions like so:

{someFilter(arg1, arg2)}

Filter functions are statements, NOT expressions so they cannot be chained nor used in if/forelse/etc. tests. However, calls can be made on any type of expression -- e.g.

{math.sin(45)}

Implementing filter functions

Filter functions may block so rather than returning the value you want rendered as you might in other frameworks, jazz passes in a callback to your filter function that you then call to indicate that you have a result. e.g. here we simulate a blocking operation using setTimeout().

// sum.jazz

{sum(5, 10)}
// sum.js

import jazz = from "jazz";

const params = {
    sum: function(arg1, arg2, cb) {
        setTimeout(function() {
            cb((arg1 + arg2).toString());
        }, 2000);
    }
}
jazz.compile("sum.jazz").eval(params, function(output) { console.log(output); });

Note that even though the execution of the callback is delayed, this example still works.

Conditional Statements

You can check if a variable evaluates to a true value like so:

{if name}
    Hello, {name}
{end}

Else clauses are also supported:

{if name}
    Hello, {name}
{else}
    Hello, Captain Anonymous
{end}

As are else..if clauses:

{if firstName}
    Hello, {firstName}
{elif lastName}
    Hello, Mr. {lastName}
{else}
    Hello, Captain Anonymous
{end}

Limited logical expressions are also possible:

{if user.lastName and user.isVip}
    Hello, Mr. {user.lastName}, my good man!
{end}

{if fred.tired or fred.bored}
    Fred: "Yawn!"
{end}

{if not awake}
    Zzz
{end}

eq & neq comparison operators are available for comparing two values:

{if config.feature eq "enabled"}
    Feature is enabled!
{end}

{if status neq "inactive"}
    Huzzah!
{end}

You can also group expressions using parentheses:

{if (a and b) or c}
    ...
{end}

Looping over an array

{foreach item in someArray}
    <p>{item}</p>
{end}

The value being iterated over can be any expression supporting an Array-like interface.

Looping over an object

{foreach pair in someObject}
    <p>{pair.key} = {pair.value}</p>
{end}

Synchronous functions

{if @blah('a')}
    <p>There were so many blahs in a</p>
{end}

The function is provided to the template the same way asynchronous functions are, just with a return instead of a cb.

Loop counters / index

{foreach pair in someObject}
    <p>Loop number (1 based): {__count}</p>
    <p>Index (0 based): {__index}</p>
    <p>{pair.key} = {pair.value}</p>
{end}

Looking into arrays/objects

<p>{object['array'][0].cheese}</p>

Credits

Jazz was created by the brilliant Thomas Lee and Daniel Brain during the era of Shine Technologies early adoption of node.

Colophon

Developer's Guide

Build reports:

nodejs
template

cliffano/jazz

OG template engine for Node.js

JavaScript

60

64 commits

updated Sep 16, 2026

See the code

README

Avatar

Build Status Dependencies Status Code Scanning Status Coverage Status Security Status Published Version

Jazz

Jazz is a minimalistic template engine with zero runtime dependency.

One of the OG template engines with first commit from 2010.

Installation

npm install jazz

Usage

import jazz from "jazz";
import sys from "sys";

const template = jazz.compile("my template source code {someVariable}");
template.eval({"someVariable": "lolmuffin"}, function(data) { sys.puts(data); });

This example would output the following:

my template source code lolmuffin

Printing variables

{someVariable}

This works for any type of expression, so the following should also work:

{users.fred}
{"hello"}
{45}
{a eq b}

Filter functions

You can call filter functions like so:

{someFilter(arg1, arg2)}

Filter functions are statements, NOT expressions so they cannot be chained nor used in if/forelse/etc. tests. However, calls can be made on any type of expression -- e.g.

{math.sin(45)}

Implementing filter functions

Filter functions may block so rather than returning the value you want rendered as you might in other frameworks, jazz passes in a callback to your filter function that you then call to indicate that you have a result. e.g. here we simulate a blocking operation using setTimeout().

// sum.jazz

{sum(5, 10)}
// sum.js

import jazz = from "jazz";

const params = {
    sum: function(arg1, arg2, cb) {
        setTimeout(function() {
            cb((arg1 + arg2).toString());
        }, 2000);
    }
}
jazz.compile("sum.jazz").eval(params, function(output) { console.log(output); });

Note that even though the execution of the callback is delayed, this example still works.

Conditional Statements

You can check if a variable evaluates to a true value like so:

{if name}
    Hello, {name}
{end}

Else clauses are also supported:

{if name}
    Hello, {name}
{else}
    Hello, Captain Anonymous
{end}

As are else..if clauses:

{if firstName}
    Hello, {firstName}
{elif lastName}
    Hello, Mr. {lastName}
{else}
    Hello, Captain Anonymous
{end}

Limited logical expressions are also possible:

{if user.lastName and user.isVip}
    Hello, Mr. {user.lastName}, my good man!
{end}

{if fred.tired or fred.bored}
    Fred: "Yawn!"
{end}

{if not awake}
    Zzz
{end}

eq & neq comparison operators are available for comparing two values:

{if config.feature eq "enabled"}
    Feature is enabled!
{end}

{if status neq "inactive"}
    Huzzah!
{end}

You can also group expressions using parentheses:

{if (a and b) or c}
    ...
{end}

Looping over an array

{foreach item in someArray}
    <p>{item}</p>
{end}

The value being iterated over can be any expression supporting an Array-like interface.

Looping over an object

{foreach pair in someObject}
    <p>{pair.key} = {pair.value}</p>
{end}

Synchronous functions

{if @blah('a')}
    <p>There were so many blahs in a</p>
{end}

The function is provided to the template the same way asynchronous functions are, just with a return instead of a cb.

Loop counters / index

{foreach pair in someObject}
    <p>Loop number (1 based): {__count}</p>
    <p>Index (0 based): {__index}</p>
    <p>{pair.key} = {pair.value}</p>
{end}

Looking into arrays/objects

<p>{object['array'][0].cheese}</p>

Credits

Jazz was created by the brilliant Thomas Lee and Daniel Brain during the era of Shine Technologies early adoption of node.

Colophon

Developer's Guide

Build reports:

nodejs
template

Project health

npm

Latest release

1.2.0 · Aug 22, 2026

Releases this year

3

Significant stargazers

Tom Lee

79 followers · starred May 2010