{"id":16492377,"url":"https://github.com/nihadbadalov/operandum","last_synced_at":"2026-04-29T23:32:00.311Z","repository":{"id":232743838,"uuid":"784849245","full_name":"NihadBadalov/operandum","owner":"NihadBadalov","description":"Dotfiles manager","archived":false,"fork":false,"pushed_at":"2024-10-01T13:33:52.000Z","size":72,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-10-10T15:37:17.625Z","etag":null,"topics":["chezmoi","configuration","dotbot","dotfile","dotfile-management","dotfile-manager","dotfile-managers","dotfile-syncer","dotfiles","dotfiles-manager","home-manager","linux","macos","manager","multiple-machines","operandum","security","stow","yadm"],"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/NihadBadalov.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":"2024-04-10T17:17:54.000Z","updated_at":"2024-05-04T19:23:53.000Z","dependencies_parsed_at":"2024-05-04T19:51:03.222Z","dependency_job_id":null,"html_url":"https://github.com/NihadBadalov/operandum","commit_stats":null,"previous_names":["nihadbadalov/operandum"],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihadBadalov%2Foperandum","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihadBadalov%2Foperandum/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihadBadalov%2Foperandum/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NihadBadalov%2Foperandum/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NihadBadalov","download_url":"https://codeload.github.com/NihadBadalov/operandum/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219860724,"owners_count":16556014,"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":["chezmoi","configuration","dotbot","dotfile","dotfile-management","dotfile-manager","dotfile-managers","dotfile-syncer","dotfiles","dotfiles-manager","home-manager","linux","macos","manager","multiple-machines","operandum","security","stow","yadm"],"created_at":"2024-10-11T14:05:29.556Z","updated_at":"2025-10-27T21:30:43.554Z","avatar_url":"https://github.com/NihadBadalov.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# operandum\n[![Node.js Package](https://github.com/NihadBadalov/operandum/actions/workflows/npm-publish.yml/badge.svg)](https://github.com/NihadBadalov/operandum/actions/workflows/npm-publish.yml)\n\nAn easy-to-use secure Dotfiles, Tasks and Scripts manager for **UNIX systems** (Linux, Macos, etc.)\n\nCurrently, it's in development; **however,** it can be used for stowing Dotfiles\nand running tasks.\n\n[User's example](https://github.com/NihadBadalov/.dotfiles)\n\u003cbr\u003e\n[Documentation example](docs/examples/Simple_Stow/README.md)\n\n## Table of Contents\n- [Installation](#installation)\n- [Usage](#usage)\n  - [Initialization](#initialization)\n  - [Stowing Dotfiles](#stowing-dotfiles)\n  - [Running Tasks](#running-tasks)\n- [Commands](#commands)\n- [Feedback and Contributing](#feedback-and-contributing)\n- [License](#license)\n\n## Installation\nCurrently, operandum can only be installed using npm. To install it, run the following command:\n```bash\nnpm install -g operandum\n```\n\n*Pay attention that the package has to be installed using the `-g` flag to be\nable to globally use the `operandum` commands.*\n\n## Usage\n### Initialization\nSay, you have a directory with your dotfiles, tasks, and scripts at `~/.dotfiles` (`$HOME/.dotfiles`). To initialize operandum, run the following command:\n```bash\ncd ~/.dotfiles\noperandum init\n```\n\nAfter running `operandum init`, you are going to be asked a few questions to set up the configuration file.\nIf you answered wrongly or want to change the configuration, you can run `operandum reinit`.\n\nThe configuration file is a single file - `operandum.ini`.\nIt is located in the root of the directory where you initialized operandum.\n(For example, `~/.dotfiles/operandum.ini`, where `~/.dotfiles` is the root directory.)\n\nThe initial congifuration file is going to look like this:\n\n```ini\n; operandum - INI config file\n\ndotfiles=dotfiles\ntasks=tasks\n```\n\nIf you changed the default values for Dotfiles and Tasks folders during your initialization,\nyou're going to see the following in your config:\n`dotfiles=(name of the folder you chose without parenthesis)` and the same for the tasks.\n\n*To see properties for the configuration file, check the [Configuration](docs/Configuration.md) page.*\n\n### Stowing Dotfiles\nYour Dotfiles folder's name is `dotfiles` by default. If you changed it,\nyou can see its name in `operandum.ini` [configuration file](docs/Configuration.md).\n\nLocations for stowing (or symlinking) your Dotfiles are defined in the `locations.ini` file.\nThe `locations.ini` file has a format of:\n```ini\nfilename=/path/to/destination\nexapmle=$HOME/.config\n```\n\n\u003cbr\u003e\n\n##### Example\nNow, for the sake of the example, move your Dotfiles inside of the Dotfiles folder.\n\u003cbr\u003e\nSay, you have the following structure:\n\n```\n--------------------------\n~/.dotfiles (root folder)\n--------------------------\n| bin/\n|  | .local/...\n|  | testfile/...\n|  | test.txt\n|  | locations.ini\n|  | ^-- {  ; locations.ini contents\n|  | ^-- {  ; Wildcard '*' can be used\n|  | ^-- {  *=$HOME\n| git/\n|  | .gitconfig\n| nvim/\n|  | .config/\n|  |  | nvim/...\n|  | locations.ini\n|  | ^-- {  ; locations.ini contents\n|  | ^-- {  .config=$HOME\n| .gitignore\n| .gitmodules\n| English.keylayout\n| locations.ignore\n| package.json\n| package-lock.json\n--------------------------\n```\n\nAnd your `locations.ignore` file looks like this:\n```\nEnglish.keylayout\npackage.json\npackage-lock.json\n```\n\n\u003cbr\u003e\n\n**So, what gets stowed where?**\n\n- The files `English.keylayout`, `package.json`, and `package-lock.json` are going to be ignored,\nbecause they are in `locations.ignore`\n- The files in the `bin` folder are going to be stowed in the `$HOME` directory.\n  - The `bin/.local` folder already (probably) exists in the `$HOME` directory,\nwhich means its contents are going to be symlinked inside the `$HOME/.local` directory.\n  \u003cbr\u003e*(For example, `bin/.local/hello.txt` -\u003e `$HOME/.local/hello.txt`)*\n\n  - The `bin/testfile` folder doesn't exist in the `$HOME` directory, so the whole folder of `testfile` going to be symlinked to the `$HOME` directory. `bin/testfile` -\u003e `$HOME/testfile`\n\n  - The `bin/test.txt` file is going to be symlinked to the `$HOME` directory. `bin/test.txt` -\u003e `$HOME/test.txt`\n\n- The `git` directory doesn't have a `locations.ini` file, so it's files **(NOT folders)** are going to be symlinked to the `$HOME` directory.\n`git/.gitconfig` -\u003e `$HOME/.gitconfig`\n\n- The `nvim/.config` folder is going to be symlinked to the `$HOME/.config` directory.\n  - But because the `$HOME/.config` directory already exists, the contents of the `nvim/.config` folder are going to be symlinked inside the `$HOME/.config` directory.\n  `nvim/.config/nvim` -\u003e `$HOME/.config/nvim`\n\n\u003cbr\u003e\n\n- There is no `locations.ini` in the `~/.dotfiles` directory, so the remaining\n`.gitignore` and `.gitmodules` files are going to be symlinked to the `$HOME` directory.\n\n  - `.gitignore` -\u003e `$HOME/.gitignore`\n\n  - `.gitmodules` -\u003e `$HOME/.gitmodules`\n\n**To stow your Dotfiles, run the following command:**\n```bash\noperandum stow -f\n```\n_**IMPORTANT: `-f` (force) is a recommended flag! Otherwise, the stowing process will stop if\nthe stowing-end-path is a symlink (i.e. a symlink exists)!**_\n\n### Running Tasks\n**Tasks are a very powerful feature of operandum, featuring variables,\nbuilt-in functions, and more.**\n\nYour Tasks folder's name is `tasks` by default. If you changed it,\nyou can see its name in `operandum.ini` configuration file.\n\nThe tasks are defined in separate YAML files (e.g., `task1.yml`, `task2.yml`, etc.) in the Tasks folder.\n\n\u003cbr\u003e\n\n##### Example\nBecause the Tasks and their compositon is a bit more complex,\nthere is a separate [Task Documentation](docs/Tasks.md).\n\u003cbr\u003e\nHere is also the documentation for [Task Configuration](docs/Task_Configuration.md) and [Built-in Functions](docs/Builtin_Functions.md)\n\\- they both can be found in the Task Documentation.\n\n## Commands\n| Command  | Usage | Description                |\n| :------  | :--------   | :------------------------- |\n| `decrypt`| `operandum decrypt \u003cfilename\u003e` | AES-256-CBC decryption of a file |\n| `deinit` | `operandum deinit`             | Removes operandum and its config file in the current directory |\n| `encrypt`| `operandum encrypt \u003cfilename\u003e` | AES-256-CBC encryption of a file |\n| `execute`| `operandum execute \u003ctask-name\u003e`| Execute a task from the Tasks |\n| `help`   | `operandum help`               | Shows a help message for operandum commands |\n| `init`   | `operandum init`               | Initializes operandum and its config file in the current directory |\n| `reinit` | `operandum reinit`             | Reinitializes operandum in the current directory |\n| `stow`   | `operandum stow -f`               | Stows (symlinks) Dotfiles to their respective stow directories\u003cbr\u003eMore simply, this commands puts your Dotfiles in their places |\n| `update` | `operandum update`             | (Git) pull Dotfiles from the remote repository |\n\n## Feedback and Contributing\nErrors and suggestions can be reported in the [Issues](https://github.com/NihadBadalov/operandum/issues)\nsection of the repository.\n\nIf you want to contribute to the project, you can fork the repository and create a pull request.\n\nContributions to documentation are also welcome.\n\n## License\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnihadbadalov%2Foperandum","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnihadbadalov%2Foperandum","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnihadbadalov%2Foperandum/lists"}