Commit Graph
56 Commits
Author SHA1 Message Date
nmemmertandClaude Sonnet 4.6 689249cf5e Add customize_airootfs.sh to remove root password on live system
Without this, pacstrap locks root's password by default and the live
ISO is unbootable/unloggable-into.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 12:55:53 -04:00
nmemmertandClaude Sonnet 4.6 5de7cfec78 archiso hook: replace getarg with direct /proc/cmdline parsing
getarg's trailing-= convention varies by mkinitcpio version and was
returning empty even when archisosearchuuid was present in cmdline.
Parse /proc/cmdline directly in ash — no external tools, no version
sensitivity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 12:39:06 -04:00
nmemmertandClaude Sonnet 4.6 685b725dbb archiso hook: support archisolabel= fallback for syslinux boots
Syslinux passes archisolabel= not archisosearchuuid= (UUID is only in
systemd-boot entries). Add blkid label lookup as fallback so both boot
paths work.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 12:32:27 -04:00
nmemmertandClaude Sonnet 4.6 9159626cff Fix archiso initcpio hook: use run_hook+mount_handler override
run_latehook fires after mkinitcpio already attempts to mount root= (empty),
which fails. Switch to run_hook() setting mount_handler=archiso_mount_handler
so mkinitcpio calls our handler instead of the default block-device mount.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 12:05:41 -04:00
nmemmertandClaude Sonnet 4.6 ca0e9f7c72 Bundle archiso initcpio hook directly in repo
Current archiso package does not install initcpio hook files (confirmed:
find /usr -path */initcpio/hooks/archiso returns nothing). Write the hook
and its mkinitcpio install script directly into the profile airootfs so
COPY carries them into the image without any package dependency.

Hook finds ISO by archisosearchuuid= kernel param, waits up to 30s for
the device to appear via blkid, mounts iso9660→squashfs→overlay onto
/new_root. mkinitcpio detects /new_root is already mounted and succeeds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 11:34:08 -04:00
nmemmertandClaude Sonnet 4.6 a3beffae15 Find archiso initcpio hooks by path rather than hardcoded location
Current archiso package version may place hooks at a non-standard path.
Use find to locate hooks/archiso and install/archiso anywhere under /usr
and copy to the canonical initcpio location in airootfs.
Prints found paths so build output shows where they came from.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 11:14:05 -04:00
nmemmertandClaude Sonnet 4.6 ebb61beaac Copy archiso initcpio hooks directly into airootfs at build time
The hook package install inside the pacstrap chroot may silently skip
the initcpio install step under QEMU emulation, leaving the archiso hook
absent from the initrd (confirmed: no 'running late hook [archiso]' in
boot output despite UUID match on device).

Explicitly copy /usr/lib/initcpio/hooks/archiso and install/archiso from
the build host into the airootfs before mkarchiso runs mkinitcpio, so
the hook is present regardless of how the chroot package install behaves.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 10:52:05 -04:00
nmemmertandClaude Sonnet 4.6 525bb49787 Fix live boot: custom syslinux.cfg and explicit squashfs/overlay modules
The releng syslinux.cfg references UI .c32 modules that may not load,
causing syslinux to fall back without archisolabel= in the kernel cmdline
so the archiso initrd hook scans for an empty device label and sets root=''.

- Write our own minimal syslinux.cfg using %INSTALL_DIR%/%ARCHISO_LABEL%
  placeholders; Dockerfile now only copies .c32 binaries from releng
- Add squashfs and overlay to mkinitcpio MODULES explicitly
- Remove microcode hook (no intel-ucode/amd-ucode packages installed)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 09:36:45 -04:00
nmemmertandClaude Sonnet 4.6 d6f2cbb2b8 Add archiso package to live ISO for working initrd hook
mkinitcpio runs inside the airootfs chroot, so the archiso hook files
(/usr/lib/initcpio/hooks/archiso) must be installed there. Without this
the hook has no device-scanning logic and boots to an empty root mount.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 09:11:12 -04:00
nmemmertandClaude Sonnet 4.6 18d3675368 Fix ISO build pipeline for Docker on macOS
- Disable pacman alpm sandbox in Dockerfile (seccomp blocks it in BuildKit)
- Move mkarchiso from RUN to CMD so it runs with --privileged at docker run time
- Fix output path: mkarchiso now writes to /dist (matches volume mount)
- Add syslinux + imlib2 to Docker build packages and live ISO package list
- Copy syslinux/ and efiboot/ boot configs from archiso releng into profile
- Switch deprecated UEFI grub bootmodes to uefi-x64.systemd-boot
- Fix wrong package names: libpam→pam, light→brightnessctl, remove pkexec
- Set SigLevel=Never and hardcode reliable mirrors in profile pacman.conf
- Add mkinitcpio.conf with archiso hook so initrd can mount the live squashfs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-31 08:27:16 -04:00
nmemmert e2e8c49a0a Merge pull request #1 from nmemmert/claude/elemetryos-macos-fork-mmkshh
OrionOS macOS-style fork — full feature build
2026-08-30 17:13:50 -04:00
Claude 6b1d705d4f Add dual-path ISO build scripts (Arch + Debian) with README
- iso/build.sh: Debian/Ubuntu host builder using debootstrap + xorriso
  Bootstraps Debian bookworm, compiles OrionOS in chroot, produces
  bootable hybrid ISO with GRUB (BIOS + EFI), auto-login root on tty1
- iso/build-arch.sh: Arch Linux host builder using mkarchiso
  Compiles OrionOS, installs into archiso profile, runs mkarchiso
- iso/README.md: instructions for all three paths (Docker/Debian/Arch)
  including dd and Ventoy USB flashing
- Makefile: iso target auto-detects available tool (docker/debootstrap/mkarchiso)
2026-08-30 20:57:40 +00:00
Claude 454f925891 Rewrite orionpkg into full GUI package manager
Previously only an update manager. Now has three tabs:
- Search: pacman -Ss query, shows results with installed badge, Install button
- Installed: pacman -Q list with scrollable rows, Remove button
- Updates: checkupdates list, Update All runs pkexec pacman -Syu

Features:
- Editable search input field with cursor, Enter to search
- Row selection with highlight, double-click toggles
- Scrollable package lists with scrollbar
- Live log view + progress bar during install/remove/upgrade
- Spinner animation during async operations
- Cancel button during running operations
- Error/success status display
- Same dark-navy palette as rest of OrionOS
2026-08-30 20:55:05 +00:00
Claude a5b2c5aee3 Complete archiso profile for OrionOS ISO build
- iso/profile/profiledef.sh: archiso profile with BIOS+UEFI bootmodes
- iso/profile/packages.x86_64: full package list (X11, audio, OrionOS deps)
- iso/profile/pacman.conf: pacman config for archiso
- iso/profile/airootfs/: live overlay (xinitrc, hostname, skel)
- iso/docker/Dockerfile: builds OrionOS from source, installs into airootfs, runs mkarchiso
2026-08-30 20:49:45 +00:00
Claude a2092fd989 Add hot corners, media keys, orionshot, orionclip, notification history, autostart, GTK accent update, wallpaper slideshow, ISO build
- wm: hot corner polling via select()-based wm_run loop; TL=Exposé, TR=show desktop, BL=launcher, BR=lock
- wm: XF86 media key grabs (volume, brightness, playback) + Super+V for clipboard
- wm: autostart reads ~/.config/orionos/autostart on startup
- events: media key dispatch (amixer/brightnessctl/playerctl); Super+V → orionclip --show; Print → orionshot
- orionshot: new X11 screenshot tool, full-screen and rubber-band region modes, saves PNG to ~/Pictures/Screenshots/
- orionclip: new clipboard manager daemon; polls clipboard, stores 20 entries, popup via Super+V IPC
- orionnotify: append-only notification history log at ~/.local/share/orionos/notif-history.log
- themes: GTK accent updated from #3A6898 to #1E58A8 to match WM/deskbar
- themes: orionwallpaper gains --slideshow DIR [SECS] mode using feh + sleep loop
- iso: Docker-based archiso builder, live-session xinitrc, profiledef.sh
- Makefile: add orionshot and orionclip to all/clean/install; Docker-based iso target
2026-08-30 20:47:47 +00:00
Claude 2a42b826fb Add 6 desktop features: workspace shortcuts, Exposé, deskbar icons, notifications, screen lock, move-to-desktop
- Super+1-4: switch virtual desktop; Super+Shift+1-4: move focused window to desktop N
- Super+Space: Exposé window overview (tiled grid), click to select, Escape to cancel
- wm/src/expose.c: expose_show/expose_hide using ceil(sqrt) grid layout with saved/restored geometry
- client_move_to_desktop(): moves window between desktops, fires _NET_WM_DESKTOP update
- on_client_message: handles _NET_WM_DESKTOP to move windows from external requests
- deskbar: optional imlib2 app icon rendering (Papirus-Dark → Papirus → hicolor → pixmaps fallback)
- deskbar: XGetClassHint populates cls field for better icon lookup
- deskbar: context menu extended with separator + "→ Desktop 1-4" items via _NET_WM_DESKTOP
- orionnotify/: freedesktop.org notification daemon (libdbus-1), stacks up to 5 popups top-right
- orionlock/: PAM-authenticated fullscreen screen lock with clock, date, password dots
- Lock Screen menu item wired to orionlock
- Root Makefile includes orionnotify and orionlock targets

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GHiBQKPfUoaJgCKuA9op1H
2026-08-30 20:14:45 +00:00
Claude b0f64d9b2e Fixes #7–#11: launcher Other tab, ICCCM size hints, icon loading, multi-desktop
Fix #7: Add "Other" catch-all category to the launcher. map_category() now
returns "Other" instead of "" for unrecognized .desktop Categories, and an
"Other" tab is added to the CATS list so those apps are discoverable instead
of silently hidden.

Fix #8: Respect ICCCM WM_NORMAL_HINTS. client_add() reads PMinSize,
PResizeInc, and PBaseSize from the window's size hints. The resize drag
handler in events.c clamps to min_w/min_h and snaps to the
width_inc/height_inc grid, fixing jank in character-cell terminal emulators
(xterm, Alacritty).

Fix #10: Optional freedesktop icon loading via imlib2. The launcher now
parses the Icon= field from .desktop files and attempts to render a PNG icon
from Papirus-Dark (or hicolor fallback). When imlib2 is not present the
existing letter-square is shown unchanged. launcher/Makefile auto-detects
imlib2 via pkg-config and sets -DHAVE_IMLIB2.

Fix #11: True 4-desktop support in the WM. Each Client carries a desktop
field (assigned at map time from wm->cur_desktop). Clicking a workspace
button in the deskbar sends _NET_CURRENT_DESKTOP; the WM now handles it via
wm_switch_desktop() which unmaps frames on the leaving desktop, maps frames
on the arriving desktop, and re-focuses. _NET_WM_DESKTOP is set per window
so the deskbar can filter db_update_apps() to show only current-desktop
windows (sticky windows with desktop 0xFFFFFFFF are always shown).
2026-08-30 20:00:10 +00:00
Claude 36641e77e2 macOS-style polish: fix seam, bidirectional Alt+Tab, minimized windows in switcher, rounded corners, deskbar context menu
Fix #1: Replace hardcoded 185px deskbar-offset in client.c and events.c with
DESKBAR_W constant (200) to eliminate the 15px gap between the WM frame and
deskbar edge.

Fix #2: Add Shift+Alt+Tab reverse-direction support — grab Mod1+Shift+XK_Tab
in wm.c, detect ShiftMask in events.c, and implement switcher_prev() in
switcher.c.

Fix #3: Include minimized windows in the Alt+Tab switcher. swl_populate() no
longer skips minimized clients; swl_mini[] tracks state so switcher_draw()
can dim them with bracketed titles and darker card backgrounds.

Fix #4: Rewrite themes/picom.conf with macOS-inspired settings — 10px corner
radius on normal windows, 8px on menus, soft downward shadow (radius 18,
offset-y 8, opacity 0.35), smooth fading (step 0.08), no dock/tray rounding.

Fix #5: Add per-app right-click context menu to the deskbar. Right-clicking
an app row opens a popup with Raise / Minimize / Close actions (Close shown
in red). Actions are sent as EWMH client messages (_NET_ACTIVE_WINDOW,
WM_CHANGE_STATE+IconicState, _NET_CLOSE_WINDOW) with matching handlers added
to the WM's on_client_message. Pointer grab closes the menu on any outside
click.
2026-08-30 19:51:54 +00:00
Claude 0d874617dd Fork ElemetryOS with macOS-style window decorations
- Move traffic-light buttons to the LEFT side of titlebars (close/minimize/maximize)
  in macOS order, using fixed left-pad positions instead of right-edge offsets
- Adopt macOS dark-mode color palette: #3C3C3C active titlebar, #2C2C2C inactive,
  traffic-light colors #FF5F57/#FEBC2E/#28C840, near-black #1C1C1C desktop
- Center window title text in the titlebar (macOS style), clamped to avoid
  overlapping the left button cluster
- Thin 1px window borders replacing the original 3px beveled border
- macOS blue (#4A90D9) selection highlight in the context menu
- Neutral dark context menu (#2C2C2C) with subtle separators and text indent
- Update README to document the ElemetryOS macOS fork identity and design changes
2026-08-30 19:40:11 +00:00
nmemmertandClaude Sonnet 4.6 4cda708cc2 Fix ARM64 initramfs: write complete archiso mkinitcpio hooks inline
The archiso git repo doesn't ship the hooks as standalone files, and
ALARM has no archiso package. Write the hooks directly in the entrypoint
with the correct three-phase structure:

- run_earlyhook: modprobe squashfs/overlay/iso9660/loop/vfat before udev
- run_hook: parse archisolabel/archisobasedir from /proc/cmdline, set
  mount_handler="archiso_mount_handler"
- archiso_mount_handler: find ISO by label (fallback to TYPE=iso9660),
  mount it, mount squashfs at arch/$(uname -m)/airootfs.sfs, set up
  tmpfs cowspace, mount overlay to /new_root

install hook: add all required modules (squashfs, overlay, iso9660,
loop, vfat, nls_*) and binaries (blkid, losetup, sleep, uname).
Each mount step prints its progress and bails with a clear error message
on failure so boot panics are diagnosable.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 08:40:18 -04:00
nmemmertandClaude Sonnet 4.6 629f16537e Fix archiso hook path: search rather than assume repo layout
The hooks are NOT at initcpio/hooks/archiso in the archiso git repo root
(that path doesn't exist). Remove the broken install lines from Dockerfile
and instead add a find diagnostic during build to reveal the actual paths.

entrypoint: use find to locate the hooks dynamically under /usr/share/archiso
(the releng airootfs copy) instead of hardcoding a path — bail with a clear
error listing if nothing is found.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 08:36:15 -04:00
nmemmertandClaude Sonnet 4.6 00c4914b7b Fix ARM64 boot: install official archiso mkinitcpio hooks into airootfs
The archiso mkinitcpio hooks live in initcpio/ at the repo root, not in
configs/releng/airootfs/ — so they were never in the ISO airootfs chroot.
ALARM has no archiso package either, so the chroot's mkinitcpio found no
archiso hook, built an initramfs without mount_handler logic, and the
default handler fired at boot with empty root= → "Failed to mount ''".

Dockerfile.arm64: preserve the official hooks from initcpio/ into
/usr/share/archiso/initcpio/ instead of deleting them with the repo.

entrypoint-arm64.sh: explicitly install the official hooks into the
airootfs overlay so the chroot mkinitcpio finds them when building the
initramfs. The official hooks use uname -m for arch detection and include
all required modules/binaries for squashfs live boot.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 08:34:02 -04:00
nmemmertandClaude Sonnet 4.6 22b311790e Fix ARM64 boot: use official archiso mkinitcpio hooks from releng profile
The custom simplified hooks we were writing to the airootfs overlay
overwrote the official hooks shipped in the releng profile. The official
hooks handle uname -m for the aarch64 squashfs path, include all required
modules (squashfs, overlay, iso9660, loop, dm-snapshot, nls_*) and
binaries (blkid, findfs, losetup, switch_root), and wire up mount_handler
correctly. Our stripped-down hooks caused the overlay to mount empty,
producing the "Root device mounted successfully, but /sbin/init does not
exist" panic at boot.

Fix: stop overwriting the official hooks; keep only the mkinitcpio.conf
(which lists the hook names, not their implementation). Also remove
plymouth from initramfs HOOKS to reduce boot complexity.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 08:23:23 -04:00
nmemmertandClaude Sonnet 4.6 e56412ecdd Fix ARM64 ISO: mkfs.fat PATH wrapper to guarantee EFI FAT headroom
Replace the fragile Python regex patch (which failed to match the actual
awk variable name in mkarchiso) with a mkfs.fat wrapper script placed
earlier in PATH. The wrapper intercepts every -C (create) invocation and
adds +128 MiB (131072 KiB) to the size argument, ensuring the ~50 MB
ARM64 kernel Image + FAT filesystem overhead fits regardless of which
exact size formula the installed mkarchiso version uses.

Also adds a grep of mkarchiso's size lines to stdout so the formula is
visible in build logs for future debugging.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 08:12:12 -04:00
nmemmertandClaude Sonnet 4.6 bdfc6008fc Fix ARM64 ISO: patch mkarchiso EFI FAT size for large ARM64 kernel
The ARM64 kernel Image is ~50 MB. mkarchiso calculates the EFI FAT
image size as int(total_bytes/MiB)+2, which leaves no room for FAT
filesystem overhead → "Disk full" when copying the kernel in.

Patch mkarchiso at container startup (before mkarchiso runs) to use
+128 MiB buffer instead, giving plenty of headroom.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-27 08:00:17 -04:00
nmemmertandClaude Sonnet 4.6 5160a30d72 Fix ARM64 ISO: local kernel repo + Image symlink fallback
Dockerfile.arm64: after pre-downloading linux-aarch64, build a local
pacman repo from the cached package using repo-add so mkarchiso can
install the kernel from file:// without touching the [alarm] mirror.

entrypoint-arm64.sh: put [alarm-local] first in the profile pacman.conf
so pacstrap always resolves linux-aarch64 from the baked-in repo.
Also add a symlink fallback in customize_airootfs.sh: ALARM aarch64
may install the kernel as /boot/Image instead of /boot/vmlinuz-linux-aarch64;
the symlink ensures archiso's vmlinuz-* glob and systemd-boot both find it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 12:05:15 -04:00
nmemmertandClaude Sonnet 4.6 4a4f3ddba5 ARM64: add boot diagnostics + pre-cache linux-aarch64 in Docker image
- Add ls/pacman -Q diagnostics in customize_airootfs.sh so we can see
  exactly what is (or isn't) in /boot after pacstrap
- Pre-download linux-aarch64 in Dockerfile with pacman -Sw so mkarchiso
  can install it from the local pacman cache even if the [alarm] mirror
  is unreachable at ISO-build time

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:57:33 -04:00
nmemmertandClaude Sonnet 4.6 62c484e0ce Fix ARM64 preset conflict: write linux-aarch64.preset in customize_airootfs
Writing the preset to the airootfs overlay caused a file conflict when
pacstrap installed linux-aarch64 (which ships its own copy of the file).
Move the preset override into customize_airootfs.sh which runs after
pacstrap, so the package installs cleanly then we replace the preset.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:50:51 -04:00
nmemmertandClaude Sonnet 4.6 fffc7508f7 Fix ARM64 pacman.conf: SigLevel = Never for mirror reliability
ALARM mirrors inconsistently serve .db.sig files — some mirrors return
404 for core.db.sig which aborts the pacstrap. SigLevel = Never is
standard practice for Docker-based archiso builds.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:46:42 -04:00
nmemmertandClaude Sonnet 4.6 56031c8c6f Fix ARM64 ISO build: pacman.conf repos, kernel preset, mkinitcpio
Three fixes for the 'vmlinuz-* not found' failure:

1. Override releng profile's pacman.conf to add [alarm] and [aur] repos.
   linux-aarch64 lives in [alarm] — without this the kernel package was
   silently missing from the airootfs and /boot was empty.

2. Remove linux.preset from releng airootfs (references vmlinuz-linux,
   the x86_64 kernel name that doesn't exist on ALARM).

3. Add linux-aarch64.preset to the airootfs with an 'archiso' preset entry
   (ALL_kver=/boot/vmlinuz-linux-aarch64, archiso_image=initramfs-linux-aarch64.img).
   mkarchiso looks for this 'archiso' preset to build the live initramfs.

4. Switch customize_airootfs.sh from mkinitcpio -P to mkinitcpio -p linux-aarch64
   so only the aarch64 preset runs (not the stale x86_64 linux preset).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:45:31 -04:00
nmemmertandClaude Sonnet 4.6 58446c1f32 Remove archiso from ARM64 live package list
archiso is not in ALARM repos for aarch64 — pacstrap fails trying to
install it into the live ISO root. The Docker build environment already
has mkarchiso installed from source; the live ISO doesn't need it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:35:04 -04:00
nmemmertandClaude Sonnet 4.6 b2688ea446 Fix ARM64 archiso install: copy files directly, skip man page build
'make install' fails because rst2man (python-docutils) is not installed
and we don't need man pages in a container. Manually install just the
three things mkarchiso needs: the mkarchiso script, run_archiso, and
the configs directory.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:27:52 -04:00
nmemmertandClaude Sonnet 4.6 5b540afd85 Fix ARM64 build: explicit mirrorlist + archiso from source
archiso is not packaged for aarch64 in ALARM repos — install from the
upstream GitLab source with PREFIX=/usr so mkarchiso lands in /usr/bin.

Also:
- Set mirrorlist explicitly (ALARM tarball ships with a stale/empty one)
- Add archiso runtime deps: mtools, dosfstools, libisoburn, squashfs-tools,
  arch-install-scripts, e2fsprogs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:20:18 -04:00
nmemmertandClaude Sonnet 4.6 983932a40b Fix ARM64 Dockerfile: use HTTP for ALARM tarball download
os.archlinuxarm.org has a TLS cert mismatch (cert SAN doesn't cover the
hostname). ALARM officially distributes over HTTP, not HTTPS.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 11:15:50 -04:00
nmemmertandClaude Sonnet 4.6 218d4a58be Fix ARM64 Dockerfile: bsdtar extraction + explicit SHELL for merged-usr
- Use libarchive-tools (bsdtar) instead of BusyBox tar to extract the
  ALARM tarball; bsdtar correctly preserves the /bin → usr/bin symlink
  that is part of ALARM's merged-usr filesystem layout
- Verify /usr/bin/bash exists after extraction so download failures are
  caught loudly instead of producing a silent empty rootfs
- Add SHELL ["/usr/bin/bash", "-c"] in stage 2: Docker's default RUN
  invocation looks up /bin/sh, which requires the symlink to be resolved
  in the container init — using the absolute path bypasses that entirely

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:58:54 -04:00
nmemmertandClaude Sonnet 4.6 396016e69a Fix ARM64 Dockerfile: two-stage build from official ALARM tarball
Stage 1 (alpine/arm64) downloads the official Arch Linux ARM rootfs via
curl — Docker caches this layer so it only runs once. Stage 2 (scratch)
COPYs the extracted filesystem in, then builds OrionOS natively in that
ALARM environment.

Also fixes DisableSandbox placement (insert into [options] section via
sed, not appended to file end where it lands in [aur] and is ignored).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:51:22 -04:00
nmemmertandClaude Sonnet 4.6 8f60d6f8b9 Fix ARM64 Dockerfile: switch to lopsided/archlinux base image
menci/archlinuxarm:aarch64 doesn't exist on Docker Hub.
lopsided/archlinux is a maintained multi-arch image with native arm64 support.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:46:21 -04:00
nmemmertandClaude Sonnet 4.6 b9d7123d60 Add ARM64 ISO build for Apple Silicon / UTM
- iso/docker/Dockerfile.arm64: Arch Linux ARM base (menci/archlinuxarm:aarch64)
- iso/docker/entrypoint-arm64.sh: ARM64 archiso profile — linux-aarch64
  kernel, EFI-only boot (no syslinux), aarch64 squashfs path, spice-vdagent
  for UTM clipboard, VirtIO GPU modesetting config
- build-iso-arm64.sh: docker buildx --platform linux/arm64 wrapper;
  runs natively on Apple Silicon, no QEMU emulation needed

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:43:33 -04:00
nmemmertandClaude Sonnet 4.6 ab4bca672d Fix lens.c compile error: add missing Xft/fontconfig headers
- lens.c: add #include <X11/Xft/Xft.h> and <fontconfig/fontconfig.h>
  (XftFont, XGlyphInfo, etc. were declared but the header was never included)
- quill.c: remove unused flen variable in ed_find_next()
- rigel.c: remove unused get_file() helper (get_fidx() is used throughout)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:21:39 -04:00
nmemmertandClaude Sonnet 4.6 e03462b61b Add imlib2 to Docker build deps for Lens image viewer
Lens links against libimlib2 at compile time. The package was already
in the ISO runtime list but missing from the builder image.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:14:14 -04:00
nmemmertandClaude Sonnet 4.6 a9efede702 Phase 4-6: Quill editor, Lens viewer, Rigel context menu, CI, website
Phase 4 — native apps:
- quill/: text editor (monospace, double-buffered, find bar, undo, open/save)
- lens/: image viewer using imlib2 (zoom, pan, rotate, directory nav)
- wm/src/menu.c: launch quill instead of mousepad
- iso/docker/entrypoint.sh: add imlib2 package; install quill + lens binaries
- skykit/template/: developer app template demonstrating the SkyKit API

Phase 5 — file system and search:
- rigel/rigel.c: right-click context menu (open, open in quill, copy path,
  rename, trash, properties); Ctrl+F search/filter bar with name highlighting;
  F2 rename-in-place overlay; Delete key moves to trash

Phase 6 — distribution:
- .github/workflows/build-iso.yml: GitHub Actions CI that compiles all
  components and builds a bootable ISO on every tag push; creates a GitHub
  release with sha256 checksums

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-24 10:07:45 -04:00
nmemmertandClaude Sonnet 4.6 d19aca2333 Fix installer GUI ghosting: add double-buffer, fix text baseline
Ghosting root cause: all X11 drawing (XFillRectangle, XDrawLine, XDrawArc,
XDrawRectangle) and XRender Xft text rendering were going directly to the
window. XRender composites text on top of pixels without clearing underneath,
so previous log lines bled through on every update.

Fix:
- Added Pixmap buf to Ins struct (created at WIN_W × WIN_H after window init)
- Redirected all drawing calls (fill_rect, draw_line, XDrawRectangle,
  XDrawArc, XFillArc) from s->win to s->buf
- XftDrawCreate in redraw() now targets s->buf
- At end of redraw(): XCopyArea(buf → win) blits the complete frame at once
- Also fixed xft_text baseline: was y + ext.height - ext.y (glyph-specific,
  varied per string); now y + f->ascent (consistent font metric)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 16:12:51 -04:00
nmemmertandClaude Sonnet 4.6 33ae437b5b Fix installer copy step; fix stale skyinstall references
Installer copy (installer/orioninstall):
- Root cause: rsync -ax / /mnt/ copies the overlayfs live root, which
  is slow, unpredictable, and hangs in VMs with overlapping filesystems
- Fix: copy from /run/archiso/airootfs instead (the squashfs is already
  mounted there on every archiso live boot). This is the clean base system,
  avoids the cow layer entirely, and is significantly faster.
- Added -H -A -X -S flags for proper hard-link, ACL, xattr, sparse-file handling
- Fallback to live-root rsync if the squashfs mount isn't present
- Also renamed EFI partition label SKYEFI → ORIONEFI

Discoverability (deskbar + wm):
- deskbar "Install OrionOS" was calling 'sudo skyinstall' (old name) — fixed
  to 'sudo orioninstall-gui || sudo orioninstall' with GUI-first fallback
- Right-click desktop menu now also has "Install OrionOS" entry
  (was only in the deskbar hamburger menu before)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 15:51:44 -04:00
nmemmertandClaude Sonnet 4.6 1340bf012c Phase 4: SkyKit library + Rigel file manager; fix text centering
SkyKit (skykit/):
- Shared palette constants, font setup, and Xlib/Xft drawing utilities
- sk_fill, sk_rect, sk_line, sk_text, sk_text_clip, sk_textw, sk_baseline
- Builds as libskykit.a, consumed by Rigel and future shell components

Rigel (rigel/):
- Native C/Xlib file manager with SkyKit
- Sidebar with 8 bookmarks (Home, Desktop, Documents, Downloads, etc.)
- Editable path bar (Ctrl+L or '/' to activate, Enter to navigate)
- Sortable columns: Name / Size / Modified (click header to sort/reverse)
- Colored type badges: DIR, IMG, SND, VID, ZIP, SRC, PDF, TXT, EXE
- Double-click to open dirs or files (xdg-open)
- Keyboard: ↑↓ select, Enter open, Backspace back, Ctrl+H toggle hidden
- Right-click menu updated: "File Manager" now launches rigel

Text centering fix (deskbar + wm):
- Root cause: draw_str added glyph-specific ext.height/ext.y offset, and
  all callers used hardcoded (H-10)/2 magic numbers instead of font metrics
- Fix: draw_str now takes y as a direct baseline; str_baseline() computes
  (strip_y + strip_h + ascent - descent) / 2 for consistent centering
- WM titlebar: same fix using font_title->ascent/descent
- Affects: "Orion ▾" button, clock, date, app list, flyout menu items,
  letter icons, and all window titlebars

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 15:40:03 -04:00
nmemmertandClaude Sonnet 4.6 e3bc761f25 Update README for OrionOS (complete rewrite)
Replace stale SkyOS content with current OrionOS state:
- All component names updated (orionwm, oriondeskbar, etc.)
- New components documented: Nebula, OrionPkg
- Installer wizard now lists 6 steps including timezone/keyboard
- Full keyboard shortcut table including Super+S, PrintScreen
- Right-click menu contents
- Nebula and OrionPkg usage sections
- Updated included software (Alacritty, Papirus, parcellite, scrot)
- Updated project layout tree
- Component naming/star theme section

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 15:09:14 -04:00
nmemmertandClaude Sonnet 4.6 0ed61cea4c Add orionpkg (package manager GUI) + installer locale step
orionpkg/orionpkg.c (~500 lines, native Xlib/Xft):
- Launches with checkupdates (pacman-contrib) to list pending upgrades
- ST_CHECKING: animated spinner while querying
- ST_UPDATES: scrollable package list with name / old ver → new ver columns
- ST_UPDATING: pkexec pacman -Syu in background, live log output,
  progress bar estimated from pacman's (N/M) counters
- ST_DONE / ST_ERROR: success or failure screen
- Refresh (r key), scroll (mouse wheel / arrow keys), Close (Esc/q)
- pacman-contrib added to ISO packages

Installer: add STEP_LOCALE (timezone + keyboard layout):
- Inserted between STEP_DISK and STEP_USER
- Timezone pane: searchable filter input + scrollable list of 37 zones
- Keyboard pane: 20 common layouts with code + description
- Timezone and keyboard passed as args 6/7 to orioninstall
- orioninstall: sets /etc/vconsole.conf and X11 xorg.conf.d keyboard
  config from args; uses selected timezone for localtime symlink

Also:
- Right-click menu: "Software Updates" → orionpkg
- Root Makefile: orionpkg target + install rule
- ISO: orionpkg binary installed, permissions map, gitignore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 14:39:00 -04:00
nmemmertandClaude Sonnet 4.6 53c6199102 Add Nebula — native C settings panel (Display, Appearance, Input, About)
nebula/nebula.c (~600 lines, single-file, native Xlib/Xft):
- Display tab: resolution cycling via xrandr, DPI toggle (96/144),
  brightness control via brightnessctl
- Appearance tab: wallpaper reset/open, shows active GTK/icon theme
- Input tab: key repeat delay + rate steppers (reads live from XKB),
  tap-to-click and natural scrolling toggles via xinput
- About tab: version, component, platform info
- Fixed-size 700×500 window, dark-navy palette, sidebar nav with
  accent mark on selected tab, dirty-state indicator, Apply/Close
- Escape/Q/Enter shortcuts; Enter applies pending changes

Wired up:
- Root Makefile: nebula target, install -Dm755 nebula/nebula
- Right-click desktop menu: "System Settings" → nebula
- ISO: binary installed to /usr/local/bin/nebula, Super+S xbindkeys
  shortcut, file permissions map entry
- .gitignore: nebula/nebula binary

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 14:21:38 -04:00
nmemmertandClaude Sonnet 4.6 98aeafc4f0 Phase 3: screenshot hotkeys, clipboard history, Papirus icon theme
Screenshots (PrintScreen / Shift+PrintScreen):
- PrintScreen → full screenshot saved to ~/Pictures via scrot
- Shift+PrintScreen → interactive region select via scrot -s
- Both send a dunst notification on save
- scrot added to packages

Clipboard manager:
- Replace janky PRIMARY/CLIPBOARD sync loop with parcellite
- parcellite provides clipboard history, survives app close,
  shows a tray icon for browsing past entries
- parcellite added to packages

Icon theme:
- Switch from Adwaita to Papirus-Dark across GTK2, GTK3 settings,
  and theme index.theme
- papirus-icon-theme added to packages

Also fix remaining stale sky* references in menu.c (skywallpaper,
pkill skywm) and events.c (skylauncher).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 14:15:27 -04:00
nmemmertandClaude Sonnet 4.6 dc209e74fe Fix Plymouth: rebuild initramfs after setting OrionOS theme
mkinitcpio runs during pacstrap (kernel install) before
customize_airootfs.sh, so the initramfs gets the Arch default
spinner theme. Add mkinitcpio -P after plymouth-set-default-theme
so the orionos theme is baked into the final initramfs.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 14:01:37 -04:00
nmemmertandClaude Sonnet 4.6 194e5c2d51 Rename themes/skywallpaper → themes/orionwallpaper
Update all internal references: config dir, wallpaper dir, default
image filename, and script header comment.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-23 13:46:11 -04:00