Reproducible modular setup for my Framework laptop (Arch Linux, niri, DankMaterialShell, greetd).
  • Shell 51.9%
  • Python 35.5%
  • Rust 10.7%
  • C 1.8%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Julian Imhof da32b2faa6
Add the bsmanager-oneclick module
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 19:58:26 +01:00
lib Patch nvidia-open-dkms with pkgpatch instead of a rebuilt package 2026-10-26 18:53:14 +01:00
modules Add the bsmanager-oneclick module 2026-11-01 19:58:26 +01:00
.gitignore Add repo skeleton and the seamless-login module 2026-09-18 22:47:33 +02:00
README.md Add the bsmanager-oneclick module 2026-11-01 19:58:26 +01:00
setup.sh Add the niri-portal-relogin module 2026-09-19 12:41:02 +02:00

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 sudo themselves where root is needed; modules that only touch your home directory never do.
  • --dry-run shows what would happen and changes nothing.
  • They explain what they are about to do and ask once. --yes skips 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.sh takes 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.