These are the dotfiles for my system
sudo pacman -S yay stow bitwarden-cli git github-cli ghostty neovim bitwarden lsof oath-toolkit solaar opencode
# yay -S ...sudo apt install stow git gh neovim ghostty lsof oathtool solaar opencodesudo dnf install stow git gh neovim ghostty bitwarden bw lsof oathtool solaar opencode#Proton Pass CLI
curl -fsSL https://proton.me/download/pass-cli/install.sh | bash
flatpak install io.github.pwr_solaar.solaar/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install stow git neovim iterm2 karabiner-elements aerospace bitwarden bitwarden-cli lsof opencodeiterm2's settings does not allow for symlinking, you'll need to hardlink the files instead.
ln -s ~/dotfiles/work/Library/Preferences/com.googlecode.iterm2.plist ~/Library/Preferences/com.googlecode.iterm2.plistMake sure you have the these installed on your system
sudo pacman -S git stowsudo apt install git stowsudo dnf install git stow/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install stow gitFirst, "check out" (the meaning you use in git not "take a look at") the dotfiles repo in your $HOME directory using git.
git clone https://github.com/luckycold/dotfiles.git
cd dotfilesthen use GNU stow to create symlinks
stow -t ~ common
stow -t ~ personal
# For systems with my exclusive use
# sudo stow -t / rootAfter stowing common, enable the Proton Pass service:
systemctl --user daemon-reload
systemctl --user enable --now proton-pass-cli-autologin.serviceThis single service handles:
- Auto-login to Proton Pass at startup
- SSH agent bootstrap
- Periodic health checks (every 5 minutes)
- Re-authentication after waking from sleep/hibernate
View logs with:
journalctl --user -u proton-pass-cli-autologin.service -f
journalctl --user -u proton-pass-cli-ssh-agent.service -fThe above is a bit of a departure from the instructional video for GNU stow. It's basically using the same idea but instead of using stow . you can switch between personal and work "profiles" to cleanly and quickly get up and running on any new computer install.
For my personal Framework AMD + Thunderbolt dock + NVIDIA eGPU setup, the power-management changes are split between:
personal/for user-session behaviorroot/for stow-safe machine policy under/etcbootstrap/framework-power/for the root-owned files that should be copied into/etc, not left as symlinks into/homebootstrap/sddm-gnome-keyring/for the root-owned SDDM PAM config that unlocks the GNOME keyring on login
Scope note:
- the
personal/changes here are still primarily aimed at this AMD Framework laptop, but theuwsmGPU pin is now conditional instead of hardcoded personal/.config/uwsm/envonly exportsAQ_DRM_DEVICESwhen both an AMD DRM card and an NVIDIA DRM card are present, and then picks the first AMD card it finds- that makes the
personal/side safer across other machines, but it is still not meant as a fully generic power profile for every AMD laptop bootstrap/framework-power/is fully personal to this specific Framework + Thunderbolt dock + NVIDIA eGPU setup and should be treated as host-specificbootstrap/sddm-gnome-keyring/is personal auth/session setup and should also be treated as a root-applied bootstrap, not a stowed profile
Overview of what had to be fixed to make this setup reliable:
- keep Hyprland on the AMD iGPU so the desktop session is not tied to the NVIDIA eGPU on boot, suspend, or wake
- remove the old
hypridleDPMS-off behavior that could leave wakeup in a broken state - disable NVIDIA's suspend video-memory preservation path, which was breaking suspend and hibernate with the eGPU attached
- disable Thunderbolt dock wake sources so suspend does not immediately wake back up
- use both
tmpfiles.dand a udev rule so wakeup gets disabled both at boot and when dock/eGPU PCI devices hotplug later - override NVIDIA's sleep-unit drop-ins so systemd freezes user sessions again during suspend, hibernate, and suspend-then-hibernate
- wire hibernate to the real swapfile with the correct
resume=andresume_offset=values - disable zram so hibernate does not fail from memory pressure while building the image
- refresh Limine EFI binaries and boot order so fallback boot and hibernate resume use the same working path
- leave TPM/Clevis as a final machine-specific step, since measured-boot changes can require regenerating the unlock binding
Files involved in this setup:
personal/.config/uwsm/env- conditionally pins Hyprland to the AMD DRM card when both AMD and NVIDIA GPUs are presentpersonal/.config/hypr/hypridle.conf- keeps the safer lock/suspend behavior without the old DPMS-off listenerbootstrap/framework-power/apply.sh- personal bootstrap for this machine that fills in install-specific boot values, copies real root-owned files into/etc, refreshes Limine, and applies wake settingsbootstrap/framework-power/etc/modprobe.d/99-nvidia-suspend-workaround.conf- disables NVIDIA video-memory preservation during suspend/hibernatebootstrap/framework-power/etc/tmpfiles.d/no-dock-wakeup.conf- disables the Thunderbolt dock PCI wake sources on bootbootstrap/framework-power/etc/udev/rules.d/43-framework-dock-wakeup.rules- disables wake on the same PCI devices when the dock/eGPU chain appears later via hotplug or resumebootstrap/framework-power/etc/systemd/system/systemd-suspend.service.d/90-freeze-user-sessions.conf- overrides the NVIDIA vendor drop-in and freezes user sessions for suspendbootstrap/framework-power/etc/systemd/system/systemd-hibernate.service.d/90-freeze-user-sessions.conf- overrides the NVIDIA vendor drop-in and freezes user sessions for hibernatebootstrap/framework-power/etc/systemd/system/systemd-suspend-then-hibernate.service.d/90-freeze-user-sessions.conf- overrides the NVIDIA vendor drop-in and freezes user sessions for delayed hibernatebootstrap/framework-power/etc/tmpfiles.d/hibernate-image-size.conf- forces the kernel to use the minimum hibernate image sizebootstrap/framework-power/etc/systemd/logind.conf.d/90-lid-suspend-then-hibernate.conf- sets lid close tosuspend-then-hibernatebootstrap/framework-power/etc/systemd/sleep.conf.d/90-suspend-then-hibernate.conf- sets the lid-close hibernate delay back to30minbootstrap/framework-power/etc/systemd/zram-generator.conf- disables zram so the swapfile is the only hibernate backing store
Apply them like this:
stow -t ~ common
stow -t ~ personal
sudo stow -t / root
sudo ./bootstrap/framework-power/apply.sh
sudo ./bootstrap/sddm-gnome-keyring/apply.shIf you are moving an already-tuned machine under Stow management instead of setting up a fresh install, use --adopt once for the profiles that already exist on disk:
stow --adopt -t ~ personal
sudo stow --adopt -t / rootWhat this covers:
- pin Hyprland to the AMD iGPU in
personal/.config/uwsm/env - keep
hypridlefrom using the old DPMS-off path inpersonal/.config/hypr/hypridle.conf - disable NVIDIA suspend integration that breaks suspend/hibernate with the eGPU
- disable Thunderbolt dock wakeups
- restore systemd's default user-session freezing during sleep operations
- force hibernate to use the swapfile instead of zram
- set lid-close to
suspend-then-hibernateafter the configured delay - regenerate Limine boot artifacts and refresh fallback EFI binaries
- install the SDDM PAM configuration that hooks GNOME keyring into login
What is still intentionally machine-specific and generated by the bootstrap script:
- the encrypted root
PARTUUID - the Btrfs swapfile
resume_offset - EFI boot-order cleanup for the current firmware
What is still a manual post-install step:
- if TPM/Clevis auto-unlock stops working after reinstall or after boot-chain changes, regenerate or rebind the TPM slot after the first successful reboot
Useful verification commands after reboot:
cat /proc/cmdline
swapon --show
systemctl hibernateImportant note for root/ files:
root/is now reserved for files that are safe to manage directly with Stow- the power-management files for this specific Framework setup live under
bootstrap/framework-power/instead - the SDDM PAM login file lives under
bootstrap/sddm-gnome-keyring/so it is installed as a real root-owned file under/etc/pam.d - those files are copied into
/etcas real root-owned files because symlinks into/homeare not reliable for early boot, udev, modprobe, andsystemd-logind - treat the bootstrap scripts as the required final step for these root-owned files, not just optional helpers
This is a useful video if you get lost: