{"id":40702894,"url":"https://github.com/sourcevault/remotemon","last_synced_at":"2026-01-21T12:07:04.660Z","repository":{"id":41494699,"uuid":"278771873","full_name":"sourcevault/remotemon","owner":"sourcevault","description":"Ansible for raspberry Pi.","archived":false,"fork":false,"pushed_at":"2023-03-13T09:43:40.000Z","size":2476,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"dev","last_synced_at":"2026-01-18T14:19:21.103Z","etag":null,"topics":["chokidar","configuration","nodemon","remote-code","rsync","watch"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sourcevault.png","metadata":{"files":{"readme":"readme.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"COPYING.txt","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":"2020-07-11T02:21:58.000Z","updated_at":"2023-01-31T21:56:45.000Z","dependencies_parsed_at":"2024-11-15T02:03:41.378Z","dependency_job_id":"189bc56b-86b0-402d-aa0f-bd07020f8a1c","html_url":"https://github.com/sourcevault/remotemon","commit_stats":{"total_commits":103,"total_committers":1,"mean_commits":103.0,"dds":0.0,"last_synced_commit":"c124c61c24146971d3de5269a05349ba98598a1e"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sourcevault/remotemon","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcevault%2Fremotemon","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcevault%2Fremotemon/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcevault%2Fremotemon/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcevault%2Fremotemon/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sourcevault","download_url":"https://codeload.github.com/sourcevault/remotemon/tar.gz/refs/heads/dev","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sourcevault%2Fremotemon/sbom","scorecard":{"id":839479,"data":{"date":"2025-08-11","repo":{"name":"github.com/sourcevault/remotemon","commit":"c124c61c24146971d3de5269a05349ba98598a1e"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENCE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENCE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'dev'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-23T20:06:02.576Z","repository_id":41494699,"created_at":"2025-08-23T20:06:02.576Z","updated_at":"2025-08-23T20:06:02.576Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28632781,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T04:47:28.174Z","status":"ssl_error","status_checked_at":"2026-01-21T04:47:22.943Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["chokidar","configuration","nodemon","remote-code","rsync","watch"],"created_at":"2026-01-21T12:07:03.952Z","updated_at":"2026-01-21T12:07:04.653Z","avatar_url":"https://github.com/sourcevault.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![](https://raw.githubusercontent.com/sourcevault/remotemon/dev/logo.jpg)\n\n\n**Install**\n```js\nsudo npm i -g remotemon \nsudo yarn global add remotemon # OR\nsudo pnpm add -g remotemon # OR\n```\n\n`remotemon` is a cli automation tool for building/copying/executing code on remote machines and monitoring the result.\n\nIts main use-case is for developing / running scripts on remote machines like the raspberry pi ..\n\n.. but can also be used for purposes that would normally be done using  `make` / `nodemon` 😀.\n\n```bash\nremotemon reboot # reboot remote machine 😏\nremotemon ssh45 # to change default ssh port to 45 👮🏼‍♂️\n```\n\n```yaml\n# Example Config File\nreboot:\n  remote:\n    - sudo reboot\n\nshutdown:\n  remote:\n    - shutdown -h now\n\nssh45:\n  local:\n    - scp sshd_config ${remotehost}:/tmp/sshd_config\n  remote:\n    - sudo mv /tmp/sshd_config /etc/ssh/sshd_config\n    - sudo systemctl restart ssh.service\n```\n#### 🟡 How to Use\n\nA local configuration files (`.remotemon.yaml`) is used to organize different sub-commands to run in a project.\n\n`⛔️ In remotemon lingo a project is top level folder name in your service directory. ⛔️`\n\nFirst argument to `remotemon` is the name of the build routine to use, subsequent arguments can be used internally as variables using handlebar syntax (eg. `${0}`), or `.global` variables using `=` ( eg. `file=main.js` ).\n\n```zsh\n~/app:(dev*) remotemon shutdown\n```\n\nRunning `remotemon` without any arguments makes `remotemon` execute default routine present in provided configuration file.\n\n```zsh\n~/app:(dev*) remotemon\n```\n\n`remotemon` has taken inspiration from [runit](http://smarden.org/runit/) in how to structure projects, just like in `runit`, you have to provide a **service directory** name ( can be any folder in your disk ), each folder within that directory is considered a project.\n\n`remotemon` also stores it's configuration data in your home folder's `.config` folder ( `~/.config/config.remotemon.yaml` ).\n\n#### 🟡 Creating Configuration `YAML` File\n\n- **Quick Example**\n\n```yaml\n  remotehost: pi@192.152.65.12\n  remotefold: ~/test\n  local: make local\n  remote: make remote\n```\n\n```yaml\n  remotehost: pi@192.152.65.12\n  remotefold: ~/test\n  local: make local\n  remote: make remote\n```\n\n```yaml\n  remotehost: pi@192.152.65.12\n  remotefold: ~/test\n  local: make local\n  remote: make remote\n  rsync:                        # rsync options\n    - recursive\n    - exclude:\n      - .gitignore\n      - .ls\n      - .git\n```\n\n```yaml\n  remotehost: pi@192.152.65.12\n  remotefold: ~/test\n  local: make local\n  remote: make remote\n  rsync:\n    - recursive\n    - exclude:\n      - .gitignore\n      - .ls\n      - .git\n  test1:                        # custom routine\n    remotefold: ~/test1\n```\n\n- **Creating custom named builds**\n\n  Named builds can be created at top-level as long as the name does not clash with **reserved keyword**, they **cannot** also contain `/` character in their name ( e.g `mybui/ld1` would be considered incorrect ):\n\n```yaml\nmybuild1:\n  remotehost: pi@192.152.65.12\n  remotefold: ~/test\n  local: make pi1\n  remote: make mybuild1\nmybuild2:\n  remotehost: pi@192.168.43.51\n  remotefold: ~/build\n  local: make pi2\n  remote: make mybuild2\n```\nvalues not provided in a build are merged with default provided at top-level, in case defaults don't exist at top level then values are extracted from module's internal defaults.\n\n```yaml\nrsync:\n  - recursive\n  - exclude:\n    - .gitignore\n    - .ls\n    - .git\nmybuild1:\n  remotehost: pi@192.152.65.12\n  remotefold: ~/test\n  local: make pi1\n  remote: make mybuild1\nmybuild2:\n  remotehost: pi@192.152.65.12\n  remotefold: ~/build\n  local: make pi2\n  remote: make mybuild2\n```\n\nIn the above config file for example, `mybuild1` and `mybuild2` get their rsync values from the common `rsync` field.\n\nSince rsync's default `src` and `des` are not provided by user in our config file, they are derived from `remotemon`'s internal defaults.\n\n#### 🟡 **all configuration options**\n\n- `remotehost`  - `{username}@{ipaddress}` / ssh name of remote client.\n- `remotefold`  - folder in remote client where we want to execute our script.\n- `watch`       - local file(s) or folders(s) to watch for changes.\n- `ignore`      - files to **not** watch.\n- `pre`         - local commands to run before setting up watch, *runs only **once***.\n- `local`       - local commands to run after a change in file is detected.\n- `remote`      - command to execute in remote client.\n- `final`       - command to execute after `remote` returns `exit 0`.\n- `ssh`         - custom `ssh` config options\n    - `startwith` - command(s) to run for each ssh session.\n    - `option`    - ssh options (default is `-tt -o LogLevel=QUIET`).\n- `verbose`     - hardcode verbose level of printing for command.\n- `silent`      - hardcode commandline `--silent` option ( use sparsely ).\n- `pwd`         - specify if the command is run in the directory of the project, or in the working directory, by default(`false`) it runs in project directory.\n\n- `description` - provide a brief description of what the command does.\n\n- `defarg`      - default values for empty commandline arguments, for enforcing minimum commandline arguments, a number can be provided.\n- `initialize`  - boolean value to specify if a first run is performed or not when command is run, default is `true`.\n\n- `rsync` - rsync options ( currently supported ) :\n    - `src` - source folder(s) to sync.\n    - `des` - destination folder in remote client.\n    - `recursive`▪️`verbose`▪️`quiet`▪️`no-motd`▪️`exclude:`▪️`checksum`▪️`archive`▪️`relative`▪️`no-OPTION`▪️`no-implied-dirs`▪️`backup`▪️`update`▪️`inplace`▪️`append`▪️`append-verify`▪️`dirs`▪️`links`▪️`copy-links`▪️`copy-unsafe-links`▪️`safe-links`▪️`copy-dirlinks`▪️`keep-dirlinks`▪️`hard-links`▪️`perms`▪️`executability`▪️`chmod:`▪️`acls`▪️`xattrs`▪️`owner`▪️`group`▪️`devices`▪️`specials`▪️`devices`▪️`specials`▪️`times`▪️`omit-dir-times`▪️`super`▪️`fake-super`▪️`sparse`▪️`dry-run`▪️`whole-file`▪️`one-file-system`▪️`existing`▪️`ignore-existing`▪️`remove-soucre-files`▪️`del`▪️`delete`▪️`delete-before`▪️`delete-during`▪️`delete-delay`▪️`delete-after`▪️`delete-excluded`▪️`ignore-errors`▪️`force`▪️`partial`▪️`delay-updates`▪️`prune-empty-dirs`▪️`numeric-ids`▪️`ignore-times`▪️`size-only`▪️`compress`▪️`cvs-exclude`▪️`F`▪️`from0`▪️`protect-args`▪️`blocking-io`▪️`stats`▪️`8-bit-output`▪️`human-readable`▪️`progress`▪️`P`▪️`itemize-changes`▪️`list-only`\n\n    - `block-size:`▪️`rsh:`▪️`rsync-path:`▪️`max-delete:`▪️`max-size:`▪️`max-size:`▪️`partial-dir:`▪️`timeout:`▪️`contimeout:`▪️`modify-window:`▪️`temp-dir:`▪️`fuzzy:`▪️`compare-dest:`▪️`copy-dest:`▪️`link-dest:`▪️`compress-level:`▪️`skip-compress:`▪️`filter:`▪️`exclude:`▪️`exclude-from:`▪️`include:`▪️`include-from:`▪️`files-from:`▪️`address:`▪️`port:`▪️`sockopts:`▪️`out-format:`▪️`log-file:`▪️`log-file-format:`▪️`password-file:`▪️`bwlimit:`▪️`write-batch:`▪️`only-write-batch:`▪️`read-batch:`▪️`protocol:`▪️`iconv:`▪️`checksum-seed:`\n\n\n#### 🟡 `cli` variables\n\n- **Named**\n\n  In `make` we can change internal variables (eg.`env`,`file`) from the command line in this way:\n\n  ```bash\n  make file=/dist/main.js\n  make env=prod file=/dist/main.js\n  make compile env=prod file=/dist/main.js\n  ```\n  in remotemon the same thing can do done :\n\n  ```bash\n  remotemon file=/dist/main.js\n  ```\n\n  it changes the internal value(s) of **associated key** in `global`:\n\n  ```yaml\n  val:\n    file: /dist/main.js # \u003c-- old value replaced with value taken from commandline\n  remotehost: pi@192.152.65.12\n  remotefold: ~/test\n  local: make local ${global.file}\n  remote: make remote\n  ```\n\n  this way we can edit the values of our makefile without opening either `.remotemon.yaml` or `makefile`.\n\n- **Unnamed**\n\n  Sometimes it's more convenient to not have to name your variables.\n\n  Instead of `remotemon file=/dist/main.js` we would like to do `remotemon /dist/main.js`.\n\n  We can in situation like that use numbered templating `${0}`,`${1}` in our config file.\n\n  `defarg` field can also be used to provide default values if the user does not specify them.\n\n  If we know the most common file name is `/dist/main.js` we could use `defarg: [/dist/main.js]` to not have to always provide the filename as an argument.\n\n***When not to use remotemon ?***\n\n- when your build process gets complicated enough to warrant the use of gulpfiles, makefiles, etc.\n\n- `remotemon` is meant for situations where you are constantly having to configure linux system files, but also developing and running code on remote machines, that involves complicated `rsync` and `ssh` commands, but prefer to change those files from the comfort of your favorite local text editor - not everybody uses vim.\n\n- `--edit`\n\n  It's possible to make **permanent edits** on `.remotemon.yaml` without opening them using the `-e`/`--edit` flag.\n\n  For example if the IP address of the host has changed, you could do :\n\n  `remotemon -e remotehost=user@192.168.43.52`\n\n  and the remotehost field would have value of `user@192.168.43.52`\n\n  It's also possible to change inner values of custom defined tasks ( using `/` to define nesting ) :\n\n  `remotemon -e mybuild1/remotehost=user@192.168.43.52`\n\n\n##### 🟡 all commandline options\n\n- `--watch-config-file` or `-w`  restarts on config file change by default.\n\n- `--dry-run` or `-d` would disable all execution, used for checking and making sure all the commands are accurate.\n\n- `--verbose,-v` ( also  `-vv`)  would show all the command in their full form.\n\n- `-l,--list` to see all the different commands from the command line itself.\n\n- `-m --auto-make-directory` make remote directory if it doesn't exist.\n\n    `-mm`  ( with root permission )\n\n- `-V --version` displays version number\n\n- `-n --no-watch` force disable any and all watches\n\n- `-s --silent` do not show `remotemon` message\n\n- `-e --edit` make permanent edits to `.remotemon.yaml` values.\n\n- `-p --project` folder name ( in service directory ) to look for `.remotemon.yaml`\n\n- `-c --cat` dump the output of the current config file being used.\n\n  `-cc` same as -c but with comments\n\n  `-ccc` show raw json for final process state\n\n\n##### 🔴 Bugs\n\n- [same object ref doesn't work #6](https://github.com/arthurlacoste/tampa/issues/6)\n\nFor now it's not possible for `remotemon` to do two levels of referencing in config file, as `remotemon` uses `tampax`, and the issue is with `tampax`, write your config files to work around the issue ( for now ).\n\n#### LICENCE\n\n- Code released under BSD-3-Clause.\n- Documentation and images released under CC BY-NC-ND 4.0.\n- details can be found [here](https://github.com/sourcevault/remotemon/blob/dev/COPYING.txt).\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsourcevault%2Fremotemon","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsourcevault%2Fremotemon","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsourcevault%2Fremotemon/lists"}