Find file
Fetching contributors…
Cannot retrieve contributors at this time
83 lines (63 sloc) 2.28 KB


Asset processing and packaging pipeline for Scala and other JVM based applications. Use satchel to develop javascript heavy web applications without worrying about css and javascript request overhead.


  • Directory walking to include all files you want
  • Javascript concatenation and compression with YUI
  • CSS concatenation and compression with YUI
  • On the fly CoffeeScript compilation
  • On the fly Less CSS compilation
  • On the fly Javascript template wrapping
  • Caching for production environments

Javascript satchels

val core = new Satchel(
  name = "core",
  root = "webapp/javascripts/vendor",
  patterns = List(

// yields combined and processed results

The above code registers a satchel by the name of core, and includes jquery, underscore, backbone, and all js files in the lib sub-directory.

Production/Development mode

// enable dev mode
// no caching, no compression
Satchel.devmode = true

// disable dev mode
// compressed and cached
Satchel.devmode = false

Javascript template satchels

val templates = new Satchel(
  name = "templates",
  root = "webapp/javascripts/templates",
  mime = "jst",
  patterns = List(

The above will generate a wrapped JS object for each found template. If for example, a file called index.jst existed in the root directory, we would access the template in javascript via:

var index = JST["/index.jst"]

// or a nested mustache template
var other = JST["/subdirectory/other.mustache"]

CoffeeScript satchels

val coffee = new Satchel(
  name = "coffee",
  root = "webapp/coffeescripts",
  mime = "coffee",
  patterns = List(

Note: coffee-script.js must exist in your classpath, you can get it here:

Running with Scalatra

Simply add the servlet to your servlet container.

context.addServlet(new ServletHolder(new SatchelServlet()), "/bundles/*")

Now you can access your satchels via /bundles/core.js or /bundles/