feat: initial commit — void-installer multi-profile (stable-cinnamon + mainline-niri)

This commit is contained in:
mozempk
2026-04-22 23:53:16 +02:00
commit a16ac37d20
35 changed files with 3902 additions and 0 deletions

91
config/install.conf Normal file
View File

@@ -0,0 +1,91 @@
# Void installer configuration for the XPS 17 (xps9700)
# Sourced by installer/install.sh inside the live environment.
# All passwords come from /etc/installer-secrets.env (baked at ISO build).
# ---------- Identity ----------
HOSTNAME="xps9700"
USERNAME="moze"
USER_FULLNAME="moze"
USER_UID="1000"
USER_GROUPS="wheel,docker,video,audio,input,plugdev,network,kvm,users"
DEFAULT_SHELL="/bin/bash"
# ---------- Locale ----------
LOCALE="en_US.UTF-8"
LANG="en_US.UTF-8"
KEYMAP="ch-fr_nodeadkeys" # Swiss French keyboard
TIMEZONE="Europe/Zurich"
HARDWARECLOCK="UTC"
# ---------- Repository ----------
REPO_URL="https://repo-default.voidlinux.org/current"
ARCH="x86_64" # glibc
EXTRA_REPOS=(nonfree multilib multilib/nonfree)
# During install, packages can be fetched via a local caching proxy (set by
# the test harness to http://10.0.2.2:3142/current). Empty = use REPO_URL.
INSTALL_REPO_URL=""
# ---------- Disk layout ----------
# Defaults match the detected XPS 17 layout. The TUI overrides these
# after explicit user confirmation.
DEFAULT_DISK="/dev/nvme0n1"
DEFAULT_ROOT_PART="/dev/nvme0n1p5" # Linux Mint -> Void
DEFAULT_EFI_PART="/dev/nvme0n1p1" # SHARED with Windows; never reformatted
DEFAULT_FS="btrfs"
# Btrfs subvolume layout. Each entry: "<subvol-name>:<mountpoint>"
# ("@" is the root subvolume; mountpoint is relative to the install root).
BTRFS_SUBVOLS=(
"@:/"
"@home:/home"
"@snapshots:/.snapshots"
"@var_log:/var/log"
"@var_cache:/var/cache"
)
BTRFS_MOUNT_OPTS="rw,noatime,ssd,compress=zstd:3,space_cache=v2,discard=async"
EFI_MOUNTPOINT="/boot/efi"
# ---------- Boot ----------
BOOTLOADER="grub"
BOOTLOADER_ID="Void"
ENABLE_OS_PROBER="yes" # detect Windows on /dev/nvme0n1p3
# ---------- Hardware ----------
CPU_VENDOR="intel" # microcode -> intel-ucode
GPU_MODE="prime-offload" # Intel UHD primary, NVIDIA GTX 1650 Ti on demand
WIFI_FW="yes"
KERNEL_PKG="linux"
# ---------- Services ----------
SSHD_ENABLE="no"
NETWORK_MGR="NetworkManager"
DISPLAY_MANAGER="lightdm"
DESKTOP="cinnamon"
ZRAM_ENABLE="yes"
ZRAM_SIZE_PCT="50" # 50% of RAM
# ---------- SSH config ----------
SSH_SOURCE_DIR="/etc/installer-ssh" # baked into ISO from /home/moze/.ssh
SSH_TARGET_DIR_REL=".ssh"
# ---------- Nix ----------
ENABLE_NIX="yes"
# Apps installed via `nix profile install` after first boot for $USERNAME:
NIX_USER_PACKAGES=(
"nixpkgs#spotify"
"nixpkgs#discord"
"nixpkgs#localsend"
"nixpkgs#google-chrome"
"nixpkgs#mission-center"
)
# ---------- Cinnamon customization ----------
GTK_THEME="Gruvbox-Dark"
ICON_THEME="Gruvbox-Plus-Dark"
CURSOR_THEME="Bibata-Modern-Ice"
DEFAULT_TERMINAL="alacritty"
INITIAL_WALLPAPER="pxfuel.jpg"
# ---------- Test mode flag ----------
# Set TEST_MODE=1 in env when running under QEMU smoke tests.
TEST_MODE="${TEST_MODE:-0}"

19
config/packages.live.list Normal file
View File

@@ -0,0 +1,19 @@
# Extra packages included in the live ISO (installer environment only).
dialog
ncurses
util-linux
gptfdisk
parted
btrfs-progs
dosfstools
xtools
rsync
curl
git
vim
NetworkManager
xz
tar
ca-certificates
pciutils
usbutils

View File

@@ -0,0 +1,149 @@
#!/bin/bash
# Niri-specific customizations. Sourced by customizations.sh after the generic
# helpers when PROFILE=mainline-niri.
# Available env: $TARGET, $USERNAME, $PROFILE, $PROFILE_DIR, all install.conf vars.
_niri_write_kdl() {
local TARGET="$1"
local cfg="$TARGET/etc/skel/.config/niri"
install -d -m 0755 "$cfg"
cat > "$cfg/config.kdl" <<'EOF'
// niri config — generated by void-installer (mainline-niri profile).
input {
keyboard {
xkb {
layout "ch"
variant "fr"
}
}
touchpad {
tap
natural-scroll
dwt
}
mouse {
accel-speed 0.0
}
}
layout {
gaps 12
center-focused-column "never"
preset-column-widths {
proportion 0.33333
proportion 0.5
proportion 0.66667
}
default-column-width { proportion 0.5; }
focus-ring {
width 2
active-color "#fabd2f"
inactive-color "#3c3836"
}
border { off; }
}
prefer-no-csd
spawn-at-startup "swaybg" "-i" "/usr/share/backgrounds/void-installer/pxfuel.jpg"
spawn-at-startup "mako"
spawn-at-startup "nm-applet" "--indicator"
spawn-at-startup "blueman-applet"
spawn-at-startup "/usr/libexec/polkit-gnome-authentication-agent-1"
spawn-at-startup "noctalia-shell"
cursor {
xcursor-theme "Bibata-Modern-Ice"
xcursor-size 24
}
binds {
Mod+T { spawn "alacritty"; }
Mod+D { spawn "fuzzel"; }
Mod+Q { close-window; }
Mod+Shift+E { quit; }
Print { screenshot; }
Mod+H { focus-column-left; }
Mod+L { focus-column-right; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+Shift+H { move-column-left; }
Mod+Shift+L { move-column-right; }
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+Shift+1 { move-column-to-workspace 1; }
Mod+Shift+2 { move-column-to-workspace 2; }
XF86AudioRaiseVolume { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%+"; }
XF86AudioLowerVolume { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "5%-"; }
XF86AudioMute { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86MonBrightnessUp { spawn "brightnessctl" "set" "+5%"; }
XF86MonBrightnessDown { spawn "brightnessctl" "set" "5%-"; }
}
EOF
# Mirror into the actual user home.
install -d -m 0755 "$TARGET/home/$USERNAME/.config/niri"
cp "$cfg/config.kdl" "$TARGET/home/$USERNAME/.config/niri/config.kdl"
run_chroot "chown -R $USERNAME:$USERNAME /home/$USERNAME/.config/niri" || true
log "niri KDL config installed"
}
_niri_write_env() {
local TARGET="$1"
cat > "$TARGET/etc/profile.d/wayland.sh" <<'EOF'
# Wayland defaults installed by void-installer (mainline-niri profile).
export QT_QPA_PLATFORM="wayland;xcb"
export GDK_BACKEND=wayland,x11
export MOZ_ENABLE_WAYLAND=1
export _JAVA_AWT_WM_NONREPARENTING=1
export XDG_CURRENT_DESKTOP=niri
export XDG_SESSION_TYPE=wayland
EOF
chmod 0644 "$TARGET/etc/profile.d/wayland.sh"
log "wayland environment installed at /etc/profile.d/wayland.sh"
}
_niri_setup_greetd() {
local TARGET="$1"
install -d -m 0755 "$TARGET/etc/greetd"
cat > "$TARGET/etc/greetd/config.toml" <<EOF
[terminal]
vt = 1
[default_session]
command = "tuigreet --time --remember --cmd niri-session"
user = "_greeter"
EOF
log "greetd configured for niri-session"
}
_niri_install_noctalia() {
local TARGET="$1"
# Third-party Void repo that ships noctalia-shell + noctalia-qs.
# Source: https://docs.noctalia.dev/getting-started/installation/#void
install -d -m 0755 "$TARGET/etc/xbps.d"
cat > "$TARGET/etc/xbps.d/10-noctalia.conf" <<'EOF'
repository=https://universalrepo.r1xelelo.workers.dev/void
EOF
# If quickshell is somehow installed it conflicts with noctalia-qs.
run_chroot "xbps-remove -y quickshell 2>/dev/null || true"
# Sync the new repo and install. Prefix with the proxy mirror configured
# by the installer environment so noctalia-shell deps still resolve fast.
if ! run_chroot "xbps-install -Sy"; then
log "WARN: noctalia repo sync failed; skipping noctalia-shell install"
return 0
fi
if run_chroot "xbps-install -y noctalia-shell"; then
log "noctalia-shell installed from third-party repo"
else
log "WARN: noctalia-shell install failed (repo may be down); shell omitted"
fi
}
_niri_write_kdl "$TARGET"
_niri_write_env "$TARGET"
_niri_setup_greetd "$TARGET"
_niri_install_noctalia "$TARGET"

View File

@@ -0,0 +1,187 @@
# Packages installed into the target system for the mainline-niri profile.
# Lines beginning with '#' or empty are skipped.
# --- base / boot ---
base-system
linux-mainline
linux-firmware
linux-firmware-network
intel-ucode
grub-x86_64-efi
efibootmgr
os-prober
dracut
gptfdisk
parted
btrfs-progs
dosfstools
# --- core userspace ---
sudo
bash
bash-completion
git
curl
wget
vim
nano
htop
tmux
unzip
zip
xz
rsync
pciutils
usbutils
lsof
strace
file
which
man-pages
mdocml
ca-certificates
xtools
# --- networking ---
NetworkManager
NetworkManager-openvpn
openssh
iwd
nftables
chrony
# --- audio (pipewire stack) ---
pipewire
wireplumber
alsa-pipewire
pavucontrol
alsa-utils
playerctl
# --- graphics / wayland ---
wayland
wayland-protocols
xorg-server-xwayland
mesa-dri
mesa-vulkan-intel
intel-video-accel
vulkan-loader
libxkbcommon
# --- nvidia (PRIME offload) ---
nvidia
nvidia-libs-32bit
nvidia-vaapi-driver
# --- niri compositor + wayland ecosystem ---
niri
fuzzel
mako
swaybg
swayidle
swaylock
grim
slurp
wl-clipboard
xdg-desktop-portal
xdg-desktop-portal-gtk
xdg-desktop-portal-wlr
polkit-gnome
brightnessctl
# --- noctalia shell runtime deps (noctalia-shell itself is installed in
# niri.sh from the third-party XBPS repo at universalrepo.r1xelelo.workers.dev).
ImageMagick
python3
ddcutil
power-profiles-daemon
upower
cliphist
wlsunset
evolution-data-server
# --- file manager (no nemo) ---
Thunar
thunar-volman
thunar-archive-plugin
gvfs
gvfs-mtp
gvfs-smb
file-roller
gnome-keyring
seahorse
network-manager-applet
blueman
bluez
# --- display manager ---
# niri can be launched directly via TTY (`niri-session`) or via a wayland-aware
# greeter. We use greetd + tuigreet — lighter than lightdm under wayland.
greetd
tuigreet
# --- fonts ---
noto-fonts-ttf
noto-fonts-emoji
noto-fonts-cjk
liberation-fonts-ttf
dejavu-fonts-ttf
font-awesome6
# --- containers ---
docker
docker-compose
# --- terminal ---
alacritty
# --- gtk theming deps ---
sassc
gnome-themes-extra
gtk-engine-murrine
dconf
# --- media / utilities ---
vlc
obs
# --- nix package manager ---
nix
# --- zram / swap ---
zramen
# --- power / laptop ---
tlp
tlp-rdw
acpi
acpid
upower
# --- printing ---
cups
cups-filters
cups-pk-helper
ghostscript
foomatic-db
gutenprint
hplip
system-config-printer
sane
simple-scan
# --- bluetooth audio ---
bluez-alsa
# --- backups / snapshots ---
timeshift
grub-btrfs
inotify-tools
# --- trackpad gestures ---
libinput-gestures
xdotool
python3-setproctitle
# NOTE: waybar is intentionally absent — niri ships with its own panel
# helpers; if you want a bar add `waybar` once it lands in void-packages.

View File

@@ -0,0 +1,31 @@
# Mainline-niri profile.
# Linux mainline kernel + niri Wayland tiling compositor.
PROFILE_NAME="mainline-niri"
PROFILE_DESC="Linux mainline kernel + niri Wayland (scrolling tiler)"
# Mainline kernel for best Wayland / GPU support.
KERNEL_PKG="linux-mainline"
# Display server / DE.
DISPLAY_SERVER="wayland"
DESKTOP="niri"
# niri has no dconf, no Cinnamon — most cinnamon helpers are skipped via
# this DESKTOP gate inside customizations.sh.
# Package list.
PROFILE_PACKAGES_FILE="config/profiles/mainline-niri/packages.list"
# Theme settings still apply (gtk3/gtk4 apps under wayland still read these).
GTK_THEME="Gruvbox-Dark"
ICON_THEME="Gruvbox-Plus-Dark"
DEFAULT_TERMINAL="alacritty"
CURSOR_THEME="Bibata-Modern-Ice"
# Wayland shell — noctalia (installed via third-party XBPS repo by niri.sh).
WAYLAND_SHELL="noctalia"
# Wayland env defaults (exported into /etc/environment by profile customisation).
QT_QPA_PLATFORM="wayland;xcb"
GDK_BACKEND="wayland,x11"
MOZ_ENABLE_WAYLAND="1"

View File

@@ -0,0 +1,174 @@
# Packages installed into the target system via xbps-install.
# Lines beginning with '#' or empty are skipped.
# --- base / boot ---
base-system
linux
linux-firmware
linux-firmware-network
intel-ucode
grub-x86_64-efi
efibootmgr
os-prober
dracut
gptfdisk
parted
btrfs-progs
dosfstools
# --- core userspace ---
sudo
bash
bash-completion
git
curl
wget
vim
nano
htop
tmux
unzip
zip
xz
rsync
pciutils
usbutils
lsof
strace
file
which
man-pages
mdocml
ca-certificates
xtools
# --- networking ---
NetworkManager
NetworkManager-openvpn
openssh
iwd
wpa_supplicant
nftables
chrony
# --- audio ---
pipewire
wireplumber
alsa-pipewire
pavucontrol
alsa-utils
# --- graphics / xorg ---
xorg-minimal
xorg-fonts
xorg-input-drivers
xf86-input-libinput
xf86-video-intel
mesa-dri
mesa-vulkan-intel
intel-video-accel
vulkan-loader
# --- nvidia (PRIME offload) ---
nvidia
nvidia-libs-32bit
nvidia-vaapi-driver
# --- desktop ---
cinnamon
xdg-user-dirs
xdg-utils
xdg-desktop-portal
xdg-desktop-portal-gtk
gvfs
gvfs-mtp
gvfs-smb
file-roller
gnome-keyring
seahorse
network-manager-applet
blueman
bluez
# --- display manager ---
lightdm
lightdm-gtk3-greeter
# --- fonts ---
noto-fonts-ttf
noto-fonts-emoji
noto-fonts-cjk
liberation-fonts-ttf
dejavu-fonts-ttf
font-awesome6
# --- containers ---
docker
docker-compose
# --- editor ---
# Real Microsoft VS Code is installed from the official tarball in postinstall
# (see install_vscode_real); the Void `vscode` package is actually code-oss.
# --- terminal ---
alacritty
# --- gtk theming deps (for gruvbox theme) ---
sassc
gnome-themes-extra
gtk-engine-murrine
dconf
dconf-editor
# --- media / utilities (xbps) ---
vlc
obs
flameshot
# firefox — replaced by google-chrome (installed via nix)
# --- nix package manager (for spotify/discord/localsend) ---
nix
# --- zram / swap ---
zramen
# --- power / laptop ---
tlp
tlp-rdw
acpi
acpid
upower
brightnessctl
# --- printing (CUPS + drivers + Cinnamon settings panel uses system-config-printer) ---
cups
cups-filters
cups-pk-helper
ghostscript
foomatic-db
gutenprint
hplip
system-config-printer
sane
simple-scan
# --- bluetooth (blueman+bluez already above, ensure bluez-alsa/obex tools) ---
bluez-alsa
# --- backups / snapshots ---
timeshift
grub-btrfs
inotify-tools
# --- trackpad gestures (libinput-gestures + GUI) ---
libinput-gestures
wmctrl
xdotool
python3-setproctitle
# --- screenshots (flameshot already above, also xclip for clipboard) ---
xclip
# --- system / package upgrade GUI helpers (Octoxbps available via xtools) ---
# nothing extra needed; we ship a small custom xbps-upgrade applet

View File

@@ -0,0 +1,20 @@
# Stable Cinnamon profile (default).
# This is the ORIGINAL setup: stable Void kernel + Cinnamon DE + X11.
PROFILE_NAME="stable-cinnamon"
PROFILE_DESC="Stable Void kernel + Cinnamon (X11) — current production profile"
# Kernel — use Void's stable LTS.
KERNEL_PKG="linux"
# Display server / DE.
DISPLAY_SERVER="x11"
DESKTOP="cinnamon"
# Package list (relative to repo root).
PROFILE_PACKAGES_FILE="config/profiles/stable-cinnamon/packages.list"
# Default GTK theme + icons (overrides install.conf if set there).
GTK_THEME="Gruvbox-Dark"
ICON_THEME="Gruvbox-Plus-Dark"
DEFAULT_TERMINAL="alacritty"
CURSOR_THEME="Bibata-Modern-Ice"