{"id":15506842,"url":"https://github.com/manovotny/rsync-generator","last_synced_at":"2026-04-29T17:41:06.677Z","repository":{"id":32553897,"uuid":"36136270","full_name":"manovotny/rsync-generator","owner":"manovotny","description":"A node script to run or generate rsync scripts for backups.","archived":false,"fork":false,"pushed_at":"2025-09-30T03:02:41.000Z","size":386,"stargazers_count":2,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-30T03:24:21.164Z","etag":null,"topics":["backup","node","rsync","script"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/manovotny.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":".github/funding.yml","license":"license","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"manovotny"}},"created_at":"2015-05-23T18:17:14.000Z","updated_at":"2025-09-30T01:39:48.000Z","dependencies_parsed_at":"2025-09-30T03:15:17.140Z","dependency_job_id":"aa50901d-e1a8-4502-aaa3-ce02be0db281","html_url":"https://github.com/manovotny/rsync-generator","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/manovotny/rsync-generator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manovotny%2Frsync-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manovotny%2Frsync-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manovotny%2Frsync-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manovotny%2Frsync-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/manovotny","download_url":"https://codeload.github.com/manovotny/rsync-generator/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/manovotny%2Frsync-generator/sbom","scorecard":{"id":615572,"data":{"date":"2025-08-11","repo":{"name":"github.com/manovotny/rsync-generator","commit":"0d5af2d6d6190d38c1d37262d6bec34403c89ee7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Maintained","score":1,"reason":"2 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 1","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","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":"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":"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":"Pinned-Dependencies","score":4,"reason":"dependency not pinned by hash detected -- score normalized to 4","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:10: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:13: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/release.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/release.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/test.yml:8: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/test.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/test.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/manovotny/rsync-generator/test.yml/main?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned","Info:   2 out of   2 npmCommand dependencies pinned"],"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/release.yml:1","Warn: no topLevel permission defined: .github/workflows/test.yml:1","Info: no jobLevel write permissions found"],"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":"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":"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":"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":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: license:0","Info: FSF or OSI recognized license: MIT License: license: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":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 4 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"14 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-67hx-6x53-jw92","Warn: Project is vulnerable to: GHSA-93q8-gq69-wqmw","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-9c47-m6qq-7p4h","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-xvch-5gv4-984h","Warn: Project is vulnerable to: GHSA-c2qf-rxjj-qqgw","Warn: Project is vulnerable to: GHSA-7p7h-4mm5-852v","Warn: Project is vulnerable to: GHSA-g3ch-rx76-35fx","Warn: Project is vulnerable to: GHSA-j8xg-fqg3-53r7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-21T03:50:59.421Z","repository_id":32553897,"created_at":"2025-08-21T03:50:59.421Z","updated_at":"2025-08-21T03:50:59.421Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32437109,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T17:34:55.123Z","status":"ssl_error","status_checked_at":"2026-04-29T17:34:45.749Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6: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":["backup","node","rsync","script"],"created_at":"2024-10-02T09:29:09.918Z","updated_at":"2026-04-29T17:41:06.672Z","avatar_url":"https://github.com/manovotny.png","language":"JavaScript","funding_links":["https://github.com/sponsors/manovotny"],"categories":[],"sub_categories":[],"readme":"# rsync-generator\n\n\u003e A node script to run or generate rsync scripts for backups.\n\n## Installation\n\n```\n$ npm i -g rsync-generator\n```\n\n## Usage\n\n`rsync-generator` requires a `~/.config/backup/settings.json` file to know what to do.\n\nOnce that's in place, run `rsync-generator` from a command line to either run rsync in realtime or to generate an executable bash script.\n\nIf you make changes to the config, you will need to run `rsync-generator` again.\n\n## Configuration\n\nThe `~/.config/backup/settings.json` file can have the following options.\n\nExample:\n\n```\n{\n    \"destination\": \"backup-server.io/\",\n    \"exclude\": [\n        \".DS_Store\",\n        \"node_modules\"\n    ],\n    \"output\": \"/run.sh\",\n    \"sources\": [\n        \"/path/to/directory\",\n        \"/path/to/some.file\"\n    ]\n}\n```\n\n### sources\n\n\u003e array (required)\n\nSpecifies the resources files and directories to process.\n\n### destination\n\n\u003e string (required)\n\nSpecifies the destination of where to rsync resources to.\n\nNote: `rsync-generator` creates a directory at the destination with the computer name, allowing multiple computers to be backed up to the same destination.\n\n### excludes\n\n\u003e array (optional)\n\nA list of files and / or folders to ignore while syncing, ie. `.DS_Store`, `node_modules`, etc., if specified.\n\n### output\n\n\u003e string (optional)\n\nGenerates an executable bash script at the specified path.\n\nExample: `/Users/USERNAME/.config/backup/run.sh`\n\nIf this isn't specified, `rsync-generator` will run in realtime with command line output.\n\n## Using with macOS for Automated Backups\n\nI thought it might be helpful out outline how I use this package to create automated backups using macOS.\n\n### Choose Backup Destination\n\nYou'll need select a destination to sync to. The most common ways are an external hard drive or a host / service.\n\n#### External Hard Drive\n\nThis is a fairly common choice for cheap and local backups. The destination in this case would be the file path of the mounted volume once it's plugged into your computer.\n\n#### Host or Service\n\nIf you're looking for a bit more more protection and resiliency in your backups (ie. house fire, etc.), you can choose a host or a service. This could be as simple as an S/FTP server with rsync installed or a dedicated service.\n\nI back up to iCloud now, but I used to use a service called [Rsync.net](https://rsync.net). If you wind up going with Rsync.net, you'll want to use their [Generate SSH Keys](https://www.rsync.net/resources/howto/ssh_keys.html) guide to get everything setup and authenticated.\n\nYou can use the guide above for many services that use SSH.\n\n### Update Rsync\n\nUnfortunately, macOS ships with an old version of rsync. You'll want to update this for way better performance and newer features.\n\n1. Install [Homebrew](https://brew.sh), if you don't have that already install\n1. Then install an updated version of rysnc by running `brew install rsync` from a command line\n1. When installation is complete, you'll want to navigate to `/private/etc/paths`, open the file, and ensure `/usr/local/bin` is listed above above `/usr/bin`. This ensures you're running the Homebrew installed version of rsync instead of the version that comes with macOS\n\n### Setup Configuration\n\n1. Create a [configuration as specified above](#usage)\n1. You want to [specify an output location](#output). I typically use the same directory as the config, `/Users/USERNAME/.config/backup/run.sh`\n\n### Setup Automation\n\nWe're going to create a [launchd](https://www.launchd.info) script. That likely sounds intimidating if you've never done it before, so let's break it down.\n\n#### Create a LaunchAgent\n\nA LaunchAgent is just a fancy Apple word for a scheduled job. We need to create a file that will tell our backup script to run on a given interval.\n\n1. Start by showing hidden files on your Mac by pressing `⌘⇧.` in any Finder window (you can press that same sequence again to hide files)\n1. Navigate to `~/Library/LaunchAgents`\n1. Create a new file named `backup.plist` in the folder\n1. Copy and paste the following into the `backup.plist` file contents\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\"?\u003e\n\u003c!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\"\u003e\n\u003cplist version=\"1.0\"\u003e\n    \u003cdict\u003e\n    \t\u003ckey\u003eLabel\u003c/key\u003e\n    \t\u003cstring\u003ebackup\u003c/string\u003e\n    \t\u003ckey\u003eEnvironmentVariables\u003c/key\u003e\n    \t\u003cdict\u003e\n    \t\t\u003ckey\u003ePATH\u003c/key\u003e\n    \t\t\u003cstring\u003e/usr/local/bin:/usr/bin:/bin\u003c/string\u003e\n    \t\t\u003ckey\u003eTERM\u003c/key\u003e\n    \t\t\u003cstring\u003exterm-color\u003c/string\u003e\n    \t\u003c/dict\u003e\n    \t\u003ckey\u003eProgramArguments\u003c/key\u003e\n    \t\u003carray\u003e\n    \t\t\u003cstring\u003e/bin/bash\u003c/string\u003e\n    \t\t\u003cstring\u003e/Users/USERNAME/.config/backup/run.sh\u003c/string\u003e\n    \t\u003c/array\u003e\n    \t\u003ckey\u003eRunAtLoad\u003c/key\u003e\n    \t\u003ctrue/\u003e\n    \t\u003ckey\u003eStartInterval\u003c/key\u003e\n    \t\u003cinteger\u003eINTERVAL\u003c/integer\u003e\n    \t\u003ckey\u003eStandardOutPath\u003c/key\u003e\n    \t\u003cstring\u003e/Users/USERNAME/.config/backup/status.log\u003c/string\u003e\n    \t\u003ckey\u003eStandardErrorPath\u003c/key\u003e\n    \t\u003cstring\u003e/Users/USERNAME/.config/backup/status.log\u003c/string\u003e\n    \u003c/dict\u003e\n\u003c/plist\u003e\n```\n\nThere are two things you'll need to change in the content above.\n\n1. `USERNAME`: This will be the username you use on your Mac\n1. `INTERVAL`: How often you want the backup script to run. This value should be in seconds. So if you want it to backup every 15 minutes, then you would use `900` (ie. 15 minutes \\* 60 seconds per minute)\n\n#### Load LaunchAgent\n\nNow that the LaunchAgent is created, we need to queue it up to run. This can be done by either restarting your computer or running the following command, again, replacing `USERNAME` with your own username.\n\n```\nlaunchctl load ~/Library/LaunchAgents/backup.plist\n```\n\n\u003e Note: It's not necessary for this guide, but in the event you ever want to unschedule the job, you can delete the `backup.plist` file and either restart your computer or run the following command.\n\u003e\n\u003e ```\n\u003e launchctl unload ~/Library/LaunchAgents/backup.plist\n\u003e ```\n\n#### Conclusion\n\nAfter either of those, backups should start running immediately and then ongoing at your specified interval. You can see how things are going by viewing the `~/.config/backup/status.log` file, [which we specified above](#create-a-launchagent).\n\n#### Additional Resources\n\nThe following resources were helpful ing getting everything setup. They're not required reading, but worth mentioning in case anyone wants to dive deeper.\n\n-   [A comprehensive guide to launchd with configuration, troubleshooting, and examples](https://www.launchd.info)\n-   [A Simple Launchd Tutorial](https://medium.com/@chetcorcos/a-simple-launchd-tutorial-9fecfcf2dbb3)\n-   [Apple Developer Documents - Daemons and Services Programming Guide](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html)\n\n## License\n\nMIT © [Michael Novotny](https://manovotny.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanovotny%2Frsync-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmanovotny%2Frsync-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmanovotny%2Frsync-generator/lists"}