Continuous Deployment on Mac. Simple, effective, flexible. Works well with static sites.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


NanoCD framework in bash for Mac. Checks git for updates, deploys code, runs tests, mails you on completion.
Allows for promotion to next env.

Dependencies for Mac. Install parallel, timeout + hub with the below:

brew install parallel
brew install coreutils
brew install hub

NanoCD Installation:

(cd /usr/local/bin && curl -O


$ nanocd
nanocd -r <repo> -l <local_checkout> [-b <build-script>] [-w <post-script>]
   [-m <email>] [-a <mail command>] [-t <mail command attach flag>]
   [-s <mail command subject flag] [-e <recipients flag>] [-n name] [-d <dir>] 
   [-c <command>] [-f] [-v] [-h] [-p] [-z]

-r - git repository, eg (required)
-l - local checkout of code (that gets updated to determine whether a run is needed) (required)

-b - build script to run (default $BUILD_SCRIPT)
-w - script to run just after actually performing test (default $DEPLOY_SCRIPT)
-m - email address to send to using "mail" command (default logs to stdout)
-a - mail command to use (default=$MAIL_CMD)
-n - name for ci (unique, must be a valid directory name), eg myproj (default=$PROJECT_NAME)
-d - directory within repository that contains test scripts (default=$TEST_DIR)
-c - test command to run from -d directory (default=$TEST_COMMAND)
-t - attach argument flag for mail command (default=$MAIL_CMD_ATTACH_FLAG, empty string means no-attach)
-f - force a run even if repo has no updates (default off)
-v - verbose logging (default off)
-p - create pull request, merge pull request, set -f flag
-i - timeout in seconds (default 86400, ie one day, does KILL one hour after that)
-z - when using an ssg (static site generator) this generates the public code to be committed (default=$SSG_BUILD_SCRIPT)
-h - show help


- "Clone -r if a git fetch on /path/to/git/root/ indicates there's been an update.
  Then navigate to tests (default), run ./ and mail your@email.tld after successfull or failed completion with results"

  nanocd -r -l /path/to/git/root/ -d tests -c ./ -m your@email.tld
  nanocd -r -l /path/to/git/root/ -m your@email.tld
  nanocd -r -l /path/to/git/root/

- "Run this continuously in a crontab."

  Crontab line to run every 30 min:
  0,30 * * * * nanocd -r -l /path/to/git/root/


*Report issues/ask questions/submit feature requests here: GitHub Issues

Pull requests welcome! Create a branch for each feature or fix you make with the below instructions. If you haven't already:

  1. Fork the repo
  2. Clone your forked repo

Inside cloned repo directory run the below:

  1. git remote add upstream
  2. git fetch upstream
  3. git checkout master
  4. git rebase upstream/master
  5. git checkout -b new_feature_or_fix
  6. git commit -am 'Added feature or fix'
  7. git push origin new_feature_or_fix)
  8. Create new Pull Request

After pull request is merged run the below:

  1. git fetch upstream
  2. git checkout master
  3. git rebase upstream/master
  4. git push


Maintained by tkjef ( and a growing community of contributors. Forked from cheapci.


MIT License, (see LICENSE)
MIT © ianmiell
portions MIT © tkjef

Project Roadmap

Version 0.4
-add automatic Version tagging with Github

Version 0.5
-add better integrity check on pull request being used to cover any edge cases
-add artifact versioning using Github, Artifactory or Nexus

Version 0.6
-add rollback to previous version or specific version capability

Version 0.7
-set generic deploy script to aws s3 that only uploads files that were added/edited,
removes files that were removed
-add better testing options

Version 0.8
-add automatic promotion to envs, deploy to specific env
-add slack alerts

Version 0.9
-add mute/unmute monitoring alerts option for:
datadog, newrelic, grafana, pagerduty, opsgenie, victorops or custom script.

Version 1.0
-polish step-based workflow

Version 1.1
-add advanced load test templates