Papercut is a node package to handle image upload, resize and sync with Amazon s3


Papercut handle image processing, versioning and storage for you, in node.js.

  • envionment configuration
  • node-imagemagick integration for image resize, crop and copy.
  • S3 image upload
var papercut = require('papercut');

  papercut.set('storage', 'file')
  papercut.set('directory', './images/uploads')
  papercut.set('url', '/images/uploads')

papercut.configure('production', function(){
  papercut.set('storage', 'S3')
  papercut.set('S3_KEY', process.env.S3_KEY)
  papercut.set('S3_SECRET', process.env.S3_SECRET)
  papercut.set('bucket', 'papercut')

AvatarUploader = papercut.Schema(function(schema){
    name: 'avatar',
    size: '200x200',
    process: 'crop'

    name: 'small',
    size: '50x50',
    process: 'crop'

uploader = new AvatarUploader();

uploader.process('image1.png', file.path, function(images){
  console.log(images.avatar); // ''
  console.log(images.small); // ''

In papercut, you can set the image directory and default process by getter and setter:

var papercut = require('papercut');

//storage type, have file and s3
papercut.set('storage', 'file');
//directory for saving image
papercut.set('directory', './images/uploads');
//url path to the directory
papercut.set('url', '/images/uploads');
//set output images extension
papercut.set('extension', 'jpg');

Also, you can set the environment dependent configuration, it detect the process.env.NODE_ENV param.
you can call export NODE_ENV=[environment] to change environment.

papercut.configure('production', function(){
  //set storage to s3 for production environment
  papercut.set('storage', 's3');
  //set s3 key from environment.
  papercut.set('S3_KEY', process.env.S3_KEY);
  papercut.set('S3_SECRET', process.env.S3_SECRET);
  //s3 bucket name
  papercut.set('bucket', 'papercut');

After configuration, you can create an uploader to process images with multiple version by Schema

var Uploader = papercut.Schema(function(schema){
    name: 'thumbnail',
    size: '45x45',
    process: 'crop'

    name: 'large',
    size: '600x480',
    process: 'resize'

    name: 'origin',
    process: 'copy'

With uploader, you can pass the image identifier and image path to process images.
Also with images url in different versions:

var uploader = new Uploader();

uploader.process('412341', '/tmp/13912304.jpg', function(err, images){
  // {
  //  thumbnail: '/images/upload/412341-thumbnail.jpg',
  //  large: '/images/upload/412341-large.jpg',
  //  origin: '/images/upload/412341-origin.jpg'
  // }


Check out the express example in project for how to use it in express framework.

  • Process image from previous one to improve processing speed.
  • Custom gravity
  • Api improvement

Author : Jimmy Chao (