Reproducible modular setup for my Framework laptop (Arch Linux, niri, DankMaterialShell, greetd).
- Shell 51.9%
- Python 35.5%
- Rust 10.7%
- C 1.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| lib | ||
| modules | ||
| .gitignore | ||
| README.md | ||
| setup.sh | ||
framework
Reproducible setup for my Framework laptop (Arch Linux, niri, Dux Shell, greetd), split into modules. Every module stands on its own: pick the ones you want, ignore the rest. Nothing in here is specific to my machine, my user name or my accounts, and there are no secrets.
Modules
| module | what it gives you |
|---|---|
boot-splash |
Quiet boot with a plymouth splash (Arch logo and spinner) instead of scrolling text. |
bsmanager-oneclick |
The BSManager Flatpak stops reporting one-click installs as disabled; its check sees the handlers. |
keyring-unlock |
The passwordless GNOME login keyring is unlocked at session start, so a fingerprint or security-key login leaves no locked keyring behind. |
lock-u2f-listen |
The Dux Shell lock screen listens for the security key all the time: no click on the key button before the touch. |
luks-fido2-prompt |
The encrypted root waits for the security key as long as it takes, with a hint on the splash; a key press switches to the passphrase. |
mixed-locale |
US English as the system language with German formats for dates, times, paper, units and money; numbers stay English. |
niri-firefox-popups |
Firefox popups open floating in niri at the size they asked for; browser windows tile as usual. |
niri-game-mirror |
A Steam game that loses the focus keeps playing in a small window in the corner; niri is patched so it stays live off-screen. |
niri-portal-relogin |
Desktop portals (Flatpak secrets, screen sharing) keep working after logging out of niri and back in. |
niri-xx-hotkey |
The experimental xx-hotkey-v1 protocol for niri: applications register their own global hotkeys. |
package-cache-clean |
The pacman cache and the yay build cache are trimmed every week: old versions, old source downloads, build trees and removed packages go. |
parallel-fingerprint |
Fingerprint, security key and password at the same time at the greetd login: no timeouts, no waiting for them with a typed password. |
seamless-login |
No black screen between the greetd greeter and the niri desktop. |
steamvr-beyond |
SteamVR with a Bigscreen Beyond on an NVIDIA GPU: no killed compositor, no tearing, no static in the headset; PC audio plays on the headset too. |
Using a module
git clone https://git.imhof.cloud/julian/framework.git
cd framework
./setup.sh # lists the modules
./setup.sh seamless-login # same as modules/seamless-login/install.sh
Each module has a README.md that says what it needs, what it changes and how to
undo it. Read it first.
All modules follow the same rules:
- Run them as your normal user. They call
sudothemselves where root is needed; modules that only touch your home directory never do. --dry-runshows what would happen and changes nothing.- They explain what they are about to do and ask once.
--yesskips the question. - They can be run again at any time; a second run repairs or updates.
- Every file they replace is copied to
/var/backups/framework-setup/<date>/first. uninstall.shtakes the module out again.
Layout
setup.sh tiny launcher: list modules, run one
lib/common.sh helpers shared by the module scripts
lib/pkgpatch.sh helpers for modules that patch packages while they are built
lib/pkgpatch/ the patcher itself, its two makepkg hooks and its dkms pacman hook
modules/<name>/ README.md, install.sh, uninstall.sh, files/
Adding a module
Create modules/<name>/ with a README.md whose first paragraph says what the
module does, an install.sh and an uninstall.sh that source lib/common.sh,
and keep everything it installs under files/. No user names, host names, keys
or tokens: take them from the environment or ask.