Scaffold BOS repo: dotfiles, ISO profile, and bos-settings GTK4 app

Implements all four components from the BOS spec:
- dotfiles/: default Hyprland, bread, breadbox, breadcrumbs configs
- iso/: archiso profiledef, package list, Calamares YAML modules, post-install.sh
- bos-settings/: Cargo workspace with GTK4 settings app (8 views: snapshots,
  packages, bread, breadbar, breadbox, breadcrumbs, breadpad, hyprland)

https://claude.ai/code/session_01WszGHvCmxgcyTwNSkfLF9P
This commit is contained in:
Claude 2026-06-12 13:27:25 +00:00
parent 26d3bd8266
commit 0ff3998c84
38 changed files with 2547 additions and 0 deletions

View file

@ -0,0 +1,9 @@
---
efiBootloaderId: "BOS"
installEFIFallback: true
grubInstall: "grub-install"
grubMkconfig: "grub-mkconfig"
grubCfg: "/boot/grub/grub.cfg"
grubProbe: "grub-probe"
efiDirectory: "/boot/efi"
kernel: ""

View file

@ -0,0 +1,5 @@
---
restartNowEnabled: true
restartNowChecked: true
restartNowCommand: "systemctl reboot"
notifyOnFinished: false

View file

@ -0,0 +1,2 @@
---
xorgConfDir: "/etc/X11/xorg.conf.d"

View file

@ -0,0 +1,5 @@
---
region: "America"
zone: "New_York"
localeGenPath: "/etc/locale.gen"
geoipUrl: "https://geoip.kde.org/v1/calamares"

View file

@ -0,0 +1,10 @@
---
backend: pacman
options:
- update_db: true
operations:
- try_install:
- pipewire-pulse
- pipewire-alsa

View file

@ -0,0 +1,29 @@
---
efiSystemPartition: "/boot/efi"
efiSystemPartitionSize: "512M"
efiSystemPartitionName: "EFI"
defaultFileSystemType: "btrfs"
btrfsSubvolumes:
- mountPoint: /
subvolume: "@"
mountOptions: "noatime,compress=zstd,space_cache=v2"
- mountPoint: /home
subvolume: "@home"
mountOptions: "noatime,compress=zstd,space_cache=v2"
- mountPoint: /.snapshots
subvolume: "@snapshots"
mountOptions: "noatime,compress=zstd,space_cache=v2"
- mountPoint: /var/log
subvolume: "@log"
mountOptions: "noatime,compress=zstd,space_cache=v2"
- mountPoint: /var/cache
subvolume: "@cache"
mountOptions: "noatime,compress=zstd,space_cache=v2"
userSwapChoices:
- none
- small
- suspend
- file

View file

@ -0,0 +1,3 @@
---
script:
- "-/usr/bin/bash /etc/calamares/post-install.sh"

View file

@ -0,0 +1,40 @@
---
defaultGroups:
- name: users
must_exist: true
system: false
- name: lp
must_exist: false
system: true
- name: video
must_exist: false
system: true
- name: network
must_exist: false
system: true
- name: storage
must_exist: false
system: true
- name: wheel
must_exist: false
system: true
- name: audio
must_exist: false
system: true
- name: input
must_exist: false
system: true
autologinGroup: autologin
doAutologin: false
sudoersGroup: wheel
setRootPassword: false
doReusePassword: true
passwordRequirements:
minLength: 6
maxLength: -1
libpwquality:
- minlen=6
allowWeakPasswords: false

View file

@ -0,0 +1,11 @@
---
showSupportUrl: false
showKnownIssuesUrl: false
showReleaseNotesUrl: false
requirements:
requiredStorage: 20
requiredRam: 2.0
checkInternet: true
checkPower: true
internetCheckUrl: "https://archlinux.org"

View file

@ -0,0 +1,36 @@
---
modules-search: [local, /usr/lib/calamares/modules]
sequence:
- show:
- welcome
- locale
- keyboard
- partition
- users
- summary
- exec:
- partition
- mount
- unpackfs
- machineid
- fstab
- locale
- keyboard
- localecfg
- users
- networkcfg
- hwclock
- packages
- bootloader
- shellprocess
- umount
- show:
- finished
branding: bos
prompt-install: true
dont-chroot: false
oem-setup: false
disable-cancel: false
disable-cancel-during-exec: true

84
iso/packages.x86_64 Normal file
View file

@ -0,0 +1,84 @@
# Base system
base
base-devel
linux
linux-firmware
linux-headers
# Bootloader + filesystem
grub
efibootmgr
btrfs-progs
dosfstools
mtools
# Snapshot infrastructure
snapper
snap-pac
grub-btrfs
inotify-tools
# Wayland / Hyprland
hyprland
xdg-desktop-portal-hyprland
xdg-utils
xdg-user-dirs
polkit
polkit-gnome
# Audio
pipewire
wireplumber
pipewire-pulse
pipewire-alsa
pipewire-jack
# Network
networkmanager
network-manager-applet
iw
iwd
bluez
bluez-utils
# GTK4 runtime
gtk4
gtk4-layer-shell
librsvg
libpulse
# Display
wayland
wayland-protocols
wlroots
# Fonts
noto-fonts
noto-fonts-emoji
ttf-jetbrains-mono
# Terminal
foot
# File manager
nautilus
# Installer
calamares
calamares-qt6
# Utilities
sudo
git
curl
wget
unzip
tar
gzip
which
man-db
man-pages
less
# Dev tools (for bos-settings standalone install)
rustup

40
iso/post-install.sh Normal file
View file

@ -0,0 +1,40 @@
#!/bin/bash
set -euo pipefail
# --- Snapper root config ---
snapper -c root create-config /
sed -i 's/TIMELINE_CREATE="yes"/TIMELINE_CREATE="no"/' /etc/snapper/configs/root
sed -i 's/NUMBER_CLEANUP="no"/NUMBER_CLEANUP="yes"/' /etc/snapper/configs/root
sed -i 's/NUMBER_MIN_AGE="[^"]*"/NUMBER_MIN_AGE="1800"/' /etc/snapper/configs/root
sed -i 's/NUMBER_LIMIT="[^"]*"/NUMBER_LIMIT="10"/' /etc/snapper/configs/root
sed -i 's/NUMBER_LIMIT_IMPORTANT="[^"]*"/NUMBER_LIMIT_IMPORTANT="5"/' /etc/snapper/configs/root
# Allow main user to use snapper without sudo
MAIN_USER=$(getent passwd 1000 | cut -d: -f1)
sed -i "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"$MAIN_USER\"/" /etc/snapper/configs/root
# --- System services ---
systemctl enable NetworkManager
systemctl enable bluetooth
systemctl enable snapper-cleanup.timer
systemctl enable grub-btrfs.path
# --- Bakery install ---
if command -v bakery &>/dev/null; then
sudo -u "$MAIN_USER" bakery install bread breadbar breadbox breadcrumbs breadpad bos-settings
fi
# --- Deploy dotfiles (skip existing files) ---
DOTFILES_SRC="/etc/skel/.config"
DOTFILES_DEST="/home/$MAIN_USER/.config"
if [[ -d "$DOTFILES_SRC" ]]; then
mkdir -p "$DOTFILES_DEST"
cp -rn "$DOTFILES_SRC/." "$DOTFILES_DEST/"
chown -R "$MAIN_USER:$MAIN_USER" "$DOTFILES_DEST"
fi
# --- XDG user dirs ---
sudo -u "$MAIN_USER" xdg-user-dirs-update
echo "BOS post-install complete. Reboot to start your system."

24
iso/profiledef.sh Normal file
View file

@ -0,0 +1,24 @@
#!/usr/bin/env bash
# shellcheck disable=SC2034
iso_name="bos"
iso_label="BOS_$(date +%Y%m)"
iso_publisher="Breadway"
iso_application="Bread Operating System"
iso_version="$(date +%Y.%m.%d)"
install_dir="arch"
buildmodes=('iso')
bootmodes=(
'bios.syslinux.mbr'
'bios.syslinux.eltorito'
'uefi-x64.systemd-boot.esp'
'uefi-x64.systemd-boot.eltorito'
)
arch="x86_64"
pacman_conf="pacman.conf"
airootfs_image_type="squashfs"
airootfs_image_tool_options=('-comp' 'xz' '-Xbcj' 'x86' '-b' '1M' '-Xdict-size' '1M')
file_permissions=(
["/etc/shadow"]="0:0:400"
["/etc/calamares/post-install.sh"]="0:0:755"
)