{"id":17749540,"url":"https://github.com/oresoftware/roodles","last_synced_at":"2025-07-09T09:14:31.684Z","repository":{"id":95713135,"uuid":"82993892","full_name":"ORESoftware/roodles","owner":"ORESoftware","description":"Just like Nodemon, but a little bit different.","archived":false,"fork":false,"pushed_at":"2018-05-30T05:21:17.000Z","size":33,"stargazers_count":1,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-18T16:54:46.135Z","etag":null,"topics":["asynchronous","chokidar","developer-tools","hashbang","nodejs","nodemon","rapid-development","restart","watcher"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ORESoftware.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-02-24T02:45:07.000Z","updated_at":"2018-05-30T05:21:18.000Z","dependencies_parsed_at":"2023-05-21T17:45:32.710Z","dependency_job_id":null,"html_url":"https://github.com/ORESoftware/roodles","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ORESoftware/roodles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ORESoftware%2Froodles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ORESoftware%2Froodles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ORESoftware%2Froodles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ORESoftware%2Froodles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ORESoftware","download_url":"https://codeload.github.com/ORESoftware/roodles/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ORESoftware%2Froodles/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262329451,"owners_count":23294693,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["asynchronous","chokidar","developer-tools","hashbang","nodejs","nodemon","rapid-development","restart","watcher"],"created_at":"2024-10-26T11:23:42.442Z","updated_at":"2025-06-27T20:36:24.490Z","avatar_url":"https://github.com/ORESoftware.png","language":"JavaScript","readme":"\n\n# roodles (NPM project)\n\nThis project is just like Nodemon. It strives to accomplish the same thing.\nMy team was having troubles with Nodemon, and so we wrote something we \ncould tweak on our own. Maybe it works better, maybe it doesn't. We think it does.\nAll the code is in one file, so you can steal it easily :)\n\n\n## Installation\n\n=\u003e ```npm install -D roodles@latest```\n\nYou can put a ```roodles.conf.js``` file at the root of your project:\n\n```js\n//roodles.conf.js\n\nmodule.exports = Object.freeze({\n   exec: '\u003cpath-to-exec-file\u003e',  // any binary file or a file with a hashbang\n   include: ['c'],   // list of regexes or strings\n   exclude: [/a/,'b'],\n   verbosity: 2,  // an integer {1,2,3}\n   processArgs: []  // the args that get sent to your process\n});\n\n```\n\n# Recommended workflow\n\nInstall roodles as a dev dependency (as described above).\n\nThen add this bash script to your project:\n\n```bash\n#!/usr/bin/env bash\n\ncd $(dirname \"$0\")\n./node_modules/.bin/roodles $@\n```\n\nThen just run this bash script, and roodles will do its thing.\n\n\n# Usage: Here's the API\n\n_Currently the API is a command line interface (CLI) only._\n\nAfter installing locally, you can run:\n\n```terminal\n./node_modules/.bin/roodles \n```\n\n\nif you don't use the ```roodles.conf.js``` file, then you will need to\nat the very least specify which exec file to use.\n\nTo specify that, you will use the --exec option like:\n\n```terminal\n./node_modules/.bin/roodles --exec \u003cfile\u003e\n```\nremember that your --exec file must have a hashbang or be binary.\n\n## Remember\n\nTo use roodles, your --exec file must be binary or have a hashbang; with node.js, that looks like:\n\n```js\n#!/usr/bin/env node\nconsole.log('this node.js file has a hashbang at the top, telling ' +\n 'the OS which executable to use to execute the file.');\n```\n\nUsing the hashbang scheme means you can easily go beyond node.js exec scripts, and use bash, python, ruby,\nperl, or even binary files like golang executables (which don't need a hashbang), etc, etc.\n\n\n## Here are the default roodles.conf.js options:\n\n```js\n\nconst defaults = {\n  verbosity: 2,              // 1 is lowest verbosity, 3 is highest\n  signal: 'SIGKILL',         // We recommend using SIGINT or SIGTERM and gracefully shutting down your process instead*\n  processArgs: [],           // we don't know what args to pass to your process!\n  restartUponChange: true,\n  restartUponAddition: false,\n  restartUponUnlink: false,\n  processLogPath: null,         // if desired, pass a relative or absolute path to log file\n  include: projectRoot,         // default is to watch all files in your project\n  exclude: [                    //...all files except the following!\n    /node_modules/,\n    /public/,\n    /bower_components/,\n    /.git/,\n    /.idea/,\n    /package.json/,\n    /test/\n  ]\n};\n\n```\n\n\n### Here's the current --help output\n\n```\n\noptions:\n    --version                           Print tool version and exit.\n    -h, --help                          Print the help information and exit.\n    -v INT, --verbosity=INT             Verbosity level =\u003e {1, 2, or 3}; the\n                                        higher, the more verbose; default is 2.\n    --process-args=ARG                  These args are directly passed to your\n                                        running process, your should surround\n                                        with quotes like so:\n                                        --process-args=\"--foo bar --baz bam\".\n    --ruc, --restart-upon-change, --restart-upon-changes\n                                        Roodles will restart your process upon\n                                        file changes.\n    --rua, --restart-upon-addition, --restart-upon-additions\n                                        Roodles will restart your process upon\n                                        file additions.\n    --ruu, --restart-upon-unlink, --restart-upon-unlinks\n                                        Roodles will restart your process upon\n                                        file deletions/unlinking.\n    --exec=ARG                          Relative or absolute path of the file\n                                        you wish to execute (and re-execute on\n                                        changes).\n    --include=ARG                       Include these paths (array of regex\n                                        and/or strings).\n    --exclude=ARG                       Exclude these paths (array of regex\n                                        and/or strings).\n    -s ARG, --signal=ARG                The --signal option is one of\n                                        {\"SIGINT\",\"SIGTERM\",\"SIGKILL\"}.\n\n\n```\n\n\n# name: roodles ?\n\nRoodles is just something I say on occasion, more like: \"roodles!\". \nAt some point I would have used this name for a software project.\nThis was the right one. I think of roodles being similar to \"redo\"...like, \"restart\". \n\nroodles~redo.\n\n\n## Example\n\nHere is an example exec file (a server, which is standard use case), and how to *shutdown gracefully,\nusing SIGINT instead of SIGKILL. You can use SIGTERM/SIGINT, both are better than SIGKILL.\n\n```js\n#!/usr/bin/env node\n\nconst http = require('http');\n\nconst server = http.createServer(function (req, res) {\n  setTimeout(function () {\n    res.write('flowers');\n    res.end();\n  }, 100);\n});\n\nlet exitCode;\n\nserver.listen(3000, function () {\n  \n  console.log(' =\u003e Server is listening on port 3000');\n  \n  process.once('close', function(){\n      process.exit(exitCode || 0);\n  });\n\n  process.once('SIGINT', function (code) {\n    console.log('SIGINT received...');\n    server.close();\n  });\n\n});\n\n\n```\n\nnote the hashbang as well as the ```process.once('SIGINT')``` handler, which will allow us to\ngracefully shut down our process.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foresoftware%2Froodles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foresoftware%2Froodles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foresoftware%2Froodles/lists"}