This repository provides a small thin installer (install.sh) that clones the repo and runs the real installer (setup.sh) contained in the repository. setup.sh expects to be run from the repository root and reads package lists from package-lists/packages.sh.
This layout keeps the remote one-liner small and auditable while ensuring the full installer has access to repo files like package-lists/packages.sh.
- Arch-based system (script checks
/etc/arch-release) sudoconfigured for the invoking user (the scripts callsudofor privileged operations)- Network access (to clone/download the repository)
gitorcurlavailable on the host (the thin installer usesgitif present, otherwise downloads a tarball)
dots/install.sh(thin wrapper)- clones the repository into a temporary directory (or downloads an archive if
gitis not available), - runs
setup.shfrom that clone, - prompts whether to keep the cloned repository permanently (default:
~/dots), - removes the temporary clone if the user declines to keep it.
- clones the repository into a temporary directory (or downloads an archive if
dots/setup.sh- is the full installer that expects to be executed from the repo root,
- sources
package-lists/packages.shfor package lists and performs package installation, repo setup, dotfiles deployment, etc.
Use the thin wrapper install.sh (this downloads the repo and runs the real installer):
bash -c "$(curl -fsSL https://raw.githubusercontent.com/davidbasilefilho/dots/main/install.sh)"bash -c "$(wget -qO- https://raw.githubusercontent.com/davidbasilefilho/dots/main/install.sh)"Those commands run the thin wrapper which obtains the repository contents and executes setup.sh from the clone.
The thin install.sh supports a few flags (pass them after the one-liner or use the downloaded wrapper):
-
--yesNon-interactive: accept prompts and keep the repository by default in~/dots(useful for automation). -
--keep-dir <path>If you choose to keep the cloned repo, move it to<path>(defaults to~/dots). -
--ref <git-ref>Checkout a specific git ref (branch, tag, or commit). Defaults tomain. -
--archive-onlyUse the tarball download fallback even ifgitis available.
Example:
# non-interactive: clone main, run setup, keep repo at ~/dots
bash -c "$(curl -fsSL https://raw.githubusercontent.com/davidbasilefilho/dots/main/install.sh)" -- --yesNote: the -- is used in the example to forward options to the downloaded script when invoking via bash -c "$(curl ...)" -- ....
If you prefer to inspect first or work from a local clone:
git clone https://github.com/davidbasilefilho/dots.git ~/dots
cd ~/dots
less setup.sh # inspect the installer
bash setup.sh # run the installer from the repo rootsetup.sh expects to find package-lists/packages.sh in the cloned repo and will source it to determine which packages to install.
- Updates the system (
pacman -Syu) and installs base packages (or uses lists frompackage-lists/packages.sh) - Optionally configures CachyOS and Chaotic AUR repos
- Installs
yay(AUR helper), Oh My Zsh, and requested user packages - Deploys dotfiles from
config/->~/.config/and.zshconf->~/.zshconf(the installer will append a safesource ~/.zshconfsnippet to your existing~/.zshrcrather than overwriting it) - Installs
basile.nvimconfiguration to~/.config/nvim(optional root install) - Offers to install the CachyOS kernel and will detect NVIDIA GPUs and install the appropriate
linux-cachyos-nvidia*variant (proprietary/open) based on hardware detection heuristics - Offers to change login shell to
zshfor the invoking user and root - Prompts about rebooting when kernel or other breaking updates are applied
The repository also contains update.sh. When run from a clone, update.sh:
- updates the system (
pacman -Syu), - attempts a fast-forward
git pullof the local repo, - redeploys dotfiles,
- installs any missing packages from
package-lists/packages.sh(pacmanfor repo packages;yayfor AUR if available).
Run it from a cloned copy:
cd ~/dots
bash update.sh- Always review scripts you fetch and run from the network. Prefer the clone-and-inspect workflow for maximum safety.
- The thin wrapper is designed to be minimal: it downloads the repository and executes the bundled
setup.sh. If you require stronger guarantees, consider:- downloading a specific release tarball and verifying a signature, or
- checking out a pinned commit in a clone before running
setup.sh.
- Do not run the thin wrapper as
root; it usessudointernally where needed.
- If the thin installer cannot find
gitandcurl, it will fail — install one of them and retry. - If
setup.shcannot findpackage-lists/packages.sh, ensure you ran the thin wrapper (which clones the repo) or that you're runningsetup.shfrom a clone. - If you encounter driver/kernel issues after NVIDIA or kernel changes, boot to a previous kernel (via your bootloader) or use the temporary clone that remains for inspection.
- Edit
package-lists/packages.shto adjust package lists.setup.shsources that file when executed from the repo root. - If you want additional flags (dry-run, verbose, auto-accept granular prompts), open a PR or request features and I can add them.
If you want, I can:
- add a short
--dry-runmode tosetup.shthat only prints actions without performing them, or - add GPG verification to the thin wrapper so it verifies a signed tag before running
setup.sh.
Which would you prefer?