0.10.2 • Public • Published

Couchapp Utils

This is a fork of the couchapp module that does not do platform specific stuff that is unnecessary such as playing sounds, if you really want sound, trigger the bell with an ANSI escape sequence, eh?


Install node.

Install npm.

$ git clone repo
$ cd node.couchapp.js
$ npm install
$ npm link .
$ couchapp help
couchapp -- utility for creating couchapps

Usage - old style with single app.js:
  couchapp <command> app.js http://localhost:5984/dbname [opts]

Usage - new style with multiple app files:
  directory based config specified by switch - multiple app files and pre- and post-processing capability)
  couchapp -dc < <appconfigdirectory> http://localhost:5984/dbname

  push   : Push app once to server.
  sync   : Push app then watch local files for changes.
  boiler : Create a boiler project.
  serve  : Serve couchapp from development webserver
            you can specify some options
            -p port  : list on port portNum [default=3000]
            -d dir   : attachments directory [default='attachments']
            -l       : log rewrites to couchdb [default='false']
Directory-based config:

  -dc (directory config) switch uses multiple config files in the directory specified by <appconfigdirectory>

  Any file with a filename that begins with "app" will be executed.


  (i) if the app config directory contains file beforepushsync.js then this will be executed before any of the app files have run
  (ii) if the app config directory contains file afterpushsync.js then this will be executed after all of the app files have run

  beforepushsync.js and afterpushsync.js can be used to perform any before/after processing, using node.js code for example.

  The sample afterpushsync.js shows lookup data being added to CouchDB after the CouchApp has been pushed.

app.js example:

  var couchapp = require('couchapp')
    , path = require('path');

  ddoc = {
      _id: '_design/app'
    , views: {}
    , lists: {}
    , shows: {} 

  module.exports = ddoc;

  ddoc.views.byType = {
    map: function(doc) {
      emit(doc.type, null);
    reduce: '_count'

  ddoc.views.peopleByName = {
    map: function(doc) {
      if(doc.type == 'person') {
        emit(, null);

  ddoc.lists.people = function(head, req) {
      headers: {"Content-type": "text/html"}
    send("<ul id='people'>\n");
    while(row = getRow()) {
      send("\t<li class='person name'>" + row.key + "</li>\n");

  ddoc.shows.person = function(doc, req) {
    return {
      headers: {"Content-type": "text/html"},
      body: "<h1 id='person' class='name'>" + + "</h1>\n"
  ddoc.validate_doc_update = function (newDoc, oldDoc, userCtx) {
    function require(field, message) {
      message = message || "Document must have a " + field;
      if (!newDoc[field]) throw({forbidden : message});

    if (newDoc.type == "person") {

  couchapp.loadAttachments(ddoc, path.join(__dirname, '_attachments'));

Local development server example.

Start the server:

couchapp serve app.js http://localhost:5984/example_db -p 3000 -l -d attachments

Now you can access your couchapp at http://localhost:3000/ . Code, hack and when you are happy with the result simply do:

couchapp push app.js http://localhost:5984/example_db




Package Sidebar


npm i couchapp-util

Weekly Downloads






Last publish


  • muji
  • tmpfs