{"id":17838520,"url":"https://github.com/xeruf/instalee","last_synced_at":"2026-04-02T03:00:00.777Z","repository":{"id":42329165,"uuid":"271874974","full_name":"xeruf/instalee","owner":"xeruf","description":"Unixy installation management","archived":false,"fork":false,"pushed_at":"2026-03-28T15:53:32.000Z","size":4570,"stargazers_count":5,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-28T17:45:31.794Z","etag":null,"topics":["installation","linux","package","package-management","package-manager","setup"],"latest_commit_sha":null,"homepage":"","language":"Shell","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/xeruf.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2020-06-12T19:27:46.000Z","updated_at":"2026-03-28T15:53:35.000Z","dependencies_parsed_at":"2024-06-11T13:33:55.420Z","dependency_job_id":"678d6334-b657-4440-a02a-a01170b9d9e8","html_url":"https://github.com/xeruf/instalee","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/xeruf/instalee","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xeruf%2Finstalee","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xeruf%2Finstalee/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xeruf%2Finstalee/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xeruf%2Finstalee/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xeruf","download_url":"https://codeload.github.com/xeruf/instalee/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xeruf%2Finstalee/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31294805,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-02T01:43:37.129Z","status":"online","status_checked_at":"2026-04-02T02:00:08.535Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["installation","linux","package","package-management","package-manager","setup"],"created_at":"2024-10-27T20:58:18.318Z","updated_at":"2026-04-02T03:00:00.768Z","avatar_url":"https://github.com/xeruf.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Instalee\n\nInspired by [pass](passwordstore.org \"The standard Unix password manager\")\nand the Unix philosophy \ncomes a small POSIX-compliant shell script\nto aid in setting up and keeping installed packages on machines in sync.\nCentral feature is the modular directory structure \nthat can handle everything from native package managers \nover installation from source\nto copying or executing scripts from a URL.\nSimilar to [tldr](https://github.com/tldr-pages/tldr),\ncreating alternative frontends is easy and appreciated.\n\nInstalee can install the same set of packages on any system\nwith graceful failure if any package is unavailable.\nWith appropriate setup and logging (TBD)\nit can also keep the installed packages in sync.\nSimply, Instalee can be used as a unified installation frontend,\nboth manual and automatic,\nto any package manager or other method of installation\non any system with a POSIX Shell available\n(and the basic logic is so simple \nyou could easily port it to another foundation,\npreserving the file structure).\n\n## Usage\n\n### Installation\n\nTo try Instalee with some pre-configured options,\nclone or download the repository and run the included script.\nCurrently this supports Debian- and Arch-based systems,\nas well as a few packages via *snap*, *cargo* and custom scripts\nusually imported from the original project site.\n\nAlternatively, you can download just the [`instalee`](./instalee) script\nand configure it yourself.\nOn Arch you can install the `instalee-git` AUR package\nto get the man-page and copy the script into `/usr/bin`.\n\n#### Windows\n\nYou can easily install instalee and its dependencies on Windows\nby running the following in an administrative powershell:\n``` powershell\nSet-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))\nchoco feature enable -n allowGlobalConfirmation\nchoco install git\nStart-Process -Wait \"C:\\Program Files\\Git\\git-bash.exe\" -Verb runAs -ArgumentList \"-c 'git clone https://github.com/xeruf/instalee; cd instalee \u0026\u0026 git pull \u0026\u0026 ./instalee win/office; sleep 10 || bash'\"\n```\nThis combines [the installation of chocolatey](https://chocolatey.org/install#install-step2)\nwith the helper script [i.ps1](./i.ps1).\n\nIt then installs the win/office group\nmade up of packages useful to almost anyone.\nTo install further packages,\nopen git bash in the created instalee directory\nand run `./instalee PACKAGE`.\n\nAn offline version is possible as well \nbut I did not get around to publishing it yet, just ask :)\n\n### (Debian) Linux Server\n\nThe classic way I get this onto a Linux server:\n\n```sh\n#!/bin/sh\nsudo=$(which sudo)\ncd /opt \n$sudo chown --from=:root :sudo . \u0026\u0026 $sudo chmod g+w .\n$sudo apt install git\ngit clone https://github.com/xeruf/instalee || git -C instalee pull\ninstalee/instalee shell/basics\n```\n\n### Configuration\n\nAll configuration is stored in `INSTALEE_HOME` \nwhich defaults to the first available of\n`$XDG_CONFIG_HOME/instalee` or the current directory.\n\nFirst, customize the _handlers_ available on your system \nin `$INSTALEE_HOME/handlers.available`\nwhich is a newline-separated list of values \nthat usually correspond to subdirectories of the `handlers` directory.\nThe _handlers_ are tried in the order they are listed.\n\nKeep the following in mind when configuring Instalee:\n- `handlers.available` is a system-specific file,\n  for sensible syncing across many different machines\n  a mechanism such as [yasm alternate files](https://yadm.io/docs/alternates)\n  can prove useful.\n- `groups` are usually personal, but system-agnostic\n- `handlers` and `packages` need to be attuned,\n  as the package entry format needs to fit the handler definitions.\n  These may be obtained from a trusted source\n  or configured personally.\n\nThis repository contains an example configuration as used by the author.\nSee the [man page](instalee.1) for more details.\n\n### Installing Packages\n\n`instalee \u003ctarget\u003e`\n\nA _target_ may be a _package_, a _group_ from the repository,\nor a file path containing a newline-separated list of targets.\nInstalee first checks for `groups/\u003ctarget\u003e`.\nA _group_ is a newline-separated list of targets.\nInstalee resolves those listed targets individually.\nIf a target listed in a group has no explicit package definition,\ninstalee will also try the first available handler as a fallback.\n\nWhen a target is a file path,\ninstalee reads it as a newline-separated list of targets\nand installs them in order.\nFile targets use the same comment filtering\nand executable-file behavior as groups.\n\nPrefix a target with `group/` or `groups/`\nto resolve it only from `groups/`\nand skip package fallback,\ne.g. `instalee group/shell/minimal`.\n\nWhen there is no corresponding _group_,\ninstalee searches for the first available _handler_\nwith a corresponding entry at `packages/\u003ctarget\u003e/\u003chandler\u003e`,\nusing that entry's contents or output as arguments to the _handler_\nto install the package.\nThe package definition may be an empty file\n(thus simply indicating the availability of a package for a _handler_),\nin which case the name of the package is passed to the _handler_.\n\nNote that both _groups_ and package entries can be executable files,\nin which case instalee will execute them and use their output instead,\nso watch the file permissions!\nIf an available _handler_ has no definition in `handlers`,\nthe package file _has to be_ executable,\nas instalee will then simply execute it.\n\n### Handlers\n\nThough not required,\na typical handler will accept a list of packages to install as arguments,\nenabling batching and the consolidation of interdependent packages into one unit.\n\nWhen installing a package and there is no handler available,\nbut a package with the name of a handler of the package has an installable candidate,\nthe handler will be installed, made available and used.\n\nWhen installing packages from groups without candidate,\nthe first available handler will be tried regardless\nso default-named packages do not always need to setup explicitly\n(TODO: Auto-update repo if that succeeds with flag to disable,\nflag for manual installation).\n\n## Guiding Principles\n\nInstalee closely follows the UNIX philosophy with directory structures and files as configuration.\nThe goal is to be as generic as possible to accommodate any kind of setup.\n\nHowever, it should be efficient while generic,\npreventing repetition at every level (DRY).\n\n### What Instalee is not\n- a (central) package repository containing package sources\n- a package manager to inspect or remove packages\n- a tool to upgrade packages installed from diverse sources -\n  see `topgrade`\n\n## Features\n\nA loose list of undocumented features \nand ideas that need to be fleshed out.\n\n- Cross-handler dependencies (e.g. logcli script needs go)\n  -\u003e currently implemented with `depends_HANDLER` files\n\n### Planned\n- detection mechanism for handler features\n  (e.g. batch-install support)\n- Ability to use multiple repos, including remote ones\n- Cope with missing versions in repositories of older OS versions\n  -\u003e version handlers\n\n- helper/hook for adding packages to groups upon install\n  (at least for `pacman`)\n- log installs for reuse\n\n### Issues\n- Homebrew for Mac - partially implemented but resolution not working (e.g. docker automatically installing brew first)\n- Somehow installing doom emacs has a dependency tree resolution issue\n- Debug corner cases: Not working on Windows when run as Admin\n- Handler preparation - update repos and cache last update time in /tmp\n- Handler for downloaded scripts (e.g. passff-host, funkwhale)\n- Enable services after install, e.g. syncthing and docker\n\n#### Windows Offline Flow\n- Install choco and git offline\n- Run in git bash\n- TODO: Use choco-offline sources\n\n### Flow v2\nThis is a revamped concept \nthat would ease setting up new devices with different systems\nby adding a mapping of functions to applications\nas well as handlers to providers\n(e.g. different make mechanisms on Arch and Debian).\nThat way, the same functionality is available everywhere,\nbut can be provided by different packages\nas different systems have different users.\nThe following tables lists some real-world examples to consider,\nbut the details still need to be fleshed out.\n\n| Function       | Package/Application | Handler              | Provider      | System        |\n|----------------|---------------------|----------------------|---------------|---------------|\n| pdf            | okular              | chocolatey           | chocolatey    | Windows       |\n|                | zathura             | arch                 | pacman or yay | Arch          |\n|                | timg poppler        | apt                  | apt           | Debian Server |\n| loki           | loki                | arch                 | pacman or yay | Arch          |\n|                |                     | make                 | checkinstall  | Debian        |\n|                |                     | make                 | wocka         | Arch          |\n| logcli         | loki-logcli         | script (depends: go) | script        | Debian        |\n|                |                     | arch                 | pacman or yay | Arch          |\n|                | logcli-bin          | aur                  | yay           | Arch          |\n| zoom           | zoom                | deb                  | apt           | Debian        |\n|                |                     | aur                  | yay           | Arch          |\n| screen-capture | spectacle peek      | arch                 | pac/yay       | Arch          |\n|                | screentogif         | chocolatey           | chocolatey    | Windows       |\n| aur            | yay                 | aur                  | makepkg       | Arch          |\n|                |                     | aur                  | yay           |               |\n\n- Software and Provider are derived from Function and Handler but can change depending on the system\n  -\u003e no way of declaring function so far, maybe via groups somehow?\n- Idea: `providers/\u003cprovider\u003e/\u003chandler\u003e[_\u003cext\u003e]` rather than `handlers/\u003chandler\u003e/install[_\u003cext\u003e]`\n  + but then one might duplicate the handler script if one provider handles multiple equally,\n    such as `yay` for arch and aur\n  + how about `providers/\u003chandler\u003e/\u003cprovider\u003e[_\u003cext\u003e]`? \n    Same duplication issue, now spread out...\n  + underscore extension might be superfluous through that, since `ext` was somewhat a proxy for a proper `provider` configuration\n- Use system subdirectories for handlers and groups,\n  which are used by default when system is detected\n\n## Notes on this Repository\n\n### Groups\n\n#### [./groups/shell](shell)\n\n- shell/basics: without these a linux machine is hardly usable\n- shell/tools: without these a linux computer is not productively usable for me\n- shell/enhancements: replacements for commonly used, dated tools, such as `ls`-\u003e`exa` and `top`-\u003e`glances`\n\n#### [./groups/arch](arch)\n\n- tools: utilities required for my dotfiles and daily use\n- base: opinionated (slightly bloated) base system\n- full: normal install\n- all: every package I use somewhat regularly\n- portable: base but with packages for installations on removable media\n\n\n## Related Projects\n\n- another universal package manager,\n  but without affecting the system:\n  https://github.com/teaxyz/cli\n- universal package updater:\n  https://github.com/topgrade-rs/topgrade\n\n\n## Windows Issues\n\nhttps://superuser.com/questions/55809/how-to-run-program-from-command-line-with-elevated-rights\n\n- auto-elevation of choco\n- post-choco-install check if launching git bash works\n- add choco to handlers\n\nSet-Location : Illegales Zeichen im Pfad.\nIn K:\\instalee\\packages\\chocolatey\\powershell.ps1:24 Zeichen:5\n+     Set-Location $Loc.Substring(1,$Loc.Length-1)\n+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    + CategoryInfo          : InvalidArgument: (K:\\instalee\":String) [Set-Location], ArgumentException\n    + FullyQualifiedErrorId : ItemExistsArgumentError,Microsoft.PowerShell.Commands.SetLocationCommand\n\nSet-Location : Der Pfad \"K:\\instalee\"\" kann nicht gefunden werden, da er nicht vorhanden ist.\nIn K:\\instalee\\packages\\chocolatey\\powershell.ps1:24 Zeichen:5\n+     Set-Location $Loc.Substring(1,$Loc.Length-1)\n+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n    + CategoryInfo          : ObjectNotFound: (K:\\instalee\":String) [Set-Location], ItemNotFoundException\n    + FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.SetLocationCommand\n\nhttps://stackoverflow.com/questions/52223872/get-windows-version-from-git-bash\n\nWindows 7: https://dotnet.microsoft.com/en-us/download/dotnet-framework\n-\u003e Unsupported Versions: 4.5\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxeruf%2Finstalee","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxeruf%2Finstalee","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxeruf%2Finstalee/lists"}