{"id":46118715,"url":"https://github.com/chikof/rocas","last_synced_at":"2026-03-02T00:01:17.349Z","repository":{"id":339657865,"uuid":"1162869336","full_name":"chikof/rocas","owner":"chikof","description":"A simple watcher that moves files to their respective folders based on their extensions","archived":false,"fork":false,"pushed_at":"2026-03-01T21:12:11.000Z","size":134,"stargazers_count":3,"open_issues_count":4,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-01T21:42:25.535Z","etag":null,"topics":["linux","macos","organize","rust","watcher","windows"],"latest_commit_sha":null,"homepage":"","language":"Rust","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/chikof.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"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}},"created_at":"2026-02-20T19:52:12.000Z","updated_at":"2026-03-01T21:12:14.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chikof/rocas","commit_stats":null,"previous_names":["chikof/rocas"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/chikof/rocas","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chikof%2Frocas","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chikof%2Frocas/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chikof%2Frocas/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chikof%2Frocas/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chikof","download_url":"https://codeload.github.com/chikof/rocas/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chikof%2Frocas/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29987726,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-01T22:42:38.399Z","status":"ssl_error","status_checked_at":"2026-03-01T22:41:51.863Z","response_time":124,"last_error":"SSL_read: 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":["linux","macos","organize","rust","watcher","windows"],"created_at":"2026-03-02T00:00:44.279Z","updated_at":"2026-03-02T00:01:17.305Z","avatar_url":"https://github.com/chikof.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cpicture\u003e\n    \u003cimg alt=\"rocas_image\" src=\"https://i.chiko.dev/u/rocas.png\" width=\"300\"\u003e\n\u003c/picture\u003e\n\n**A simple file watcher that automatically moves files into folders based on rules you define.**\n\n\u003c/div\u003e\n\n---\n\n## Features\n\n- Watch any directory for new files (defaults to Downloads)\n- Move files based on glob patterns — extensions, names, catch-alls\n- Recursive watching with configurable depth\n- Cross-platform (Windows, macOS, Linux)\n\n## Installation\n\n### Standalone\n\nDownload the appropriate binary for your OS from the [Releases](https://github.com/chikof/rocas/releases) page, extract it, and run the executable.\n\n### NixOS\n\nAdd rocas to your flake inputs and import the module:\n\n```nix\n# flake.nix\ninputs.rocas.url = \"github:chikof/rocas\";\n```\n\nThen in your NixOS configuration:\n\n```nix\n{ inputs, ... }: {\n  imports = [ inputs.rocas.nixosModules.default ];\n\n  services.rocas = {\n    enable = true;\n    watcher.watchPath = \"/home/chiko/Downloads\";\n    rules = [\n      { patterns = [ \"*.pdf\" ];         destination = \"/home/chiko/Documents\"; }\n      { patterns = [ \"*.jpg\" \"*.png\" ]; destination = \"/home/chiko/Pictures\"; }\n    ];\n  };\n}\n```\n\nrocas will run as a system service under a dedicated `rocas` user. You can override this with `services.rocas.user` and `services.rocas.group`.\n\n### Home Manager\n\nPrefer this for per-user installs or if you want rocas to autostart on graphical login.\n\n```nix\n# flake.nix\ninputs.rocas.url = \"github:chikof/rocas\";\n```\n\n```nix\n{ inputs, ... }: {\n  imports = [ inputs.rocas.homeManagerModules.default ];\n\n  programs.rocas = {\n    enable    = true;\n    autostart = true;\n    rules = [\n      { patterns = [ \"*.pdf\" ];         destination = \"~/Documents\"; }\n      { patterns = [ \"*.jpg\" \"*.png\" ]; destination = \"~/Pictures\"; }\n    ];\n  };\n}\n```\n\nWhen `autostart` is enabled, rocas runs as a systemd user service tied to your graphical session. You can manage it manually with:\n\n```sh\nsystemctl --user status rocas\nsystemctl --user restart rocas\n```\n\n#### Available Nix options\n\n| Option                    | Default       | Description                                                                   |\n| ------------------------- | ------------- | ----------------------------------------------------------------------------- |\n| `watcher.watchPath`       | `~/Downloads` | Primary directory to watch                                                    |\n| `watcher.watchPaths`      | `[]`          | Watch multiple directories simultaneously (takes precedence over `watchPath`) |\n| `watcher.recursive`       | `true`        | Watch subdirectories                                                          |\n| `watcher.intervalMillis`  | `1000`        | Polling interval (ms)                                                         |\n| `watcher.maxDepth`        | `null`        | Max recursion depth (`null` = unlimited)                                      |\n| `watcher.debounceMs`      | `50`          | Collapse rapid events for the same path within this window (ms)               |\n| `watcher.renameTimeoutMs` | `50`          | Wait this long for a rename pair before treating the source as a delete       |\n| `misc.logLevel`           | `\"info\"`      | `trace` `debug` `info` `warn` `error`                                         |\n| `misc.logFile`            | `null`        | Path to a log file; omit to log to stderr only                                |\n| `misc.logMaxSizeMb`       | `10`          | Rotate the log file when it exceeds this size (MB); `0` disables rotation     |\n| `misc.logKeepFiles`       | `3`           | Number of rotated log files to keep                                           |\n| `misc.checkForUpdates`    | `true`        | Check for updates on startup                                                  |\n| `rules`                   | `[]`          | List of `{ patterns, destination }` rules                                     |\n\n\u003e `misc.autoUpdate` is accepted for config compatibility but has no effect in Nix-managed installs — update rocas via `nix flake update` instead.\n\n## Configuration\n\nRocas looks for its config file in the following locations depending on your OS:\n\n- **Linux:** `~/.config/rocas/rocas.toml`\n- **macOS:** `~/Library/Application Support/rocas/rocas.toml`\n- **Windows:** `%APPDATA%\\rocas\\rocas.toml`\n- **ANY:** `./rocas.toml` (current working directory)\n\n```toml\n[watcher]\nwatch_path = \"/home/chiko/Downloads\"  # directory to watch (single)\n# watch_paths = [\"/home/chiko/Downloads\", \"/home/chiko/Desktop\"]  # watch multiple dirs simultaneously\nrecursive = true                      # watch subdirectories\ninterval_millis = 1000                # polling interval in milliseconds\nmax_depth = 1                         # max recursion depth: 0 = root only, 1 = root + one level, omit for unlimited\n# debounce_ms = 50                    # collapse events within this window (ms); increase for slow/network drives\n# rename_timeout_ms = 50              # wait this long for a rename pair before treating From as a delete (ms)\n\n[misc]\nlog_level = \"info\"                    # trace | debug | info | warn | error\n# log_file = \"/var/log/rocas/rocas.log\"  # omit to log to stderr only\n# log_max_size_mb = 10               # rotate when file exceeds this size (MB); 0 = no rotation\n# log_keep_files = 3                 # number of rotated files to keep\ncheck_for_updates = true              # check for updates on startup\nauto_update = false                   # auto update is ignored in Nix-managed installs\n\n[[rules]]\npatterns = [\"*.pdf\", \"*.docx\"]\ndestination = \"/home/chiko/Documents\"\n\n[[rules]]\npatterns = [\"*.jpg\", \"*.png\", \"*.gif\"]\ndestination = \"/home/chiko/Pictures\"\n\n[[rules]]\npatterns = [\"*\"]                      # catch-all, matches anything not covered above\ndestination = \"/home/chiko/Other\"\n```\n\n## Contributing\n\nContributions are welcome! For major changes, please open an issue first to discuss what you have in mind. Bug fixes and improvements can go straight to a pull request.\n\n## Credits\n\n- [@Aliwizzz](https://github.com/Aliwizzz) - Windows icon and idea\n- [@prdgn52627](https://discord.com/users/726913634516860971) — Name and logo\n\n## License\n\nMIT — see [LICENSE](LICENSE) for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchikof%2Frocas","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchikof%2Frocas","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchikof%2Frocas/lists"}