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>
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>
- 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>
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>
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>
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>
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>
'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>
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>
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>
- 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>
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>
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>
- 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>
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>
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>
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>
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>
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>
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>
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>
System tray in skydeskbar (Phase 1 #4):
- Claims _NET_SYSTEM_TRAY_S<screen> selection on startup and
broadcasts MANAGER so nm-applet and other tray clients connect
- Handles _NET_SYSTEM_TRAY_OPCODE dock requests: XReparentWindow
icon into the deskbar, sends XEMBED_EMBEDDED_NOTIFY
- Tray section is zero-height when empty; expands to DB_TRAY_H=26px
when first icon embeds, shrinking back when last icon exits
- DestroyNotify / ReparentNotify clean up the icon list and
reposition remaining icons; SelectionClear hands off gracefully
- Icon positions are updated (db_tray_reposition) whenever the app
list changes and shifts the tray section vertically
Plymouth boot splash (Phase 2 #10):
- 'skyos' script-module theme: dark navy (#111520) background,
"SkyOS" logo in accent blue (#90BBEE), thin progress bar
- 1×1 pixel bar_bg.png / bar_fg.png scaled at runtime by the
Plymouth script — no large PNGs committed to the repo
- logo.png generated at build time by ImageMagick (same tool used
for the wallpaper); build continues if ImageMagick is absent
- mkinitcpio HOOKS: added 'plymouth' after 'udev'
- Kernel cmdline: added 'splash' for UEFI systemd-boot entry
- customize_airootfs.sh: plymouth-set-default-theme skyos
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Launcher now loads apps dynamically from /usr/share/applications
and ~/.local/share/applications instead of a hardcoded list;
maps desktop Categories to tab system, falls back to built-in list
on systems without .desktop files (dev/macOS builds)
- Launcher gains scroll support: mouse wheel and PgUp/PgDn scroll
the app grid, scrollbar drawn on right edge when needed
- Deskbar status bar shows VOL % from pactl (cached, polls every 5s)
- Deskbar status bar: scroll wheel changes volume ±5%, left-click
toggles mute
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Alt+Tab now shows a centered visual switcher overlay with window cards;
cycling with Tab, committing on Alt release, cancelling with Escape
- GTK3 and GTK2 themes rewritten in dark navy palette matching skywm/
skydeskbar color constants (was an off-brand tan/BeOS palette)
- Add alacritty to ISO packages with pre-configured dark color scheme;
update all menu Terminal entries to launch alacritty instead of xterm
- Add KeyReleaseMask to WM root event selection to detect Alt release
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>