dotfiles

Bash profile, aliases, functions and an installer menu, managed with homeshick. One command installs them; the same aliases then work on Debian, Arch, Red Hat, openSUSE and Alpine based systems, on a few appliances and on Windows.

105 installers · 423 aliases · 223 functions · 22 systems

Contents

Supported systems

home/.dot/lib/detect.sh reads /etc/os-release. A derivative takes the path of its family through ID_LIKE, so Linux Mint follows Ubuntu, Manjaro follows Arch, and Rocky or AlmaLinux follow RHEL. Proxmox VE, Raspberry Pi OS, Synology DSM, Unraid and Asuswrt-Merlin are detected by their own files and load an extra profile from ~/.dot/<system>.

Debian, Ubuntu Ubuntu
Ubuntu
Debian
Debian
Linux Mint
Linux Mint
Kali Linux
Kali
Arch Arch Linux
Arch
Manjaro
Manjaro
Red Hat Fedora
Fedora
Red Hat Enterprise Linux
RHEL
Rocky Linux
Rocky
AlmaLinux
AlmaLinux
CentOS Stream
CentOS Stream
Other Linux openSUSE
openSUSE
Alpine Linux
Alpine
Own profile Proxmox VE
Proxmox VE
Raspberry Pi OS
Raspberry Pi OS
Synology DSM
Synology DSM
Unraid
Unraid
Asuswrt-Merlin
Asuswrt-Merlin
Windows Git for Windows
Git Bash
MSYS2
MSYS2
Cygwin
Cygwin
WSL
WSL

WSL runs a Linux distribution, and the dotfiles treat it as that distribution. The installers cover the Debian, Arch and Red Hat families; 24 of them run on any system, and each one names its systems in its # systems: line. The menu offers only what fits.

Installation

Requirements: bash, curl and, on Windows, git. On Linux the script installs git itself.

bash <(curl -fsSL https://corgan2222.github.io/dotfiles/deploy_headless.sh)

deploy_headless.sh does this, in order:

  1. Installs git when it is missing, and sudo when it runs as root (aliases such as apuu, ap and apr call sudo). It uses apt, dnf, pacman, zypper, apk or opkg. As a normal user without sudo, and on Windows, git has to be there already and nothing is installed.
  2. Fetches homeshick and this repository to ~/.homesick/repos/.
  3. Moves every file it would replace to ~/.dotfiles-backup/<date>/, with the same path below your home: ~/.bashrc, ~/.profile, files of your own in ~/.dot with the name of one of ours, and ~/.bash_profile and ~/.bash_login, which would hide ~/.profile from bash.
  4. Links ~/.bashrc, ~/.profile and ~/.dot into your home. The profile folders in ~/.dot (raspi, proxmox, synology, …) load only on their system.
  5. Runs ~/.dot/setup.sh, which offers the installer menu at the end.

Without a terminal, for example curl ... | bash inside a script, it asks nothing.

From a local checkout

To try a state that is not on GitHub yet, run the script of a checkout. It installs the committed state of that checkout:

bash path/to/dotfiles/deploy_headless.sh

Windows (Git Bash, MSYS2, Cygwin)

The same command runs in Git Bash, MSYS2 and Cygwin. All of them need git and curl; in Cygwin, pick both in the setup program.

homeshick links the files into your home folder. The deploy and the shell set winsymlinks:nativestrict, so these are native Windows symlinks. Windows allows them with Developer Mode on (Settings, For developers) or in a shell run as administrator. Without either, the deploy stops before it moves a file; when a link fails half way, it removes the new links and puts your files back.

Cygwin packages come from the Cygwin setup program (setup-x86_64.exe): run it again to install or upgrade. With apt-cyg installed, ap, apr, apSearch and aptList work as on Linux; apuu points to the setup program.

On Windows the shell adds open (and with it o), pbcopy, pbpaste, winpath and unixpath. The prompt shows the git branch only, without dirty state and IP, because every process costs 10 to 20 ms there.

Setup, update, removal

Setup

~/.dot/setup.sh            # ask for every value that is still missing
~/.dot/setup.sh --check    # only list what is missing
~/.dot/setup.sh --motd     # show the login screen again and choose whether it stays on

The setup asks for git name and e-mail, the editor, delta as git pager (when installed) and the login screen, each question with an example. It never overwrites a value that is set. Personal values go to ~/.extra (mode 0600, not in the repository), git settings to ~/.gitconfig.

Update

dotupdate

dotupdate pulls the repository, links new files, removes links of files that were deleted, asks the setup questions of what is new and starts a new login shell. loadHome and the alias l do the same. At login the shell tells you when new commits are waiting; it fetches in the background at most every 6 hours.

An install from before dotupdate existed updates once by hand:

homeshick pull dotfiles && homeshick link dotfiles

Removal

bash ~/.homesick/repos/dotfiles/remove_dotfiles.sh

It lists what it will do and asks first. It removes the links, the repository, homeshick when no other castle is left, and ~/.autojump, ~/.fzf and ~/.git-radar. Then it puts back your files from ~/.dotfiles-backup; a missing ~/.bashrc or ~/.profile comes from /etc/skel. Other castles, ~/.nvm and files of your own in ~/.dot go only after a question of their own. The backups stay.

Installer menu

installer                       # dialog checklist, grouped by category
installer --list                # installers that fit this system
installer --list-all            # every installer
installer --list-status         # the menu rows as text: category, ways to install, installed state
installer grafana loki          # run these without the menu

The menu shows only installers that fit this system, grouped by category, with what is already installed. On the first run it preselects the base installers.

Ways to install, shown as [B|D|P] per installer:

B native (bare metal): packages, a systemd service
D Docker
Docker
a Docker compose project in /opt/<name>
P Portainer
Portainer
a stack in the local Portainer

D and P appear only while docker info answers; P also needs a Portainer API token, or Portainer chosen in the same run. An installer that can run in Docker is offered on every system with Docker, even when its own system list does not match.

Before anything runs, the menu:

At the end it prints a summary per installed service: address, where it listens, the login and the files that hold its passwords (with their content; DOT_SHOW_SECRETS=0 hides it), and how to see the service and its logs.

Every dialog is skipped when its answer is in the environment: INSTALL_CHOICES="alloy grafana", INSTALL_MODE=native|compose|portainer, BIND_ADDR=127.0.0.1|0.0.0.0 and the variables an installer asks for. Without a terminal, a missing answer stops the menu with the name of its variable.

Installers

105 installers in 11 categories. 91 install natively, 42 as Docker compose project, 41 as Portainer stack. Letters after a name list the ways to install; no letters means native only.

Category Count Installers
Base 14 basics, bat, bd, btop, delta, duf, eza, glow, gping, lazydocker, lazygit, lsd, nmap, rustnet
Sysop 11 ansible, atuin, bw, etckeeper, fail2ban, onepanel, rclone, ssh, teamviewer, tldr, wifi-wavemon
Dev 16 aichat, claude-code, code_server (B D P), codex, composer, cuda, gitea (B D P), gitlab (B D P), go, nodejs, opencv, pm2, python, rust, wpcli, yarn
Desktop 8 chrome, chromium, digikam, firefoxdev, gimp, jetbrains, terminator, vscode
Docker 5 diun (D P), dockcheck, docker, dozzle (D P), portainer (D)
Databases 5 chronograf (B D P), garage (B D P), influxdb (B D P), redis (B D P), superset (D P)
Monitoring 9 grafana (B D P), grafana-plugins (B D P), node_exporter (B D P), otel (B D P), patchmon (D P), prometheus (B D P), victoriametrics (B D P), zabbix_agent (B D P), zabbix_cli
Logs 2 alloy (B D P), loki (B D P)
Network/VPN 8 cloudflared (B D P), headscale (B D P), netbird (B D P), openvpn, tailscale, wg_easy (D P), wireguard, zerotier
Raspberry Pi 7 picamera, raspi-fanSpeed, raspi-install-BT, raspi_conky, raspi_extfat, raspi_wiringPI, raspi_zigbee2mqtt (B D P)
Server 20 caddy (B D P), emqx (B D P), esec_onlogic, frigate (D P), go2rtc, krakend (B D P), mosquitto (B D P), nextcloud (D P), nginx (B D P), nginx_proxy_manager (D P), nodered (B D P), restreamer (D P), runtipi, samba, snapotter (D P), stalwart (B D P), traefik (D P), vaultwarden (D P), zabbix_server (B D P), zipline (D P)

installer --list-all prints one line per installer with its description and systems. How an installer describes itself (# installer:, # systems:, # modes:, # category:, # check:, # ask:, # ports:) is documented at the top of home/.dot/installer/installer.sh.

Shell

Aliases and functions per system

Every system loads the base files; a system with its own profile loads its folder on top.

Profile Aliases Functions
base (all systems) 328 203
proxmox 45 13
raspi 30 8
asuswrt 14 5
synology 17 3
unraid 8 7
windows (Git Bash, MSYS2, Cygwin) 4 1
ubuntu16, ubuntu18, ubuntu19 (only on Ubuntu 16.04, 18.04, 19.04) 19 4
kali 0 3
distinct names in total 423 223

Generated reference lists are in home/.dot/docs/ (create_github_docs); they may lag behind the code.

Working on the dotfiles

With the wrapper functions:

saveHome "message" [path…]   # commit changed files (and new ones you name), push after a question
addToHome <file>             # add a file or folder of your home to the repository
checkHome                    # is the local copy up to date?
gitSaveCredential            # store the git credentials for later pushes

With homeshick directly:

homeshick cd dotfiles                  # go to the repository
homeshick track dotfiles <file>        # add a file or folder
homeshick check dotfiles               # compare with GitHub
homeshick pull dotfiles && homeshick link dotfiles

When a pull fails, look at the repository:

homeshick cd dotfiles
git status

How the numbers are counted

Counted on 2026-10-28 from the files in this repository:

Thanks

Author: corgan2222