{"id":13467374,"url":"https://github.com/RaphGL/Tuckr","last_synced_at":"2025-03-26T02:31:22.067Z","repository":{"id":62827940,"uuid":"242400185","full_name":"RaphGL/Tuckr","owner":"RaphGL","description":"Super powered replacement for GNU Stow","archived":false,"fork":false,"pushed_at":"2025-03-06T20:20:47.000Z","size":1387,"stargazers_count":190,"open_issues_count":14,"forks_count":15,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-06T21:24:35.996Z","etag":null,"topics":["dotfile-management","dotfile-manager","dotfiles","stow","tuckr"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RaphGL.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}},"created_at":"2020-02-22T19:34:47.000Z","updated_at":"2025-03-06T20:19:46.000Z","dependencies_parsed_at":"2024-01-16T06:20:09.001Z","dependency_job_id":"b411fa6b-aa50-4f6e-bb7d-92531ee38a67","html_url":"https://github.com/RaphGL/Tuckr","commit_stats":null,"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RaphGL%2FTuckr","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RaphGL%2FTuckr/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RaphGL%2FTuckr/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RaphGL%2FTuckr/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RaphGL","download_url":"https://codeload.github.com/RaphGL/Tuckr/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245576529,"owners_count":20638125,"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":["dotfile-management","dotfile-manager","dotfiles","stow","tuckr"],"created_at":"2024-07-31T15:00:55.523Z","updated_at":"2025-03-26T02:31:22.060Z","avatar_url":"https://github.com/RaphGL.png","language":"Rust","funding_links":[],"categories":["Applications","Rust"],"sub_categories":["Utilities"],"readme":"\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/RaphGL/Tuckr\"\u003e\n  \u003c/a\u003e\n\n  \u003ch1 align=\"center\"\u003eTuckr\u003c/h1\u003e\n  \u003ch3 align=\"center\"\u003eA super powered replacement for GNU Stow\u003c/h3\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cbr /\u003e\n    \u003ca href=\"https://github.com/RaphGL/Tuckr/wiki\"\u003e\u003cstrong\u003eExplore the docs »\u003c/strong\u003e\u003c/a\u003e\n    \u003cbr /\u003e\n    \u003cbr /\u003e\n    ·\n    \u003ca href=\"https://github.com/RaphGL/Tuckr/issues\"\u003eReport Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/RaphGL/Tuckr/issues\"\u003eRequest Feature\u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails open=\"open\"\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#how-it-works\"\u003eHow it works\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#using-hooks\"\u003eUsing hooks\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#using-secrets\"\u003eUsing secrets\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#conditional-deployment\"\u003eConditional Deployment\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#exit-codes\"\u003eExit codes\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n\nTuckr is a dotfile manager inspired by Stow and Git. Tuckr aims to make dotfile management less painful. It follows the same model as Stow, symlinking files onto $HOME. It works on all the major OSes (Linux, Windows, BSDs and MacOS).\n\nTuckr aims to bring the simplicity of Stow to a dotfile manager with a very small learning curve.\nTo achieve that goal Tuckr tries to only cover what is directly needed to manage dotfiles and nothing else. We won't wrap git, rm, cp or reimplement the functionality that are perfeclty covered by other utilities in the system unless it greatly impacts usability.\n\n### Goals:\n\n- No configuration\n- Commands can be run from anywhere\n- Symlinks are tracked and validated\n- Configuration files are grouped and handled as a logical unit \n- Provide ability to run hooks (scripts) that facilitate deployment and uninstallation\n- Easily encrypt and deploy sensitive configuration files (WIP: please do not secrets for production just yet)\n\n\u003c!-- GETTING STARTED --\u003e\n\n## Getting Started\n\nTuckr uses a `dotfiles` directory to store all your configs. Please check the table below to know where\nto put it according to your operating system.\n\nYou can choose either the config or the home path.\n\n| Platform       | Config Path                                | Home Path            |\n| -------------- | ------------------------------------------ | -------------------- |\n| Linux/BSDs/etc | $HOME/.config/dotfiles                     | $HOME/.dotfiles      |\n| MacOS          | $HOME/Library/Application Support/dotfiles | $HOME/.dotfiles      |\n| Windows        | %HomePath%\\AppData\\Roaming\\dotfiles        | %HomePath%\\\\.dotfiles |\n\nTo learn how to set up your dotfiles, check the `How it works` sections.\n\n#### Stow users\n\nTuckr is interchangeable with Stow. To migrate:\n\n1. Go to your dotfiles directory remove all symlinks with\n\n```\nstow -t $HOME --delete *\n```\n\n2. Move your dotfiles directory to one of the valid paths and move all your directories there:\n\n```\n$ mkdir -p \u003cCONFIG_PATH\u003e/Configs\n$ mv -t \u003cCONFIG_PATH\u003e * \n```\n\n3. Resymlink your dotfiles with:\n\n```\ntuckr add \\*\n```\n\n4. You can confirm that your dotfiles have been deployed:\n\n```\ntuckr status\n```\n\n#### Windows users\n\nYou need to enable developer mode for symlinking to work, this is a restriction imposed by the OS.\n\n### Installation\n\n**Install from source:**\n\n```sh\ncargo install --git https://github.com/RaphGL/Tuckr.git\n```\n\nNote: The binary will be installed to `$HOME/.cargo/bin` either move it to somewhere in your $PATH or add it to path.\n\n**Install from the AUR:**\n\n```sh\nparu -S tuckr-git\n```\n\n\u003c!-- USAGE EXAMPLES --\u003e\n\n## Usage\n\n```sh\n$ tuckr add \\* # adds all dotfiles to the system\n$ tuckr add \\* -e neovim # adds all dotfiles except neovim\n$ tuckr add neovim zsh # adds only the neovim and zsh dotfiles\n$ tuckr set \\* # adds all the dotfiles and runs their hooks (scripts)\n$ tuckr rm \\* # removes all dotfiles from your system\n```\n\n```\nSuper powered GNU Stow replacement\n\nUsage: tuckr [OPTIONS] \u003cCOMMAND\u003e\n\nCommands:\n  status   Get dotfiles' symlinking status (alias: s)\n  add      Deploy dotfiles for the supplied groups (alias: a)\n  rm       Remove dotfiles for the supplied groups\n  set      Setup groups and run their hooks\n  unset    Remove groups and run their cleanup hooks\n  encrypt  Encrypt files and move them to dotfiles/Secrets (alias: e)\n  decrypt  Decrypt files (alias: d)\n  push     Copy files into groups\n  pop      Remove groups from dotfiles/Configs\n  ls       List dotfiles hooks, secrets, profiles\n  init     Initialize dotfile directory\n  groupis  Return the group files belongs to\n  help     Print this message or the help of the given subcommand(s)\n\nOptions:\n  -p, --profile \u003cPROFILE\u003e  Choose which dotfile profile to use\n  -h, --help               Print help\n  -V, --version            Print version\n```\n\nNote: for additional information also check [the wiki](https://github.com/RaphGL/Tuckr/wiki)\n\n### How it works\n\nTuckr works with no configuration, this is achieved by making some assumptions about the structure of your dotfiles directory.\nEvery Tuckr dotfiles directory should have the following structure:\n\n```sh\ndotfiles\n├── Configs # Dotfiles go here\n├── Secrets # Encrypted files go here\n└── Hooks # Setup scripts go here\n```\n\nThese directories contain directories that separate the dotfiles by program name (or whatever criteria you want to group them by)\n\n```sh\ndotfiles\n├── Configs\n│   ├── tmux\n│   └── zsh\n└── Hooks\n    ├── tmux\n    └── zsh\n```\n\nInside of these group directories the structure is exactly the same as what your $HOME looks like.\n\n```sh\nConfigs\n├── tmux\n│   └── .config\n│       └── tmux\n│           └── tmux.conf\n└── zsh\n    ├── .zshenv\n    └── .zshrc\n```\n\nThe group directories' names are used to reference them on tuckr.\n\n### Using Hooks\n\nHooks are run before and after adding every program, if they're coupled with a program they should their directory should have the same name in Hooks as in Configs.  \nHooks that run before symlinking the program are prefixed with `pre`, scripts that run afterwards are prefixed with `post`, as long as this is true you can name the file whatever you want.\n\n```sh\nHooks\n├── tmux\n│   ├── post.sh\n│   └── pre.sh\n└── zsh\n    ├── post.sh\n    └── pre.sh\n```\n\nTo run scripts for a program run `tuckr set \u003cprogram_name\u003e` or alternatively use a wildcard like so: `tuckr set \\*` to run all hooks.\n\n### Using Secrets\nPlease not that secrets are still WIP and their security is really not guaranteed. So it's best to avoid it in production. If you want to deploy secrets with tuckr,\nthen consider create a hook that deploys secrets for you using some of the reputable encryption tools out there like veracrypt, gpg, etc.\n\n#### Encrypting files\n\nEncrypt a file and put it in \u003cgroup_name\u003e\n\n```\ntuckr encrypt \u003cgroup_name\u003e \u003cfile_name...\u003e\n```\n\nThis will create an appropriate file in the `Secrets` directory pointing to the path where it originally came from\n\n#### Decrypting files\n\nDecrypt files from the groups \u003cgroup_name...\u003e and put them on their appropriate paths\n\n```\ntuckr decrypt \u003cgroup_name...\u003e\n```\n\n### Conditional deployment\nConditional deployment is used when a dotfile should only be deployed on a specific platform. This is done by creating a separate group with the same name suffixed with the desired platform.\n\nConditional groups are entirely ignored on unsupported systems.\n\nExample:\n\n```sh\nConfigs\n├── config\n├── config_unix # deployed on any unix-like system\n├── config_linux # linux only files\n├── config_macos # macos only files\n└── config_windows # windows only files\n```\n\nThe groups that are supported on the target system will be treated as being a part of the original `config` group. One only needs to reference it to have all of the valid ones included as well.\n\nAny of the [options available](https://doc.rust-lang.org/reference/conditional-compilation.html#target_os) on Rust's `target_family` and `target_os` are valid targets.\n\n### Exit codes\n\nFor scripting purposes Tuckr has the following exit codes:\n\n- `2` Could not find Dotfiles directory\n- `3` No Configs/Hooks/Secrets directory setup\n- `4` No such file or directory exists\n- `5` Encryption failed\n- `6` Decryption failed\n\nOn success Tuckr returns whatever is the default success return code for the platform (0 on unix-like systems).\n\n\u003c!-- LICENSE --\u003e\n\n## License\n\nDistributed under GPLv3 License. See [`LICENSE`](https://github.com/RaphGL/Tuckr/blob/main/LICENSE) for more information.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRaphGL%2FTuckr","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FRaphGL%2FTuckr","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FRaphGL%2FTuckr/lists"}