Commit graph

32 commits

Author SHA1 Message Date
Breadway
105b67bb4d Bake bread ecosystem into the ISO + full live desktop; fix installer timeout
- packages.x86_64: add bread, breadbar, breadbox, breadcrumbs, breadpad,
  bos-settings so they ship in the squashfs and reach the target via unpackfs
  (no network needed; install works fully offline)
- shellprocess.conf: set timeout 1800 — Calamares' 10s default was killing
  post-install.sh partway (the real cause of the empty /boot + ESP); the "-"
  prefix had been masking the kill as success
- bos-live-setup: live user now boots the real BOS desktop from /etc/skel
  (breadd + breadbar + breadbox) with the installer layered on top
  (auto-launch + Super+I), instead of an installer-only kiosk
- post-install.sh: drop the now-redundant networked `bakery install`
2026-06-14 18:41:59 +08:00
Breadway
078c5f4f94 Fix unbootable installs: lay the kernel into the target and own GRUB
archiso keeps vmlinuz/initramfs in the ISO boot dir, not the squashfs, so
unpackfs lays down an empty /boot. The chroot's mkinitcpio/grub-mkconfig had
nothing to work with and the ESP ended up empty (firmware found no bootloader).

- shellprocess@kernel (dontChroot) copies the live kernel into the target
  /boot before the bootloader step
- post-install.sh now runs grub-install itself, including a --removable pass
  so firmware with no NVRAM entry still boots via EFI/BOOT/BOOTX64.EFI
2026-06-14 17:57:50 +08:00
Breadway
2116b7cd7b Add rsync and make the installed system bootable/clean
unpackfs runs unsquashfs then rsync to copy the rootfs onto the target;
rsync was missing (error code 127), so add it alongside squashfs-tools.

unpackfs also copies the live filesystem verbatim, so the installed
system would inherit the archiso initramfs hooks (booting into the live
path) plus the live autologin/user/sudoers. Rework post-install.sh to run
in the target chroot as a resilient best-effort script that:
- removes the live autologin drop-in, bos-live-setup service/scripts and
  the liveuser sudoers file, and locks root (sudo model; the live medium
  left root passwordless),
- drops the archiso mkinitcpio config, installs the stock linux.preset and
  regenerates the initramfs, then refreshes grub.cfg,
- keeps the snapper/services/dotfiles setup, with the network-dependent
  bakery install made non-fatal so offline installs still complete.
2026-06-14 13:29:49 +08:00
Breadway
8aebfc26c4 Add squashfs-tools so Calamares can unpack the rootfs
Calamares' unpackfs module shells out to unsquashfs to extract
airootfs.sfs onto the target. squashfs-tools wasn't in the live package
list, so installs failed at the Finish step with "Failed to find
unsquashfs ... Bad unpackfs configuration". Add it.
2026-06-14 13:15:27 +08:00
Breadway
08855ecd86 Log the live Hyprland session to a user-writable path
liveuser can't write /var/log, so the .bash_profile redirect
(Hyprland &>/var/log/hyprland-live.log) failed and bash aborted the line
without ever launching the compositor. Log to /tmp/hyprland-live.log,
which the live user can write.
2026-06-14 04:24:52 +08:00
Breadway
937a31732b Run the live session as an unprivileged user (Hyprland won't run as root)
The live medium autologged root on tty1 and exec'd Hyprland, but Hyprland
refuses to start with superuser privileges ("launched with superuser
privileges, but the privileges check is not omitted") and exited before
even creating a log — leaving tty1 at a blank blinking cursor. (Boot,
switch-root, firstboot suppression and the bos login on other ttys were
all already working.)

Adopt the standard live-ISO pattern:
- bos-live-setup.service (oneshot, gated on the archisobasedir cmdline so
  it only runs on the live medium) creates an unprivileged `liveuser`,
  adds it to the usual hardware groups, clears its password, and drops in
  a minimal live Hyprland config that auto-launches the installer.
- tty1 autologin now targets liveuser instead of root.
- Calamares needs root, so bos-launch-calamares runs it via passwordless
  sudo (/etc/sudoers.d/99-bos-live) with the Wayland env preserved, so the
  root installer renders on the live user's compositor.
2026-06-14 04:13:10 +08:00
Breadway
80e8efc84e Capture live-session Hyprland output and fall back to a shell
Redirect the live autologin compositor's stdout/stderr to
/var/log/hyprland-live.log, and on exit drop to an interactive shell
showing the return code instead of letting the getty autologin
respawn-loop hide any startup failure behind a blank blinking cursor.
Makes a failed live boot diagnosable and leaves the medium usable.
2026-06-14 03:57:27 +08:00
Breadway
f967422d61 Let the live Hyprland session fall back to software rendering
On GPU-less targets (VMs, headless, exotic hardware) wlroots refuses to
initialise without a hardware renderer, so the autologin session exec'd
Hyprland on tty1 and it died immediately — leaving a blinking cursor and
no desktop, while tty2 still showed the (correct) `bos` login.

Export WLR_RENDERER_ALLOW_SOFTWARE=1 before exec Hyprland in root's
.bash_profile so wlroots may use the llvmpipe software renderer when no
GPU renderer exists. On real hardware the hardware renderer is still
chosen; this is purely a fallback. Also set WLR_NO_HARDWARE_CURSORS=1 so
the pointer isn't invisible in VMs. Both must be real env vars (read at
wlroots init), not Hyprland `env=` lines, which apply too late.
2026-06-14 03:35:23 +08:00
Breadway
10f9449272 Add live-environment config so the ISO boots straight to the session
The fixed initramfs boots into userspace, but systemd-firstboot
(ConditionFirstBoot=yes, --prompt-locale --prompt-keymap-auto
--prompt-timezone --prompt-root-password) then blocked the console
waiting for interactive input, and root was locked (no /etc/shadow),
so the live medium never reached the autologin getty + Hyprland.

Ship the same base files releng uses to satisfy firstboot and unlock
root for autologin:
- etc/locale.conf  (LANG=C.UTF-8)        -> no locale prompt
- etc/localtime    (-> UTC)              -> no timezone prompt
- etc/vconsole.conf (KEYMAP=us)          -> no keymap prompt
- etc/hostname     (bos)
- etc/shadow       (root unlocked, empty pw, perms 0400 via profiledef)
- etc/passwd       (root shell = bash; system users are appended by the
                    systemd-sysusers pacman hook during pacstrap)

The overlay is applied before pacstrap (mkarchiso _make_custom_airootfs
precedes _make_packages) and these are pacman backup files, so the
static passwd/shadow act as the base and package scriptlets add the
rest — no clobbering of polkitd/pipewire/etc. users.
2026-06-14 03:13:54 +08:00
Breadway
6b20163c92 Add archiso initramfs hooks so the live ISO can switch root
The profile shipped boot configs and the package list but lacked the
mkinitcpio archiso configuration, so mkarchiso built a stock initramfs
with no archiso hook. At boot the kernel honoured archisosearchuuid/
archisobasedir but nothing knew how to find and mount airootfs.sfs, so
switch-root failed and the live medium dropped to emergency mode.

Add the canonical releng pieces:
- airootfs/etc/mkinitcpio.conf.d/archiso.conf (HOOKS incl. archiso)
- airootfs/etc/mkinitcpio.d/linux.preset (builds initramfs-linux.img)
- mkinitcpio{,-archiso,-nfs-utils} in packages.x86_64
2026-06-14 02:55:53 +08:00
Breadway
159d14774e Add in-house Calamares package (AUR-only upstream)
Calamares isn't in Arch's official repos, so BOS vendors the PKGBUILD and
publishes a built package to the [breadway] repo. All its deps are official
(kpmcore, qt6-*, yaml-cpp). Also drop the nonexistent calamares-qt6 from the
package list (calamares 3.4.x is already Qt6).
2026-06-13 23:39:39 +08:00
Breadway
9f9a5db5cc Set [breadway] SigLevel=Never (Forgejo db key unavailable to pacman) 2026-06-13 23:34:51 +08:00
Breadway
47ec044cd6 Fix archiso bootmodes and add syslinux to package list
mkarchiso validation: bios.syslinux.mbr/eltorito and uefi-x64.* bootmodes
are deprecated -> use bios.syslinux + uefi.systemd-boot. syslinux must be
in the package list for the BIOS bootmode; add memtest86+/edk2-shell too.
2026-06-13 23:32:25 +08:00
Breadway
a11a063c12 Add bootloader configs to archiso profile (syslinux/efiboot/grub)
The profile declared syslinux + systemd-boot bootmodes but lacked the
required config directories, so mkarchiso would fail. Added from the
official releng profile, rebranded to Bread OS; %PLACEHOLDER% tokens are
substituted by mkarchiso at build time.
2026-06-13 23:03:54 +08:00
Breadway
0486f4c7c6 Disable debug package so the main package publishes correctly
makepkg's debug split produced a -debug pkg; the upload's head -1 could
grab it instead of the main package. !debug yields a single package.
2026-06-13 23:00:48 +08:00
Breadway
617aeb3d99 Remove accidentally-committed .claude agent state; gitignore it 2026-06-13 22:54:47 +08:00
Breadway
a71ecdcd0b Fix bos-settings compile errors and use REGISTRY_TOKEN for publishing
bos-settings was scaffolded but never compiled. Fixes:
- main.rs: import gtk4::prelude (connect_activate/run)
- window.rs: disambiguate WidgetExt::display(); drop unused GBox import
- hyprland.rs: Label has no set_monospace -> use the monospace CSS class
- theme.rs: drop unused prelude import

Also switch package.yml to secrets.REGISTRY_TOKEN (scoped write:package),
since the auto Actions token is not authorized for the owner registry.
2026-06-13 22:54:27 +08:00
Breadway
b34217d869 Disable LTO in PKGBUILD (vendored ring/mlua static libs vs makepkg -flto) 2026-06-13 17:06:53 +08:00
Breadway
be81e03c45 Regenerate Cargo.lock for bos-settings
The scaffolded lockfile was stale, so packaging builds with --locked failed.
Regenerated against current Cargo.toml (88 packages).
2026-06-13 16:59:30 +08:00
Breadway
ac84b6bb36 Add Calamares branding images from bread logo
- logo.png (productLogo/productIcon): rasterised from the bread logo, transparent
- languages.png (productWelcome): logo centred on a light Nord canvas
- logo.svg / bread_white.svg: source vector

Resolves the missing-branding-asset blocker so Calamares can render.
Colour scheme can be refined when final SVGs land.
2026-06-13 16:53:25 +08:00
Breadway
e8e33e35c4 Source calamares from official extra, not [breadway]
calamares and calamares-qt6 are in Arch's extra repo; no custom PKGBUILD
needed. Update packages.x86_64 and the pacman.conf comment accordingly.
2026-06-13 16:40:59 +08:00
Breadway
7d7737c3b0 Clone from public URL, not GITHUB_SERVER_URL (resolves to localhost in runner)
The Forgejo runner injects GITHUB_SERVER_URL as http://localhost:3002, which
is unreachable from inside the job container. Use the public URL instead.
2026-06-13 16:14:12 +08:00
Breadway
8838cc35f2 Rename mirror secret to MIRROR_TOKEN (GITHUB_ prefix is reserved)
Forgejo/gitea rejects user secret names starting with GITHUB_.
2026-06-13 16:10:39 +08:00
Breadway
11e27a0723 Use Forgejo-prescribed pacman section name for the Arch registry
Forgejo serves the repo db as {owner}.{group}.{domain}.db, and pacman
fetches "<section>.db" from Server — so the section name must match.
2026-06-13 16:03:55 +08:00
Breadway
267f6df523 Fix Forgejo workflows for the actual server capabilities
- package.yml: use correct Arch registry upload (octet-stream + binary body
  + PUT /api/packages/Breadway/arch/os), drop --privileged, remove
  actions/checkout (archlinux image has no Node) in favour of a manual
  shell clone, use the built-in Actions token instead of a stored secret,
  and --nocheck (tests belong in CI, not packaging)
- mirror.yml: clone --mirror + explicit refs/heads + refs/tags push with
  --prune, instead of pushing refs/remotes pollution from a checkout
- pacman.conf: correct Server URL to the Forgejo Arch registry format

Requires only the GITHUB_MIRROR_TOKEN secret (GitHub PAT, repo scope) for
the mirror job; package publishing uses the automatic per-run token.
2026-06-13 16:01:50 +08:00
Breadway
baff024016 Add Forgejo Actions workflows and fix [breadway] repo URL
- .forgejo/workflows/mirror.yml: mirrors every push/tag to GitHub
- .forgejo/workflows/package.yml: builds PKGBUILD on tag and publishes
  bos-settings to the Forgejo Arch package registry (distrib=breadway)
- iso/pacman.conf: replace placeholder repo.breadway.dev with the actual
  Forgejo package registry URL

Requires two Forgejo secrets:
  GITHUB_MIRROR_TOKEN — GitHub PAT with repo push scope
  FORGEJO_TOKEN       — Forgejo token with package:write scope
2026-06-13 11:42:00 +08:00
Breadway
a028e7462a Add bakery.toml and packaging/arch to match bread ecosystem
Mirrors the build/distribution pattern used by the bread project:
- bakery.toml describes bos-settings as a bakery-managed package
- packaging/arch/PKGBUILD builds and installs the binary via cargo
- packaging/arch/bos-settings.desktop for app launchers
- LICENSE (MIT) required by PKGBUILD
2026-06-13 11:32:40 +08:00
Breadway
e67e2a2f66 Fix prod-readiness issues flagged in audit
- Fix XDG config dir logic in config/mod.rs (was double-nesting and had /home/user hardcode)
- Replace /home/user hardcodes in breadbar.rs and hyprland.rs with config::config_dir()
- Fix /home/user hardcode in packages.rs (uses /root fallback for .local/state path)
- Remove eprintln! from GTK callback in packages.rs (no stderr at runtime)
- Fix YAML parse error in branding.desc (missing space after sidebarTextHighlight key)
- Add .gitignore (Rust target/, ISO artifacts, editor/OS junk, secrets)
- Delete state.rs (dead code — never mod'd in main.rs)
- Add brightnessctl, grim, slurp to packages.x86_64 (used by keybinds)
- Rename can-you-begin-a-composed-beacon.md → DESIGN.md
2026-06-13 11:29:53 +08:00
Breadway
8a1157dfce Merge pull request #1 from Breadway/scaffold/bos-initial
Scaffold/bos initial
2026-06-13 11:15:38 +08:00
Claude
d5913da277 Fix all issues from code/UX review
ISO structural:
- Move post-install.sh → airootfs/etc/calamares/ (it was never in the squashfs)
- Create airootfs/etc/skel/.config/ with all dotfiles (deploy path now works)
- Add iso/pacman.conf with [breadway] custom repo stub for calamares + bakery
- Add Calamares branding component (bos/branding.desc + show.qml)
- Add missing unpackfs.conf and mount.conf modules
- Add live-session autostart: getty autologin → bash_profile → Hyprland → calamares
- Add polkit rule for wheel-group snapper rollback (pkexec path)
- Remove wlroots from packages (bundled with Hyprland); add bakery to package list
- Fix modules-search path in settings.conf

Dotfiles:
- Rename dotfiles/hyprland/ → dotfiles/hypr/ (Hyprland reads ~/.config/hypr/)
- Fix deprecated shadow options: drop_shadow/shadow_range → shadow { } block

bos-settings Rust:
- Replace glib::MainContext::channel (removed in glib 0.19) with async_channel
- Stream bakery update output line-by-line instead of buffering all at once
- Fix zombie processes: per-package update buttons now wait() in a thread
- Fix sidebar/stack mismatch at startup: select snapshots row to match default view
- Replace deprecated MessageDialog with AlertDialog (GTK 4.10+) throughout
- Use pkexec for snapper rollback so polkit handles privilege escalation
- Add confirmation dialog before delete snapshot (was missing, rollback had one)
- Add refresh button + repopulate after delete in snapshots view
- Add "Saved" / "Error: …" status label to every config view save button
- Add "Remove" buttons to breadbox contexts and breadcrumbs profiles
- Remove hardcoded model string from breadpad defaults
- Drop unused state mod; fix config_dir HOME fallback; fix zombie in editor launches

https://claude.ai/code/session_01WszGHvCmxgcyTwNSkfLF9P
2026-06-12 13:45:00 +00:00
Claude
0ff3998c84 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
2026-06-12 13:27:25 +00:00
Breadway
26d3bd8266 initial 2026-06-12 21:16:09 +08:00