{"id":22323619,"url":"https://github.com/dev01d/tm-exclude","last_synced_at":"2026-02-08T19:04:30.294Z","repository":{"id":44596997,"uuid":"169533296","full_name":"dev01d/tm-exclude","owner":"dev01d","description":":computer:  Automatically exclude dev dependancies from Time Machine backups","archived":false,"fork":false,"pushed_at":"2022-02-06T02:59:15.000Z","size":14,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-26T05:26:47.612Z","etag":null,"topics":["apple","backup","backups","development-environment","time-machine"],"latest_commit_sha":null,"homepage":"","language":null,"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/dev01d.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}},"created_at":"2019-02-07T07:17:50.000Z","updated_at":"2022-02-06T02:00:43.000Z","dependencies_parsed_at":"2022-09-17T07:10:53.787Z","dependency_job_id":null,"html_url":"https://github.com/dev01d/tm-exclude","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/dev01d/tm-exclude","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev01d%2Ftm-exclude","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev01d%2Ftm-exclude/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev01d%2Ftm-exclude/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev01d%2Ftm-exclude/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dev01d","download_url":"https://codeload.github.com/dev01d/tm-exclude/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dev01d%2Ftm-exclude/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265432984,"owners_count":23764198,"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":["apple","backup","backups","development-environment","time-machine"],"created_at":"2024-12-04T01:11:20.940Z","updated_at":"2026-02-08T19:04:25.798Z","avatar_url":"https://github.com/dev01d.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Time Machine exclude [![version badge](https://img.shields.io/github/release/dev01d/tm-exclude.svg?style=flat)](https://github.com/dev01d/tm-exclude/releases)\n\nThis is a `launchd` plist wrapper that uses `find` and `tmutil` to recursively search for and exclude specified directories from your Time Machine backups.\n\n\u003e This example is for the node_modules directory but will work on any other reoccurring dev dependency.\n\nThis plist watches each directory specified for state change, runs and then sleeps for 30 seconds so the system doesn't throttle it.\n\n## Usage\n\n- Open with Xcode or any text editor\n\n1. Edit the variable `\u003cstring\u003eWORKINGDIR=$HOME/your-working-dir\u003c/string\u003e` so it points to the parent folder of your working directory\n\n2. Edit the string under `\u003ckey\u003eWatchPaths\u003c/key\u003e` and be sure to include trailing slash\n\n   - Multiple `\u003cstring\u003e~/directory/to/monitor/\u003c/string\u003e` entries supported\n\n3. Move plist to `~/Library/LaunchAgents/`\n\n4. Load config with this command\n\n```bash\nlaunchctl load ~/Library/LaunchAgents/com.user.time-machine-exclude.plist\n```\n\n- Done.\n\nWhenever a monitored directory's state changes the script will run removing old exclusions then adding new ones\n\n## Example\n\n```shell\n~/Code\n  ├── Go\n  ├── JavaScript\n  ├── K8s\n  ├── Python\n  └── Websites\n```\n\n- `\u003cstring\u003eWORKINGDIR=$HOME/Code\u003c/string\u003e` for the above location\n\nThen dirs to watch (WatchPaths) would be:\n\n- `\u003cstring\u003e~/Code/JavaScript/\u003c/string\u003e`\n- `\u003cstring\u003e~/Code/Websites/\u003c/string\u003e`\n\n## Test\n\nTo see if the plist was effective run this command.\n\n```bash\nWORKINGDIR=$HOME/your-working-dir \\\n\u0026\u0026 find $WORKINGDIR -type d -name node_modules -prune -exec tmutil isexcluded {} +\n```\n\n**Note:** I haven't noticed any absurd resource usage but for those concerned please see [v1.0.0](https://github.com/dev01d/tm-exclude/releases/tag/1.0.0).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev01d%2Ftm-exclude","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdev01d%2Ftm-exclude","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdev01d%2Ftm-exclude/lists"}