From 02e26930ab8c4fcdea8aafaeb6da84fc7b51a187 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 10:44:56 -0800 Subject: [PATCH 01/27] hypercube packages --- .github/workflows/build-disk.yml | 3 +- .github/workflows/build.yml | 16 +- Containerfile | 15 +- Justfile | 8 +- build_files/base/01-base-system.sh | 98 ++++++++++ build_files/dx/01-dx-tooling.sh | 36 ++++ ...e-branding.sh => 01-hypercube-branding.sh} | 19 +- .../hypercube/01-hypercube-packages.sh | 54 ----- build_files/hypercube/99-tests.sh | 93 ++++++--- build_files/hyprland/01-hyprland-desktop.sh | 87 +++++++++ build_files/shared/build.sh | 39 ++-- build_files/shared/clean-stage.sh | 7 + .../branding/hypercube/branding.desc | 28 +++ .../calamares/branding/hypercube/show.qml | 184 ++++++++++++++++++ iso_files/calamares/modules/bootc-deploy.conf | 12 ++ iso_files/calamares/modules/users.conf | 39 ++++ iso_files/calamares/modules/welcome.conf | 21 ++ iso_files/calamares/settings.conf | 38 ++++ iso_files/configure_live_session.sh | 63 ++++++ iso_files/hide_hyprland_session.sh | 10 - iso_files/livesys-hyprland | 38 ++++ packages/livesys-scripts/livesys-hyprland | 62 ++++++ packages/livesys-scripts/livesys-scripts.spec | 66 +++++++ .../shared/etc/dconf/db/gdm.d/01-hypercube | 18 -- .../dconf/db/local.d/01-hypercube-dark-mode | 9 +- system_files/shared/etc/dconf/profile/gdm | 2 - .../shared/etc/distrobox/distrobox.ini | 11 ++ system_files/shared/etc/greetd/config.toml | 8 + .../shared/usr/share/ublue-os/just/61-dx.just | 98 ++++++++++ 29 files changed, 1027 insertions(+), 155 deletions(-) create mode 100755 build_files/base/01-base-system.sh create mode 100755 build_files/dx/01-dx-tooling.sh rename build_files/hypercube/{00-hypercube-branding.sh => 01-hypercube-branding.sh} (88%) delete mode 100755 build_files/hypercube/01-hypercube-packages.sh create mode 100755 build_files/hyprland/01-hyprland-desktop.sh create mode 100644 iso_files/calamares/branding/hypercube/branding.desc create mode 100644 iso_files/calamares/branding/hypercube/show.qml create mode 100644 iso_files/calamares/modules/bootc-deploy.conf create mode 100644 iso_files/calamares/modules/users.conf create mode 100644 iso_files/calamares/modules/welcome.conf create mode 100644 iso_files/calamares/settings.conf create mode 100755 iso_files/configure_live_session.sh delete mode 100755 iso_files/hide_hyprland_session.sh create mode 100644 iso_files/livesys-hyprland create mode 100644 packages/livesys-scripts/livesys-hyprland create mode 100644 packages/livesys-scripts/livesys-scripts.spec delete mode 100644 system_files/shared/etc/dconf/db/gdm.d/01-hypercube delete mode 100644 system_files/shared/etc/dconf/profile/gdm create mode 100644 system_files/shared/etc/distrobox/distrobox.ini create mode 100644 system_files/shared/etc/greetd/config.toml create mode 100644 system_files/shared/usr/share/ublue-os/just/61-dx.just diff --git a/.github/workflows/build-disk.yml b/.github/workflows/build-disk.yml index 356b1cd..caa016f 100644 --- a/.github/workflows/build-disk.yml +++ b/.github/workflows/build-disk.yml @@ -58,7 +58,8 @@ jobs: image-ref: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ matrix.variant.tag }} iso-dest: ${{ github.workspace }}/output.iso builder-distro: fedora - hook-pre-initramfs: ${{ github.workspace }}/iso_files/hide_hyprland_session.sh + livesys: false + hook-post-rootfs: ${{ github.workspace }}/iso_files/configure_live_session.sh - name: Rename ISO and generate checksum id: rename diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 017968b..84a48ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,12 +14,13 @@ on: workflow_dispatch: env: - IMAGE_DESC: "Hypercube - A Hyprland-focused bootc image built on Bluefin-DX" - IMAGE_KEYWORDS: "bootc,ublue,universal-blue,hyprland,hypercube,wayland" + IMAGE_DESC: "Hypercube - A developer workstation with Hyprland built on Fedora Atomic" + IMAGE_KEYWORDS: "bootc,ublue,universal-blue,hyprland,hypercube,wayland,developer" IMAGE_LOGO_URL: "https://raw.githubusercontent.com/${{ github.repository_owner }}/${{ github.event.repository.name }}/main/branding/hypercube-logo.png" IMAGE_NAME: "${{ github.event.repository.name }}" IMAGE_REGISTRY: "ghcr.io/${{ github.repository_owner }}" DEFAULT_TAG: "latest" + FEDORA_VERSION: "43" concurrency: group: ${{ github.workflow }}-${{ github.ref || github.run_id }} @@ -40,10 +41,12 @@ jobs: matrix: variant: - flavor: "main" - base_image: "ghcr.io/ublue-os/bluefin-dx:stable-daily" + source_image: "base" + source_suffix: "-main" tag_suffix: "" - flavor: "nvidia" - base_image: "ghcr.io/ublue-os/bluefin-dx-nvidia:stable-daily" + source_image: "base" + source_suffix: "-nvidia" tag_suffix: "-nvidia" steps: @@ -104,9 +107,12 @@ jobs: tags: ${{ steps.metadata.outputs.tags }} labels: ${{ steps.metadata.outputs.labels }} build-args: | - BASE_IMAGE=${{ matrix.variant.base_image }} + SOURCE_IMAGE=${{ matrix.variant.source_image }} + SOURCE_SUFFIX=${{ matrix.variant.source_suffix }} + FEDORA_VERSION=${{ env.FEDORA_VERSION }} IMAGE_NAME=${{ env.IMAGE_NAME }} IMAGE_VENDOR=${{ github.repository_owner }} + IMAGE_FLAVOR=${{ matrix.variant.flavor }} oci: false - name: Login to GitHub Container Registry diff --git a/Containerfile b/Containerfile index fa4f098..893dfa3 100644 --- a/Containerfile +++ b/Containerfile @@ -1,12 +1,15 @@ -# Hypercube Container Build -# Aligned with Bluefin patterns +# Hypercube v2 Container Build +# Built from ublue-os/base-main (pure Hyprland, no GNOME) # ============================================ # Build Arguments # ============================================ -ARG BASE_IMAGE=ghcr.io/ublue-os/bluefin-dx:stable-daily +ARG SOURCE_IMAGE="base" +ARG SOURCE_SUFFIX="-main" +ARG FEDORA_VERSION="43" ARG IMAGE_NAME=hypercube ARG IMAGE_VENDOR=binarypie-dev +ARG IMAGE_FLAVOR="main" ARG SHA_HEAD_SHORT="" # ============================================ @@ -20,16 +23,20 @@ COPY build_files /build_files # ============================================ # Stage 2: Main Build # ============================================ -FROM ${BASE_IMAGE} +FROM ghcr.io/ublue-os/${SOURCE_IMAGE}${SOURCE_SUFFIX}:${FEDORA_VERSION} # Re-declare ARGs after FROM (they don't persist across stages) ARG IMAGE_NAME ARG IMAGE_VENDOR +ARG IMAGE_FLAVOR ARG SHA_HEAD_SHORT +ARG FEDORA_VERSION # Export build-time environment variables ENV IMAGE_NAME=${IMAGE_NAME} ENV IMAGE_VENDOR=${IMAGE_VENDOR} +ENV IMAGE_FLAVOR=${IMAGE_FLAVOR} +ENV FEDORA_VERSION=${FEDORA_VERSION} # Copy dot_files (config templates) into the image COPY dot_files /usr/share/hypercube/config diff --git a/Justfile b/Justfile index a3e48de..6bbd8c7 100644 --- a/Justfile +++ b/Justfile @@ -157,8 +157,10 @@ build-iso flavor="main": _titanoboa-setup fi # Build ISO with Titanoboa + # livesys=0 skips Fedora livesys scripts (we use Calamares instead) + # hook-post-rootfs sets up live user, Calamares, and auto-login cd _titanoboa - {{ SUDO }} just build "${IMAGE_FULL}" + {{ SUDO }} HOOK_POST_ROOTFS="${PWD}/../iso_files/configure_live_session.sh" just build "${IMAGE_FULL}" livesys=0 # Fix ownership if [[ "${UID}" -gt 0 ]]; then @@ -197,8 +199,10 @@ build-iso-ghcr flavor="main": _titanoboa-setup echo "Building ISO for ${IMAGE_FULL}..." + # livesys=0 skips Fedora livesys scripts (we use Calamares instead) + # hook-post-rootfs sets up live user, Calamares, and auto-login cd _titanoboa - {{ SUDO }} just build "${IMAGE_FULL}" + {{ SUDO }} HOOK_POST_ROOTFS="${PWD}/../iso_files/configure_live_session.sh" just build "${IMAGE_FULL}" livesys=0 if [[ "${UID}" -gt 0 ]]; then {{ SUDO }} chown "${UID}:$(id -g)" -R "${PWD}" diff --git a/build_files/base/01-base-system.sh b/build_files/base/01-base-system.sh new file mode 100755 index 0000000..6eb7926 --- /dev/null +++ b/build_files/base/01-base-system.sh @@ -0,0 +1,98 @@ +#!/bin/bash +# Hypercube Base System +# Installs core system components, display manager (greetd + regreet), and hardware support + +set -ouex pipefail + +echo "Installing Hypercube base system..." + +# Clean DNF cache first +dnf5 -y clean all + +### Display Manager: greetd + tuigreet +# Both are in official Fedora repos +# Note: Can switch to regreet (GTK greeter) when F43 COPR is available +dnf5 -y install \ + greetd \ + greetd-selinux \ + tuigreet + +### Desktop Portals & Integration +dnf5 -y install \ + xdg-desktop-portal \ + xdg-desktop-portal-gtk \ + xdg-user-dirs \ + xdg-utils + +### Credential & Secret Storage +dnf5 -y install \ + gnome-keyring \ + seahorse + +### Audio (Pipewire should be in base, but ensure full stack) +dnf5 -y install \ + pipewire \ + pipewire-pulseaudio \ + pipewire-alsa \ + wireplumber + +### Networking +dnf5 -y install \ + NetworkManager \ + NetworkManager-wifi \ + NetworkManager-bluetooth \ + network-manager-applet + +### Bluetooth +dnf5 -y install \ + bluez \ + bluez-tools + +### Power Management +dnf5 -y install \ + power-profiles-daemon \ + upower + +### Fonts (base set - more can be added) +dnf5 -y install \ + google-noto-fonts-common \ + google-noto-sans-fonts \ + google-noto-serif-fonts \ + google-noto-sans-mono-fonts \ + google-noto-emoji-fonts \ + fontawesome-fonts-all \ + jetbrains-mono-fonts-all + +### Utilities +dnf5 -y install \ + wl-clipboard \ + xdg-utils \ + polkit \ + dbus-daemon + +### File Management +dnf5 -y install \ + nautilus \ + file-roller \ + gvfs \ + gvfs-mtp \ + gvfs-gphoto2 \ + gvfs-smb + +### Create greeter user for greetd +# greetd runs the greeter as this user +if ! id -u greeter &>/dev/null; then + useradd -r -M -s /usr/bin/nologin greeter +fi + +### Enable services +systemctl enable greetd.service +systemctl enable NetworkManager.service +systemctl enable bluetooth.service +systemctl enable power-profiles-daemon.service + +### Disable services we don't need +systemctl disable gdm.service 2>/dev/null || true +systemctl disable sddm.service 2>/dev/null || true + +echo "Hypercube base system installed successfully" diff --git a/build_files/dx/01-dx-tooling.sh b/build_files/dx/01-dx-tooling.sh new file mode 100755 index 0000000..b619c75 --- /dev/null +++ b/build_files/dx/01-dx-tooling.sh @@ -0,0 +1,36 @@ +#!/bin/bash +# Hypercube DX (Developer Experience) Tooling +# Installs Distrobox, container tools, and dev utilities + +set -ouex pipefail + +echo "Installing DX tooling..." + +### Distrobox - Container-based dev environments +dnf5 -y install distrobox + +### Container tools (Podman is in base-main, add full stack) +dnf5 -y install \ + podman \ + podman-compose \ + buildah \ + skopeo + +### Podman Desktop - GUI for containers and Kubernetes +# Installed via Flatpak for automatic updates +flatpak install -y flathub io.podman_desktop.PodmanDesktop + +### Additional dev utilities +dnf5 -y install \ + just \ + direnv \ + openssl \ + openssh-clients \ + rsync \ + wget \ + curl \ + unzip \ + zip \ + tar + +echo "DX tooling installed successfully" diff --git a/build_files/hypercube/00-hypercube-branding.sh b/build_files/hypercube/01-hypercube-branding.sh similarity index 88% rename from build_files/hypercube/00-hypercube-branding.sh rename to build_files/hypercube/01-hypercube-branding.sh index 4162d8d..07ea007 100755 --- a/build_files/hypercube/00-hypercube-branding.sh +++ b/build_files/hypercube/01-hypercube-branding.sh @@ -9,7 +9,7 @@ IMAGE_NAME="${IMAGE_NAME:-hypercube}" IMAGE_VENDOR="${IMAGE_VENDOR:-binarypie-dev}" IMAGE_FLAVOR="${IMAGE_FLAVOR:-main}" FEDORA_VERSION="${FEDORA_VERSION:-$(rpm -E %fedora)}" -BASE_IMAGE_NAME="${BASE_IMAGE_NAME:-bluefin-dx}" +BASE_IMAGE_NAME="${BASE_IMAGE_NAME:-base-main}" # Create image-info.json mkdir -p /usr/share/hypercube @@ -26,7 +26,7 @@ cat > /usr/share/hypercube/image-info.json << EOF EOF # Modify /usr/lib/os-release for Hypercube branding -# Keep Bluefin as ID_LIKE since we inherit from it +# No longer inheriting from Bluefin - built from base-main if [ -f /usr/lib/os-release ]; then # Set NAME to Hypercube sed -i "s/^NAME=.*/NAME=\"Hypercube\"/" /usr/lib/os-release @@ -34,14 +34,14 @@ if [ -f /usr/lib/os-release ]; then # Update PRETTY_NAME sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"Hypercube ${FEDORA_VERSION} (Fedora-based)\"/" /usr/lib/os-release - # Set ID to hypercube, keep fedora and bluefin as ID_LIKE + # Set ID to hypercube, keep fedora as ID_LIKE sed -i "s/^ID=.*/ID=hypercube/" /usr/lib/os-release - # Update ID_LIKE to include both fedora and bluefin + # Update ID_LIKE to fedora (no longer inheriting from Bluefin) if grep -q "^ID_LIKE=" /usr/lib/os-release; then - sed -i "s/^ID_LIKE=.*/ID_LIKE=\"bluefin fedora\"/" /usr/lib/os-release + sed -i "s/^ID_LIKE=.*/ID_LIKE=\"fedora\"/" /usr/lib/os-release else - echo 'ID_LIKE="bluefin fedora"' >> /usr/lib/os-release + echo 'ID_LIKE="fedora"' >> /usr/lib/os-release fi # Set VARIANT_ID @@ -100,11 +100,10 @@ if [ -d /usr/share/plymouth/themes/hypercube ]; then echo "Plymouth theme set to hypercube" fi -### GDM Login Screen Branding -# Compile dconf database for GDM logo -if [ -d /etc/dconf/db/gdm.d ]; then +### dconf database update (for any remaining dconf settings) +if [ -d /etc/dconf/db ]; then dconf update - echo "GDM dconf database updated" + echo "dconf database updated" fi echo "Hypercube branding applied successfully" diff --git a/build_files/hypercube/01-hypercube-packages.sh b/build_files/hypercube/01-hypercube-packages.sh deleted file mode 100755 index 9ce7931..0000000 --- a/build_files/hypercube/01-hypercube-packages.sh +++ /dev/null @@ -1,54 +0,0 @@ -#!/bin/bash -# Hypercube Package Installation -# Installs Hyprland compositor stack, CLI tools, terminals, and editors - -set -ouex pipefail - -echo "Installing Hypercube packages..." - -# Clean DNF cache first -dnf5 -y clean all - -### Compositor / Hyprland Stack -dnf5 -y copr enable sdegler/hyprland -dnf5 -y install \ - hyprland \ - hyprland-contrib \ - hyprland-plugins \ - hyprland-qtutils \ - hyprpaper \ - hyprpicker \ - hypridle \ - hyprshot \ - hyprlock \ - hyprpolkitagent \ - pyprland \ - waybar-git \ - xdg-desktop-portal-hyprland - -### CLI Tools (skip packages already in bluefin-dx) -# Note: starship is already installed in bluefin-dx -dnf5 -y install \ - fd-find \ - qt6ct - -### Lazygit from COPR -dnf5 -y copr enable atim/lazygit -dnf5 -y install lazygit - -### Quickshell - Application Launcher, Notifications, OSD -dnf5 -y copr enable errornointernet/quickshell -dnf5 -y install quickshell - -### Terminals -dnf5 -y copr enable wezfurlong/wezterm-nightly -dnf5 -y install wezterm - -dnf5 -y copr enable scottames/ghostty -dnf5 -y install ghostty - -### Editor -dnf5 -y copr enable agriffis/neovim-nightly -dnf5 -y install neovim python3-neovim - -echo "Hypercube packages installed successfully" diff --git a/build_files/hypercube/99-tests.sh b/build_files/hypercube/99-tests.sh index 0cf354b..47349d5 100755 --- a/build_files/hypercube/99-tests.sh +++ b/build_files/hypercube/99-tests.sh @@ -8,51 +8,84 @@ echo "Running Hypercube validation tests..." ### Check critical packages are installed REQUIRED_PACKAGES=( - "hyprland" - "hyprlock" - "hypridle" - "quickshell" - "wezterm" - "ghostty" - "neovim" - "lazygit" + # Display manager + "greetd" + "tuigreet" + # Hyprland stack + "hyprland" + "hyprlock" + "hypridle" + "quickshell" + # Terminals + "wezterm" + "ghostty" + # Dev tools + "neovim" + "lazygit" + "fish" + "starship" + # DX tooling + "distrobox" + "podman" ) for pkg in "${REQUIRED_PACKAGES[@]}"; do - if ! rpm -q "$pkg" &>/dev/null; then - echo "ERROR: Required package '$pkg' is not installed!" - exit 1 - fi - echo " OK: $pkg installed" + if ! rpm -q "$pkg" &>/dev/null; then + echo "ERROR: Required package '$pkg' is not installed!" + exit 1 + fi + echo " OK: $pkg installed" done ### Check critical files exist REQUIRED_FILES=( - "/usr/share/hypercube/image-info.json" - "/usr/lib/environment.d/60-hypercube-xdg.conf" - "/usr/bin/nvimd" - "/etc/fish/config.fish" - "/usr/share/hypercube/config/starship/starship.toml" - "/usr/share/themes/Tokyonight-Dark/gtk-3.0/gtk.css" - "/usr/share/icons/Tokyonight-Dark/index.theme" - "/usr/share/plymouth/themes/hypercube/hypercube.plymouth" - "/usr/share/pixmaps/hypercube-logo.png" - "/usr/share/backgrounds/hypercube/background.png" + # Branding + "/usr/share/hypercube/image-info.json" + "/usr/lib/environment.d/60-hypercube-xdg.conf" + # greetd + "/etc/greetd/config.toml" + # Config files + "/usr/bin/nvimd" + "/etc/fish/config.fish" + "/usr/share/hypercube/config/starship/starship.toml" + # Theming + "/usr/share/themes/Tokyonight-Dark/gtk-3.0/gtk.css" + "/usr/share/icons/Tokyonight-Dark/index.theme" + "/usr/share/plymouth/themes/hypercube/hypercube.plymouth" + "/usr/share/pixmaps/hypercube-logo.png" + "/usr/share/backgrounds/hypercube/background.png" + # DX config + "/etc/distrobox/distrobox.ini" + "/usr/share/ublue-os/just/61-dx.just" ) for file in "${REQUIRED_FILES[@]}"; do - if [ ! -e "$file" ]; then - echo "ERROR: Required file '$file' does not exist!" - exit 1 - fi - echo " OK: $file exists" + if [ ! -e "$file" ]; then + echo "ERROR: Required file '$file' does not exist!" + exit 1 + fi + echo " OK: $file exists" done ### Check os-release branding if ! grep -q "ID=hypercube" /usr/lib/os-release; then - echo "ERROR: os-release branding not applied!" - exit 1 + echo "ERROR: os-release branding not applied!" + exit 1 fi echo " OK: os-release branding applied" +### Check services are enabled +REQUIRED_SERVICES=( + "greetd.service" + "NetworkManager.service" +) + +for svc in "${REQUIRED_SERVICES[@]}"; do + if ! systemctl is-enabled "$svc" &>/dev/null; then + echo "ERROR: Required service '$svc' is not enabled!" + exit 1 + fi + echo " OK: $svc enabled" +done + echo "All Hypercube validation tests passed!" diff --git a/build_files/hyprland/01-hyprland-desktop.sh b/build_files/hyprland/01-hyprland-desktop.sh new file mode 100755 index 0000000..14dd61c --- /dev/null +++ b/build_files/hyprland/01-hyprland-desktop.sh @@ -0,0 +1,87 @@ +#!/bin/bash +# Hypercube Hyprland Desktop Stack +# Installs Hyprland compositor, tools, terminals, and editors + +set -ouex pipefail + +echo "Installing Hyprland desktop stack..." + +### Compositor / Hyprland Stack +dnf5 -y copr enable sdegler/hyprland +dnf5 -y install \ + hyprland \ + hyprland-contrib \ + hyprland-plugins \ + hyprland-qtutils \ + hyprpaper \ + hyprpicker \ + hypridle \ + hyprshot \ + hyprlock \ + hyprpolkitagent \ + pyprland \ + waybar-git \ + xdg-desktop-portal-hyprland + +### Quickshell - Application Launcher, Notifications, OSD +dnf5 -y copr enable errornointernet/quickshell +dnf5 -y install quickshell + +### CLI Tools - Official Fedora repos +dnf5 -y install \ + fd-find \ + fzf \ + ripgrep \ + bat \ + zoxide \ + htop \ + btop \ + git \ + jq \ + yq \ + tmux \ + qt6ct + +### CLI Tools - From COPRs (not in official F43 repos) +# eza - modern ls replacement +dnf5 -y copr enable alternateved/eza +dnf5 -y install eza + +# starship - cross-shell prompt +dnf5 -y copr enable atim/starship +dnf5 -y install starship + +# git-delta - better git diff +dnf5 -y copr enable gourlaysama/git-delta || true +dnf5 -y install git-delta || true + +### Fish Shell (set as default) +# Note: fisher (plugin manager) removed - starship handles prompt, fish has good built-in completions +dnf5 -y install fish + +### Lazygit from COPR +dnf5 -y copr enable atim/lazygit +dnf5 -y install lazygit + +### Terminals +dnf5 -y copr enable wezfurlong/wezterm-nightly +dnf5 -y install wezterm + +dnf5 -y copr enable scottames/ghostty +dnf5 -y install ghostty + +### Editor +dnf5 -y copr enable agriffis/neovim-nightly +dnf5 -y install neovim python3-neovim + +### Image/Media Viewers +dnf5 -y install \ + imv \ + mpv + +### Screenshot/Screen Recording (hyprshot handles most, but add deps) +dnf5 -y install \ + grim \ + slurp + +echo "Hyprland desktop stack installed successfully" diff --git a/build_files/shared/build.sh b/build_files/shared/build.sh index 9cb8e61..a70a0f4 100755 --- a/build_files/shared/build.sh +++ b/build_files/shared/build.sh @@ -1,11 +1,11 @@ #!/bin/bash -# Hypercube Build Orchestrator +# Hypercube v2 Build Orchestrator # Main build script that coordinates all build steps set -ouex pipefail echo "========================================" -echo "Starting Hypercube Build" +echo "Starting Hypercube v2 Build" echo "========================================" ### Rsync system files to root filesystem @@ -13,15 +13,30 @@ echo "Installing system files..." # Note: We don't use --ignore-existing so our files override base image files rsync -rlpvh /ctx/system_files/shared/ / -### Run hypercube build scripts in order -echo "Running build scripts..." -for script in /ctx/build_files/hypercube/*.sh; do - if [[ -f "$script" && -x "$script" ]]; then - echo "" - echo "========================================" - echo "Running: $(basename "$script")" - echo "========================================" - "$script" +### Run build scripts in order from each phase directory +# Phase 1: Base system (greetd, portals, hardware) +# Phase 2: Hyprland desktop +# Phase 3: DX tooling +# Phase 4: Hypercube theming/branding + +BUILD_DIRS=( + "/ctx/build_files/base" + "/ctx/build_files/hyprland" + "/ctx/build_files/dx" + "/ctx/build_files/hypercube" +) + +for build_dir in "${BUILD_DIRS[@]}"; do + if [[ -d "$build_dir" ]]; then + for script in "$build_dir"/*.sh; do + if [[ -f "$script" && -x "$script" ]]; then + echo "" + echo "========================================" + echo "Running: $(basename "$build_dir")/$(basename "$script")" + echo "========================================" + "$script" + fi + done fi done @@ -34,5 +49,5 @@ echo "========================================" echo "" echo "========================================" -echo "Hypercube Build Complete!" +echo "Hypercube v2 Build Complete!" echo "========================================" diff --git a/build_files/shared/clean-stage.sh b/build_files/shared/clean-stage.sh index 65ce81d..5f0e771 100755 --- a/build_files/shared/clean-stage.sh +++ b/build_files/shared/clean-stage.sh @@ -8,6 +8,8 @@ echo "Disabling COPR repositories..." # Disable all COPR repos that were enabled during build # This ensures the final image doesn't have external repos enabled + +# Hyprland COPRs dnf5 -y copr disable sdegler/hyprland || true dnf5 -y copr disable errornointernet/quickshell || true dnf5 -y copr disable wezfurlong/wezterm-nightly || true @@ -15,6 +17,11 @@ dnf5 -y copr disable scottames/ghostty || true dnf5 -y copr disable agriffis/neovim-nightly || true dnf5 -y copr disable atim/lazygit || true +# CLI Tools COPRs +dnf5 -y copr disable alternateved/eza || true +dnf5 -y copr disable atim/starship || true +dnf5 -y copr disable gourlaysama/git-delta || true + echo "Cleaning package caches..." dnf5 -y clean all diff --git a/iso_files/calamares/branding/hypercube/branding.desc b/iso_files/calamares/branding/hypercube/branding.desc new file mode 100644 index 0000000..58c24cc --- /dev/null +++ b/iso_files/calamares/branding/hypercube/branding.desc @@ -0,0 +1,28 @@ +--- +componentName: hypercube + +strings: + productName: Hypercube + shortProductName: Hypercube + version: 1.0 + shortVersion: 1.0 + versionedName: Hypercube 1.0 + shortVersionedName: Hypercube 1.0 + bootloaderEntryName: Hypercube + productUrl: https://github.com/binarypie-dev/hypercube + supportUrl: https://github.com/binarypie-dev/hypercube/issues + knownIssuesUrl: https://github.com/binarypie-dev/hypercube/issues + releaseNotesUrl: https://github.com/binarypie-dev/hypercube/releases + +images: + productLogo: "hypercube-logo.png" + productIcon: "hypercube-logo.png" + productWelcome: "hypercube-welcome.png" + +slideshow: "show.qml" + +style: + sidebarBackground: "#1a1b26" + sidebarText: "#c0caf5" + sidebarTextSelect: "#7aa2f7" + sidebarTextHighlight: "#bb9af7" diff --git a/iso_files/calamares/branding/hypercube/show.qml b/iso_files/calamares/branding/hypercube/show.qml new file mode 100644 index 0000000..2c5a72d --- /dev/null +++ b/iso_files/calamares/branding/hypercube/show.qml @@ -0,0 +1,184 @@ +/* Hypercube Calamares Slideshow */ + +import QtQuick 2.15 +import calamares.slideshow 1.0 + +Presentation { + id: presentation + + Timer { + interval: 5000 + running: true + repeat: true + onTriggered: presentation.goToNextSlide() + } + + Slide { + Rectangle { + anchors.fill: parent + color: "#1a1b26" + + Column { + anchors.centerIn: parent + spacing: 30 + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Welcome to Hypercube" + font.pixelSize: 32 + font.bold: true + color: "#c0caf5" + } + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "A developer-focused workstation with Hyprland" + font.pixelSize: 18 + color: "#a9b1d6" + } + } + } + } + + Slide { + Rectangle { + anchors.fill: parent + color: "#1a1b26" + + Column { + anchors.centerIn: parent + spacing: 20 + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Hyprland Desktop" + font.pixelSize: 28 + font.bold: true + color: "#7aa2f7" + } + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Modern, tiling Wayland compositor" + font.pixelSize: 16 + color: "#a9b1d6" + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 8 + + Text { text: "• Smooth animations and effects"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Dynamic tiling and workspaces"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Waybar status bar"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Quickshell launcher"; color: "#c0caf5"; font.pixelSize: 14 } + } + } + } + } + + Slide { + Rectangle { + anchors.fill: parent + color: "#1a1b26" + + Column { + anchors.centerIn: parent + spacing: 20 + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Developer Experience" + font.pixelSize: 28 + font.bold: true + color: "#bb9af7" + } + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Everything you need to be productive" + font.pixelSize: 16 + color: "#a9b1d6" + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 8 + + Text { text: "• Distrobox for isolated dev environments"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Homebrew via bluefin-cli container"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Docker & Podman container runtimes"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• kubectl, kind, helm for Kubernetes"; color: "#c0caf5"; font.pixelSize: 14 } + } + } + } + } + + Slide { + Rectangle { + anchors.fill: parent + color: "#1a1b26" + + Column { + anchors.centerIn: parent + spacing: 20 + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Modern Tooling" + font.pixelSize: 28 + font.bold: true + color: "#9ece6a" + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 8 + + Text { text: "• Ghostty & WezTerm terminals"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Neovim with nightly builds"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Fish shell with Starship prompt"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Lazygit for git workflows"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• ripgrep, fd, eza, bat, zoxide"; color: "#c0caf5"; font.pixelSize: 14 } + } + } + } + } + + Slide { + Rectangle { + anchors.fill: parent + color: "#1a1b26" + + Column { + anchors.centerIn: parent + spacing: 20 + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Atomic & Reliable" + font.pixelSize: 28 + font.bold: true + color: "#f7768e" + } + + Text { + anchors.horizontalCenter: parent.horizontalCenter + text: "Built on Fedora Atomic (bootc)" + font.pixelSize: 16 + color: "#a9b1d6" + } + + Column { + anchors.horizontalCenter: parent.horizontalCenter + spacing: 8 + + Text { text: "• Immutable base system"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Atomic updates with rollback"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Container-native workflow"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Always recoverable"; color: "#c0caf5"; font.pixelSize: 14 } + } + } + } + } +} diff --git a/iso_files/calamares/modules/bootc-deploy.conf b/iso_files/calamares/modules/bootc-deploy.conf new file mode 100644 index 0000000..1634c50 --- /dev/null +++ b/iso_files/calamares/modules/bootc-deploy.conf @@ -0,0 +1,12 @@ +# Hypercube bootc Deploy Module Configuration +# Deploys the bootc image to the target system + +# The container image to deploy +# This will be read from the running system +imageRef: "" + +# Use the image from the currently running system +useCurrentImage: true + +# Target root for installation +targetRoot: "" diff --git a/iso_files/calamares/modules/users.conf b/iso_files/calamares/modules/users.conf new file mode 100644 index 0000000..06b0189 --- /dev/null +++ b/iso_files/calamares/modules/users.conf @@ -0,0 +1,39 @@ +# Hypercube Users Module Configuration + +defaultGroups: + - name: wheel + must_exist: true + system: true + - name: video + must_exist: false + system: true + - name: render + must_exist: false + system: true + - name: input + must_exist: false + system: true + +autologinGroup: autologin + +doAutologin: false + +sudoersGroup: wheel + +sudoersConfigureWithGroup: true + +setRootPassword: false + +doReusePassword: true + +passwordRequirements: + minLength: 8 + maxLength: -1 + +allowWeakPasswords: false +allowWeakPasswordsDefault: false + +userShell: /usr/bin/fish + +setHostname: EtcFile +writeHostsFile: true diff --git a/iso_files/calamares/modules/welcome.conf b/iso_files/calamares/modules/welcome.conf new file mode 100644 index 0000000..eb8c813 --- /dev/null +++ b/iso_files/calamares/modules/welcome.conf @@ -0,0 +1,21 @@ +# Hypercube Welcome Module Configuration + +showSupportUrl: true +showKnownIssuesUrl: true +showReleaseNotesUrl: true + +requirements: + requiredStorage: 20 + requiredRam: 4 + internetCheckUrl: https://github.com + check: + - storage + - ram + - root + required: + - storage + - ram + - root + +geoip: + style: none diff --git a/iso_files/calamares/settings.conf b/iso_files/calamares/settings.conf new file mode 100644 index 0000000..918882e --- /dev/null +++ b/iso_files/calamares/settings.conf @@ -0,0 +1,38 @@ +# Hypercube Calamares Settings +# Configuration for the bootc-based installer + +modules-search: [ local, /usr/lib/calamares/modules ] + +sequence: + - show: + - welcome + - locale + - keyboard + - partition + - users + - summary + - exec: + - partition + - mount + - bootc-deploy + - users + - displaymanager + - hwclock + - umount + - show: + - finished + +branding: hypercube + +prompt-install: true + +dont-chroot: false + +oem-setup: false + +disable-cancel: false +disable-cancel-during-exec: true + +hide-back-and-next-during-exec: true + +quit-at-end: false diff --git a/iso_files/configure_live_session.sh b/iso_files/configure_live_session.sh new file mode 100755 index 0000000..83459c4 --- /dev/null +++ b/iso_files/configure_live_session.sh @@ -0,0 +1,63 @@ +#!/bin/bash +set -euxo pipefail + +# Hypercube ISO Live Session Setup +# Since livesys-scripts doesn't support Hyprland yet, we do the setup manually +# +# NOTE: This script runs inside titanoboa's chroot with livesys=0 +# +# TODO: Once https://pagure.io/livesys-scripts merges Hyprland support, +# we can remove this and use livesys=1 + +echo "Setting up Hypercube live session..." + +### Install livesys-scripts (we'll run the Hyprland session setup manually) +dnf5 -y install livesys-scripts + +### Configure livesys for Hyprland +sed -i 's/^livesys_session=.*/livesys_session=hyprland/' /etc/sysconfig/livesys + +### Install Hyprland session file for livesys-scripts +mkdir -p /usr/libexec/livesys/sessions.d +cat > /usr/libexec/livesys/sessions.d/livesys-hyprland << 'SESSION_EOF' +#!/bin/sh +# +# livesys-hyprland: hyprland specific setup for livesys +# SPDX-License-Identifier: GPL-3.0-or-later +# + +HYPRLAND_SESSION_FILE="hyprland.desktop" + +# set up autologin for user liveuser using greetd +if [ -f /etc/greetd/config.toml ]; then + cat > /etc/greetd/config.toml << GREETD_EOF +[terminal] +vt = 1 + +[default_session] +command = "Hyprland" +user = "liveuser" +GREETD_EOF +fi + +# Show harddisk install on the desktop +if [ -f /usr/share/applications/liveinst.desktop ]; then + sed -i -e 's/NoDisplay=true/NoDisplay=false/' /usr/share/applications/liveinst.desktop +fi +mkdir -p /home/liveuser/Desktop +SESSION_EOF + +chmod +x /usr/libexec/livesys/sessions.d/livesys-hyprland + +### Enable livesys services +systemctl enable livesys.service livesys-late.service + +### Create livesys-session-extra tmpfiles config +echo "C /var/lib/livesys/livesys-session-extra 0755 root root - /usr/share/factory/var/lib/livesys/livesys-session-extra" > \ + /usr/lib/tmpfiles.d/livesys-session-extra.conf + +### Mark this as a live session +mkdir -p /var/lib/hypercube +touch /var/lib/hypercube/live-session + +echo "Hypercube live session setup complete" diff --git a/iso_files/hide_hyprland_session.sh b/iso_files/hide_hyprland_session.sh deleted file mode 100755 index 59aa508..0000000 --- a/iso_files/hide_hyprland_session.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash -set -euxo pipefail - -# Hide Hyprland session so livesys detects GNOME for the live session -# After install, the full image with Hyprland session will be deployed -# This runs before rootfs-install-livesys-scripts -if [ -f /usr/share/wayland-sessions/hyprland.desktop ]; then - mv /usr/share/wayland-sessions/hyprland.desktop /usr/share/wayland-sessions/hyprland.desktop.hidden - echo "Hyprland session hidden - livesys will detect GNOME instead" -fi diff --git a/iso_files/livesys-hyprland b/iso_files/livesys-hyprland new file mode 100644 index 0000000..ac8974d --- /dev/null +++ b/iso_files/livesys-hyprland @@ -0,0 +1,38 @@ +#!/bin/sh +# +# livesys-hyprland: hyprland specific setup for livesys +# SPDX-License-Identifier: GPL-3.0-or-later +# + +HYPRLAND_SESSION_FILE="hyprland.desktop" + +# set up autologin for user liveuser +if [ -f /etc/greetd/config.toml ]; then + # Use greetd for Hyprland + cat > /etc/greetd/config.toml << GREETD_EOF +[terminal] +vt = 1 + +[default_session] +command = "Hyprland" +user = "liveuser" +GREETD_EOF +elif [ -f /etc/sddm.conf ]; then + sed -i 's/^#User=.*/User=liveuser/' /etc/sddm.conf + sed -i "s/^#Session=.*/Session=${HYPRLAND_SESSION_FILE}/" /etc/sddm.conf +else + cat > /etc/sddm.conf << SDDM_EOF +[Autologin] +User=liveuser +Session=${HYPRLAND_SESSION_FILE} +SDDM_EOF +fi + +# Show harddisk install on the desktop +if [ -f /usr/share/applications/liveinst.desktop ]; then + sed -i -e 's/NoDisplay=true/NoDisplay=false/' /usr/share/applications/liveinst.desktop +fi +mkdir -p /home/liveuser/Desktop + +# echoing type liveinst to start the installer +echo "echo 'Please type liveinst and press Enter to start the installer'" >> /home/liveuser/.bashrc diff --git a/packages/livesys-scripts/livesys-hyprland b/packages/livesys-scripts/livesys-hyprland new file mode 100644 index 0000000..b68643c --- /dev/null +++ b/packages/livesys-scripts/livesys-hyprland @@ -0,0 +1,62 @@ +#!/bin/sh +# +# livesys-hyprland: hyprland specific setup for livesys +# SPDX-License-Identifier: GPL-3.0-or-later +# + +HYPRLAND_SESSION_FILE="hyprland.desktop" + +# set up autologin for user liveuser +# Support greetd, GDM, and SDDM + +if [ -f /etc/greetd/config.toml ]; then + # greetd (common for Hyprland setups) + cat > /etc/greetd/config.toml << GREETD_EOF +[terminal] +vt = 1 + +[default_session] +command = "Hyprland" +user = "liveuser" +GREETD_EOF + +elif [ -f /etc/gdm/custom.conf ]; then + # GDM + sed -i 's/^\[daemon\]/[daemon]\nAutomaticLoginEnable=True\nAutomaticLogin=liveuser/' /etc/gdm/custom.conf + # Set default session for GDM + mkdir -p /var/lib/AccountsService/users + cat > /var/lib/AccountsService/users/liveuser << GDM_USER_EOF +[User] +Session=${HYPRLAND_SESSION_FILE} +XSession=${HYPRLAND_SESSION_FILE} +SystemAccount=false +GDM_USER_EOF + +elif [ -f /etc/sddm.conf ]; then + # SDDM (existing config) + sed -i 's/^#User=.*/User=liveuser/' /etc/sddm.conf + sed -i "s/^#Session=.*/Session=${HYPRLAND_SESSION_FILE}/" /etc/sddm.conf + +else + # SDDM (create new config) + cat > /etc/sddm.conf << SDDM_EOF +[Autologin] +User=liveuser +Session=${HYPRLAND_SESSION_FILE} +SDDM_EOF +fi + +# Show harddisk install on the desktop +if [ -f /usr/share/applications/liveinst.desktop ]; then + sed -i -e 's/NoDisplay=true/NoDisplay=false/' /usr/share/applications/liveinst.desktop +fi +mkdir -p /home/liveuser/Desktop + +# echoing type liveinst to start the installer +echo "echo 'Please type liveinst and press Enter to start the installer'" >> /home/liveuser/.bashrc + +# use hyprland configuration files for live environment +if [ "$(ls /usr/share/hypr/config.live.d/*.conf 2>/dev/null)" ]; then + mkdir -p /home/liveuser/.config/hypr/ + ln -sf -t /home/liveuser/.config/hypr /usr/share/hypr/config.live.d/*.conf +fi diff --git a/packages/livesys-scripts/livesys-scripts.spec b/packages/livesys-scripts/livesys-scripts.spec new file mode 100644 index 0000000..61f63ba --- /dev/null +++ b/packages/livesys-scripts/livesys-scripts.spec @@ -0,0 +1,66 @@ +Name: livesys-scripts +Version: 0.9.1 +Release: 1.hypercube%{?dist} +Summary: Scripts for auto-configuring live media during boot (with Hyprland support) + +License: GPL-3.0-or-later +URL: https://pagure.io/fork/binarypie/livesys-scripts +Source: https://pagure.io/fork/binarypie/livesys-scripts/archive/main/%{name}-main.tar.gz + +BuildRequires: systemd-rpm-macros +BuildRequires: make + +BuildArch: noarch + +# This package provides livesys-scripts with Hyprland support +Provides: livesys-scripts = %{version}-%{release} +Obsoletes: livesys-scripts < %{version}-%{release} + +%description +Scripts for auto-configuring live media during boot. +This version includes Hyprland session support. + + +%prep +%autosetup -n %{name}-main -p1 + + +%build +# Nothing to do + +%install +%make_install + +# Make ghost files +mkdir -p %{buildroot}%{_sharedstatedir}/livesys +touch %{buildroot}%{_sharedstatedir}/livesys/livesys-session-extra +touch %{buildroot}%{_sharedstatedir}/livesys/livesys-session-late-extra + + +%preun +%systemd_preun livesys.service livesys-late.service + + +%post +%systemd_post livesys.service livesys-late.service + + +%postun +%systemd_postun livesys.service livesys-late.service + + +%files +%license COPYING +%doc README.md +%config(noreplace) %{_sysconfdir}/sysconfig/livesys +%{_libexecdir}/livesys/ +%{_unitdir}/livesys* +%dir %{_sharedstatedir}/livesys +%ghost %{_sharedstatedir}/livesys/livesys-session-extra +%ghost %{_sharedstatedir}/livesys/livesys-session-late-extra + + +%changelog +* Mon Dec 16 2024 Hypercube - 0.9.1-1.hypercube +- Add Hyprland session support +- Based on upstream 0.9.1 diff --git a/system_files/shared/etc/dconf/db/gdm.d/01-hypercube b/system_files/shared/etc/dconf/db/gdm.d/01-hypercube deleted file mode 100644 index 4fa4003..0000000 --- a/system_files/shared/etc/dconf/db/gdm.d/01-hypercube +++ /dev/null @@ -1,18 +0,0 @@ -[org/gnome/login-screen] -disable-user-list=false - -[org/gnome/desktop/interface] -color-scheme='prefer-dark' - -[org/gnome/desktop/screensaver] -picture-uri='file:///usr/share/backgrounds/hypercube/background.png' -picture-options='zoom' -primary-color='#1a1b26' -secondary-color='#1a1b26' - -[org/gnome/desktop/background] -picture-uri='file:///usr/share/backgrounds/hypercube/background.png' -picture-uri-dark='file:///usr/share/backgrounds/hypercube/background.png' -picture-options='zoom' -primary-color='#1a1b26' -secondary-color='#1a1b26' diff --git a/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode b/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode index 45883e7..1caee5a 100644 --- a/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode +++ b/system_files/shared/etc/dconf/db/local.d/01-hypercube-dark-mode @@ -1,5 +1,5 @@ # Hypercube Settings -# System-wide defaults for GNOME desktop +# System-wide defaults for GTK applications running under Hyprland [org/gnome/desktop/interface] color-scheme='prefer-dark' @@ -7,9 +7,4 @@ gtk-theme='Tokyonight-Dark-BL' icon-theme='Tokyonight-Dark' cursor-theme='Adwaita' -[org/gnome/desktop/wm/preferences] -theme='Tokyonight-Dark-BL' - -[org/gnome/desktop/input-sources] -# XKB options: Caps Lock as Ctrl, swap Alt and Super -xkb-options=['caps:ctrl_modifier', 'altwin:swap_alt_win'] +# Note: XKB options are now configured in Hyprland (hyprland.conf) diff --git a/system_files/shared/etc/dconf/profile/gdm b/system_files/shared/etc/dconf/profile/gdm deleted file mode 100644 index e4ac220..0000000 --- a/system_files/shared/etc/dconf/profile/gdm +++ /dev/null @@ -1,2 +0,0 @@ -user-db:user -system-db:gdm diff --git a/system_files/shared/etc/distrobox/distrobox.ini b/system_files/shared/etc/distrobox/distrobox.ini new file mode 100644 index 0000000..c274dad --- /dev/null +++ b/system_files/shared/etc/distrobox/distrobox.ini @@ -0,0 +1,11 @@ +# Hypercube Distrobox Configuration +# Pre-configured containers for development + +[bluefin-cli] +image=ghcr.io/ublue-os/bluefin-cli:latest +pull=true +init=false +start_now=false +# Homebrew and common CLI tools pre-installed +# Access via: distrobox enter bluefin-cli +# Or use the 'brew' alias configured in fish diff --git a/system_files/shared/etc/greetd/config.toml b/system_files/shared/etc/greetd/config.toml new file mode 100644 index 0000000..b047317 --- /dev/null +++ b/system_files/shared/etc/greetd/config.toml @@ -0,0 +1,8 @@ +[terminal] +# The VT to run the greeter on +vt = 1 + +[default_session] +# Run tuigreet with Hyprland as the default session +command = "tuigreet --remember --remember-session --time --greeting 'Welcome to Hypercube' --asterisks --cmd Hyprland" +user = "greeter" diff --git a/system_files/shared/usr/share/ublue-os/just/61-dx.just b/system_files/shared/usr/share/ublue-os/just/61-dx.just new file mode 100644 index 0000000..ab1283b --- /dev/null +++ b/system_files/shared/usr/share/ublue-os/just/61-dx.just @@ -0,0 +1,98 @@ +# Hypercube DX (Developer Experience) Commands + +# Enter the bluefin-cli container (Homebrew environment) +brew: + #!/usr/bin/bash + set -euo pipefail + + # Check if bluefin-cli container exists + if ! distrobox list | grep -q "bluefin-cli"; then + echo "Creating bluefin-cli container..." + distrobox assemble create --file /etc/distrobox/distrobox.ini + fi + + distrobox enter bluefin-cli + +# Run a brew command directly without entering the container +brew-run *args: + #!/usr/bin/bash + set -euo pipefail + + # Check if bluefin-cli container exists + if ! distrobox list | grep -q "bluefin-cli"; then + echo "Creating bluefin-cli container..." + distrobox assemble create --file /etc/distrobox/distrobox.ini + fi + + distrobox enter bluefin-cli -- brew {{ args }} + +# Create distrobox containers from config +distrobox-assemble: + #!/usr/bin/bash + set -euo pipefail + + echo "Creating distrobox containers from /etc/distrobox/distrobox.ini..." + distrobox assemble create --file /etc/distrobox/distrobox.ini + echo "" + echo "Containers created. Use 'distrobox list' to see them." + +# List all distrobox containers +distrobox-list: + distrobox list + +# Create a new dev container with common tools +distrobox-dev name: + #!/usr/bin/bash + set -euo pipefail + + echo "Creating development container: {{ name }}" + distrobox create --name "{{ name }}" --image ghcr.io/ublue-os/bluefin-cli:latest + echo "" + echo "Container created. Enter with: distrobox enter {{ name }}" + +# Create a Fedora container +distrobox-fedora name: + #!/usr/bin/bash + set -euo pipefail + + echo "Creating Fedora container: {{ name }}" + distrobox create --name "{{ name }}" --image registry.fedoraproject.org/fedora:latest + echo "" + echo "Container created. Enter with: distrobox enter {{ name }}" + +# Create an Ubuntu container +distrobox-ubuntu name: + #!/usr/bin/bash + set -euo pipefail + + echo "Creating Ubuntu container: {{ name }}" + distrobox create --name "{{ name }}" --image docker.io/library/ubuntu:latest + echo "" + echo "Container created. Enter with: distrobox enter {{ name }}" + +# Create an Arch Linux container +distrobox-arch name: + #!/usr/bin/bash + set -euo pipefail + + echo "Creating Arch Linux container: {{ name }}" + distrobox create --name "{{ name }}" --image docker.io/library/archlinux:latest + echo "" + echo "Container created. Enter with: distrobox enter {{ name }}" + +# Show developer environment status +dx-status: + #!/usr/bin/bash + set -euo pipefail + + echo "Hypercube DX Status" + echo "===================" + echo "" + + echo "Container Runtimes:" + echo -n " Podman: " + podman --version 2>/dev/null || echo "not found" + echo "" + + echo "Distrobox Containers:" + distrobox list 2>/dev/null || echo " (none)" From fe1ef9061db87bef058eb94ac547e354e7439c0c Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 11:44:35 -0800 Subject: [PATCH 02/27] copr stuff --- build_files/hyprland/01-hyprland-desktop.sh | 50 ++---- build_files/shared/clean-stage.sh | 14 +- packages/aquamarine/aquamarine.spec | 61 ++++++++ packages/eza/eza.spec | 55 +++++++ packages/ghostty/ghostty.spec | 86 +++++++++++ packages/hyprcursor/hyprcursor.spec | 55 +++++++ packages/hyprgraphics/hyprgraphics.spec | 64 ++++++++ packages/hypridle/hypridle.spec | 68 +++++++++ .../hyprland-protocols.spec | 40 +++++ .../hyprland-qt-support.spec | 42 +++++ packages/hyprland/hyprland.spec | 143 ++++++++++++++++++ packages/hyprlang/hyprlang.spec | 53 +++++++ packages/hyprlock/hyprlock.spec | 72 +++++++++ packages/hyprpaper/hyprpaper.spec | 56 +++++++ packages/hyprpolkitagent/hyprpolkitagent.spec | 53 +++++++ packages/hyprutils/hyprutils.spec | 52 +++++++ .../hyprwayland-scanner.spec | 44 ++++++ packages/lazygit/lazygit.spec | 36 +++++ packages/livesys-scripts/livesys-hyprland | 62 -------- packages/livesys-scripts/livesys-scripts.spec | 4 +- packages/neovim/neovim.spec | 69 +++++++++ packages/quickshell/quickshell.spec | 79 ++++++++++ packages/starship/starship.spec | 50 ++++++ .../xdg-desktop-portal-hyprland.spec | 73 +++++++++ 24 files changed, 1269 insertions(+), 112 deletions(-) create mode 100644 packages/aquamarine/aquamarine.spec create mode 100644 packages/eza/eza.spec create mode 100644 packages/ghostty/ghostty.spec create mode 100644 packages/hyprcursor/hyprcursor.spec create mode 100644 packages/hyprgraphics/hyprgraphics.spec create mode 100644 packages/hypridle/hypridle.spec create mode 100644 packages/hyprland-protocols/hyprland-protocols.spec create mode 100644 packages/hyprland-qt-support/hyprland-qt-support.spec create mode 100644 packages/hyprland/hyprland.spec create mode 100644 packages/hyprlang/hyprlang.spec create mode 100644 packages/hyprlock/hyprlock.spec create mode 100644 packages/hyprpaper/hyprpaper.spec create mode 100644 packages/hyprpolkitagent/hyprpolkitagent.spec create mode 100644 packages/hyprutils/hyprutils.spec create mode 100644 packages/hyprwayland-scanner/hyprwayland-scanner.spec create mode 100644 packages/lazygit/lazygit.spec delete mode 100644 packages/livesys-scripts/livesys-hyprland create mode 100644 packages/neovim/neovim.spec create mode 100644 packages/quickshell/quickshell.spec create mode 100644 packages/starship/starship.spec create mode 100644 packages/xdg-desktop-portal-hyprland/xdg-desktop-portal-hyprland.spec diff --git a/build_files/hyprland/01-hyprland-desktop.sh b/build_files/hyprland/01-hyprland-desktop.sh index 14dd61c..99989e0 100755 --- a/build_files/hyprland/01-hyprland-desktop.sh +++ b/build_files/hyprland/01-hyprland-desktop.sh @@ -6,25 +6,20 @@ set -ouex pipefail echo "Installing Hyprland desktop stack..." -### Compositor / Hyprland Stack -dnf5 -y copr enable sdegler/hyprland +### Enable Hypercube COPR (our self-maintained packages) +dnf5 -y copr enable binarypie/hypercube + +### Compositor / Hyprland Stack (from Hypercube COPR) dnf5 -y install \ hyprland \ - hyprland-contrib \ - hyprland-plugins \ - hyprland-qtutils \ + hyprland-uwsm \ hyprpaper \ - hyprpicker \ hypridle \ - hyprshot \ hyprlock \ hyprpolkitagent \ - pyprland \ - waybar-git \ xdg-desktop-portal-hyprland -### Quickshell - Application Launcher, Notifications, OSD -dnf5 -y copr enable errornointernet/quickshell +### Quickshell - Application Launcher, Notifications, OSD (from Hypercube COPR) dnf5 -y install quickshell ### CLI Tools - Official Fedora repos @@ -42,36 +37,19 @@ dnf5 -y install \ tmux \ qt6ct -### CLI Tools - From COPRs (not in official F43 repos) -# eza - modern ls replacement -dnf5 -y copr enable alternateved/eza -dnf5 -y install eza - -# starship - cross-shell prompt -dnf5 -y copr enable atim/starship -dnf5 -y install starship - -# git-delta - better git diff -dnf5 -y copr enable gourlaysama/git-delta || true -dnf5 -y install git-delta || true +### CLI Tools - From Hypercube COPR +dnf5 -y install \ + eza \ + starship \ + lazygit ### Fish Shell (set as default) -# Note: fisher (plugin manager) removed - starship handles prompt, fish has good built-in completions dnf5 -y install fish -### Lazygit from COPR -dnf5 -y copr enable atim/lazygit -dnf5 -y install lazygit - -### Terminals -dnf5 -y copr enable wezfurlong/wezterm-nightly -dnf5 -y install wezterm - -dnf5 -y copr enable scottames/ghostty +### Terminal - Ghostty (from Hypercube COPR) dnf5 -y install ghostty -### Editor -dnf5 -y copr enable agriffis/neovim-nightly +### Editor - Neovim (from Hypercube COPR) dnf5 -y install neovim python3-neovim ### Image/Media Viewers @@ -79,7 +57,7 @@ dnf5 -y install \ imv \ mpv -### Screenshot/Screen Recording (hyprshot handles most, but add deps) +### Screenshot/Screen Recording dnf5 -y install \ grim \ slurp diff --git a/build_files/shared/clean-stage.sh b/build_files/shared/clean-stage.sh index 5f0e771..1a170b2 100755 --- a/build_files/shared/clean-stage.sh +++ b/build_files/shared/clean-stage.sh @@ -9,18 +9,8 @@ echo "Disabling COPR repositories..." # Disable all COPR repos that were enabled during build # This ensures the final image doesn't have external repos enabled -# Hyprland COPRs -dnf5 -y copr disable sdegler/hyprland || true -dnf5 -y copr disable errornointernet/quickshell || true -dnf5 -y copr disable wezfurlong/wezterm-nightly || true -dnf5 -y copr disable scottames/ghostty || true -dnf5 -y copr disable agriffis/neovim-nightly || true -dnf5 -y copr disable atim/lazygit || true - -# CLI Tools COPRs -dnf5 -y copr disable alternateved/eza || true -dnf5 -y copr disable atim/starship || true -dnf5 -y copr disable gourlaysama/git-delta || true +# Hypercube COPR (our self-maintained packages) +dnf5 -y copr disable binarypie/hypercube || true echo "Cleaning package caches..." dnf5 -y clean all diff --git a/packages/aquamarine/aquamarine.spec b/packages/aquamarine/aquamarine.spec new file mode 100644 index 0000000..e32d876 --- /dev/null +++ b/packages/aquamarine/aquamarine.spec @@ -0,0 +1,61 @@ +Name: aquamarine +Version: 0.10.0 +Release: 1%{?dist} +Summary: A very light linux rendering backend library + +License: BSD-3-Clause +URL: https://github.com/hyprwm/aquamarine +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: mesa-libEGL-devel +BuildRequires: pkgconfig(gbm) +BuildRequires: pkgconfig(hwdata) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(hyprwayland-scanner) +BuildRequires: pkgconfig(libdisplay-info) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(libinput) +BuildRequires: pkgconfig(libseat) +BuildRequires: pkgconfig(libudev) +BuildRequires: pkgconfig(pixman-1) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-protocols) + +%description +%{summary}. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development files for %{name}. + +%prep +%autosetup -p1 + +%build +%cmake -DCMAKE_BUILD_TYPE=Release +%cmake_build + +%install +%cmake_install + +%files +%license LICENSE +%doc README.md +%{_libdir}/lib%{name}.so.%{version} +%{_libdir}/lib%{name}.so.9 + +%files devel +%{_includedir}/%{name}/ +%{_libdir}/lib%{name}.so +%{_libdir}/pkgconfig/%{name}.pc + +%changelog +* Mon Dec 16 2024 Hypercube - 0.10.0-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/eza/eza.spec b/packages/eza/eza.spec new file mode 100644 index 0000000..fd7106e --- /dev/null +++ b/packages/eza/eza.spec @@ -0,0 +1,55 @@ +Name: eza +Version: 0.20.21 +Release: 1%{?dist} +Summary: Modern replacement for ls + +License: EUPL-1.2 +URL: https://github.com/eza-community/eza +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: cargo +BuildRequires: rust +BuildRequires: gcc +BuildRequires: pandoc +BuildRequires: git + +%description +eza is a modern replacement for the venerable file-listing command-line program +ls that ships with Unix and Linux operating systems, giving it more features +and better defaults. + +%prep +%autosetup -n %{name}-%{version} + +%build +cargo build --release --locked + +%install +install -Dpm 0755 target/release/%{name} %{buildroot}%{_bindir}/%{name} + +# Generate and install man pages +mkdir -p %{buildroot}%{_mandir}/man1 +mkdir -p %{buildroot}%{_mandir}/man5 +pandoc --standalone -f markdown -t man man/eza.1.md -o %{buildroot}%{_mandir}/man1/eza.1 +pandoc --standalone -f markdown -t man man/eza_colors.5.md -o %{buildroot}%{_mandir}/man5/eza_colors.5 +pandoc --standalone -f markdown -t man man/eza_colors-explanation.5.md -o %{buildroot}%{_mandir}/man5/eza_colors-explanation.5 + +# Install shell completions +install -Dpm 0644 completions/bash/%{name} %{buildroot}%{_datadir}/bash-completion/completions/%{name} +install -Dpm 0644 completions/zsh/_%{name} %{buildroot}%{_datadir}/zsh/site-functions/_%{name} +install -Dpm 0644 completions/fish/%{name}.fish %{buildroot}%{_datadir}/fish/vendor_completions.d/%{name}.fish + +%files +%license LICENCE +%doc README.md CHANGELOG.md +%{_bindir}/%{name} +%{_mandir}/man1/eza.1* +%{_mandir}/man5/eza_colors.5* +%{_mandir}/man5/eza_colors-explanation.5* +%{_datadir}/bash-completion/completions/%{name} +%{_datadir}/zsh/site-functions/_%{name} +%{_datadir}/fish/vendor_completions.d/%{name}.fish + +%changelog +* Mon Dec 16 2024 Hypercube - 0.20.21-1 +- Initial package for Hypercube diff --git a/packages/ghostty/ghostty.spec b/packages/ghostty/ghostty.spec new file mode 100644 index 0000000..e1869be --- /dev/null +++ b/packages/ghostty/ghostty.spec @@ -0,0 +1,86 @@ +Name: ghostty +Version: 1.2.3 +Release: 1%{?dist} +Summary: Fast, feature-rich, cross-platform terminal emulator + +License: MIT +URL: https://github.com/ghostty-org/ghostty +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +# Ghostty requires Zig 0.15.2 which is not in Fedora repos +# We download the official binary +%global zig_version 0.15.0 +%global zig_arch x86_64 + +BuildRequires: gcc +BuildRequires: git +BuildRequires: pkg-config +BuildRequires: fontconfig-devel +BuildRequires: freetype-devel +BuildRequires: gtk4-devel +BuildRequires: libadwaita-devel +BuildRequires: libX11-devel +BuildRequires: libXcursor-devel +BuildRequires: libXrandr-devel +BuildRequires: pandoc +BuildRequires: bzip2-devel +BuildRequires: oniguruma-devel +BuildRequires: lz4-devel +BuildRequires: zstd-devel +BuildRequires: libpng-devel + +Requires: fontconfig +Requires: freetype +Requires: gtk4 +Requires: libadwaita + +%description +Ghostty is a terminal emulator that differentiates itself by being both +incredibly fast and feature-rich. It's built with GPU acceleration, +native platform feel, and a focus on performance. + +%prep +%autosetup -n %{name}-%{version} + +# Download Zig +curl -L -o zig.tar.xz https://ziglang.org/download/%{zig_version}/zig-linux-%{zig_arch}-%{zig_version}.tar.xz +tar xf zig.tar.xz +export PATH="$PWD/zig-linux-%{zig_arch}-%{zig_version}:$PATH" + +# Fetch dependencies for offline build +./nix/build-support/fetch-zig-cache.sh + +%build +export PATH="$PWD/zig-linux-%{zig_arch}-%{zig_version}:$PATH" +zig build \ + --prefix %{_prefix} \ + --system \ + -Doptimize=ReleaseFast \ + -Dcpu=baseline \ + -Dpie=true + +%install +export PATH="$PWD/zig-linux-%{zig_arch}-%{zig_version}:$PATH" +DESTDIR=%{buildroot} zig build install \ + --prefix %{_prefix} \ + --system \ + -Doptimize=ReleaseFast \ + -Dcpu=baseline \ + -Dpie=true + +%files +%license LICENSE +%doc README.md +%{_bindir}/%{name} +%{_datadir}/applications/%{name}.desktop +%{_datadir}/icons/hicolor/*/apps/%{name}.* +%{_datadir}/%{name}/ +%{_datadir}/bash-completion/completions/%{name} +%{_datadir}/zsh/site-functions/_%{name} +%{_datadir}/fish/vendor_completions.d/%{name}.fish +%{_mandir}/man1/%{name}.1* +%{_mandir}/man5/%{name}.5* + +%changelog +* Mon Dec 16 2024 Hypercube - 1.2.3-1 +- Initial package for Hypercube diff --git a/packages/hyprcursor/hyprcursor.spec b/packages/hyprcursor/hyprcursor.spec new file mode 100644 index 0000000..2e92628 --- /dev/null +++ b/packages/hyprcursor/hyprcursor.spec @@ -0,0 +1,55 @@ +Name: hyprcursor +Version: 0.1.13 +Release: 1%{?dist} +Summary: The hyprland cursor format, library and utilities + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprcursor +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(librsvg-2.0) +BuildRequires: pkgconfig(libzip) +BuildRequires: pkgconfig(tomlplusplus) + +%description +%{summary}. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development files for %{name}. + +%prep +%autosetup -p1 + +%build +%cmake -DCMAKE_BUILD_TYPE=Release +%cmake_build + +%install +%cmake_install + +%files +%license LICENSE +%doc README.md +%{_bindir}/hyprcursor-util +%{_libdir}/lib%{name}.so.%{version} +%{_libdir}/lib%{name}.so.0 + +%files devel +%{_includedir}/%{name}.hpp +%{_includedir}/%{name}/ +%{_libdir}/lib%{name}.so +%{_libdir}/pkgconfig/%{name}.pc + +%changelog +* Mon Dec 16 2024 Hypercube - 0.1.13-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprgraphics/hyprgraphics.spec b/packages/hyprgraphics/hyprgraphics.spec new file mode 100644 index 0000000..00f8351 --- /dev/null +++ b/packages/hyprgraphics/hyprgraphics.spec @@ -0,0 +1,64 @@ +Name: hyprgraphics +Version: 0.2.0 +Release: 1%{?dist} +Summary: Hyprland graphics / resource utilities + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprgraphics +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(libjpeg) +BuildRequires: pkgconfig(libjxl_cms) +BuildRequires: pkgconfig(libjxl_threads) +BuildRequires: pkgconfig(libjxl) +BuildRequires: pkgconfig(libmagic) +BuildRequires: pkgconfig(libwebp) +BuildRequires: pkgconfig(pixman-1) +BuildRequires: pkgconfig(libpng) +BuildRequires: pkgconfig(pangocairo) +BuildRequires: pkgconfig(libheif) +BuildRequires: pkgconfig(librsvg-2.0) + +%description +%{summary}. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development files for %{name}. + +%prep +%autosetup -p1 + +%build +%cmake -DCMAKE_BUILD_TYPE=Release +%cmake_build + +%install +%cmake_install + +%check +%ctest + +%files +%license LICENSE +%doc README.md +%{_libdir}/lib%{name}.so.1 +%{_libdir}/lib%{name}.so.%{version} + +%files devel +%{_includedir}/%{name}/ +%{_libdir}/lib%{name}.so +%{_libdir}/pkgconfig/%{name}.pc + +%changelog +* Mon Dec 16 2024 Hypercube - 0.2.0-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hypridle/hypridle.spec b/packages/hypridle/hypridle.spec new file mode 100644 index 0000000..ddd283d --- /dev/null +++ b/packages/hypridle/hypridle.spec @@ -0,0 +1,68 @@ +%global sdbus_version 2.1.0 + +Name: hypridle +Version: 0.1.7 +Release: 1%{?dist} +Summary: Hyprland's idle daemon + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hypridle +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Source1: https://github.com/Kistler-Group/sdbus-cpp/archive/v%{sdbus_version}/sdbus-%{sdbus_version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: systemd-rpm-macros +BuildRequires: cmake(hyprwayland-scanner) +BuildRequires: pkgconfig(hyprland-protocols) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(systemd) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-protocols) + +%description +%{summary}. + +%prep +%autosetup -p1 -a1 + +%build +pushd sdbus-cpp-%{sdbus_version} +%cmake \ + -DCMAKE_INSTALL_PREFIX=%{_builddir}/sdbus \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=OFF +%cmake_build +cmake --install %{__cmake_builddir} +popd +export PKG_CONFIG_PATH=%{_builddir}/sdbus/lib64/pkgconfig + +%cmake +%cmake_build + +%install +%cmake_install +rm %{buildroot}%{_datadir}/hypr/hypridle.conf + +%files +%license LICENSE +%doc README.md assets/example.conf +%{_bindir}/%{name} +%{_userunitdir}/%{name}.service + +%post +%systemd_user_post %{name}.service + +%preun +%systemd_user_preun %{name}.service + +%postun +%systemd_user_postun %{name}.service + +%changelog +* Mon Dec 16 2024 Hypercube - 0.1.7-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprland-protocols/hyprland-protocols.spec b/packages/hyprland-protocols/hyprland-protocols.spec new file mode 100644 index 0000000..4aa901f --- /dev/null +++ b/packages/hyprland-protocols/hyprland-protocols.spec @@ -0,0 +1,40 @@ +Name: hyprland-protocols +Version: 0.7.0 +Release: 1%{?dist} +Summary: Wayland protocol extensions for Hyprland +BuildArch: noarch + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprland-protocols +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: meson + +%description +%{summary}. + +%package devel +Summary: Wayland protocol extensions for Hyprland + +%description devel +%{summary}. + +%prep +%autosetup -p1 + +%build +%meson +%meson_build + +%install +%meson_install + +%files devel +%license LICENSE +%doc README.md +%{_datadir}/pkgconfig/%{name}.pc +%{_datadir}/%{name}/ + +%changelog +* Mon Dec 16 2024 Hypercube - 0.7.0-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprland-qt-support/hyprland-qt-support.spec b/packages/hyprland-qt-support/hyprland-qt-support.spec new file mode 100644 index 0000000..67ae2e9 --- /dev/null +++ b/packages/hyprland-qt-support/hyprland-qt-support.spec @@ -0,0 +1,42 @@ +Name: hyprland-qt-support +Version: 0.1.0 +Release: 1%{?dist} +Summary: A Qt6 Qml style provider for hypr* apps + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprland-qt-support +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: qt6-rpm-macros +BuildRequires: cmake(Qt6Quick) +BuildRequires: cmake(Qt6QuickControls2) +BuildRequires: cmake(Qt6Qml) +BuildRequires: pkgconfig(hyprlang) + +%description +%{summary}. + +%prep +%autosetup -p1 + +%build +%cmake -DINSTALL_QMLDIR=%{_qt6_qmldir} +%cmake_build + +%install +%cmake_install + +%files +%license LICENSE +%doc README.md +%{_libdir}/libhyprland-quick-style-impl.so +%{_libdir}/libhyprland-quick-style.so +%{_qt6_qmldir}/org/hyprland/ + +%changelog +* Mon Dec 16 2024 Hypercube - 0.1.0-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprland/hyprland.spec b/packages/hyprland/hyprland.spec new file mode 100644 index 0000000..f4ddc03 --- /dev/null +++ b/packages/hyprland/hyprland.spec @@ -0,0 +1,143 @@ +Name: hyprland +Version: 0.52.2 +Release: 1%{?dist} +Summary: Dynamic tiling Wayland compositor that doesn't sacrifice on its looks + +License: BSD-3-Clause AND BSD-2-Clause AND HPND-sell-variant AND LGPL-2.1-or-later +URL: https://github.com/hyprwm/Hyprland +Source0: %{url}/releases/download/v%{version}/source-v%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: meson +BuildRequires: glaze-static +BuildRequires: pkgconfig(aquamarine) +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(egl) +BuildRequires: pkgconfig(gbm) +BuildRequires: pkgconfig(gio-2.0) +BuildRequires: pkgconfig(glesv2) +BuildRequires: pkgconfig(hwdata) +BuildRequires: pkgconfig(hyprcursor) +BuildRequires: pkgconfig(hyprgraphics) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(hyprwayland-scanner) +BuildRequires: pkgconfig(libdisplay-info) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(libinput) >= 1.28 +BuildRequires: pkgconfig(libliftoff) +BuildRequires: pkgconfig(libseat) +BuildRequires: pkgconfig(libudev) +BuildRequires: pkgconfig(pango) +BuildRequires: pkgconfig(pangocairo) +BuildRequires: pkgconfig(pixman-1) +BuildRequires: pkgconfig(re2) +BuildRequires: pkgconfig(systemd) +BuildRequires: pkgconfig(tomlplusplus) +BuildRequires: pkgconfig(uuid) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-protocols) >= 1.45 +BuildRequires: pkgconfig(wayland-scanner) +BuildRequires: pkgconfig(wayland-server) +BuildRequires: pkgconfig(xcb-composite) +BuildRequires: pkgconfig(xcb-dri3) +BuildRequires: pkgconfig(xcb-errors) +BuildRequires: pkgconfig(xcb-ewmh) +BuildRequires: pkgconfig(xcb-icccm) +BuildRequires: pkgconfig(xcb-present) +BuildRequires: pkgconfig(xcb-render) +BuildRequires: pkgconfig(xcb-renderutil) +BuildRequires: pkgconfig(xcb-res) +BuildRequires: pkgconfig(xcb-shm) +BuildRequires: pkgconfig(xcb-util) +BuildRequires: pkgconfig(xcb-xfixes) +BuildRequires: pkgconfig(xcb-xinput) +BuildRequires: pkgconfig(xcb) +BuildRequires: pkgconfig(xcursor) +BuildRequires: pkgconfig(xkbcommon) +BuildRequires: pkgconfig(xwayland) + +Requires: xorg-x11-server-Xwayland%{?_isa} +Requires: aquamarine%{?_isa} >= 0.9.2 +Requires: hyprcursor%{?_isa} >= 0.1.13 +Requires: hyprgraphics%{?_isa} >= 0.1.6 +Requires: hyprlang%{?_isa} >= 0.6.3 +Requires: hyprutils%{?_isa} >= 0.8.4 + +Recommends: ghostty +Recommends: playerctl +Recommends: brightnessctl +Recommends: mesa-dri-drivers +Recommends: polkit +Recommends: %{name}-uwsm +Recommends: (qt5-qtwayland if qt5-qtbase-gui) +Recommends: (qt6-qtwayland if qt6-qtbase-gui) + +%description +Hyprland is a dynamic tiling Wayland compositor that doesn't sacrifice +on its looks. It supports multiple layouts, fancy effects, has a +very flexible IPC model allowing for a lot of customization, a powerful +plugin system and more. + +%package uwsm +Summary: Files for a uwsm-managed session +Requires: uwsm + +%description uwsm +Files for a uwsm-managed session. + +%package devel +Summary: Header and protocol files for %{name} +License: BSD-3-Clause +Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: cpio +Requires: git-core +Requires: pkgconfig(xkbcommon) + +%description devel +%{summary}. + +%prep +%autosetup -n hyprland-source -N + +cp -p subprojects/hyprland-protocols/LICENSE LICENSE-hyprland-protocols +cp -p subprojects/udis86/LICENSE LICENSE-udis86 + +%build +%cmake \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DNO_TESTS=TRUE \ + -DBUILD_TESTING=FALSE +%cmake_build + +%install +%cmake_install + +%files +%license LICENSE LICENSE-udis86 LICENSE-hyprland-protocols +%{_bindir}/[Hh]yprland +%{_bindir}/hyprctl +%{_bindir}/hyprpm +%{_datadir}/hypr/ +%{_datadir}/wayland-sessions/hyprland.desktop +%{_datadir}/xdg-desktop-portal/hyprland-portals.conf +%{_mandir}/man1/hyprctl.1* +%{_mandir}/man1/Hyprland.1* +%{_datadir}/bash-completion/completions/hypr* +%{_datadir}/fish/vendor_completions.d/hypr*.fish +%{_datadir}/zsh/site-functions/_hypr* + +%files uwsm +%{_datadir}/wayland-sessions/hyprland-uwsm.desktop + +%files devel +%{_datadir}/pkgconfig/hyprland.pc +%{_includedir}/hyprland/ + +%changelog +* Mon Dec 16 2024 Hypercube - 0.52.2-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprlang/hyprlang.spec b/packages/hyprlang/hyprlang.spec new file mode 100644 index 0000000..030dcb0 --- /dev/null +++ b/packages/hyprlang/hyprlang.spec @@ -0,0 +1,53 @@ +Name: hyprlang +Version: 0.6.4 +Release: 1%{?dist} +Summary: The official implementation library for the hypr config language + +License: LGPL-3.0-only +URL: https://github.com/hyprwm/hyprlang +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: pkgconfig(hyprutils) + +%description +%{summary}. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development files for %{name}. + +%prep +%autosetup -p1 +sed 's/.*/%{version}/' -i VERSION + +%build +%cmake +%cmake_build + +%install +%cmake_install + +%check +%ctest + +%files +%license LICENSE +%doc README.md +%{_libdir}/libhyprlang.so.2 +%{_libdir}/libhyprlang.so.%{version} + +%files devel +%{_includedir}/hyprlang.hpp +%{_libdir}/libhyprlang.so +%{_libdir}/pkgconfig/hyprlang.pc + +%changelog +* Mon Dec 16 2024 Hypercube - 0.6.4-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprlock/hyprlock.spec b/packages/hyprlock/hyprlock.spec new file mode 100644 index 0000000..7e554ec --- /dev/null +++ b/packages/hyprlock/hyprlock.spec @@ -0,0 +1,72 @@ +%global sdbus_version 2.1.0 + +Name: hyprlock +Version: 0.9.2 +Release: 1%{?dist} +Summary: Hyprland's GPU-accelerated screen locking utility + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprlock +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Source1: https://github.com/Kistler-Group/sdbus-cpp/archive/v%{sdbus_version}/sdbus-%{sdbus_version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: cmake(hyprwayland-scanner) +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(egl) +BuildRequires: pkgconfig(gbm) +BuildRequires: pkgconfig(hyprgraphics) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(opengl) +BuildRequires: pkgconfig(pam) +BuildRequires: pkgconfig(pangocairo) +BuildRequires: pkgconfig(systemd) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-egl) +BuildRequires: pkgconfig(wayland-protocols) +BuildRequires: pkgconfig(xkbcommon) + +Provides: bundled(sdbus-cpp) = %{sdbus_version} + +%description +%{summary}. + +%prep +%autosetup -p1 +mkdir -p subprojects/sdbus-cpp +tar -xf %{SOURCE1} -C subprojects/sdbus-cpp --strip=1 + +%build +pushd subprojects/sdbus-cpp +%cmake \ + -DCMAKE_INSTALL_PREFIX=%{_builddir}/sdbus \ + -DCMAKE_BUILD_TYPE=Release \ + -DSDBUSCPP_BUILD_DOCS=OFF \ + -DBUILD_SHARED_LIBS=OFF +%cmake_build +cmake --install %{_vpath_builddir} +popd +export PKG_CONFIG_PATH=%{_builddir}/sdbus/%{_lib}/pkgconfig + +%cmake -DCMAKE_BUILD_TYPE=Release +%cmake_build + +%install +%cmake_install +rm %{buildroot}%{_datadir}/hypr/%{name}.conf + +%files +%license LICENSE +%doc README.md assets/example.conf +%{_bindir}/%{name} +%config(noreplace) %{_sysconfdir}/pam.d/%{name} + +%changelog +* Mon Dec 16 2024 Hypercube - 0.9.2-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprpaper/hyprpaper.spec b/packages/hyprpaper/hyprpaper.spec new file mode 100644 index 0000000..6a41b09 --- /dev/null +++ b/packages/hyprpaper/hyprpaper.spec @@ -0,0 +1,56 @@ +Name: hyprpaper +Version: 0.7.6 +Release: 1%{?dist} +Summary: Blazing fast wayland wallpaper utility with IPC controls + +License: BSD-3-Clause AND HPND-sell-variant +URL: https://github.com/hyprwm/hyprpaper +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: systemd-rpm-macros +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(glesv2) +BuildRequires: pkgconfig(hyprgraphics) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(hyprwayland-scanner) +BuildRequires: pkgconfig(libmagic) +BuildRequires: pkgconfig(pango) +BuildRequires: pkgconfig(pangocairo) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-protocols) + +%description +Hyprpaper is a blazing fast wallpaper utility for Hyprland with the ability +to dynamically change wallpapers through sockets. It will work on all +wlroots-based compositors, though. + +%prep +%autosetup -p1 + +%build +%cmake +%cmake_build + +%install +%cmake_install + +%post +%systemd_user_post %{name}.service + +%preun +%systemd_user_preun %{name}.service + +%files +%license LICENSE +%doc README.md +%{_bindir}/%{name} +%{_userunitdir}/%{name}.service + +%changelog +* Mon Dec 16 2024 Hypercube - 0.7.6-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprpolkitagent/hyprpolkitagent.spec b/packages/hyprpolkitagent/hyprpolkitagent.spec new file mode 100644 index 0000000..0766788 --- /dev/null +++ b/packages/hyprpolkitagent/hyprpolkitagent.spec @@ -0,0 +1,53 @@ +Name: hyprpolkitagent +Version: 0.1.3 +Release: 1%{?dist} +Summary: A simple polkit authentication agent for Hyprland + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprpolkitagent +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: desktop-file-utils +BuildRequires: gcc-c++ +BuildRequires: systemd-rpm-macros +BuildRequires: cmake(Qt6Quick) +BuildRequires: cmake(Qt6QuickControls2) +BuildRequires: cmake(Qt6Widgets) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(polkit-agent-1) +BuildRequires: pkgconfig(polkit-qt6-1) + +Requires: hyprland-qt-support%{?_isa} + +%description +A simple polkit authentication agent for Hyprland, written in QT/QML. + +%prep +%autosetup -p1 + +%build +%cmake +%cmake_build + +%install +%cmake_install + +%post +%systemd_user_post %{name}.service + +%preun +%systemd_user_preun %{name}.service + +%files +%license LICENSE +%doc README.md +%{_datadir}/dbus-1/services/org.hyprland.%{name}.service +%{_libexecdir}/%{name} +%{_userunitdir}/%{name}.service + +%changelog +* Mon Dec 16 2024 Hypercube - 0.1.3-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprutils/hyprutils.spec b/packages/hyprutils/hyprutils.spec new file mode 100644 index 0000000..22b7813 --- /dev/null +++ b/packages/hyprutils/hyprutils.spec @@ -0,0 +1,52 @@ +Name: hyprutils +Version: 0.10.0 +Release: 1%{?dist} +Summary: Hyprland utilities library used across the ecosystem + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprutils +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: pkgconfig(pixman-1) + +%description +%{summary}. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development files for %{name}. + +%prep +%autosetup -p1 + +%build +%cmake +%cmake_build + +%install +%cmake_install + +%check +%ctest + +%files +%license LICENSE +%doc README.md +%{_libdir}/lib%{name}.so.%{version} +%{_libdir}/lib%{name}.so.9 + +%files devel +%{_includedir}/%{name}/ +%{_libdir}/lib%{name}.so +%{_libdir}/pkgconfig/%{name}.pc + +%changelog +* Mon Dec 16 2024 Hypercube - 0.10.0-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprwayland-scanner/hyprwayland-scanner.spec b/packages/hyprwayland-scanner/hyprwayland-scanner.spec new file mode 100644 index 0000000..149689e --- /dev/null +++ b/packages/hyprwayland-scanner/hyprwayland-scanner.spec @@ -0,0 +1,44 @@ +Name: hyprwayland-scanner +Version: 0.4.5 +Release: 1%{?dist} +Summary: A Hyprland implementation of wayland-scanner, in and for C++ + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprwayland-scanner +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: cmake(pugixml) +BuildRequires: gcc-c++ + +%description +%{summary}. + +%package devel +Summary: A Hyprland implementation of wayland-scanner, in and for C++ + +%description devel +%{summary}. + +%prep +%autosetup -p1 + +%build +%cmake +%cmake_build + +%install +%cmake_install + +%files devel +%license LICENSE +%doc README.md +%{_bindir}/%{name} +%{_libdir}/pkgconfig/%{name}.pc +%{_libdir}/cmake/%{name}/ + +%changelog +* Mon Dec 16 2024 Hypercube - 0.4.5-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/lazygit/lazygit.spec b/packages/lazygit/lazygit.spec new file mode 100644 index 0000000..1ba11b6 --- /dev/null +++ b/packages/lazygit/lazygit.spec @@ -0,0 +1,36 @@ +Name: lazygit +Version: 0.57.0 +Release: 1%{?dist} +Summary: Simple terminal UI for git commands + +License: MIT +URL: https://github.com/jesseduffield/lazygit +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: golang >= 1.21 +BuildRequires: git + +%description +A simple terminal UI for git commands. Lazygit makes it easier to add files, +resolve merge conflicts, checkout recent branches, scroll through logs/diffs +and more. It's designed to make git less painful. + +%prep +%autosetup -n %{name}-%{version} + +%build +export GOFLAGS="-buildmode=pie -trimpath" +export LDFLAGS="-X main.version=%{version} -X main.buildSource=rpm" +go build -ldflags "${LDFLAGS}" -o %{name} + +%install +install -Dpm 0755 %{name} %{buildroot}%{_bindir}/%{name} + +%files +%license LICENSE +%doc README.md +%{_bindir}/%{name} + +%changelog +* Mon Dec 16 2024 Hypercube - 0.57.0-1 +- Initial package for Hypercube diff --git a/packages/livesys-scripts/livesys-hyprland b/packages/livesys-scripts/livesys-hyprland deleted file mode 100644 index b68643c..0000000 --- a/packages/livesys-scripts/livesys-hyprland +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/sh -# -# livesys-hyprland: hyprland specific setup for livesys -# SPDX-License-Identifier: GPL-3.0-or-later -# - -HYPRLAND_SESSION_FILE="hyprland.desktop" - -# set up autologin for user liveuser -# Support greetd, GDM, and SDDM - -if [ -f /etc/greetd/config.toml ]; then - # greetd (common for Hyprland setups) - cat > /etc/greetd/config.toml << GREETD_EOF -[terminal] -vt = 1 - -[default_session] -command = "Hyprland" -user = "liveuser" -GREETD_EOF - -elif [ -f /etc/gdm/custom.conf ]; then - # GDM - sed -i 's/^\[daemon\]/[daemon]\nAutomaticLoginEnable=True\nAutomaticLogin=liveuser/' /etc/gdm/custom.conf - # Set default session for GDM - mkdir -p /var/lib/AccountsService/users - cat > /var/lib/AccountsService/users/liveuser << GDM_USER_EOF -[User] -Session=${HYPRLAND_SESSION_FILE} -XSession=${HYPRLAND_SESSION_FILE} -SystemAccount=false -GDM_USER_EOF - -elif [ -f /etc/sddm.conf ]; then - # SDDM (existing config) - sed -i 's/^#User=.*/User=liveuser/' /etc/sddm.conf - sed -i "s/^#Session=.*/Session=${HYPRLAND_SESSION_FILE}/" /etc/sddm.conf - -else - # SDDM (create new config) - cat > /etc/sddm.conf << SDDM_EOF -[Autologin] -User=liveuser -Session=${HYPRLAND_SESSION_FILE} -SDDM_EOF -fi - -# Show harddisk install on the desktop -if [ -f /usr/share/applications/liveinst.desktop ]; then - sed -i -e 's/NoDisplay=true/NoDisplay=false/' /usr/share/applications/liveinst.desktop -fi -mkdir -p /home/liveuser/Desktop - -# echoing type liveinst to start the installer -echo "echo 'Please type liveinst and press Enter to start the installer'" >> /home/liveuser/.bashrc - -# use hyprland configuration files for live environment -if [ "$(ls /usr/share/hypr/config.live.d/*.conf 2>/dev/null)" ]; then - mkdir -p /home/liveuser/.config/hypr/ - ln -sf -t /home/liveuser/.config/hypr /usr/share/hypr/config.live.d/*.conf -fi diff --git a/packages/livesys-scripts/livesys-scripts.spec b/packages/livesys-scripts/livesys-scripts.spec index 61f63ba..5a6e614 100644 --- a/packages/livesys-scripts/livesys-scripts.spec +++ b/packages/livesys-scripts/livesys-scripts.spec @@ -4,8 +4,8 @@ Release: 1.hypercube%{?dist} Summary: Scripts for auto-configuring live media during boot (with Hyprland support) License: GPL-3.0-or-later -URL: https://pagure.io/fork/binarypie/livesys-scripts -Source: https://pagure.io/fork/binarypie/livesys-scripts/archive/main/%{name}-main.tar.gz +URL: https://github.com/binarypie-dev/livesys-scripts +Source: https://github.com/binarypie-dev/livesys-scripts/archive/refs/heads/main.tar.gz BuildRequires: systemd-rpm-macros BuildRequires: make diff --git a/packages/neovim/neovim.spec b/packages/neovim/neovim.spec new file mode 100644 index 0000000..e73341d --- /dev/null +++ b/packages/neovim/neovim.spec @@ -0,0 +1,69 @@ +Name: neovim +Version: 0.11.5 +Release: 1%{?dist} +Summary: Vim-fork focused on extensibility and usability + +License: Apache-2.0 AND Vim +URL: https://github.com/neovim/neovim +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: cmake >= 3.16 +BuildRequires: ninja-build +BuildRequires: gcc +BuildRequires: make +BuildRequires: gettext +BuildRequires: glibc-gconv-extra +BuildRequires: git +BuildRequires: unzip + +# Runtime dependencies +Requires: lua +Requires: python3-neovim + +%description +Neovim is a refactor, and sometimes redactor, in the tradition of Vim (which +itself derives from Stevie). It is not a rewrite but a continuation and +extension of Vim. Many clones and derivatives exist, some very clever - but +none are Vim. Neovim is built for users who want the good parts of Vim, and +more. + +%package -n python3-neovim +Summary: Python client for Neovim +BuildArch: noarch +Requires: python3 +Requires: python3-msgpack +Requires: python3-greenlet + +%description -n python3-neovim +Python client library for Neovim, enabling Python plugins and remote +communication with Neovim instances. + +%prep +%autosetup -n %{name}-%{version} + +%build +%cmake \ + -GNinja \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_INSTALL_PREFIX=%{_prefix} + +%cmake_build + +%install +%cmake_install + +# Desktop file and icons are installed by cmake + +%files +%license LICENSE.txt +%doc README.md CONTRIBUTING.md +%{_bindir}/nvim +%{_datadir}/nvim/ +%{_datadir}/applications/nvim.desktop +%{_datadir}/icons/hicolor/*/apps/nvim.* +%{_datadir}/locale/*/LC_MESSAGES/nvim.mo +%{_mandir}/man1/nvim.1* + +%changelog +* Mon Dec 16 2024 Hypercube - 0.11.5-1 +- Initial package for Hypercube diff --git a/packages/quickshell/quickshell.spec b/packages/quickshell/quickshell.spec new file mode 100644 index 0000000..c6b7f30 --- /dev/null +++ b/packages/quickshell/quickshell.spec @@ -0,0 +1,79 @@ +Name: quickshell +Version: 0.2.1 +Release: 1%{?dist} +Summary: Flexible QtQuick based desktop shell toolkit + +License: LGPL-3.0-or-later +URL: https://github.com/quickshell-mirror/quickshell +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: cmake +BuildRequires: ninja-build +BuildRequires: gcc-c++ +BuildRequires: pkg-config +BuildRequires: qt6-qtbase-devel >= 6.6.0 +BuildRequires: qt6-qtdeclarative-devel +BuildRequires: qt6-qtshadertools-devel +BuildRequires: qt6-qtsvg-devel +BuildRequires: qt6-qtwayland-devel +BuildRequires: spirv-tools-devel +BuildRequires: cli11-devel + +# Wayland support +BuildRequires: wayland-devel +BuildRequires: wayland-protocols-devel + +# X11 support +BuildRequires: libxcb-devel + +# Audio/PipeWire +BuildRequires: pipewire-devel + +# DBus +BuildRequires: qt6-qtbase-private-devel + +# Optional dependencies +BuildRequires: jemalloc-devel +BuildRequires: pam-devel +BuildRequires: polkit-devel +BuildRequires: glib2-devel +BuildRequires: libdrm-devel +BuildRequires: mesa-libgbm-devel + +Requires: qt6-qtbase >= 6.6.0 +Requires: qt6-qtdeclarative +Requires: qt6-qtwayland +Requires: qt6-qtsvg + +%description +Quickshell is a toolkit for constructing desktop components like status bars, +widgets, and lockscreens using QtQuick on Wayland compositors or window +managers. It supports Hyprland, Sway, and other Wayland compositors. + +%prep +%autosetup -n %{name}-%{version} + +%build +%cmake \ + -GNinja \ + -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DWAYLAND=ON \ + -DX11=ON \ + -DPIPEWIRE=ON \ + -DHYPRLAND=ON \ + -DI3=ON \ + -DCRASH_REPORTER=OFF + +%cmake_build + +%install +%cmake_install + +%files +%license LICENSE LICENSE.GPL +%doc README.md +%{_bindir}/%{name} + +%changelog +* Mon Dec 16 2024 Hypercube - 0.2.1-1 +- Initial package for Hypercube diff --git a/packages/starship/starship.spec b/packages/starship/starship.spec new file mode 100644 index 0000000..a2d4735 --- /dev/null +++ b/packages/starship/starship.spec @@ -0,0 +1,50 @@ +Name: starship +Version: 1.24.1 +Release: 1%{?dist} +Summary: Minimal, blazing-fast, and infinitely customizable prompt for any shell + +License: ISC +URL: https://github.com/starship/starship +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +BuildRequires: cargo +BuildRequires: rust +BuildRequires: gcc +BuildRequires: cmake +BuildRequires: openssl-devel +BuildRequires: zlib-devel + +%description +Starship is the minimal, blazing-fast, and infinitely customizable prompt for +any shell! The prompt shows information you need while you're working, while +staying sleek and out of the way. It works with Bash, Zsh, Fish, PowerShell, +Ion, Elvish, Tcsh, Xonsh, Nushell, and Cmd. + +%prep +%autosetup -n %{name}-%{version} + +%build +cargo build --release --locked + +%install +install -Dpm 0755 target/release/%{name} %{buildroot}%{_bindir}/%{name} + +# Generate and install shell completions +mkdir -p %{buildroot}%{_datadir}/bash-completion/completions +mkdir -p %{buildroot}%{_datadir}/zsh/site-functions +mkdir -p %{buildroot}%{_datadir}/fish/vendor_completions.d +target/release/%{name} completions bash > %{buildroot}%{_datadir}/bash-completion/completions/%{name} +target/release/%{name} completions zsh > %{buildroot}%{_datadir}/zsh/site-functions/_%{name} +target/release/%{name} completions fish > %{buildroot}%{_datadir}/fish/vendor_completions.d/%{name}.fish + +%files +%license LICENSE +%doc README.md CHANGELOG.md +%{_bindir}/%{name} +%{_datadir}/bash-completion/completions/%{name} +%{_datadir}/zsh/site-functions/_%{name} +%{_datadir}/fish/vendor_completions.d/%{name}.fish + +%changelog +* Mon Dec 16 2024 Hypercube - 1.24.1-1 +- Initial package for Hypercube diff --git a/packages/xdg-desktop-portal-hyprland/xdg-desktop-portal-hyprland.spec b/packages/xdg-desktop-portal-hyprland/xdg-desktop-portal-hyprland.spec new file mode 100644 index 0000000..958d3c9 --- /dev/null +++ b/packages/xdg-desktop-portal-hyprland/xdg-desktop-portal-hyprland.spec @@ -0,0 +1,73 @@ +%global sdbus_version 2.1.0 + +Name: xdg-desktop-portal-hyprland +Epoch: 1 +Version: 1.3.11 +Release: 1%{?dist} +Summary: xdg-desktop-portal backend for hyprland + +License: BSD-3-Clause +URL: https://github.com/hyprwm/xdg-desktop-portal-hyprland +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Source1: https://github.com/Kistler-Group/sdbus-cpp/archive/v%{sdbus_version}/sdbus-%{sdbus_version}.tar.gz + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: systemd-rpm-macros +BuildRequires: pkgconfig(gbm) +BuildRequires: pkgconfig(hyprland-protocols) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(hyprwayland-scanner) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(libpipewire-0.3) +BuildRequires: pkgconfig(libsystemd) +BuildRequires: pkgconfig(Qt6Widgets) +BuildRequires: pkgconfig(systemd) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-protocols) +BuildRequires: pkgconfig(wayland-scanner) + +Requires: dbus +Requires: grim +Requires: xdg-desktop-portal +Requires: slurp +Requires: qt6-qtwayland + +Enhances: hyprland +Supplements: hyprland + +Provides: bundled(sdbus-cpp) = %{sdbus_version} + +%description +%{summary}. + +%prep +%autosetup -p1 +tar -xf %{SOURCE1} -C subprojects/sdbus-cpp --strip=1 + +%build +%cmake -DBUILD_SHARED_LIBS:BOOL=OFF -DCMAKE_BUILD_TYPE=Release +%cmake_build + +%install +%cmake_install + +%post +%systemd_user_post %{name}.service + +%preun +%systemd_user_preun %{name}.service + +%files +%license LICENSE +%doc README.md +%{_bindir}/hyprland-share-picker +%{_datadir}/dbus-1/services/org.freedesktop.impl.portal.desktop.hyprland.service +%{_datadir}/xdg-desktop-portal/portals/hyprland.portal +%{_libexecdir}/%{name} +%{_userunitdir}/%{name}.service + +%changelog +* Mon Dec 16 2024 Hypercube - 1.3.11-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) From 2fe7d54fc48f3524f4490b1b1f59e6508269e219 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 12:20:29 -0800 Subject: [PATCH 03/27] updated versions --- packages/hyprgraphics/hyprgraphics.spec | 7 +++++-- packages/hyprlang/hyprlang.spec | 5 ++++- packages/hyprutils/hyprutils.spec | 7 +++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/hyprgraphics/hyprgraphics.spec b/packages/hyprgraphics/hyprgraphics.spec index 00f8351..569cb23 100644 --- a/packages/hyprgraphics/hyprgraphics.spec +++ b/packages/hyprgraphics/hyprgraphics.spec @@ -1,5 +1,5 @@ Name: hyprgraphics -Version: 0.2.0 +Version: 0.4.0 Release: 1%{?dist} Summary: Hyprland graphics / resource utilities @@ -51,7 +51,7 @@ Development files for %{name}. %files %license LICENSE %doc README.md -%{_libdir}/lib%{name}.so.1 +%{_libdir}/lib%{name}.so.3 %{_libdir}/lib%{name}.so.%{version} %files devel @@ -60,5 +60,8 @@ Development files for %{name}. %{_libdir}/pkgconfig/%{name}.pc %changelog +* Mon Dec 16 2024 Hypercube - 0.4.0-1 +- Update to 0.4.0 + * Mon Dec 16 2024 Hypercube - 0.2.0-1 - Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprlang/hyprlang.spec b/packages/hyprlang/hyprlang.spec index 030dcb0..7969725 100644 --- a/packages/hyprlang/hyprlang.spec +++ b/packages/hyprlang/hyprlang.spec @@ -1,5 +1,5 @@ Name: hyprlang -Version: 0.6.4 +Version: 0.6.7 Release: 1%{?dist} Summary: The official implementation library for the hypr config language @@ -49,5 +49,8 @@ sed 's/.*/%{version}/' -i VERSION %{_libdir}/pkgconfig/hyprlang.pc %changelog +* Mon Dec 16 2024 Hypercube - 0.6.7-1 +- Update to 0.6.7 + * Mon Dec 16 2024 Hypercube - 0.6.4-1 - Initial package for Hypercube (based on sdegler/hyprland COPR) diff --git a/packages/hyprutils/hyprutils.spec b/packages/hyprutils/hyprutils.spec index 22b7813..b783a37 100644 --- a/packages/hyprutils/hyprutils.spec +++ b/packages/hyprutils/hyprutils.spec @@ -1,5 +1,5 @@ Name: hyprutils -Version: 0.10.0 +Version: 0.11.0 Release: 1%{?dist} Summary: Hyprland utilities library used across the ecosystem @@ -40,7 +40,7 @@ Development files for %{name}. %license LICENSE %doc README.md %{_libdir}/lib%{name}.so.%{version} -%{_libdir}/lib%{name}.so.9 +%{_libdir}/lib%{name}.so.10 %files devel %{_includedir}/%{name}/ @@ -48,5 +48,8 @@ Development files for %{name}. %{_libdir}/pkgconfig/%{name}.pc %changelog +* Mon Dec 16 2024 Hypercube - 0.11.0-1 +- Update to 0.11.0 (adds cli/Logger.hpp needed by aquamarine) + * Mon Dec 16 2024 Hypercube - 0.10.0-1 - Initial package for Hypercube (based on sdegler/hyprland COPR) From d6311677e899019b717cbb56f7bd7503e4ebb11b Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 12:32:45 -0800 Subject: [PATCH 04/27] Fix qt build for hyprland --- packages/hyprland-qt-support/hyprland-qt-support.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hyprland-qt-support/hyprland-qt-support.spec b/packages/hyprland-qt-support/hyprland-qt-support.spec index 67ae2e9..7111c7a 100644 --- a/packages/hyprland-qt-support/hyprland-qt-support.spec +++ b/packages/hyprland-qt-support/hyprland-qt-support.spec @@ -24,7 +24,7 @@ BuildRequires: pkgconfig(hyprlang) %autosetup -p1 %build -%cmake -DINSTALL_QMLDIR=%{_qt6_qmldir} +%cmake -DINSTALL_QMLDIR=%{_qt6_qmldir} -DCMAKE_INSTALL_LIBDIR=%{_libdir} %cmake_build %install From 0994f2edaf38c72ff0a788535591299ff0cb4106 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 12:35:52 -0800 Subject: [PATCH 05/27] Add Glaze for hyprland --- packages/glaze/glaze.spec | 50 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 packages/glaze/glaze.spec diff --git a/packages/glaze/glaze.spec b/packages/glaze/glaze.spec new file mode 100644 index 0000000..df3a902 --- /dev/null +++ b/packages/glaze/glaze.spec @@ -0,0 +1,50 @@ +%global debug_package %{nil} + +Name: glaze +Version: 6.1.0 +Release: 1%{?dist} +Summary: Extremely fast, in memory, JSON and interface library for modern C++ + +License: MIT +URL: https://github.com/stephenberry/glaze +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ + +%description +Glaze is an extremely fast, in memory, JSON and interface library for modern C++. + +%package devel +Summary: Development files for %{name} +BuildArch: noarch +Provides: %{name}-static = %{version}-%{release} + +%description devel +Development files for %{name}. Glaze is a header-only library. + +%prep +%autosetup -p1 + +%build +%cmake \ + -Dglaze_INSTALL_CMAKEDIR=%{_datadir}/cmake/%{name} \ + -Dglaze_DISABLE_SIMD_WHEN_SUPPORTED:BOOL=ON \ + -Dglaze_DEVELOPER_MODE:BOOL=OFF \ + -Dglaze_ENABLE_FUZZING:BOOL=OFF +%cmake_build + +%install +%cmake_install + +%files devel +%license LICENSE +%doc README.md +%{_datadir}/cmake/%{name}/ +%{_includedir}/%{name}/ + +%changelog +* Mon Dec 16 2024 Hypercube - 6.1.0-1 +- Initial package for Hypercube (based on sdegler/hyprland COPR) From c23c3f9fe343ce9de5b0d613766a4a47a21c311d Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 12:49:10 -0800 Subject: [PATCH 06/27] Update starship build --- packages/starship/starship.spec | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/starship/starship.spec b/packages/starship/starship.spec index a2d4735..bd61920 100644 --- a/packages/starship/starship.spec +++ b/packages/starship/starship.spec @@ -7,12 +7,12 @@ License: ISC URL: https://github.com/starship/starship Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz -BuildRequires: cargo -BuildRequires: rust +BuildRequires: cargo >= 1.80 +BuildRequires: rust >= 1.80 BuildRequires: gcc -BuildRequires: cmake -BuildRequires: openssl-devel -BuildRequires: zlib-devel +BuildRequires: cmake3 +BuildRequires: pkgconfig(openssl) +BuildRequires: pkgconfig(zlib) %description Starship is the minimal, blazing-fast, and infinitely customizable prompt for @@ -24,18 +24,24 @@ Ion, Elvish, Tcsh, Xonsh, Nushell, and Cmd. %autosetup -n %{name}-%{version} %build -cargo build --release --locked +# Build handled in install %install -install -Dpm 0755 target/release/%{name} %{buildroot}%{_bindir}/%{name} +export CARGO_PROFILE_RELEASE_BUILD_OVERRIDE_OPT_LEVEL=3 +export CMAKE=cmake3 +RUSTFLAGS='-C strip=symbols' cargo install --root=%{buildroot}%{_prefix} --path=. # Generate and install shell completions mkdir -p %{buildroot}%{_datadir}/bash-completion/completions mkdir -p %{buildroot}%{_datadir}/zsh/site-functions mkdir -p %{buildroot}%{_datadir}/fish/vendor_completions.d -target/release/%{name} completions bash > %{buildroot}%{_datadir}/bash-completion/completions/%{name} -target/release/%{name} completions zsh > %{buildroot}%{_datadir}/zsh/site-functions/_%{name} -target/release/%{name} completions fish > %{buildroot}%{_datadir}/fish/vendor_completions.d/%{name}.fish +%{buildroot}%{_bindir}/%{name} completions bash > %{buildroot}%{_datadir}/bash-completion/completions/%{name} +%{buildroot}%{_bindir}/%{name} completions zsh > %{buildroot}%{_datadir}/zsh/site-functions/_%{name} +%{buildroot}%{_bindir}/%{name} completions fish > %{buildroot}%{_datadir}/fish/vendor_completions.d/%{name}.fish + +# Remove .crates.toml and .crates2.json created by cargo install +rm -f %{buildroot}%{_prefix}/.crates.toml +rm -f %{buildroot}%{_prefix}/.crates2.json %files %license LICENSE From 25bfcb0a2abd59839536088df92656779c365fcc Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:01:59 -0800 Subject: [PATCH 07/27] Use official neovim --- build_files/hyprland/01-hyprland-desktop.sh | 3 +- packages/neovim/neovim.spec | 69 --------------------- 2 files changed, 2 insertions(+), 70 deletions(-) delete mode 100644 packages/neovim/neovim.spec diff --git a/build_files/hyprland/01-hyprland-desktop.sh b/build_files/hyprland/01-hyprland-desktop.sh index 99989e0..8348790 100755 --- a/build_files/hyprland/01-hyprland-desktop.sh +++ b/build_files/hyprland/01-hyprland-desktop.sh @@ -49,7 +49,8 @@ dnf5 -y install fish ### Terminal - Ghostty (from Hypercube COPR) dnf5 -y install ghostty -### Editor - Neovim (from Hypercube COPR) +### Editor - Neovim nightly (from agriffis COPR) +dnf5 -y copr enable agriffis/neovim-nightly dnf5 -y install neovim python3-neovim ### Image/Media Viewers diff --git a/packages/neovim/neovim.spec b/packages/neovim/neovim.spec deleted file mode 100644 index e73341d..0000000 --- a/packages/neovim/neovim.spec +++ /dev/null @@ -1,69 +0,0 @@ -Name: neovim -Version: 0.11.5 -Release: 1%{?dist} -Summary: Vim-fork focused on extensibility and usability - -License: Apache-2.0 AND Vim -URL: https://github.com/neovim/neovim -Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz - -BuildRequires: cmake >= 3.16 -BuildRequires: ninja-build -BuildRequires: gcc -BuildRequires: make -BuildRequires: gettext -BuildRequires: glibc-gconv-extra -BuildRequires: git -BuildRequires: unzip - -# Runtime dependencies -Requires: lua -Requires: python3-neovim - -%description -Neovim is a refactor, and sometimes redactor, in the tradition of Vim (which -itself derives from Stevie). It is not a rewrite but a continuation and -extension of Vim. Many clones and derivatives exist, some very clever - but -none are Vim. Neovim is built for users who want the good parts of Vim, and -more. - -%package -n python3-neovim -Summary: Python client for Neovim -BuildArch: noarch -Requires: python3 -Requires: python3-msgpack -Requires: python3-greenlet - -%description -n python3-neovim -Python client library for Neovim, enabling Python plugins and remote -communication with Neovim instances. - -%prep -%autosetup -n %{name}-%{version} - -%build -%cmake \ - -GNinja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_INSTALL_PREFIX=%{_prefix} - -%cmake_build - -%install -%cmake_install - -# Desktop file and icons are installed by cmake - -%files -%license LICENSE.txt -%doc README.md CONTRIBUTING.md -%{_bindir}/nvim -%{_datadir}/nvim/ -%{_datadir}/applications/nvim.desktop -%{_datadir}/icons/hicolor/*/apps/nvim.* -%{_datadir}/locale/*/LC_MESSAGES/nvim.mo -%{_mandir}/man1/nvim.1* - -%changelog -* Mon Dec 16 2024 Hypercube - 0.11.5-1 -- Initial package for Hypercube From 4cc4df26d5df9a2a31a53c85562d4fe87e57d46b Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:06:19 -0800 Subject: [PATCH 08/27] Fix eza and lazygit --- packages/eza/eza.spec | 32 ++++++++++++++++++-------------- packages/lazygit/lazygit.spec | 9 ++++++--- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/eza/eza.spec b/packages/eza/eza.spec index fd7106e..76ef7ee 100644 --- a/packages/eza/eza.spec +++ b/packages/eza/eza.spec @@ -1,3 +1,7 @@ +# NOTE: This package requires "Enable internet access during builds" in COPR settings + +%global debug_package %{nil} + Name: eza Version: 0.20.21 Release: 1%{?dist} @@ -9,9 +13,7 @@ Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz BuildRequires: cargo BuildRequires: rust -BuildRequires: gcc BuildRequires: pandoc -BuildRequires: git %description eza is a modern replacement for the venerable file-listing command-line program @@ -22,30 +24,32 @@ and better defaults. %autosetup -n %{name}-%{version} %build +export RUSTFLAGS="%{build_rustflags}" cargo build --release --locked %install -install -Dpm 0755 target/release/%{name} %{buildroot}%{_bindir}/%{name} +install -Dpm 0755 target/release/%{name} -t %{buildroot}%{_bindir}/ # Generate and install man pages -mkdir -p %{buildroot}%{_mandir}/man1 -mkdir -p %{buildroot}%{_mandir}/man5 -pandoc --standalone -f markdown -t man man/eza.1.md -o %{buildroot}%{_mandir}/man1/eza.1 -pandoc --standalone -f markdown -t man man/eza_colors.5.md -o %{buildroot}%{_mandir}/man5/eza_colors.5 -pandoc --standalone -f markdown -t man man/eza_colors-explanation.5.md -o %{buildroot}%{_mandir}/man5/eza_colors-explanation.5 +mkdir -p target/man +for page in eza.1 eza_colors.5 eza_colors-explanation.5; do + sed "s/\$version/v%{version}/g" "man/${page}.md" | pandoc --standalone -f markdown -t man > "target/man/${page}" +done +install -Dpm 0644 target/man/eza.1 -t %{buildroot}/%{_mandir}/man1/ +install -Dpm 0644 target/man/eza_colors.5 -t %{buildroot}/%{_mandir}/man5/ +install -Dpm 0644 target/man/eza_colors-explanation.5 -t %{buildroot}/%{_mandir}/man5/ # Install shell completions -install -Dpm 0644 completions/bash/%{name} %{buildroot}%{_datadir}/bash-completion/completions/%{name} -install -Dpm 0644 completions/zsh/_%{name} %{buildroot}%{_datadir}/zsh/site-functions/_%{name} -install -Dpm 0644 completions/fish/%{name}.fish %{buildroot}%{_datadir}/fish/vendor_completions.d/%{name}.fish +install -Dpm 0644 completions/bash/%{name} -t %{buildroot}/%{_datadir}/bash-completion/completions/ +install -Dpm 0644 completions/zsh/_%{name} -t %{buildroot}/%{_datadir}/zsh/site-functions/ +install -Dpm 0644 completions/fish/%{name}.fish -t %{buildroot}/%{_datadir}/fish/vendor_completions.d/ %files -%license LICENCE +%license LICENSE.txt %doc README.md CHANGELOG.md %{_bindir}/%{name} %{_mandir}/man1/eza.1* -%{_mandir}/man5/eza_colors.5* -%{_mandir}/man5/eza_colors-explanation.5* +%{_mandir}/man5/eza_colors* %{_datadir}/bash-completion/completions/%{name} %{_datadir}/zsh/site-functions/_%{name} %{_datadir}/fish/vendor_completions.d/%{name}.fish diff --git a/packages/lazygit/lazygit.spec b/packages/lazygit/lazygit.spec index 1ba11b6..5e92145 100644 --- a/packages/lazygit/lazygit.spec +++ b/packages/lazygit/lazygit.spec @@ -1,3 +1,8 @@ +# NOTE: This package requires "Enable internet access during builds" in COPR settings +# because go needs to download dependencies + +%global debug_package %{nil} + Name: lazygit Version: 0.57.0 Release: 1%{?dist} @@ -19,9 +24,7 @@ and more. It's designed to make git less painful. %autosetup -n %{name}-%{version} %build -export GOFLAGS="-buildmode=pie -trimpath" -export LDFLAGS="-X main.version=%{version} -X main.buildSource=rpm" -go build -ldflags "${LDFLAGS}" -o %{name} +go build -ldflags "-X main.version=%{version}" -o %{name} %install install -Dpm 0755 %{name} %{buildroot}%{_bindir}/%{name} From 869daf526e8981094d3a0bcf1927819f33e86d63 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:09:18 -0800 Subject: [PATCH 09/27] Fix ghostty --- packages/ghostty/ghostty.spec | 104 ++++++++++++++++++---------------- 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/packages/ghostty/ghostty.spec b/packages/ghostty/ghostty.spec index e1869be..9806783 100644 --- a/packages/ghostty/ghostty.spec +++ b/packages/ghostty/ghostty.spec @@ -1,85 +1,89 @@ +# NOTE: This package requires "Enable internet access during builds" in COPR settings + Name: ghostty Version: 1.2.3 Release: 1%{?dist} -Summary: Fast, feature-rich, cross-platform terminal emulator +Summary: Fast, feature-rich, and cross-platform terminal emulator License: MIT URL: https://github.com/ghostty-org/ghostty Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz -# Ghostty requires Zig 0.15.2 which is not in Fedora repos -# We download the official binary -%global zig_version 0.15.0 -%global zig_arch x86_64 +ExclusiveArch: x86_64 aarch64 -BuildRequires: gcc -BuildRequires: git -BuildRequires: pkg-config +BuildRequires: blueprint-compiler BuildRequires: fontconfig-devel BuildRequires: freetype-devel +BuildRequires: glib2-devel BuildRequires: gtk4-devel +BuildRequires: gtk4-layer-shell-devel +BuildRequires: harfbuzz-devel BuildRequires: libadwaita-devel -BuildRequires: libX11-devel -BuildRequires: libXcursor-devel -BuildRequires: libXrandr-devel -BuildRequires: pandoc -BuildRequires: bzip2-devel -BuildRequires: oniguruma-devel -BuildRequires: lz4-devel -BuildRequires: zstd-devel BuildRequires: libpng-devel +BuildRequires: oniguruma-devel +BuildRequires: pandoc-cli +BuildRequires: pixman-devel +BuildRequires: pkg-config +BuildRequires: wayland-protocols-devel +BuildRequires: zig +BuildRequires: zlib-ng-devel Requires: fontconfig Requires: freetype +Requires: glib2 Requires: gtk4 +Requires: harfbuzz Requires: libadwaita +Requires: libpng +Requires: oniguruma +Requires: pixman +Requires: zlib-ng %description Ghostty is a terminal emulator that differentiates itself by being both -incredibly fast and feature-rich. It's built with GPU acceleration, -native platform feel, and a focus on performance. +fast and feature-rich. It uses platform-native UI and GPU acceleration. %prep -%autosetup -n %{name}-%{version} - -# Download Zig -curl -L -o zig.tar.xz https://ziglang.org/download/%{zig_version}/zig-linux-%{zig_arch}-%{zig_version}.tar.xz -tar xf zig.tar.xz -export PATH="$PWD/zig-linux-%{zig_arch}-%{zig_version}:$PATH" - -# Fetch dependencies for offline build -./nix/build-support/fetch-zig-cache.sh +%setup -q -n %{name}-%{version} %build -export PATH="$PWD/zig-linux-%{zig_arch}-%{zig_version}:$PATH" -zig build \ - --prefix %{_prefix} \ - --system \ +DESTDIR=%{buildroot} zig build \ + --summary all \ + --prefix "%{_prefix}" \ + -Dversion-string=%{version}-%{release} \ -Doptimize=ReleaseFast \ -Dcpu=baseline \ - -Dpie=true + -Dpie=true \ + -Demit-docs -%install -export PATH="$PWD/zig-linux-%{zig_arch}-%{zig_version}:$PATH" -DESTDIR=%{buildroot} zig build install \ - --prefix %{_prefix} \ - --system \ - -Doptimize=ReleaseFast \ - -Dcpu=baseline \ - -Dpie=true +# Remove terminfo that conflicts with ncurses +rm -f "%{buildroot}%{_datadir}/terminfo/g/ghostty" %files %license LICENSE -%doc README.md -%{_bindir}/%{name} -%{_datadir}/applications/%{name}.desktop -%{_datadir}/icons/hicolor/*/apps/%{name}.* -%{_datadir}/%{name}/ -%{_datadir}/bash-completion/completions/%{name} -%{_datadir}/zsh/site-functions/_%{name} -%{_datadir}/fish/vendor_completions.d/%{name}.fish -%{_mandir}/man1/%{name}.1* -%{_mandir}/man5/%{name}.5* +%{_bindir}/ghostty +%{_datadir}/applications/com.mitchellh.ghostty.desktop +%{_datadir}/bash-completion/completions/ghostty.bash +%{_datadir}/bat/syntaxes/ghostty.sublime-syntax +%{_datadir}/fish/vendor_completions.d/ghostty.fish +%{_datadir}/ghostty/ +%{_datadir}/icons/hicolor/*/apps/com.mitchellh.ghostty.png +%{_datadir}/kio/servicemenus/com.mitchellh.ghostty.desktop +%{_datadir}/man/man1/ghostty.1* +%{_datadir}/man/man5/ghostty.5* +%{_datadir}/nautilus-python/extensions/ghostty.py +%{_datadir}/nvim/site/compiler/ghostty.vim +%{_datadir}/nvim/site/ftdetect/ghostty.vim +%{_datadir}/nvim/site/ftplugin/ghostty.vim +%{_datadir}/nvim/site/syntax/ghostty.vim +%{_datadir}/vim/vimfiles/compiler/ghostty.vim +%{_datadir}/vim/vimfiles/ftdetect/ghostty.vim +%{_datadir}/vim/vimfiles/ftplugin/ghostty.vim +%{_datadir}/vim/vimfiles/syntax/ghostty.vim +%{_datadir}/zsh/site-functions/_ghostty +%{_datadir}/dbus-1/services/com.mitchellh.ghostty.service +%{_datadir}/locale/*/LC_MESSAGES/com.mitchellh.ghostty.mo +%{_datadir}/metainfo/com.mitchellh.ghostty.metainfo.xml %changelog * Mon Dec 16 2024 Hypercube - 1.2.3-1 From 8f10c69e3267980a74ac33ae68e06675c8673127 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:13:38 -0800 Subject: [PATCH 10/27] Fix quickshell --- packages/quickshell/quickshell.spec | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/quickshell/quickshell.spec b/packages/quickshell/quickshell.spec index c6b7f30..790fc00 100644 --- a/packages/quickshell/quickshell.spec +++ b/packages/quickshell/quickshell.spec @@ -70,9 +70,11 @@ managers. It supports Hyprland, Sway, and other Wayland compositors. %cmake_install %files -%license LICENSE LICENSE.GPL +%license LICENSE LICENSE-GPL %doc README.md %{_bindir}/%{name} +%{_datadir}/applications/org.quickshell.desktop +%{_datadir}/icons/hicolor/scalable/apps/org.quickshell.svg %changelog * Mon Dec 16 2024 Hypercube - 0.2.1-1 From 9c595633dec9b2e466faadccf16c80ba24c54c8a Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:15:59 -0800 Subject: [PATCH 11/27] Fix starship --- packages/starship/starship.spec | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/starship/starship.spec b/packages/starship/starship.spec index bd61920..f2669e4 100644 --- a/packages/starship/starship.spec +++ b/packages/starship/starship.spec @@ -1,3 +1,5 @@ +%global debug_package %{nil} + Name: starship Version: 1.24.1 Release: 1%{?dist} From bb00e8920fdf8cd7865e215b9a79b5e28f6612fa Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:20:55 -0800 Subject: [PATCH 12/27] Build ghostty from git --- packages/ghostty/ghostty.spec | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/packages/ghostty/ghostty.spec b/packages/ghostty/ghostty.spec index 9806783..984d74e 100644 --- a/packages/ghostty/ghostty.spec +++ b/packages/ghostty/ghostty.spec @@ -1,13 +1,18 @@ # NOTE: This package requires "Enable internet access during builds" in COPR settings +# Building from main branch commit that supports zig 0.15.2 (Fedora 43) + +%global commit ab3a3805aa2db46eafc8c7a497df24665fa5e21b +%global shortcommit %(c=%{commit}; echo ${c:0:7}) +%global commitdate 20251216 Name: ghostty -Version: 1.2.3 +Version: 1.2.3^%{commitdate}git%{shortcommit} Release: 1%{?dist} Summary: Fast, feature-rich, and cross-platform terminal emulator License: MIT URL: https://github.com/ghostty-org/ghostty -Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +Source0: %{url}/archive/%{commit}/%{name}-%{shortcommit}.tar.gz ExclusiveArch: x86_64 aarch64 @@ -44,10 +49,10 @@ Ghostty is a terminal emulator that differentiates itself by being both fast and feature-rich. It uses platform-native UI and GPU acceleration. %prep -%setup -q -n %{name}-%{version} +%setup -q -n %{name}-%{commit} %build -DESTDIR=%{buildroot} zig build \ +zig build \ --summary all \ --prefix "%{_prefix}" \ -Dversion-string=%{version}-%{release} \ @@ -56,6 +61,15 @@ DESTDIR=%{buildroot} zig build \ -Dpie=true \ -Demit-docs +%install +DESTDIR=%{buildroot} zig build install \ + --prefix "%{_prefix}" \ + -Dversion-string=%{version}-%{release} \ + -Doptimize=ReleaseFast \ + -Dcpu=baseline \ + -Dpie=true \ + -Demit-docs + # Remove terminfo that conflicts with ncurses rm -f "%{buildroot}%{_datadir}/terminfo/g/ghostty" From 3f894c5c1772e4602e3fd17338f61da7a50417e6 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:24:40 -0800 Subject: [PATCH 13/27] Remove lazy lock from source control --- .gitignore | 1 + dot_files/nvim/lazy-lock.json | 50 ----------------------------------- 2 files changed, 1 insertion(+), 50 deletions(-) delete mode 100644 dot_files/nvim/lazy-lock.json diff --git a/.gitignore b/.gitignore index ab799f8..6d1319f 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ _vm_build/ # ISO files *.iso result-iso/ +dot_files/nvim/lazy-lock.json diff --git a/dot_files/nvim/lazy-lock.json b/dot_files/nvim/lazy-lock.json deleted file mode 100644 index 26890c0..0000000 --- a/dot_files/nvim/lazy-lock.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "LazyVim": { "branch": "main", "commit": "28db03f958d58dfff3c647ce28fdc1cb88ac158d" }, - "SchemaStore.nvim": { "branch": "main", "commit": "e9c00ea7813006dfa29f35c174f83f0184d45a93" }, - "augment.vim": { "branch": "main", "commit": "97418c9dfc1918fa9bdd23863ea3d2e49130727f" }, - "blink.cmp": { "branch": "main", "commit": "b19413d214068f316c78978b08264ed1c41830ec" }, - "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, - "catppuccin": { "branch": "main", "commit": "ce4a8e0d5267e67056f9f4dcf6cb1d0933c8ca00" }, - "claudecode.nvim": { "branch": "main", "commit": "1552086ebcce9f4a2ea3b9793018a884d6b60169" }, - "conform.nvim": { "branch": "master", "commit": "4993e07fac6679d0a5005aa7499e0bad2bd39f19" }, - "crates.nvim": { "branch": "main", "commit": "ac9fa498a9edb96dc3056724ff69d5f40b898453" }, - "dial.nvim": { "branch": "master", "commit": "f97c0c7fa7d5111bc04a91d0f693900fb2d95861" }, - "flash.nvim": { "branch": "main", "commit": "fcea7ff883235d9024dc41e638f164a450c14ca2" }, - "friendly-snippets": { "branch": "main", "commit": "572f5660cf05f8cd8834e096d7b4c921ba18e175" }, - "gitsigns.nvim": { "branch": "main", "commit": "5813e4878748805f1518cee7abb50fd7205a3a48" }, - "grug-far.nvim": { "branch": "main", "commit": "b58b2d65863f4ebad88b10a1ddd519e5380466e0" }, - "helm-ls.nvim": { "branch": "main", "commit": "d6f3a8d4ad59b4f54cd734267dfb5411679ea608" }, - "inc-rename.nvim": { "branch": "main", "commit": "2597bccb57d1b570fbdbd4adf88b955f7ade715b" }, - "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, - "lazydev.nvim": { "branch": "main", "commit": "5231c62aa83c2f8dc8e7ba957aa77098cda1257d" }, - "lualine.nvim": { "branch": "master", "commit": "47f91c416daef12db467145e16bed5bbfe00add8" }, - "markdown-preview.nvim": { "branch": "master", "commit": "a923f5fc5ba36a3b17e289dc35dc17f66d0548ee" }, - "mason-lspconfig.nvim": { "branch": "main", "commit": "0b9bb925c000ae649ff7e7149c8cd00031f4b539" }, - "mason.nvim": { "branch": "main", "commit": "57e5a8addb8c71fb063ee4acda466c7cf6ad2800" }, - "mini.ai": { "branch": "main", "commit": "bfb26d9072670c3aaefab0f53024b2f3729c8083" }, - "mini.hipatterns": { "branch": "main", "commit": "add8d8abad602787377ec5d81f6b248605828e0f" }, - "mini.icons": { "branch": "main", "commit": "ff2e4f1d29f659cc2bad0f9256f2f6195c6b2428" }, - "mini.pairs": { "branch": "main", "commit": "472ec50092a3314ec285d2db2baa48602d71fe93" }, - "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" }, - "nui.nvim": { "branch": "main", "commit": "de740991c12411b663994b2860f1a4fd0937c130" }, - "nvim-lint": { "branch": "master", "commit": "d1118791070d090777398792a73032a0ca5c79ff" }, - "nvim-lspconfig": { "branch": "master", "commit": "effe4bf2e1afb881ea67291c648b68dd3dfc927a" }, - "nvim-treesitter": { "branch": "main", "commit": "e527584cf8508b2f99f127c2a20f93237e8fcf83" }, - "nvim-treesitter-textobjects": { "branch": "main", "commit": "dfbf9596f8aa8b4bed5301647485594ff7252955" }, - "nvim-ts-autotag": { "branch": "main", "commit": "c4ca798ab95b316a768d51eaaaee48f64a4a46bc" }, - "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" }, - "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, - "render-markdown.nvim": { "branch": "main", "commit": "6e0e8902dac70fecbdd8ce557d142062a621ec38" }, - "rustaceanvim": { "branch": "master", "commit": "6c3785d6a230bec63f70c98bf8e2842bed924245" }, - "smear-cursor.nvim": { "branch": "main", "commit": "c85bdbb25db096fbcf616bc4e1357bd61fe2c199" }, - "snacks.nvim": { "branch": "main", "commit": "fe7cfe9800a182274d0f868a74b7263b8c0c020b" }, - "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, - "tokyonight.nvim": { "branch": "main", "commit": "5da1b76e64daf4c5d410f06bcb6b9cb640da7dfd" }, - "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, - "ts-comments.nvim": { "branch": "main", "commit": "123a9fb12e7229342f807ec9e6de478b1102b041" }, - "vim-dadbod": { "branch": "master", "commit": "e95afed23712f969f83b4857a24cf9d59114c2e6" }, - "vim-dadbod-completion": { "branch": "master", "commit": "a8dac0b3cf6132c80dc9b18bef36d4cf7a9e1fe6" }, - "vim-dadbod-ui": { "branch": "master", "commit": "48c4f271da13d380592f4907e2d1d5558044e4e5" }, - "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" }, - "yanky.nvim": { "branch": "main", "commit": "04fc42b94305d94948c9c197f679336668af3292" } -} From 06a42aba17a38b15ccb95d3329df796e68fddbae Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:30:40 -0800 Subject: [PATCH 14/27] Remove wezterm --- CONTRIBUTING.md | 3 +- README.md | 6 +- build_files/hypercube/03-hypercube-configs.sh | 16 - build_files/hypercube/99-tests.sh | 1 - dot_files/fish/config.fish | 2 - dot_files/ghostty/config | 8 +- dot_files/nvim/README.md | 2 +- dot_files/wezterm/wezterm.lua | 241 ------------- .../calamares/branding/hypercube/show.qml | 2 +- packages/README.md | 331 ++++++++++++++++++ .../usr/share/ublue-os/just/60-custom.just | 18 - 11 files changed, 340 insertions(+), 290 deletions(-) delete mode 100644 dot_files/wezterm/wezterm.lua create mode 100644 packages/README.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 49eb64b..ed4279d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,8 +37,7 @@ hypercube/ │ ├── nvim/ # Neovim/LazyVim setup │ ├── qt6ct/ # Qt6 theming │ ├── quickshell/ # App launcher -│ ├── starship/ # Shell prompt -│ └── wezterm/ # WezTerm terminal +│ └── starship/ # Shell prompt │ ├── system_files/ # System-level files │ └── shared/ diff --git a/README.md b/README.md index 5dabc9b..f3b1514 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Pre-configured and ready to use: - **Neovim** (nightly) with LazyVim, LSP, and language support - **Lazygit** for interactive Git operations - **Fish** shell with Starship prompt -- **Ghostty** & **WezTerm** GPU-accelerated terminals +- **Ghostty** GPU-accelerated terminal - **Quickshell** application launcher and system controls ### Consistent Theming @@ -99,7 +99,7 @@ On top of Bluefin-DX, Hypercube adds: | Category | Packages | |----------|----------| | Compositor | Hyprland, Hyprlock, Hypridle, Hyprpaper, Hyprshot | -| Terminals | Ghostty, WezTerm | +| Terminals | Ghostty | | Editor | Neovim (nightly) | | Git Tools | Lazygit | | Launcher | Quickshell | @@ -112,7 +112,7 @@ All configurations live in `/usr/share/hypercube/config/` and can be overridden - Fish shell with vim mode and Starship prompt - Hyprland with vim-style navigation - Neovim with LazyVim distribution -- Ghostty and WezTerm with Tokyo Night colors +- Ghostty with Tokyo Night colors - GTK/Qt theming with dark mode ## Documentation diff --git a/build_files/hypercube/03-hypercube-configs.sh b/build_files/hypercube/03-hypercube-configs.sh index 28e810a..5e7cdaf 100755 --- a/build_files/hypercube/03-hypercube-configs.sh +++ b/build_files/hypercube/03-hypercube-configs.sh @@ -42,22 +42,6 @@ config-file = /usr/share/hypercube/config/ghostty/config # Your customizations below: EOF -### Wezterm terminal - stub that sources system config -# Users can customize by modifying the config table after dofile() -mkdir -p /etc/skel/.config/wezterm -cat > /etc/skel/.config/wezterm/wezterm.lua << 'EOF' --- Hypercube Wezterm Configuration --- System defaults are loaded below. Add your customizations after this line. --- To replace defaults entirely, remove the dofile line and start fresh. - -local config = dofile("/usr/share/hypercube/config/wezterm/wezterm.lua") - --- Your customizations below: --- Example: config.font_size = 14 - -return config -EOF - ### GTK theme settings - install to /etc/xdg/ for system-wide defaults # Users can override by creating ~/.config/gtk-3.0/settings.ini install -Dm644 "${CONFIG_DIR}/gtk-3.0/settings.ini" /etc/xdg/gtk-3.0/settings.ini diff --git a/build_files/hypercube/99-tests.sh b/build_files/hypercube/99-tests.sh index 47349d5..ab09139 100755 --- a/build_files/hypercube/99-tests.sh +++ b/build_files/hypercube/99-tests.sh @@ -17,7 +17,6 @@ REQUIRED_PACKAGES=( "hypridle" "quickshell" # Terminals - "wezterm" "ghostty" # Dev tools "neovim" diff --git a/dot_files/fish/config.fish b/dot_files/fish/config.fish index f68dab3..e0f9bb1 100644 --- a/dot_files/fish/config.fish +++ b/dot_files/fish/config.fish @@ -21,8 +21,6 @@ if status is-interactive fish_add_path $HOME/Code/flutter/bin fish_add_path $HOME/go/bin - # Alias - alias wezterm 'flatpak run org.wezfurlong.wezterm' end ### bling.fish source start diff --git a/dot_files/ghostty/config b/dot_files/ghostty/config index f420681..317b638 100644 --- a/dot_files/ghostty/config +++ b/dot_files/ghostty/config @@ -1,4 +1,4 @@ -# Ghostty keybindings matching WezTerm config +# Ghostty keybindings with tmux-style leader key # Leader key is CTRL+a (simulated via prefix since Linux doesn't support global leader) # ---------------------------------------------------------------- @@ -96,8 +96,7 @@ keybind = ctrl+a>w=toggle_tab_overview # Create a new tab keybind = ctrl+a>c=new_tab -# Rename current tab (Ghostty doesn't support this natively, but we can use new_tab as closest) -# Note: ctrl+a>, is for rename in WezTerm but Ghostty doesn't have direct rename support +# Rename current tab # Move to next/previous tab keybind = ctrl+a>n=next_tab @@ -142,8 +141,7 @@ keybind = ctrl+a>l=goto_split:right keybind = ctrl+a>k=goto_split:top keybind = ctrl+a>j=goto_split:bottom -# Pane resizing (ctrl+a>r enters resize mode, then h/j/k/l to resize) -# Note: Ghostty doesn't have key tables/modes like WezTerm, so we use direct bindings +# Pane resizing (ctrl+a>r then h/j/k/l to resize) keybind = ctrl+a>r>h=resize_split:left,10 keybind = ctrl+a>r>l=resize_split:right,10 keybind = ctrl+a>r>k=resize_split:up,10 diff --git a/dot_files/nvim/README.md b/dot_files/nvim/README.md index f3e528c..625556b 100644 --- a/dot_files/nvim/README.md +++ b/dot_files/nvim/README.md @@ -84,7 +84,7 @@ The container mounts your local directories: ### Clipboard Support -The container uses OSC 52 for clipboard integration, which works with modern terminals like Ghostty, Kitty, WezTerm, and others that support OSC 52 escape sequences. +The container uses OSC 52 for clipboard integration, which works with modern terminals like Ghostty, Kitty, and others that support OSC 52 escape sequences. ## Plugins diff --git a/dot_files/wezterm/wezterm.lua b/dot_files/wezterm/wezterm.lua deleted file mode 100644 index 629a5ea..0000000 --- a/dot_files/wezterm/wezterm.lua +++ /dev/null @@ -1,241 +0,0 @@ -local wezterm = require("wezterm") -local config = wezterm.config_builder() -local act = wezterm.action - -config.color_scheme = "Tokyo Night" -config.font = wezterm.font("JetBrains Mono") -config.window_decorations = "NONE" -config.font_size = 13.0 -config.pane_focus_follows_mouse = false -config.tab_bar_at_bottom = true -config.automatically_reload_config = true -config.show_tab_index_in_tab_bar = false -config.tab_max_width = 32 - -config.use_fancy_tab_bar = false -config.show_new_tab_button_in_tab_bar = false -config.show_tab_index_in_tab_bar = false -config.hide_tab_bar_if_only_one_tab = true -config.max_fps = 120 - --- Pane border colors matching Tokyo Night theme -config.inactive_pane_hsb = { - saturation = 0.9, - brightness = 0.6, -} - --- The filled in variant of the < symbol -local SOLID_LEFT_ARROW = wezterm.nerdfonts.ple_ice_waveform_mirrored - --- The filled in variant of the > symbol -local SOLID_RIGHT_ARROW = wezterm.nerdfonts.ple_ice_waveform - --- This function returns the suggested title for a tab. --- It prefers the title that was set via `tab:set_title()` --- or `wezterm cli set-tab-title`, but falls back to the --- title of the active pane in that tab. -function tab_title(tab_info) - local title = tab_info.tab_title - -- if the tab title is explicitly set, take that - if title and #title > 0 then - return title - end - -- Otherwise, use the title from the active pane - -- in that tab - return tab_info.active_pane.title -end - -wezterm.on("format-tab-title", function(tab, tabs, panes, config, hover, max_width) - local edge_background = "#1a1b26" - local background = "#1a1b26" - local foreground = "#565f89" - - if tab.is_active then - background = "#24283b" - foreground = "#bb9af7" - elseif hover then - background = "#24283b" - end - - local edge_foreground = background - - local title = tab_title(tab) - - -- ensure that the titles fit in the available space, - -- and that we have room for the edges. - title = wezterm.truncate_right(title, max_width - 4) - - return { - { Background = { Color = edge_background } }, - { Foreground = { Color = edge_foreground } }, - { Text = SOLID_LEFT_ARROW }, - { Background = { Color = background } }, - { Foreground = { Color = foreground } }, - { Text = " " .. title .. " " }, - { Background = { Color = edge_background } }, - { Foreground = { Color = edge_foreground } }, - { Text = SOLID_RIGHT_ARROW }, - } -end) - -config.leader = { - key = "a", - mods = "CTRL", - timeout_milliseconds = 2000, -} - --- Custom key bindings -config.keys = { - { - key = "Enter", - mods = "ALT", - action = act.DisableDefaultAssignment, - }, - - -- Copy mode - { - key = "[", - mods = "LEADER", - action = act.ActivateCopyMode, - }, - - -- ---------------------------------------------------------------- - -- TABS - -- - -- Where possible, I'm using the same combinations as I would in tmux - -- ---------------------------------------------------------------- - - -- Show tab navigator; similar to listing panes in tmux - { - key = "w", - mods = "LEADER", - action = act.ShowTabNavigator, - }, - -- Create a tab (alternative to Ctrl-Shift-Tab) - { - key = "c", - mods = "LEADER", - action = act.SpawnTab("CurrentPaneDomain"), - }, - -- Rename current tab; analagous to command in tmux - { - key = ",", - mods = "LEADER", - action = act.PromptInputLine({ - description = "Enter new name for tab", - action = wezterm.action_callback(function(window, pane, line) - if line then - window:active_tab():set_title(line) - end - end), - }), - }, - -- Move to next/previous TAB - { - key = "n", - mods = "LEADER", - action = act.ActivateTabRelative(1), - }, - { - key = "p", - mods = "LEADER", - action = act.ActivateTabRelative(-1), - }, - -- Close tab - { - key = "&", - mods = "LEADER|SHIFT", - action = act.CloseCurrentTab({ confirm = true }), - }, - - -- ---------------------------------------------------------------- - -- PANES - -- - -- These are great and get me most of the way to replacing tmux - -- entirely, particularly as you can use "wezterm ssh" to ssh to another - -- server, and still retain Wezterm as your terminal there. - -- ---------------------------------------------------------------- - - -- -- Vertical split - { - -- | - key = "|", - mods = "LEADER|SHIFT", - action = act.SplitPane({ - direction = "Right", - size = { Percent = 50 }, - }), - }, - -- Horizontal split - { - -- - - key = "-", - mods = "LEADER", - action = act.SplitPane({ - direction = "Down", - size = { Percent = 50 }, - }), - }, - - -- Close/kill active pane - { - key = "x", - mods = "LEADER", - action = act.CloseCurrentPane({ confirm = true }), - }, - -- Swap active pane with another one - - { - key = "{", - mods = "LEADER|SHIFT", - action = act.PaneSelect({ mode = "SwapWithActiveKeepFocus" }), - }, - -- Zoom current pane (toggle) - { - key = "z", - mods = "LEADER", - action = act.TogglePaneZoomState, - }, - { - key = "f", - mods = "ALT", - action = act.TogglePaneZoomState, - }, - -- Move to next/previous pane - { - key = ";", - mods = "LEADER", - action = act.ActivatePaneDirection("Prev"), - }, - { - key = "o", - mods = "LEADER", - action = act.ActivatePaneDirection("Next"), - }, - - { key = "h", mods = "LEADER", action = act.ActivatePaneDirection("Left") }, - { key = "l", mods = "LEADER", action = act.ActivatePaneDirection("Right") }, - { key = "k", mods = "LEADER", action = act.ActivatePaneDirection("Up") }, - { key = "j", mods = "LEADER", action = act.ActivatePaneDirection("Down") }, - - { - key = "r", - mods = "LEADER", - action = act.ActivateKeyTable({ - name = "resize_pane", - one_shot = false, - }), - }, -} - -config.key_tables = { - resize_pane = { - { key = "h", action = act.AdjustPaneSize({ "Left", 1 }) }, - { key = "l", action = act.AdjustPaneSize({ "Right", 1 }) }, - { key = "k", action = act.AdjustPaneSize({ "Up", 1 }) }, - { key = "j", action = act.AdjustPaneSize({ "Down", 1 }) }, - { key = "Escape", action = "PopKeyTable" }, - }, -} - -return config diff --git a/iso_files/calamares/branding/hypercube/show.qml b/iso_files/calamares/branding/hypercube/show.qml index 2c5a72d..5a013ba 100644 --- a/iso_files/calamares/branding/hypercube/show.qml +++ b/iso_files/calamares/branding/hypercube/show.qml @@ -135,7 +135,7 @@ Presentation { anchors.horizontalCenter: parent.horizontalCenter spacing: 8 - Text { text: "• Ghostty & WezTerm terminals"; color: "#c0caf5"; font.pixelSize: 14 } + Text { text: "• Ghostty terminal"; color: "#c0caf5"; font.pixelSize: 14 } Text { text: "• Neovim with nightly builds"; color: "#c0caf5"; font.pixelSize: 14 } Text { text: "• Fish shell with Starship prompt"; color: "#c0caf5"; font.pixelSize: 14 } Text { text: "• Lazygit for git workflows"; color: "#c0caf5"; font.pixelSize: 14 } diff --git a/packages/README.md b/packages/README.md new file mode 100644 index 0000000..8461b25 --- /dev/null +++ b/packages/README.md @@ -0,0 +1,331 @@ +# Hypercube COPR Package Setup Guide + +This document lists all packages to configure in the `binarypie/hypercube` COPR repository. + +## COPR Repository Settings + +- **Project Name**: `hypercube` +- **Chroot Targets**: `fedora-43-x86_64` +- **Build Method**: SCM (Source Control Management) + +--- + +## Package Definitions + +For each package, use these settings in COPR: + +- **Type**: SCM +- **Clone URL**: `https://github.com/binarypie-dev/hypercube.git` +- **Committish**: `main` +- **Subdir**: (as listed below) +- **Spec File**: (as listed below) +- **SCM Type**: git + +--- + +## Priority 1: Hyprland Core Libraries + +These must be built first as other packages depend on them. + +### 1. hyprutils + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprutils` | +| Spec File | `hyprutils.spec` | +| Version | 0.11.0 | +| Dependencies | None (base library) | + +--- + +### 2. hyprlang + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprlang` | +| Spec File | `hyprlang.spec` | +| Version | 0.6.7 | +| Dependencies | hyprutils | + +--- + +### 3. hyprwayland-scanner + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprwayland-scanner` | +| Spec File | `hyprwayland-scanner.spec` | +| Version | 0.4.5 | +| Dependencies | None | + +--- + +### 4. hyprgraphics + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprgraphics` | +| Spec File | `hyprgraphics.spec` | +| Version | 0.4.0 | +| Dependencies | hyprutils | + +--- + +### 5. hyprcursor + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprcursor` | +| Spec File | `hyprcursor.spec` | +| Version | 0.1.13 | +| Dependencies | hyprlang | + +--- + +### 6. hyprland-protocols + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprland-protocols` | +| Spec File | `hyprland-protocols.spec` | +| Version | 0.7.0 | +| Dependencies | None | + +--- + +### 7. aquamarine + +| Setting | Value | +|---------|-------| +| Subdir | `packages/aquamarine` | +| Spec File | `aquamarine.spec` | +| Version | 0.10.0 | +| Dependencies | hyprutils, hyprwayland-scanner | + +--- + +### 8. hyprland-qt-support + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprland-qt-support` | +| Spec File | `hyprland-qt-support.spec` | +| Version | 0.1.0 | +| Dependencies | hyprlang | + +--- + +### 9. glaze + +| Setting | Value | +|---------|-------| +| Subdir | `packages/glaze` | +| Spec File | `glaze.spec` | +| Version | 6.1.0 | +| Dependencies | None (header-only library) | +| Notes | Provides glaze-static for hyprland | + +--- + +## Priority 2: Hyprland Compositor & Tools + +Build after core libraries are available. + +### 10. hyprland + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprland` | +| Spec File | `hyprland.spec` | +| Version | 0.52.2 | +| Dependencies | aquamarine, hyprcursor, hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner | + +--- + +### 11. hyprlock + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprlock` | +| Spec File | `hyprlock.spec` | +| Version | 0.9.2 | +| Dependencies | hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner | + +--- + +### 12. hypridle + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hypridle` | +| Spec File | `hypridle.spec` | +| Version | 0.1.7 | +| Dependencies | hyprland-protocols, hyprlang, hyprutils, hyprwayland-scanner | + +--- + +### 13. hyprpaper + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprpaper` | +| Spec File | `hyprpaper.spec` | +| Version | 0.7.6 | +| Dependencies | hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner | + +--- + +### 14. xdg-desktop-portal-hyprland + +| Setting | Value | +|---------|-------| +| Subdir | `packages/xdg-desktop-portal-hyprland` | +| Spec File | `xdg-desktop-portal-hyprland.spec` | +| Version | 1.3.11 | +| Dependencies | hyprland-protocols, hyprlang, hyprutils, hyprwayland-scanner | + +--- + +### 15. hyprpolkitagent + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprpolkitagent` | +| Spec File | `hyprpolkitagent.spec` | +| Version | 0.1.3 | +| Dependencies | hyprutils, hyprland-qt-support | + +--- + +## Priority 3: CLI Tools + +These have no hyprland dependencies and can be built in parallel. + +### 16. eza + +| Setting | Value | +|---------|-------| +| Subdir | `packages/eza` | +| Spec File | `eza.spec` | +| Version | 0.20.21 | +| Dependencies | None | + +--- + +### 17. starship + +| Setting | Value | +|---------|-------| +| Subdir | `packages/starship` | +| Spec File | `starship.spec` | +| Version | 1.24.1 | +| Dependencies | None | + +--- + +### 18. lazygit + +| Setting | Value | +|---------|-------| +| Subdir | `packages/lazygit` | +| Spec File | `lazygit.spec` | +| Version | 0.57.0 | +| Dependencies | None | + +--- + +### 19. ghostty + +| Setting | Value | +|---------|-------| +| Subdir | `packages/ghostty` | +| Spec File | `ghostty.spec` | +| Version | 1.2.3^git (main branch) | +| Dependencies | None | +| Notes | Building from main branch for zig 0.15.2 compatibility | + +--- + +### 20. quickshell + +| Setting | Value | +|---------|-------| +| Subdir | `packages/quickshell` | +| Spec File | `quickshell.spec` | +| Version | 0.2.1 | +| Dependencies | None | + +--- + +### 21. livesys-scripts + +| Setting | Value | +|---------|-------| +| Subdir | `packages/livesys-scripts` | +| Spec File | `livesys-scripts.spec` | +| Version | 0.9.1 | +| Dependencies | None | +| Notes | Source is from Pagure fork, not GitHub | + +--- + +## Build Order Summary + +To ensure dependencies are satisfied, build in this order: + +**Batch 1** (no dependencies): +1. hyprutils +2. hyprwayland-scanner +3. hyprland-protocols +4. glaze +5. eza +6. starship +7. lazygit +8. ghostty +9. quickshell +10. livesys-scripts + +**Batch 2** (depends on Batch 1): +1. hyprlang (needs hyprutils) +2. hyprgraphics (needs hyprutils) +3. aquamarine (needs hyprutils, hyprwayland-scanner) + +**Batch 3** (depends on Batch 2): +1. hyprcursor (needs hyprlang) +2. hyprland-qt-support (needs hyprlang) + +**Batch 4** (depends on Batch 3): +1. hyprland (needs aquamarine, hyprcursor, hyprgraphics, hyprlang, hyprutils, glaze) +2. hyprlock (needs hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner) +3. hypridle (needs hyprland-protocols, hyprlang, hyprutils, hyprwayland-scanner) +4. hyprpaper (needs hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner) +5. xdg-desktop-portal-hyprland (needs hyprland-protocols, hyprlang, hyprutils, hyprwayland-scanner) +6. hyprpolkitagent (needs hyprutils, hyprland-qt-support) + +--- + +## Quick Reference Table + +| # | Package | Subdir | Spec File | Version | +|---|---------|--------|-----------|---------| +| 1 | hyprutils | `packages/hyprutils` | `hyprutils.spec` | 0.11.0 | +| 2 | hyprlang | `packages/hyprlang` | `hyprlang.spec` | 0.6.7 | +| 3 | hyprwayland-scanner | `packages/hyprwayland-scanner` | `hyprwayland-scanner.spec` | 0.4.5 | +| 4 | hyprgraphics | `packages/hyprgraphics` | `hyprgraphics.spec` | 0.4.0 | +| 5 | hyprcursor | `packages/hyprcursor` | `hyprcursor.spec` | 0.1.13 | +| 6 | hyprland-protocols | `packages/hyprland-protocols` | `hyprland-protocols.spec` | 0.7.0 | +| 7 | aquamarine | `packages/aquamarine` | `aquamarine.spec` | 0.10.0 | +| 8 | hyprland-qt-support | `packages/hyprland-qt-support` | `hyprland-qt-support.spec` | 0.1.0 | +| 9 | glaze | `packages/glaze` | `glaze.spec` | 6.1.0 | +| 10 | hyprland | `packages/hyprland` | `hyprland.spec` | 0.52.2 | +| 11 | hyprlock | `packages/hyprlock` | `hyprlock.spec` | 0.9.2 | +| 12 | hypridle | `packages/hypridle` | `hypridle.spec` | 0.1.7 | +| 13 | hyprpaper | `packages/hyprpaper` | `hyprpaper.spec` | 0.7.6 | +| 14 | xdg-desktop-portal-hyprland | `packages/xdg-desktop-portal-hyprland` | `xdg-desktop-portal-hyprland.spec` | 1.3.11 | +| 15 | hyprpolkitagent | `packages/hyprpolkitagent` | `hyprpolkitagent.spec` | 0.1.3 | +| 16 | eza | `packages/eza` | `eza.spec` | 0.20.21 | +| 17 | starship | `packages/starship` | `starship.spec` | 1.24.1 | +| 18 | lazygit | `packages/lazygit` | `lazygit.spec` | 0.57.0 | +| 19 | ghostty | `packages/ghostty` | `ghostty.spec` | 1.2.3^git | +| 20 | quickshell | `packages/quickshell` | `quickshell.spec` | 0.2.1 | +| 21 | livesys-scripts | `packages/livesys-scripts` | `livesys-scripts.spec` | 0.9.1 | diff --git a/system_files/shared/usr/share/ublue-os/just/60-custom.just b/system_files/shared/usr/share/ublue-os/just/60-custom.just index 3d6aed2..98b6691 100644 --- a/system_files/shared/usr/share/ublue-os/just/60-custom.just +++ b/system_files/shared/usr/share/ublue-os/just/60-custom.just @@ -14,7 +14,6 @@ hypercube-config-reset: echo "" echo "Configs that will be reset:" echo " - Ghostty (~/.config/ghostty/)" - echo " - Wezterm (~/.config/wezterm/)" echo "" echo "You can restore your old configs from the backup directory at any time." echo "" @@ -49,7 +48,6 @@ hypercube-config-reset: # Backup existing configs backup_and_reset "ghostty" "Ghostty" - backup_and_reset "wezterm" "Wezterm" echo "" echo "Creating Hypercube config stubs..." @@ -67,22 +65,6 @@ config-file = /usr/share/hypercube/config/ghostty/config EOF echo " Created Ghostty config stub" - # Create Wezterm stub - mkdir -p "$HOME/.config/wezterm" - cat > "$HOME/.config/wezterm/wezterm.lua" << 'EOF' --- Hypercube Wezterm Configuration --- System defaults are loaded below. Add your customizations after this line. --- To replace defaults entirely, remove the dofile line and start fresh. - -local config = dofile("/usr/share/hypercube/config/wezterm/wezterm.lua") - --- Your customizations below: --- Example: config.font_size = 14 - -return config -EOF - echo " Created Wezterm config stub" - echo "" echo "Done! Your old configs have been backed up to:" echo " $BACKUP_DIR" From ac9af23b0cb33b05f25bb47d996759169a6ed940 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:34:31 -0800 Subject: [PATCH 15/27] Install ghostty from copr --- build_files/hyprland/01-hyprland-desktop.sh | 3 +- packages/ghostty/ghostty.spec | 104 -------------------- 2 files changed, 2 insertions(+), 105 deletions(-) delete mode 100644 packages/ghostty/ghostty.spec diff --git a/build_files/hyprland/01-hyprland-desktop.sh b/build_files/hyprland/01-hyprland-desktop.sh index 8348790..183cdab 100755 --- a/build_files/hyprland/01-hyprland-desktop.sh +++ b/build_files/hyprland/01-hyprland-desktop.sh @@ -46,7 +46,8 @@ dnf5 -y install \ ### Fish Shell (set as default) dnf5 -y install fish -### Terminal - Ghostty (from Hypercube COPR) +### Terminal - Ghostty (from scottames COPR) +dnf5 -y copr enable scottames/ghostty dnf5 -y install ghostty ### Editor - Neovim nightly (from agriffis COPR) diff --git a/packages/ghostty/ghostty.spec b/packages/ghostty/ghostty.spec deleted file mode 100644 index 984d74e..0000000 --- a/packages/ghostty/ghostty.spec +++ /dev/null @@ -1,104 +0,0 @@ -# NOTE: This package requires "Enable internet access during builds" in COPR settings -# Building from main branch commit that supports zig 0.15.2 (Fedora 43) - -%global commit ab3a3805aa2db46eafc8c7a497df24665fa5e21b -%global shortcommit %(c=%{commit}; echo ${c:0:7}) -%global commitdate 20251216 - -Name: ghostty -Version: 1.2.3^%{commitdate}git%{shortcommit} -Release: 1%{?dist} -Summary: Fast, feature-rich, and cross-platform terminal emulator - -License: MIT -URL: https://github.com/ghostty-org/ghostty -Source0: %{url}/archive/%{commit}/%{name}-%{shortcommit}.tar.gz - -ExclusiveArch: x86_64 aarch64 - -BuildRequires: blueprint-compiler -BuildRequires: fontconfig-devel -BuildRequires: freetype-devel -BuildRequires: glib2-devel -BuildRequires: gtk4-devel -BuildRequires: gtk4-layer-shell-devel -BuildRequires: harfbuzz-devel -BuildRequires: libadwaita-devel -BuildRequires: libpng-devel -BuildRequires: oniguruma-devel -BuildRequires: pandoc-cli -BuildRequires: pixman-devel -BuildRequires: pkg-config -BuildRequires: wayland-protocols-devel -BuildRequires: zig -BuildRequires: zlib-ng-devel - -Requires: fontconfig -Requires: freetype -Requires: glib2 -Requires: gtk4 -Requires: harfbuzz -Requires: libadwaita -Requires: libpng -Requires: oniguruma -Requires: pixman -Requires: zlib-ng - -%description -Ghostty is a terminal emulator that differentiates itself by being both -fast and feature-rich. It uses platform-native UI and GPU acceleration. - -%prep -%setup -q -n %{name}-%{commit} - -%build -zig build \ - --summary all \ - --prefix "%{_prefix}" \ - -Dversion-string=%{version}-%{release} \ - -Doptimize=ReleaseFast \ - -Dcpu=baseline \ - -Dpie=true \ - -Demit-docs - -%install -DESTDIR=%{buildroot} zig build install \ - --prefix "%{_prefix}" \ - -Dversion-string=%{version}-%{release} \ - -Doptimize=ReleaseFast \ - -Dcpu=baseline \ - -Dpie=true \ - -Demit-docs - -# Remove terminfo that conflicts with ncurses -rm -f "%{buildroot}%{_datadir}/terminfo/g/ghostty" - -%files -%license LICENSE -%{_bindir}/ghostty -%{_datadir}/applications/com.mitchellh.ghostty.desktop -%{_datadir}/bash-completion/completions/ghostty.bash -%{_datadir}/bat/syntaxes/ghostty.sublime-syntax -%{_datadir}/fish/vendor_completions.d/ghostty.fish -%{_datadir}/ghostty/ -%{_datadir}/icons/hicolor/*/apps/com.mitchellh.ghostty.png -%{_datadir}/kio/servicemenus/com.mitchellh.ghostty.desktop -%{_datadir}/man/man1/ghostty.1* -%{_datadir}/man/man5/ghostty.5* -%{_datadir}/nautilus-python/extensions/ghostty.py -%{_datadir}/nvim/site/compiler/ghostty.vim -%{_datadir}/nvim/site/ftdetect/ghostty.vim -%{_datadir}/nvim/site/ftplugin/ghostty.vim -%{_datadir}/nvim/site/syntax/ghostty.vim -%{_datadir}/vim/vimfiles/compiler/ghostty.vim -%{_datadir}/vim/vimfiles/ftdetect/ghostty.vim -%{_datadir}/vim/vimfiles/ftplugin/ghostty.vim -%{_datadir}/vim/vimfiles/syntax/ghostty.vim -%{_datadir}/zsh/site-functions/_ghostty -%{_datadir}/dbus-1/services/com.mitchellh.ghostty.service -%{_datadir}/locale/*/LC_MESSAGES/com.mitchellh.ghostty.mo -%{_datadir}/metainfo/com.mitchellh.ghostty.metainfo.xml - -%changelog -* Mon Dec 16 2024 Hypercube - 1.2.3-1 -- Initial package for Hypercube From 5c49ede3bcbe649eba77f844bca134a76e6217fe Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 13:37:38 -0800 Subject: [PATCH 16/27] Add qs to quickshell --- packages/quickshell/quickshell.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/quickshell/quickshell.spec b/packages/quickshell/quickshell.spec index 790fc00..5a81a89 100644 --- a/packages/quickshell/quickshell.spec +++ b/packages/quickshell/quickshell.spec @@ -73,6 +73,7 @@ managers. It supports Hyprland, Sway, and other Wayland compositors. %license LICENSE LICENSE-GPL %doc README.md %{_bindir}/%{name} +%{_bindir}/qs %{_datadir}/applications/org.quickshell.desktop %{_datadir}/icons/hicolor/scalable/apps/org.quickshell.svg From 095aa4945cef8856745c80ced0a9cc8c9d5d1972 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 14:11:39 -0800 Subject: [PATCH 17/27] Add UWSM --- packages/README.md | 74 +++++++++++++++++++++--------------- packages/uwsm/uwsm.spec | 83 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 127 insertions(+), 30 deletions(-) create mode 100644 packages/uwsm/uwsm.spec diff --git a/packages/README.md b/packages/README.md index 8461b25..a7c6a4b 100644 --- a/packages/README.md +++ b/packages/README.md @@ -127,11 +127,23 @@ These must be built first as other packages depend on them. --- +### 10. uwsm + +| Setting | Value | +|---------|-------| +| Subdir | `packages/uwsm` | +| Spec File | `uwsm.spec` | +| Version | 0.23.3 | +| Dependencies | None (Python-based, uses system packages) | +| Notes | Universal Wayland Session Manager, required by hyprland-uwsm subpackage | + +--- + ## Priority 2: Hyprland Compositor & Tools Build after core libraries are available. -### 10. hyprland +### 11. hyprland | Setting | Value | |---------|-------| @@ -142,7 +154,7 @@ Build after core libraries are available. --- -### 11. hyprlock +### 12. hyprlock | Setting | Value | |---------|-------| @@ -153,7 +165,7 @@ Build after core libraries are available. --- -### 12. hypridle +### 13. hypridle | Setting | Value | |---------|-------| @@ -164,7 +176,7 @@ Build after core libraries are available. --- -### 13. hyprpaper +### 14. hyprpaper | Setting | Value | |---------|-------| @@ -175,7 +187,7 @@ Build after core libraries are available. --- -### 14. xdg-desktop-portal-hyprland +### 15. xdg-desktop-portal-hyprland | Setting | Value | |---------|-------| @@ -186,7 +198,7 @@ Build after core libraries are available. --- -### 15. hyprpolkitagent +### 16. hyprpolkitagent | Setting | Value | |---------|-------| @@ -201,7 +213,7 @@ Build after core libraries are available. These have no hyprland dependencies and can be built in parallel. -### 16. eza +### 17. eza | Setting | Value | |---------|-------| @@ -212,7 +224,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 17. starship +### 18. starship | Setting | Value | |---------|-------| @@ -223,7 +235,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 18. lazygit +### 19. lazygit | Setting | Value | |---------|-------| @@ -234,7 +246,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 19. ghostty +### 20. ghostty | Setting | Value | |---------|-------| @@ -246,7 +258,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 20. quickshell +### 21. quickshell | Setting | Value | |---------|-------| @@ -257,7 +269,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 21. livesys-scripts +### 22. livesys-scripts | Setting | Value | |---------|-------| @@ -278,12 +290,13 @@ To ensure dependencies are satisfied, build in this order: 2. hyprwayland-scanner 3. hyprland-protocols 4. glaze -5. eza -6. starship -7. lazygit -8. ghostty -9. quickshell -10. livesys-scripts +5. uwsm +6. eza +7. starship +8. lazygit +9. ghostty +10. quickshell +11. livesys-scripts **Batch 2** (depends on Batch 1): 1. hyprlang (needs hyprutils) @@ -317,15 +330,16 @@ To ensure dependencies are satisfied, build in this order: | 7 | aquamarine | `packages/aquamarine` | `aquamarine.spec` | 0.10.0 | | 8 | hyprland-qt-support | `packages/hyprland-qt-support` | `hyprland-qt-support.spec` | 0.1.0 | | 9 | glaze | `packages/glaze` | `glaze.spec` | 6.1.0 | -| 10 | hyprland | `packages/hyprland` | `hyprland.spec` | 0.52.2 | -| 11 | hyprlock | `packages/hyprlock` | `hyprlock.spec` | 0.9.2 | -| 12 | hypridle | `packages/hypridle` | `hypridle.spec` | 0.1.7 | -| 13 | hyprpaper | `packages/hyprpaper` | `hyprpaper.spec` | 0.7.6 | -| 14 | xdg-desktop-portal-hyprland | `packages/xdg-desktop-portal-hyprland` | `xdg-desktop-portal-hyprland.spec` | 1.3.11 | -| 15 | hyprpolkitagent | `packages/hyprpolkitagent` | `hyprpolkitagent.spec` | 0.1.3 | -| 16 | eza | `packages/eza` | `eza.spec` | 0.20.21 | -| 17 | starship | `packages/starship` | `starship.spec` | 1.24.1 | -| 18 | lazygit | `packages/lazygit` | `lazygit.spec` | 0.57.0 | -| 19 | ghostty | `packages/ghostty` | `ghostty.spec` | 1.2.3^git | -| 20 | quickshell | `packages/quickshell` | `quickshell.spec` | 0.2.1 | -| 21 | livesys-scripts | `packages/livesys-scripts` | `livesys-scripts.spec` | 0.9.1 | +| 10 | uwsm | `packages/uwsm` | `uwsm.spec` | 0.23.3 | +| 11 | hyprland | `packages/hyprland` | `hyprland.spec` | 0.52.2 | +| 12 | hyprlock | `packages/hyprlock` | `hyprlock.spec` | 0.9.2 | +| 13 | hypridle | `packages/hypridle` | `hypridle.spec` | 0.1.7 | +| 14 | hyprpaper | `packages/hyprpaper` | `hyprpaper.spec` | 0.7.6 | +| 15 | xdg-desktop-portal-hyprland | `packages/xdg-desktop-portal-hyprland` | `xdg-desktop-portal-hyprland.spec` | 1.3.11 | +| 16 | hyprpolkitagent | `packages/hyprpolkitagent` | `hyprpolkitagent.spec` | 0.1.3 | +| 17 | eza | `packages/eza` | `eza.spec` | 0.20.21 | +| 18 | starship | `packages/starship` | `starship.spec` | 1.24.1 | +| 19 | lazygit | `packages/lazygit` | `lazygit.spec` | 0.57.0 | +| 20 | ghostty | `packages/ghostty` | `ghostty.spec` | 1.2.3^git | +| 21 | quickshell | `packages/quickshell` | `quickshell.spec` | 0.2.1 | +| 22 | livesys-scripts | `packages/livesys-scripts` | `livesys-scripts.spec` | 0.9.1 | diff --git a/packages/uwsm/uwsm.spec b/packages/uwsm/uwsm.spec new file mode 100644 index 0000000..1defefb --- /dev/null +++ b/packages/uwsm/uwsm.spec @@ -0,0 +1,83 @@ +Name: uwsm +Version: 0.23.3 +Release: 1%{?dist} +Summary: Universal Wayland Session Manager + +License: MIT +URL: https://github.com/Vladimir-csp/uwsm +Source0: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz +BuildArch: noarch + +BuildRequires: desktop-file-utils +BuildRequires: meson +BuildRequires: python-rpm-macros +BuildRequires: python3 +BuildRequires: python3-dbus +BuildRequires: python3-pyxdg +BuildRequires: scdoc +BuildRequires: systemd-rpm-macros + +Requires: python3 +Requires: python3-dbus +Requires: python3-pyxdg +Requires: util-linux + +Recommends: /usr/bin/notify-send +Recommends: /usr/bin/whiptail +Recommends: wofi + +%description +Wraps standalone Wayland compositors into a set of Systemd units on the fly. +This provides robust session management including environment, XDG autostart +support, bi-directional binding with login session, and clean shutdown. +For compositors this is an opportunity to offload Systemd integration and +session/XDG autostart management in Systemd-managed environments. + +%prep +%autosetup -p1 + +%build +%meson -Duuctl=enabled -Dfumon=enabled -Duwsm-app=enabled +%meson_build + +%install +%meson_install +%py_byte_compile %{python3} %{buildroot}%{_datadir}/%{name}/modules + +%check +desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop + +%post +%systemd_user_post fumon.service + +%preun +%systemd_user_preun fumon.service + +%postun +%systemd_user_postun fumon.service + +%files +%doc %{_docdir}/%{name}/ +%license LICENSE +%{_bindir}/%{name} +%{_bindir}/%{name}-app +%{_bindir}/%{name}-terminal +%{_bindir}/%{name}-terminal-scope +%{_bindir}/%{name}-terminal-service +%{_bindir}/fumon +%{_bindir}/uuctl +%{_datadir}/%{name}/ +%{_datadir}/applications/uuctl.desktop +%{_mandir}/man1/%{name}.1.* +%{_mandir}/man1/fumon.1.* +%{_mandir}/man1/uuctl.1.* +%{_mandir}/man1/uwsm-app.1.* +%{_mandir}/man3/%{name}-plugins.3.* +%{_userunitdir}/fumon.service +%{_userunitdir}/*-graphical.slice +%{_userunitdir}/wayland-*.service +%{_userunitdir}/wayland-*.target + +%changelog +* Mon Dec 16 2024 Hypercube - 0.23.3-1 +- Initial package for Hypercube (based on solopasha/hyprland COPR) From 99203e1a8517837559b3dfeb83830f2c352a2209 Mon Sep 17 00:00:00 2001 From: binarypie Date: Tue, 16 Dec 2025 16:18:40 -0800 Subject: [PATCH 18/27] Added hyprland support to Titanoboa --- .github/workflows/build-disk.yml | 7 ++-- Justfile | 35 +++++++++++----- flatpaks/system-flatpaks.list | 1 + iso_files/configure_live_session.sh | 63 ----------------------------- 4 files changed, 30 insertions(+), 76 deletions(-) create mode 100644 flatpaks/system-flatpaks.list delete mode 100755 iso_files/configure_live_session.sh diff --git a/.github/workflows/build-disk.yml b/.github/workflows/build-disk.yml index caa016f..74d4956 100644 --- a/.github/workflows/build-disk.yml +++ b/.github/workflows/build-disk.yml @@ -53,13 +53,14 @@ jobs: - name: Build ISO id: build - uses: ublue-os/titanoboa@main + uses: binarypie-dev/titanoboa@main with: image-ref: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ matrix.variant.tag }} iso-dest: ${{ github.workspace }}/output.iso builder-distro: fedora - livesys: false - hook-post-rootfs: ${{ github.workspace }}/iso_files/configure_live_session.sh + livesys: true + livesys-repo: binarypie/hypercube + flatpaks-list: ${{ github.workspace }}/flatpaks/system-flatpaks.list - name: Rename ISO and generate checksum id: rename diff --git a/Justfile b/Justfile index 6bbd8c7..3e3d5bf 100644 --- a/Justfile +++ b/Justfile @@ -1,11 +1,10 @@ # Hypercube Build System -# Aligned with Bluefin patterns for consistency # Configuration export repo_organization := env("REPO_ORGANIZATION", "binarypie-dev") export image_name := env("IMAGE_NAME", "hypercube") -export base_image := env("BASE_IMAGE", "ghcr.io/ublue-os/bluefin-dx") -export base_image_nvidia := env("BASE_IMAGE_NVIDIA", "ghcr.io/ublue-os/bluefin-dx-nvidia") +export base_image := env("BASE_IMAGE", "ghcr.io/ublue-os/base-main") +export base_image_nvidia := env("BASE_IMAGE_NVIDIA", "ghcr.io/ublue-os/base-nvidia") export default_tag := env("DEFAULT_TAG", "stable-daily") # Runtime detection @@ -117,7 +116,7 @@ _titanoboa-setup: git -C _titanoboa pull --ff-only || true else echo "Cloning Titanoboa..." - git clone --depth 1 "https://github.com/ublue-os/titanoboa.git" _titanoboa + git clone --depth 1 "https://github.com/binarypie-dev/titanoboa.git" _titanoboa fi # Patch Titanoboa to use --policy=missing for local image builds sed -i 's/PODMAN }} pull /PODMAN }} pull --policy=missing /' _titanoboa/Justfile @@ -157,10 +156,18 @@ build-iso flavor="main": _titanoboa-setup fi # Build ISO with Titanoboa - # livesys=0 skips Fedora livesys scripts (we use Calamares instead) - # hook-post-rootfs sets up live user, Calamares, and auto-login + # livesys=1 enables livesys-scripts from binarypie/hypercube COPR (includes Hyprland support) + # Parameters (positional): image livesys flatpaks_file compression extra_kargs container_image polkit livesys_repo cd _titanoboa - {{ SUDO }} HOOK_POST_ROOTFS="${PWD}/../iso_files/configure_live_session.sh" just build "${IMAGE_FULL}" livesys=0 + {{ SUDO }} just build \ + "${IMAGE_FULL}" \ + 1 \ + "${PWD}/../flatpaks/system-flatpaks.list" \ + squashfs \ + NONE \ + "${IMAGE_FULL}" \ + 1 \ + binarypie/hypercube # Fix ownership if [[ "${UID}" -gt 0 ]]; then @@ -199,10 +206,18 @@ build-iso-ghcr flavor="main": _titanoboa-setup echo "Building ISO for ${IMAGE_FULL}..." - # livesys=0 skips Fedora livesys scripts (we use Calamares instead) - # hook-post-rootfs sets up live user, Calamares, and auto-login + # livesys=1 enables livesys-scripts from binarypie/hypercube COPR (includes Hyprland support) + # Parameters (positional): image livesys flatpaks_file compression extra_kargs container_image polkit livesys_repo cd _titanoboa - {{ SUDO }} HOOK_POST_ROOTFS="${PWD}/../iso_files/configure_live_session.sh" just build "${IMAGE_FULL}" livesys=0 + {{ SUDO }} just build \ + "${IMAGE_FULL}" \ + 1 \ + "${PWD}/../flatpaks/system-flatpaks.list" \ + squashfs \ + NONE \ + "${IMAGE_FULL}" \ + 1 \ + binarypie/hypercube if [[ "${UID}" -gt 0 ]]; then {{ SUDO }} chown "${UID}:$(id -g)" -R "${PWD}" diff --git a/flatpaks/system-flatpaks.list b/flatpaks/system-flatpaks.list new file mode 100644 index 0000000..0c5aeec --- /dev/null +++ b/flatpaks/system-flatpaks.list @@ -0,0 +1 @@ +# Hypercube System Flatpaks diff --git a/iso_files/configure_live_session.sh b/iso_files/configure_live_session.sh deleted file mode 100755 index 83459c4..0000000 --- a/iso_files/configure_live_session.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash -set -euxo pipefail - -# Hypercube ISO Live Session Setup -# Since livesys-scripts doesn't support Hyprland yet, we do the setup manually -# -# NOTE: This script runs inside titanoboa's chroot with livesys=0 -# -# TODO: Once https://pagure.io/livesys-scripts merges Hyprland support, -# we can remove this and use livesys=1 - -echo "Setting up Hypercube live session..." - -### Install livesys-scripts (we'll run the Hyprland session setup manually) -dnf5 -y install livesys-scripts - -### Configure livesys for Hyprland -sed -i 's/^livesys_session=.*/livesys_session=hyprland/' /etc/sysconfig/livesys - -### Install Hyprland session file for livesys-scripts -mkdir -p /usr/libexec/livesys/sessions.d -cat > /usr/libexec/livesys/sessions.d/livesys-hyprland << 'SESSION_EOF' -#!/bin/sh -# -# livesys-hyprland: hyprland specific setup for livesys -# SPDX-License-Identifier: GPL-3.0-or-later -# - -HYPRLAND_SESSION_FILE="hyprland.desktop" - -# set up autologin for user liveuser using greetd -if [ -f /etc/greetd/config.toml ]; then - cat > /etc/greetd/config.toml << GREETD_EOF -[terminal] -vt = 1 - -[default_session] -command = "Hyprland" -user = "liveuser" -GREETD_EOF -fi - -# Show harddisk install on the desktop -if [ -f /usr/share/applications/liveinst.desktop ]; then - sed -i -e 's/NoDisplay=true/NoDisplay=false/' /usr/share/applications/liveinst.desktop -fi -mkdir -p /home/liveuser/Desktop -SESSION_EOF - -chmod +x /usr/libexec/livesys/sessions.d/livesys-hyprland - -### Enable livesys services -systemctl enable livesys.service livesys-late.service - -### Create livesys-session-extra tmpfiles config -echo "C /var/lib/livesys/livesys-session-extra 0755 root root - /usr/share/factory/var/lib/livesys/livesys-session-extra" > \ - /usr/lib/tmpfiles.d/livesys-session-extra.conf - -### Mark this as a live session -mkdir -p /var/lib/hypercube -touch /var/lib/hypercube/live-session - -echo "Hypercube live session setup complete" From 4623547818ff2ab93c024efaeb66f2405efd6596 Mon Sep 17 00:00:00 2001 From: binarypie Date: Thu, 18 Dec 2025 14:31:15 -0800 Subject: [PATCH 19/27] Required packages --- .../hyprland-guiutils/hyprland-guiutils.spec | 48 ++++++++++++++ packages/hyprtoolkit/hyprtoolkit.spec | 65 +++++++++++++++++++ 2 files changed, 113 insertions(+) create mode 100644 packages/hyprland-guiutils/hyprland-guiutils.spec create mode 100644 packages/hyprtoolkit/hyprtoolkit.spec diff --git a/packages/hyprland-guiutils/hyprland-guiutils.spec b/packages/hyprland-guiutils/hyprland-guiutils.spec new file mode 100644 index 0000000..2e8b30d --- /dev/null +++ b/packages/hyprland-guiutils/hyprland-guiutils.spec @@ -0,0 +1,48 @@ +Name: hyprland-guiutils +Version: 0.2.0 +Release: 1%{?dist} +Summary: Hyprland GUI utilities (successor to hyprland-qtutils) + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprland-guiutils +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprtoolkit) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(pixman-1) +BuildRequires: pkgconfig(xkbcommon) + +Requires: hyprtoolkit%{?_isa} + +%description +%{summary}. Includes utilities: dialog, donate-screen, run, update-screen, +and welcome. + +%prep +%autosetup -p1 + +%build +%cmake -DCMAKE_BUILD_TYPE=Release +%cmake_build + +%install +%cmake_install + +%files +%license LICENSE +%doc README.md +%{_bindir}/hyprland-dialog +%{_bindir}/hyprland-donate-screen +%{_bindir}/hyprland-run +%{_bindir}/hyprland-update-screen +%{_bindir}/hyprland-welcome + +%changelog +* Wed Dec 18 2024 Hypercube - 0.2.0-1 +- Initial package for Hypercube diff --git a/packages/hyprtoolkit/hyprtoolkit.spec b/packages/hyprtoolkit/hyprtoolkit.spec new file mode 100644 index 0000000..1174a61 --- /dev/null +++ b/packages/hyprtoolkit/hyprtoolkit.spec @@ -0,0 +1,65 @@ +Name: hyprtoolkit +Version: 0.4.1 +Release: 1%{?dist} +Summary: A modern C++ Wayland-native GUI toolkit + +License: BSD-3-Clause +URL: https://github.com/hyprwm/hyprtoolkit +Source: %{url}/archive/v%{version}/%{name}-%{version}.tar.gz + +ExcludeArch: %{ix86} + +BuildRequires: cmake +BuildRequires: gcc-c++ +BuildRequires: mesa-libGLES-devel +BuildRequires: pkgconfig(aquamarine) +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(egl) +BuildRequires: pkgconfig(gbm) +BuildRequires: pkgconfig(hyprgraphics) +BuildRequires: pkgconfig(hyprlang) +BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(hyprwayland-scanner) +BuildRequires: pkgconfig(iniparser) +BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(pango) +BuildRequires: pkgconfig(pangocairo) +BuildRequires: pkgconfig(pixman-1) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-protocols) +BuildRequires: pkgconfig(xkbcommon) + +%description +%{summary}. + +%package devel +Summary: Development files for %{name} +Requires: %{name}%{?_isa} = %{version}-%{release} + +%description devel +Development files for %{name}. + +%prep +%autosetup -p1 + +%build +%cmake -DCMAKE_BUILD_TYPE=Release +%cmake_build + +%install +%cmake_install + +%files +%license LICENSE +%doc README.md +%{_libdir}/lib%{name}.so.0 +%{_libdir}/lib%{name}.so.%{version} + +%files devel +%{_includedir}/%{name}/ +%{_libdir}/lib%{name}.so +%{_libdir}/pkgconfig/%{name}.pc + +%changelog +* Wed Dec 18 2024 Hypercube - 0.4.1-1 +- Initial package for Hypercube From e4c5fdb4bfab9d1dd74cb63e020f16b4a5975464 Mon Sep 17 00:00:00 2001 From: binarypie Date: Thu, 18 Dec 2025 14:42:04 -0800 Subject: [PATCH 20/27] Updated hyprtoolkit build --- packages/hyprtoolkit/hyprtoolkit.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hyprtoolkit/hyprtoolkit.spec b/packages/hyprtoolkit/hyprtoolkit.spec index 1174a61..14d3937 100644 --- a/packages/hyprtoolkit/hyprtoolkit.spec +++ b/packages/hyprtoolkit/hyprtoolkit.spec @@ -52,7 +52,7 @@ Development files for %{name}. %files %license LICENSE %doc README.md -%{_libdir}/lib%{name}.so.0 +%{_libdir}/lib%{name}.so.4 %{_libdir}/lib%{name}.so.%{version} %files devel From 94afa667db515219c34ddc68fb5cb5f7e09d683a Mon Sep 17 00:00:00 2001 From: binarypie Date: Thu, 18 Dec 2025 14:51:15 -0800 Subject: [PATCH 21/27] Updated gui utils --- packages/hyprland-guiutils/hyprland-guiutils.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hyprland-guiutils/hyprland-guiutils.spec b/packages/hyprland-guiutils/hyprland-guiutils.spec index 2e8b30d..c882b3d 100644 --- a/packages/hyprland-guiutils/hyprland-guiutils.spec +++ b/packages/hyprland-guiutils/hyprland-guiutils.spec @@ -11,6 +11,7 @@ ExcludeArch: %{ix86} BuildRequires: cmake BuildRequires: gcc-c++ +BuildRequires: pkgconfig(aquamarine) BuildRequires: pkgconfig(hyprlang) BuildRequires: pkgconfig(hyprtoolkit) BuildRequires: pkgconfig(hyprutils) From 0e12f806a1c68b6926defa7db29aca7bfe3748e9 Mon Sep 17 00:00:00 2001 From: binarypie Date: Thu, 18 Dec 2025 14:53:27 -0800 Subject: [PATCH 22/27] updated readme --- packages/README.md | 54 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 12 deletions(-) diff --git a/packages/README.md b/packages/README.md index a7c6a4b..dfe20db 100644 --- a/packages/README.md +++ b/packages/README.md @@ -209,11 +209,35 @@ Build after core libraries are available. --- +### 17. hyprtoolkit + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprtoolkit` | +| Spec File | `hyprtoolkit.spec` | +| Version | 0.4.1 | +| Dependencies | aquamarine, hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner | +| Notes | Modern C++ Wayland-native GUI toolkit for Hyprland utilities | + +--- + +### 18. hyprland-guiutils + +| Setting | Value | +|---------|-------| +| Subdir | `packages/hyprland-guiutils` | +| Spec File | `hyprland-guiutils.spec` | +| Version | 0.2.0 | +| Dependencies | aquamarine, hyprtoolkit, hyprlang, hyprutils | +| Notes | Successor to hyprland-qtutils. Provides dialog, donate-screen, run, update-screen, welcome utilities | + +--- + ## Priority 3: CLI Tools These have no hyprland dependencies and can be built in parallel. -### 17. eza +### 19. eza | Setting | Value | |---------|-------| @@ -224,7 +248,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 18. starship +### 20. starship | Setting | Value | |---------|-------| @@ -235,7 +259,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 19. lazygit +### 21. lazygit | Setting | Value | |---------|-------| @@ -246,7 +270,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 20. ghostty +### 22. ghostty | Setting | Value | |---------|-------| @@ -258,7 +282,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 21. quickshell +### 23. quickshell | Setting | Value | |---------|-------| @@ -269,7 +293,7 @@ These have no hyprland dependencies and can be built in parallel. --- -### 22. livesys-scripts +### 24. livesys-scripts | Setting | Value | |---------|-------| @@ -314,6 +338,10 @@ To ensure dependencies are satisfied, build in this order: 4. hyprpaper (needs hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner) 5. xdg-desktop-portal-hyprland (needs hyprland-protocols, hyprlang, hyprutils, hyprwayland-scanner) 6. hyprpolkitagent (needs hyprutils, hyprland-qt-support) +7. hyprtoolkit (needs aquamarine, hyprgraphics, hyprlang, hyprutils, hyprwayland-scanner) + +**Batch 5** (depends on Batch 4): +1. hyprland-guiutils (needs aquamarine, hyprtoolkit, hyprlang, hyprutils) --- @@ -337,9 +365,11 @@ To ensure dependencies are satisfied, build in this order: | 14 | hyprpaper | `packages/hyprpaper` | `hyprpaper.spec` | 0.7.6 | | 15 | xdg-desktop-portal-hyprland | `packages/xdg-desktop-portal-hyprland` | `xdg-desktop-portal-hyprland.spec` | 1.3.11 | | 16 | hyprpolkitagent | `packages/hyprpolkitagent` | `hyprpolkitagent.spec` | 0.1.3 | -| 17 | eza | `packages/eza` | `eza.spec` | 0.20.21 | -| 18 | starship | `packages/starship` | `starship.spec` | 1.24.1 | -| 19 | lazygit | `packages/lazygit` | `lazygit.spec` | 0.57.0 | -| 20 | ghostty | `packages/ghostty` | `ghostty.spec` | 1.2.3^git | -| 21 | quickshell | `packages/quickshell` | `quickshell.spec` | 0.2.1 | -| 22 | livesys-scripts | `packages/livesys-scripts` | `livesys-scripts.spec` | 0.9.1 | +| 17 | hyprtoolkit | `packages/hyprtoolkit` | `hyprtoolkit.spec` | 0.4.1 | +| 18 | hyprland-guiutils | `packages/hyprland-guiutils` | `hyprland-guiutils.spec` | 0.2.0 | +| 19 | eza | `packages/eza` | `eza.spec` | 0.20.21 | +| 20 | starship | `packages/starship` | `starship.spec` | 1.24.1 | +| 21 | lazygit | `packages/lazygit` | `lazygit.spec` | 0.57.0 | +| 22 | ghostty | `packages/ghostty` | `ghostty.spec` | 1.2.3^git | +| 23 | quickshell | `packages/quickshell` | `quickshell.spec` | 0.2.1 | +| 24 | livesys-scripts | `packages/livesys-scripts` | `livesys-scripts.spec` | 0.9.1 | From 854aabaf005da9348b3a8ac1c7f399f9f3b7f018 Mon Sep 17 00:00:00 2001 From: binarypie Date: Thu, 18 Dec 2025 14:55:02 -0800 Subject: [PATCH 23/27] add graphics to gui utils --- packages/hyprland-guiutils/hyprland-guiutils.spec | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/hyprland-guiutils/hyprland-guiutils.spec b/packages/hyprland-guiutils/hyprland-guiutils.spec index c882b3d..f93d4db 100644 --- a/packages/hyprland-guiutils/hyprland-guiutils.spec +++ b/packages/hyprland-guiutils/hyprland-guiutils.spec @@ -12,6 +12,7 @@ ExcludeArch: %{ix86} BuildRequires: cmake BuildRequires: gcc-c++ BuildRequires: pkgconfig(aquamarine) +BuildRequires: pkgconfig(hyprgraphics) BuildRequires: pkgconfig(hyprlang) BuildRequires: pkgconfig(hyprtoolkit) BuildRequires: pkgconfig(hyprutils) From 37966bd02d48f6cfce90de219dd86d3d0beec3fa Mon Sep 17 00:00:00 2001 From: binarypie Date: Thu, 18 Dec 2025 14:57:57 -0800 Subject: [PATCH 24/27] all the dependencies --- packages/hyprland-guiutils/hyprland-guiutils.spec | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/packages/hyprland-guiutils/hyprland-guiutils.spec b/packages/hyprland-guiutils/hyprland-guiutils.spec index f93d4db..fe306bd 100644 --- a/packages/hyprland-guiutils/hyprland-guiutils.spec +++ b/packages/hyprland-guiutils/hyprland-guiutils.spec @@ -11,13 +11,22 @@ ExcludeArch: %{ix86} BuildRequires: cmake BuildRequires: gcc-c++ +BuildRequires: mesa-libGLES-devel BuildRequires: pkgconfig(aquamarine) +BuildRequires: pkgconfig(cairo) +BuildRequires: pkgconfig(egl) +BuildRequires: pkgconfig(gbm) BuildRequires: pkgconfig(hyprgraphics) BuildRequires: pkgconfig(hyprlang) BuildRequires: pkgconfig(hyprtoolkit) BuildRequires: pkgconfig(hyprutils) +BuildRequires: pkgconfig(iniparser) BuildRequires: pkgconfig(libdrm) +BuildRequires: pkgconfig(pango) +BuildRequires: pkgconfig(pangocairo) BuildRequires: pkgconfig(pixman-1) +BuildRequires: pkgconfig(wayland-client) +BuildRequires: pkgconfig(wayland-protocols) BuildRequires: pkgconfig(xkbcommon) Requires: hyprtoolkit%{?_isa} From 913fd5b1b6ea1d1dbdbfbeb80a840211274dfe6f Mon Sep 17 00:00:00 2001 From: binarypie Date: Sun, 21 Dec 2025 10:06:26 -0800 Subject: [PATCH 25/27] live iso works --- .github/workflows/build-disk.yml | 1 + .gitignore | 1 + Justfile | 145 ++++++++++++-- build_files/hyprland/01-hyprland-desktop.sh | 1 + dot_files/fish/conf.d/rustup.fish | 3 +- dot_files/hypr/hyprland.conf | 3 + flatpaks/system-flatpaks.list | 1 + iso_files/anaconda/hypercube.conf | 22 +++ iso_files/anaconda/hypercube.css | 77 ++++++++ iso_files/branding/background.png | Bin 0 -> 275173 bytes .../branding/hypercube/branding.desc | 28 --- .../calamares/branding/hypercube/show.qml | 184 ------------------ iso_files/calamares/modules/bootc-deploy.conf | 12 -- iso_files/calamares/modules/users.conf | 39 ---- iso_files/calamares/modules/welcome.conf | 21 -- iso_files/calamares/settings.conf | 38 ---- iso_files/hook-post-rootfs.sh | 59 ++++++ iso_files/hypr/hyprland-live.conf | 69 +++++++ iso_files/hypr/hyprpaper-live.conf | 4 + iso_files/livesys-hyprland | 38 ---- 20 files changed, 367 insertions(+), 379 deletions(-) create mode 100644 iso_files/anaconda/hypercube.conf create mode 100644 iso_files/anaconda/hypercube.css create mode 100644 iso_files/branding/background.png delete mode 100644 iso_files/calamares/branding/hypercube/branding.desc delete mode 100644 iso_files/calamares/branding/hypercube/show.qml delete mode 100644 iso_files/calamares/modules/bootc-deploy.conf delete mode 100644 iso_files/calamares/modules/users.conf delete mode 100644 iso_files/calamares/modules/welcome.conf delete mode 100644 iso_files/calamares/settings.conf create mode 100644 iso_files/hook-post-rootfs.sh create mode 100644 iso_files/hypr/hyprland-live.conf create mode 100644 iso_files/hypr/hyprpaper-live.conf delete mode 100644 iso_files/livesys-hyprland diff --git a/.github/workflows/build-disk.yml b/.github/workflows/build-disk.yml index 74d4956..0663f58 100644 --- a/.github/workflows/build-disk.yml +++ b/.github/workflows/build-disk.yml @@ -61,6 +61,7 @@ jobs: livesys: true livesys-repo: binarypie/hypercube flatpaks-list: ${{ github.workspace }}/flatpaks/system-flatpaks.list + hook-post-rootfs: ${{ github.workspace }}/iso_files/hook-post-rootfs.sh - name: Rename ISO and generate checksum id: rename diff --git a/.gitignore b/.gitignore index 6d1319f..824155a 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ changelog.md # Titanoboa ISO builder _titanoboa/ +podman_scp.* # VM testing _vm_build/ diff --git a/Justfile b/Justfile index 3e3d5bf..89ef51e 100644 --- a/Justfile +++ b/Justfile @@ -101,6 +101,44 @@ run flavor="main": "localhost/{{ image_name }}:${TAG}" \ /bin/bash +# ============================================ +# VM Recipes +# ============================================ + +# Run ISO in local VM with virt-manager +[group('VM')] +run-iso-local iso_file: + #!/usr/bin/bash + set -euo pipefail + + if [[ ! -f "{{ iso_file }}" ]]; then + echo "Error: ISO file not found: {{ iso_file }}" + exit 1 + fi + + ISO_PATH="$(realpath {{ iso_file }})" + VM_NAME="hypercube-test-$$" + + # Calculate RAM size (half of available, max 8G) + mem_free=$(awk '/MemAvailable/ { printf "%.0f\n", $2/1024/1024 }' /proc/meminfo) + ram_size=$(( mem_free > 16 ? 8 : (mem_free > 8 ? mem_free / 2 : 4) )) + + echo "Starting VM: ${VM_NAME}" + echo "Close virt-manager window to destroy VM" + + # Run with virt-install (transient VM, destroyed on shutdown) + virt-install \ + --name "${VM_NAME}" \ + --memory $(( ram_size * 1024 )) \ + --vcpus $(( $(nproc) / 2 > 0 ? $(nproc) / 2 : 1 )) \ + --cdrom "${ISO_PATH}" \ + --disk size=64,format=qcow2,bus=virtio \ + --os-variant fedora-unknown \ + --boot uefi \ + --transient \ + --destroy-on-exit \ + --autoconsole graphical + # ============================================ # ISO Recipes # ============================================ @@ -118,16 +156,21 @@ _titanoboa-setup: echo "Cloning Titanoboa..." git clone --depth 1 "https://github.com/binarypie-dev/titanoboa.git" _titanoboa fi - # Patch Titanoboa to use --policy=missing for local image builds - sed -i 's/PODMAN }} pull /PODMAN }} pull --policy=missing /' _titanoboa/Justfile - sed -i 's/podman pull /podman pull --policy=missing /' _titanoboa/Justfile + # Patch Titanoboa for local builds: + # - Add --policy=missing to avoid re-pulling existing images + # - Add --tls-verify=false for insecure local registries + sed -i 's/podman pull /podman pull --tls-verify=false --policy=missing /' _titanoboa/Justfile + sed -i 's/PODMAN }} pull /PODMAN }} pull --tls-verify=false --policy=missing /' _titanoboa/Justfile -# Build ISO from local image +# Build ISO from local image using a temporary local registry [group('ISO')] -build-iso flavor="main": _titanoboa-setup +build-iso-local flavor="main": _titanoboa-setup #!/usr/bin/bash set -euo pipefail + REGISTRY_PORT=5000 + REGISTRY_NAME="hypercube-registry" + if [[ "{{ flavor }}" == "nvidia" ]]; then TAG="{{ default_tag }}-nvidia" ISO_NAME="{{ image_name }}-nvidia.iso" @@ -136,36 +179,89 @@ build-iso flavor="main": _titanoboa-setup ISO_NAME="{{ image_name }}.iso" fi - IMAGE_FULL="localhost/{{ image_name }}:${TAG}" + LOCAL_IMAGE="localhost/{{ image_name }}:${TAG}" - echo "Building ISO for ${IMAGE_FULL}..." + # Get the host IP address that the chroot can reach + # Use the default route interface IP, or fall back to hostname -I + HOST_IP=$(ip route get 1.1.1.1 2>/dev/null | awk '{print $7; exit}' || hostname -I | awk '{print $1}') + if [[ -z "$HOST_IP" ]]; then + echo "Error: Could not determine host IP address" + exit 1 + fi + REGISTRY_IMAGE="${HOST_IP}:${REGISTRY_PORT}/{{ image_name }}:${TAG}" + + echo "Building ISO for ${LOCAL_IMAGE}..." + echo "Using registry at ${HOST_IP}:${REGISTRY_PORT}" - # Check if image exists - ID=$({{ PODMAN }} images --filter reference="${IMAGE_FULL}" --format "{{{{.ID}}}}") + # Check if image exists in user storage + ID=$({{ PODMAN }} images --filter reference="${LOCAL_IMAGE}" --format "{{{{.ID}}}}") if [[ -z "$ID" ]]; then - echo "Error: Image ${IMAGE_FULL} not found. Run 'just build {{ flavor }}' first." + echo "Error: Image ${LOCAL_IMAGE} not found. Run 'just build {{ flavor }}' first." exit 1 fi + # Cleanup function + cleanup() { + echo "Stopping local registry..." + {{ SUDO }} {{ PODMAN }} stop "${REGISTRY_NAME}" 2>/dev/null || true + {{ SUDO }} {{ PODMAN }} rm "${REGISTRY_NAME}" 2>/dev/null || true + } + trap cleanup EXIT + + # Stop any existing registry container from a previous failed build + {{ SUDO }} {{ PODMAN }} stop "${REGISTRY_NAME}" 2>/dev/null || true + {{ SUDO }} {{ PODMAN }} rm "${REGISTRY_NAME}" 2>/dev/null || true + # Copy image to root podman storage if running as non-root if [[ "${UID}" -gt 0 ]]; then echo "Copying image to root podman storage..." COPYTMP=$(mktemp -p "${PWD}" -d -t podman_scp.XXXXXXXXXX) - {{ SUDO }} TMPDIR=${COPYTMP} {{ PODMAN }} image scp "${UID}@localhost::${IMAGE_FULL}" root@localhost::"${IMAGE_FULL}" + {{ SUDO }} TMPDIR=${COPYTMP} {{ PODMAN }} image scp "${UID}@localhost::${LOCAL_IMAGE}" root@localhost::"${LOCAL_IMAGE}" rm -rf "${COPYTMP}" fi + # Start local registry bound to all interfaces + echo "Starting local registry on port ${REGISTRY_PORT}..." + {{ SUDO }} {{ PODMAN }} run -d --rm \ + --name "${REGISTRY_NAME}" \ + -p 0.0.0.0:${REGISTRY_PORT}:5000 \ + docker.io/library/registry:2 + + # Wait for registry to be ready + echo "Waiting for registry to be ready..." + for i in {1..30}; do + if curl -s "http://${HOST_IP}:${REGISTRY_PORT}/v2/" > /dev/null 2>&1; then + echo "Registry is ready" + break + fi + sleep 1 + done + + # Tag and push image to local registry + echo "Pushing image to local registry..." + {{ SUDO }} {{ PODMAN }} tag "${LOCAL_IMAGE}" "${REGISTRY_IMAGE}" + {{ SUDO }} {{ PODMAN }} push --tls-verify=false "${REGISTRY_IMAGE}" + + # Save project root for later + PROJECT_ROOT="${PWD}" + + # Copy iso_files to _titanoboa so they're available at /app/iso_files inside the chroot + echo "Copying iso_files to _titanoboa..." + rm -rf _titanoboa/iso_files + cp -r iso_files _titanoboa/iso_files + # Build ISO with Titanoboa # livesys=1 enables livesys-scripts from binarypie/hypercube COPR (includes Hyprland support) + # HOOK_post_rootfs installs Anaconda and copies live ISO configs # Parameters (positional): image livesys flatpaks_file compression extra_kargs container_image polkit livesys_repo cd _titanoboa - {{ SUDO }} just build \ - "${IMAGE_FULL}" \ + {{ SUDO }} HOOK_post_rootfs="${PROJECT_ROOT}/iso_files/hook-post-rootfs.sh" just build \ + "${REGISTRY_IMAGE}" \ 1 \ - "${PWD}/../flatpaks/system-flatpaks.list" \ + "${PROJECT_ROOT}/flatpaks/system-flatpaks.list" \ squashfs \ NONE \ - "${IMAGE_FULL}" \ + "${REGISTRY_IMAGE}" \ 1 \ binarypie/hypercube @@ -174,9 +270,13 @@ build-iso flavor="main": _titanoboa-setup {{ SUDO }} chown "${UID}:$(id -g)" -R "${PWD}" fi + # Stop registry before moving ISO (while sudo is still cached) + cleanup + trap - EXIT + # Move ISO to project root if [[ -f "output.iso" ]]; then - mv output.iso "../${ISO_NAME}" + mv output.iso "${PROJECT_ROOT}/${ISO_NAME}" echo "" echo "========================================" echo "ISO built successfully: ${ISO_NAME}" @@ -206,13 +306,22 @@ build-iso-ghcr flavor="main": _titanoboa-setup echo "Building ISO for ${IMAGE_FULL}..." + # Save project root for later + PROJECT_ROOT="${PWD}" + + # Copy iso_files to _titanoboa so they're available at /app/iso_files inside the chroot + echo "Copying iso_files to _titanoboa..." + rm -rf _titanoboa/iso_files + cp -r iso_files _titanoboa/iso_files + # livesys=1 enables livesys-scripts from binarypie/hypercube COPR (includes Hyprland support) + # HOOK_post_rootfs installs Anaconda and copies live ISO configs # Parameters (positional): image livesys flatpaks_file compression extra_kargs container_image polkit livesys_repo cd _titanoboa - {{ SUDO }} just build \ + {{ SUDO }} HOOK_post_rootfs="${PROJECT_ROOT}/iso_files/hook-post-rootfs.sh" just build \ "${IMAGE_FULL}" \ 1 \ - "${PWD}/../flatpaks/system-flatpaks.list" \ + "${PROJECT_ROOT}/flatpaks/system-flatpaks.list" \ squashfs \ NONE \ "${IMAGE_FULL}" \ diff --git a/build_files/hyprland/01-hyprland-desktop.sh b/build_files/hyprland/01-hyprland-desktop.sh index 183cdab..eb2f5e3 100755 --- a/build_files/hyprland/01-hyprland-desktop.sh +++ b/build_files/hyprland/01-hyprland-desktop.sh @@ -12,6 +12,7 @@ dnf5 -y copr enable binarypie/hypercube ### Compositor / Hyprland Stack (from Hypercube COPR) dnf5 -y install \ hyprland \ + hyprland-guiutils \ hyprland-uwsm \ hyprpaper \ hypridle \ diff --git a/dot_files/fish/conf.d/rustup.fish b/dot_files/fish/conf.d/rustup.fish index e4cb363..4b676f9 100644 --- a/dot_files/fish/conf.d/rustup.fish +++ b/dot_files/fish/conf.d/rustup.fish @@ -1 +1,2 @@ -source "$HOME/.cargo/env.fish" +# Only source cargo env if rustup is installed +test -f "$HOME/.cargo/env.fish" && source "$HOME/.cargo/env.fish" diff --git a/dot_files/hypr/hyprland.conf b/dot_files/hypr/hyprland.conf index 898576c..e6f8e80 100644 --- a/dot_files/hypr/hyprland.conf +++ b/dot_files/hypr/hyprland.conf @@ -327,6 +327,9 @@ bindl = , XF86AudioPause, exec, playerctl play-pause bindl = , XF86AudioPlay, exec, playerctl play-pause bindl = , XF86AudioPrev, exec, playerctl previous +# Screenshot with Gradia (Print Screen key) +bind = , Print, exec, flatpak run be.alexandervanhee.gradia --screenshot=INTERACTIVE + ############################## ### WINDOWS AND WORKSPACES ### ############################## diff --git a/flatpaks/system-flatpaks.list b/flatpaks/system-flatpaks.list index 0c5aeec..5940626 100644 --- a/flatpaks/system-flatpaks.list +++ b/flatpaks/system-flatpaks.list @@ -1 +1,2 @@ # Hypercube System Flatpaks +be.alexandervanhee.gradia diff --git a/iso_files/anaconda/hypercube.conf b/iso_files/anaconda/hypercube.conf new file mode 100644 index 0000000..3521e38 --- /dev/null +++ b/iso_files/anaconda/hypercube.conf @@ -0,0 +1,22 @@ +[Profile] +profile_id = hypercube +base_profile = fedora + +[Profile Detection] +os_id = hypercube +variant_id = hypercube + +[Network] +default_on_boot = FIRST_WIRED_WITH_LINK + +[Bootloader] +menu_auto_hide = True +efi_dir = fedora + +[Storage] +default_scheme = BTRFS +btrfs_compression = zstd:1 + +[User Interface] +custom_stylesheet = /usr/share/anaconda/pixmaps/hypercube/hypercube.css +hidden_spokes = diff --git a/iso_files/anaconda/hypercube.css b/iso_files/anaconda/hypercube.css new file mode 100644 index 0000000..725faf4 --- /dev/null +++ b/iso_files/anaconda/hypercube.css @@ -0,0 +1,77 @@ +/* Hypercube Anaconda Theme - Tokyo Night */ +/* SPDX-License-Identifier: GPL-3.0-or-later */ + +/* Tokyo Night color palette */ +@define-color hypercube #7aa2f7; +@define-color tokyo_bg #1a1b26; +@define-color tokyo_bg_dark #16161e; +@define-color tokyo_fg #c0caf5; +@define-color tokyo_blue #7aa2f7; +@define-color tokyo_purple #bb9af7; +@define-color tokyo_dark_purple #414868; +@define-color tokyo_cyan #7dcfff; +@define-color tokyo_green #9ece6a; + +/* Sidebar - use solid color instead of image */ +.logo-sidebar { + background-image: none; + background-color: @tokyo_bg; + background-repeat: no-repeat; +} + +/* Logo placeholder */ +.logo { + background-image: none; + background-color: transparent; +} + +/* Product logo placeholder */ +.product-logo { + background-image: none; + background-color: transparent; +} + +/* Navigation bar */ +AnacondaSpokeWindow #nav-box, +AnacondaHubWindow #nav-box { + background-color: @tokyo_purple; + background-image: none; + background-repeat: repeat; + color: white; +} + +/* Main content area */ +AnacondaSpokeWindow, +AnacondaHubWindow { + background-color: @tokyo_bg_dark; +} + +/* Buttons */ +.spoke-button { + background-color: @tokyo_dark_purple; + color: @tokyo_fg; +} + +.spoke-button:hover { + background-color: @tokyo_blue; +} + +/* Selection highlights */ +*:selected { + background-color: @tokyo_blue; + color: @tokyo_bg; +} + +/* Links and accents */ +*:link { + color: @tokyo_cyan; +} + +/* Progress bar */ +progressbar progress { + background-color: @tokyo_purple; +} + +progressbar trough { + background-color: @tokyo_dark_purple; +} diff --git a/iso_files/branding/background.png b/iso_files/branding/background.png new file mode 100644 index 0000000000000000000000000000000000000000..53203f3a1ac3bc10a3fe0df8a5b7afebf3f808e1 GIT binary patch literal 275173 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%0AS@+C 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°{1t!XZgd+{+k{FI-k{Hef!laC?lBAQFT<6sj9#EQ~)+oEHn$VsXV4PC! z%lgK_IhD+$6@`eoZ!yo;+rxi*^{;=1_t#MNbXYPNqC^uIs8KYcjEDw}h}x|AZLOV8 zG>EsTS52u8e~#CK`W`*WdDWwxZ;#?LTz|Eys23}WNF~bXs#(tz6j%hs;FF`2nm7tX zR1KA1tz@Io>POe$TTjauj$f4ZPvh1!}6G1xrp=M`iv42-XpgrmsgAk8z?h38tcgMEG$I>{P`Pzd{93 z84|u#>-~UD!F=z9Ww_tayQsA!thN{o&II%t75yH1J!Bb@se^--5p)$gH|^Rde8Kx+ zjBu>?&su6d88v9E4YEO4v}jbbiv7xcJf(ZvMATp>G-vGe;xq^4ZuepeRy4kn+l`;^ zlTjlkCKI!>WTZ9T`->q`Xb|jfqn#}0D;PH_?|Fz=GE^b863L-@v6f?tRic7`VCr4+ z|A2x4$w%d0d{HI~7^gu9RqaaZx@4@cUP695Z@EKOLQBsNi>vQm{rL~@t3Jwg6eEPd zq}*i@8by;=qd`?vcSk1Fw_y5e-IZj2U~%Mm{3J#rjX#R%*os9l({YVyubAqxHYD{b zc888z#?{iMFd9T)0jwvMvAmlxkx0xW^<53Yn`lwoc;WsEsAp zq-v6+_w3`^Rn$e)Ryl`r>S!9&KGxZYf=Tl6a9-zeY@>Z1ttk&TrW2LJKj@SAM}w(C z(kKvvWXKlaGsFVJLE0WBN`^o!rk%D3r1B^LX)udpXb-j-%5ABjOc{Pv)pXmkXP!P< zo9xfhQXyl!zL2y;XQu=>gFpxhU42uM#fNuMgTX<)Q6T{aLxd&+n6dI08hw?$off2G zs??T?33rq_JPEyPrUJwYPC8``zQsF55-X!Ruib!QGI`cn=`|*?%u2>~3Rr9ggWQEG zI#nIqHHo^n63A{{nk1SmRbfRcRhUUbAXbb`D&W$sg^KfdYyJ}S!yjR+BHlV@h4lP0ygZhaSG z)l3Ay{+b2F$+!9kl&AKNsi5&$eoWI+-&FV!^^lH8n}WaC7o?s*U<5JDxI zdL#@(=t!20v|R4L`{#dChS#3?J7@0n_1ewl&Y8u9W0@(!5dF<^{o|`IES+5X%G1Le z&wuwXKRrLU6pDeFxhyY711}&*EkF^NS|FG_XB?PX@PXsVeIW>IU1^Dcj{s9BaZLwox>ZOhM-e9+{ci=+3gC4FC^4H-ov zti}u&Fy-6UJfw6cHpp}4vE@n8NjtPd~#?!|YmeY)A}IL$hlZwq8LfBxC0jv3;y zW3a#f(L0w0H*RShv|62FG|IA$h5=0-sZ>Kb0U3bf`KZp9Dt#D9zAI_1sa71@rcw~= zLK4SY%({Nyrn=L2xr`5fCfi=c8w>Z_A+7iCqUC)U4>g6{<(G%|$e+A;A`+Ea<^9t8 z@5Q3LbL~^fbBu<78U-YC-tg0Zd%gO@dF8 zKPX6&g_Rdo+;=sxA^cj&yxXMNV^)7w^>dOZ)`sdpQ{i`PJhH|7ZtrieV8pcxb!t^i zT^Oy7ipFgzWs*6mt1?@3nGPub91Epziy_I5=hOIVLX1MX3e{!~bTkJ#VV+D6#e|lb zc`un0Z_M(Le{=5QosH%9uu8Tr&MsKLeXH7u$vr4zHlSR!Z#^rM=}H!?`Tr?IOuV%- z&1r2Q@4z$9?hMw4z8rBiSQw!wHI$68;;L5V$&}CvT1TQ)3mKG5x?HLM9~Fd@jFttJ z(9%}1y#B(%iA&#m{i$zVJay*$jcZpsi*qlXn>(?9d?stRap_(3ZVpeLnSJ5;=ij_} zyX)tQSPnxO!)P{}@v176sF9W4ORZ@hlX0+tW+f8`-jYp~RJ{~4fRXidHLmpU(m|c- zNj0!x4>h)wrD~UYs{qvmF{w<|iUSY*D4)PcR-5b^?l zGi|jmc>Ox-;g^0e?~ys{5G_G#fX&TO|N7e1GTwG7s^ti!L4&BNQjB!YGSa&WV6day z!Qn?9AH`7|#g^F8(r<<~m!qWIREr*l3ik`K#DyahwpdgvY@U^#F<9Ah6qr++39h>l z|NQ^;@Bi`t;UBKe9-m)qWi1RxxVC~KXs;JcIJi@M?eG59hi`wlvAkTU{}=!A|M=>O^Jw zuMX-gWY1T2OO1qZMv~6p0ZAkQK}I+;)?hYZQs=Q`zk$RqNHua3AOL{`M3c(=0bXI+ zUJcG>>QW~*cb~{PPP>4y)?~$0X~Y)4@XvNf_WhSTVAf>nhr7FiR{MUyCngfK1n4-@2D!l3ImHF_r7 zW+UL3Jb+mhRbkGV2Rz{bGdREiM|fCHv|D~*7?7bAqgo5A{nZvTcvY%uP^uvaDdwrH zB$PRoh*mTcYR!VGv*>BlWt(8HwZZV22!ieZ=1*zbPY*z`>GW~}k`^;1x%Y@Y(z<%ZmSC(}~I>jV5ydTPxfU z(wQV0gM%A0H`2j}S_hsW5v_)7rBASZ?4ciEOwx>dT5*@e#HvG#lmIU5Y3>XWxl zh~wYd)Qcw5Db^ND!(_;fk2YFH_>BpKmY0L&pmtb^*{Z=N2BMz@lU^ebMyFHD=YJCEh0mk zC+A&%2+nfUlci_RAIm$#PPTk&dFIqeI_c0`K~A` z)sC2q8d#H^4VKg}%#?)k0k}FgOt<&@_N16%sJzHY($o29PAN3!oG2s;Aq1H??iSNG zMX16eT*^um6k=?5b>E3flW#3|d*^*zCEfD(`w+|A@q6!0ap;lNQ>*2~>Wsyc8IcJ+ zNzj>yS{|5@c^9qUZax1S-KS?q+40WOvCY{N`CL2iH0w6JXZ?UG?-f!llB{hIk{z3? zx-JyJg935UocPW{`;0F$7X4TjMY$<1Xq3sgO&?*6V&OIqN)xe)I;F6wwn^iBn#`i@ zF2C60l>@Yc+}eRjeX6@_1KiK|Z2S4~t-u|E=WELWv9ZZK_$Jr`K3{IDxIduduez-J zKAtU{>?w<+X_XFQifX@uFKuFvsEL}XF({%^bKe<7{_^sNJr*DQ$&H0GXV3kE6NB|r ztJiK1H#g#S*Yamuvv6%3TUfaEv8iOo&$G2~{OUWG3_|lT6(dbpXCA3S3BnnonR7{s zF_IccNRn!FW-!Uj3MOGjj=RtVc}OY*N=%nE)Bh4x5taa)?08R20c&=F>U(mCv-;*> zJ0y4DC=N?J{vDMRRH%YN3zb{new5=MUTj@~DmPgJOjJae!C>%4ujT-eylqUPerbT?v~ss7om0q9 zg?7gzVno2%PE+=nUNY{nj7xw`{)tHfIRTiUmeY|ism%F={ZRPK&$Y9;SDt&}qjx?Y zn8XkV#Rz%a1`?2M-pJGXztl=T+fq_-2)zhoE1Kmfj^go)yZLn8(?@O3!MKM&e44>r zqr%mMepNrq7z@m3Mq@N9%}OvBMqnNtjgDEK#SBCHPyg>fdA0kGp8dU3$7WA#+=%7v z-iNo=pE@(|!>B(jPd>k>hRfI2Pb|!zdHN)wPQ@rNC((pK8Nrf3K%@!GoMfsBQJR6E znJBapxZeM|`5CY9{mw8`ER;r;(nx4IerMxt6caSn7!RrG`%xUl{$op`vaRRvcp&h! z5{qRpH)fD2;Y?^kDojY2F-@wUX=_r+3hy7~S*1*AL&*vA*c7IejL0B9%iF#^H`wSy z+6YlOm*h7EVivXRWv#BbA{2c>c4Lq>)t6Xpv?# z3i6ruiKov!A5|}1`Y2d&{?yaG>zgn7i%b4kD|+;8Cih>$$t4^^f8Y=@s8H!h@`W&@N&eLx#$qi?KP}2&nq>w`97ILCR%fKL}K!AB#XS0aMUFQ#8{o4Qh;muFl z3!C|RxglMb7qLj+Vn#`JpsZb+sY<3tYx=r~YBa>;Y%m4=s!io=!WL@^U6^tVdfMgQ zZ5vnH$K>?T+NokqBo9xHwV#tEQSCl4{nYF=2BzP+y=S{u|K#!K!0h*Vf0$tnAmTwo zcpmWiPMglu=Og?5ll{Ek5>9ygF^@lITY;~+2bk)O$I0pd0I{-_v`Wnv$@h$68o|_i zQCffvRcsgwkG7L8Z6uOsAOt8@YwkJIz9WplGA$Ek~0s<$F-d7SqgozR`Z|W#ijFM0@ z3`{j6I8&=<+Q%VjIcldI#dJJD9hGEtRC^dsnw<&COf_tsY9Dsg0Mn-Wzd|UE!YERf z5sN2q>=X)x%ahcB8ZhXgJzLIZSiS;`fO_hjXs{g6Nl_nWQYu#Q^=XF;6>RsqGF2zE z?G>%lLI;)K{;l87-0a3iU(osV`sEj&eqm%A$L@4pK?^XdE8}mpzP#x+Z-n(Oa%t)r zaJq74S+%8L!iaIYOCXg_Mv~q!0c$#w=0J{=#xR%(%!}q7bWi4UUpp>0&z}9TTV5Ux zZr&(jQ8pGf)|(Y>U27Y|W-L8y*4!~R(e1mU4<3xDj_jJ>PI^IyXz@-!rioJOW1q}C zq|p5#o1XlrEabQQY{zSG^OKyix>>57SueTCP6I#qKr{h)EsglqGhfS zy*2#wJHP(b_y6X~Klt|7|L}_^&!4`rHpuhNeC~bLArvjq5e5UYJKH@LpZ&rYUwZMC zR{O*c|N1+jT&G5*2pugsPMSe!3Rc8^RUu47V{&(q-80WEGAf56(j64~Od+GFP(mDp zFd+nzQ=3e5!A}fhKHT0dK8Z~_LrzUa2)MtiK$Y^ZpUw|cX9{& zJZyK)-p}VJjT8zfY34DZ5y;!eUi;?K@BY2jb|={YE4&zHz3BS-jE+9|?w`dUe-}D> zfOQd$y}E6Odws73yegWN!uuLO`|s>Mvaz~jmLg>0f(V60QT*zypRKH{A3L@L$Q!T! zda3l^_~Jk9Y~)!NMu@m`C-Q3r<_K5W2B2=-8A#_eCo-Tg zD?nG(XU&V`v^LBGPMCzhyfB}&?(_4DPjBG0BK-bquYUj5+DC6?Lnpgw@u%cJq1t3h zP>VL{^i_wr!wsVD?@`&#QMvm)P47uPL#sSwwgzcNSE)toSkFzG$7r#=*U;Xu;W|o)QQ7Oe>7E`++B(fX;7B!p6%uGeaMCm~#DaORM!4&JG zsRjJdclq0)edZxa7t~dq76VkEFlO+%`H0w0X1q1&rY6KDfwtN%?E&-~KjX>j^h)vQ z=a!>5Jn^J-RQ3)%KsfI~MFWMBo>Ea1r7SGsnTw;m?edmFA}NMmP~YG5K>X#;Dm5?) zjE8h9bJwV`%W8J0h(y57Y$BWfm9i>(>(^R0)vrE_3*3`^7i4m=Q#t*|BxS(!! z77&o|#ApcLaaopWl5VN^pSvuQsa0ar9F@vxzEx>)A~aNPJS>NHlF4J;2@z+x2fldv z!a2drv(M#AGq*NoiQ#BeircnAPqdQjVrsJy$4dQkufh3X3wvWBX>R4ujL)E2rN`w) zSJ^2Xri$ZabRDjV>nJ`ap}TAr_wF`po#D8~w4fl(qFIcLL>XyPfnx&*GvAAwv(jpL z@5>lAMrW4hu73aLAARks=U$z;wLI+h+-w)C{W6qgE3=uomRp+FVbMC>J$|D5?%TI! zE}Z}BZ~fk{fBZu?h_tkW4}xfjqAHFGH4}jtOigGaDiJ1-c$XyPQ9XS!)k2@xFgUmj zbI1Kt&*n=f`ols@GF2bJSPoXM#an%Z0??!|dBnjx;NS$$d=w8Ywj?S~&eazK3}Ryg z?0fs`$&XWi*lElJGO1+b(bWhQ`26p91+n$NVWOGHbVnAl8`lcu42T~@bb zCRUx+UE|F+-~8&Ae*=(T{NmRUcDi+ZsUNeoVpU_uImu9#81(u@Yvfz`2<5n$k!Yz3 zNHPXZFN&}C)~<$P0}uyCIMTtqm_>_exiX4HKby~GvM9`lqfIlKm4NribMSb3w!d1Q zyLfB__XQ=icE4&7FPtGXzVTKlg$ z<}FcoqcrK5laFKhEXtAOBB({=3Kji|AUHuWlThna$emn>W`_ zooTH(oI2Zj>g2gnV8HR0PJZ&vEr06V=@(ziFTKCIelOkQ z4jMQG$4_KvGX-MVp)66>4L-G}&BWlqnPQk1Lm(u-s-Vmz9rfPBcvJjVLv-1nf{gndNexGIhupY)>qr0YJHPi||K81_b*Z5dIDV?Xxh@$t`>VHCZ^E$`Rs@py%+UoCSPA4LgB7ZU zO&rN=8xn7tsqzSB!YwsZ0R&}fA*@HY$<`>OBd3QALM-E03i1%~?w)`UVT?!f@FR;S zDp5(zlkE)@3T-S^bm&5%CE%SR#?Zg=$?><}KAz<+YXKtaY0#qIf_8kI8}v5fNNA?P z5OJV&lG?fUAuaWZyy3(NofF}qsily#d%v)(q~}}(^kNiD!zWAttgo-9%)#IQJcp-_ zXPvf_tPRQGimcqsyboEHIrvoYCq*Dik@}-5OZAkHB=Qwm^*t&^D#3uGW$7r6;$R|W03;$}Wm}9gku`--b3jRBL|qtC6QWge z{g)qw-}}~uZ?}Jb6{Ak*p2_XniEGz3k1fuqXoLfhsXhH-{zh-meeS81VzB(-<+C$O z((j*`Kb!T#YPk-X8Ce;XMmpya1sExnZ~|{oL(r5u9m1dkAV$DJ2$slu^QSb-M zY8BmjVj8=K?;4f*9GUnb=2b!GjTz0i{6e?A06+k*Kv2JWBQrgPxi6i0b|#Z{2W}R~ z!4dL)rZXmU&bRY8B+bLT!jFkPJ6_4HiY{Xxm8s-hM8(79;%{HSJ)bWO!yOP#y}9z?*)FdbkS^ya+MpN~WM8QWM9M|F-fAQ0=fAzP& z_|mb#3a)%qo?Xg@-EQG1<`fV^p?$N~%U@b}`)4;#ees2rwT(AE_;{`ebBNDgxR|Zp zxVC=9vY8SRG^nYg8W907>O`a@9vax>R!w9Yq!QOjz45|sUAyx0A8nRIs{;sB0G*$0 z>z%6@_A;Lraqy_m;)#l?eEB#nhEG)Z9aLQIQ`zYuhVJB;I}PhHOWGb=3kXvk1CzT7 z#ccm&!?OamgT7(o6-mAp3KJnwf>BS5D#!M6LA=;YNTfZyn)xO7b_*AxLksL>@++4S?&r`>ajrfM>n zS?WJnG+vs}-0V$G#^!py9?|Ca0sk^~u^q zsaK5MkZL`2C}LWkH0fz2Xr*}|RHtQCufUUo}dr}4~XtnU^rM1PS*%PN`!e;->qJR2a>&kUJ^_yS+WMPggn|D6AH2nDb z3s0ZP+u4=%Ynw3#3e_S=S*zj}NnO*lRx^f~8igVhO-)%Ls{dt;%i!KmL1Rxc?Qgc5 zPWsmIkea|_8w0Dd6oC+lra02gzx`otv69}T>kP00c@}I0ahmMuQ(3bvyFJjsb8o@j zy?`IJ=3!bH(rvGnhv~hgO^)xdPSj6U9CcJ4bc|I{szz*G8m|ex38`k$Y{cN{94m{x z$#%_5%?uhrwHPP0pUR3cKr73}2N6@q{sa4p@qX9s$h|f`O7TR}RX2$wxKn!vJ7{4M zjm<8t;)?kB_Ch9k1i${&E3-YXWjuz~JoHSvHP@odM}InYzPyB!z{j}$;qt=yrG;ln zj|fwWnV+^vnZAtUs{gn&Xd+3}YwI3JXc!e6x37G>&|1<#ztBO8vmWi|PCoZ^er)a2 zJ0rK)Ut3vRXE7WB^xjXBvHSFvdDx*8iWAA`Gl*01X)iL~G>~RSGeSxjVI@Flh3e)O z?BkC2`hgw$V{wI#;wW|x*>{ee_NirU@l+sH!o-V$P=d}fudU)XZvNG!*_&U`wb9B? zF28we^hf{fOMT$O<^G-iX4!HxHaj!ZUEkQe`22#K!LNtQ&;Q2P^I^Em?AF_Fw(qPx zbN=+m3>!Cx#h{?58eF6Wc?=%6Eov@}Zh2V%MXed4m4Po+EygO{lsXSQKp{-{G*)~kZ5BAk zekQeTFr7jiL`>A2r*ARy!Jo-beYJCf%foq*AzH^FXXe|!W33k){>UK!w}2e&XMN`) zmp4bndN8PpDxx5Rkh;q(S<}bU;a6TO;vF)YFX2EVDfG@sh=YZW`{McYKY8nxpv;k- zUU=$ceyqH5?S(JD`tizDU{hD}P^dvfyv2K?saW0Ze8{&_nLKNl?v(RRrLsg&LYQO; z2mp?1q>7nX(wQ~`6(MzoQZgfEM+?$X9L2!}H8rPGfgfgK5k?b*MPdXqqlraQ#RMcQ z%OsZ~*I(RTzVzm?xuvJB`>=lH+U(i<>&Mq~$uFM0)$esy@ze~W`uQBsK7}hEj#dV6 z?ZuaW=l7VkKmOHE%1^JKUYgBja68`IPz@|#;!Kp{#HonsVdfq8zamVn zhJnc=Z

nWIAU|{`7U{{ZWTW0u7QN1!75$O{OU{ww13UNy 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�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℞DjkF%EZQkRfJvtt5J!>j;G90<_HZW% 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 literal 0 HcmV?d00001 diff --git a/iso_files/calamares/branding/hypercube/branding.desc b/iso_files/calamares/branding/hypercube/branding.desc deleted file mode 100644 index 58c24cc..0000000 --- a/iso_files/calamares/branding/hypercube/branding.desc +++ /dev/null @@ -1,28 +0,0 @@ ---- -componentName: hypercube - -strings: - productName: Hypercube - shortProductName: Hypercube - version: 1.0 - shortVersion: 1.0 - versionedName: Hypercube 1.0 - shortVersionedName: Hypercube 1.0 - bootloaderEntryName: Hypercube - productUrl: https://github.com/binarypie-dev/hypercube - supportUrl: https://github.com/binarypie-dev/hypercube/issues - knownIssuesUrl: https://github.com/binarypie-dev/hypercube/issues - releaseNotesUrl: https://github.com/binarypie-dev/hypercube/releases - -images: - productLogo: "hypercube-logo.png" - productIcon: "hypercube-logo.png" - productWelcome: "hypercube-welcome.png" - -slideshow: "show.qml" - -style: - sidebarBackground: "#1a1b26" - sidebarText: "#c0caf5" - sidebarTextSelect: "#7aa2f7" - sidebarTextHighlight: "#bb9af7" diff --git a/iso_files/calamares/branding/hypercube/show.qml b/iso_files/calamares/branding/hypercube/show.qml deleted file mode 100644 index 5a013ba..0000000 --- a/iso_files/calamares/branding/hypercube/show.qml +++ /dev/null @@ -1,184 +0,0 @@ -/* Hypercube Calamares Slideshow */ - -import QtQuick 2.15 -import calamares.slideshow 1.0 - -Presentation { - id: presentation - - Timer { - interval: 5000 - running: true - repeat: true - onTriggered: presentation.goToNextSlide() - } - - Slide { - Rectangle { - anchors.fill: parent - color: "#1a1b26" - - Column { - anchors.centerIn: parent - spacing: 30 - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Welcome to Hypercube" - font.pixelSize: 32 - font.bold: true - color: "#c0caf5" - } - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "A developer-focused workstation with Hyprland" - font.pixelSize: 18 - color: "#a9b1d6" - } - } - } - } - - Slide { - Rectangle { - anchors.fill: parent - color: "#1a1b26" - - Column { - anchors.centerIn: parent - spacing: 20 - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Hyprland Desktop" - font.pixelSize: 28 - font.bold: true - color: "#7aa2f7" - } - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Modern, tiling Wayland compositor" - font.pixelSize: 16 - color: "#a9b1d6" - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 8 - - Text { text: "• Smooth animations and effects"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Dynamic tiling and workspaces"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Waybar status bar"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Quickshell launcher"; color: "#c0caf5"; font.pixelSize: 14 } - } - } - } - } - - Slide { - Rectangle { - anchors.fill: parent - color: "#1a1b26" - - Column { - anchors.centerIn: parent - spacing: 20 - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Developer Experience" - font.pixelSize: 28 - font.bold: true - color: "#bb9af7" - } - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Everything you need to be productive" - font.pixelSize: 16 - color: "#a9b1d6" - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 8 - - Text { text: "• Distrobox for isolated dev environments"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Homebrew via bluefin-cli container"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Docker & Podman container runtimes"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• kubectl, kind, helm for Kubernetes"; color: "#c0caf5"; font.pixelSize: 14 } - } - } - } - } - - Slide { - Rectangle { - anchors.fill: parent - color: "#1a1b26" - - Column { - anchors.centerIn: parent - spacing: 20 - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Modern Tooling" - font.pixelSize: 28 - font.bold: true - color: "#9ece6a" - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 8 - - Text { text: "• Ghostty terminal"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Neovim with nightly builds"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Fish shell with Starship prompt"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Lazygit for git workflows"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• ripgrep, fd, eza, bat, zoxide"; color: "#c0caf5"; font.pixelSize: 14 } - } - } - } - } - - Slide { - Rectangle { - anchors.fill: parent - color: "#1a1b26" - - Column { - anchors.centerIn: parent - spacing: 20 - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Atomic & Reliable" - font.pixelSize: 28 - font.bold: true - color: "#f7768e" - } - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: "Built on Fedora Atomic (bootc)" - font.pixelSize: 16 - color: "#a9b1d6" - } - - Column { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 8 - - Text { text: "• Immutable base system"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Atomic updates with rollback"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Container-native workflow"; color: "#c0caf5"; font.pixelSize: 14 } - Text { text: "• Always recoverable"; color: "#c0caf5"; font.pixelSize: 14 } - } - } - } - } -} diff --git a/iso_files/calamares/modules/bootc-deploy.conf b/iso_files/calamares/modules/bootc-deploy.conf deleted file mode 100644 index 1634c50..0000000 --- a/iso_files/calamares/modules/bootc-deploy.conf +++ /dev/null @@ -1,12 +0,0 @@ -# Hypercube bootc Deploy Module Configuration -# Deploys the bootc image to the target system - -# The container image to deploy -# This will be read from the running system -imageRef: "" - -# Use the image from the currently running system -useCurrentImage: true - -# Target root for installation -targetRoot: "" diff --git a/iso_files/calamares/modules/users.conf b/iso_files/calamares/modules/users.conf deleted file mode 100644 index 06b0189..0000000 --- a/iso_files/calamares/modules/users.conf +++ /dev/null @@ -1,39 +0,0 @@ -# Hypercube Users Module Configuration - -defaultGroups: - - name: wheel - must_exist: true - system: true - - name: video - must_exist: false - system: true - - name: render - must_exist: false - system: true - - name: input - must_exist: false - system: true - -autologinGroup: autologin - -doAutologin: false - -sudoersGroup: wheel - -sudoersConfigureWithGroup: true - -setRootPassword: false - -doReusePassword: true - -passwordRequirements: - minLength: 8 - maxLength: -1 - -allowWeakPasswords: false -allowWeakPasswordsDefault: false - -userShell: /usr/bin/fish - -setHostname: EtcFile -writeHostsFile: true diff --git a/iso_files/calamares/modules/welcome.conf b/iso_files/calamares/modules/welcome.conf deleted file mode 100644 index eb8c813..0000000 --- a/iso_files/calamares/modules/welcome.conf +++ /dev/null @@ -1,21 +0,0 @@ -# Hypercube Welcome Module Configuration - -showSupportUrl: true -showKnownIssuesUrl: true -showReleaseNotesUrl: true - -requirements: - requiredStorage: 20 - requiredRam: 4 - internetCheckUrl: https://github.com - check: - - storage - - ram - - root - required: - - storage - - ram - - root - -geoip: - style: none diff --git a/iso_files/calamares/settings.conf b/iso_files/calamares/settings.conf deleted file mode 100644 index 918882e..0000000 --- a/iso_files/calamares/settings.conf +++ /dev/null @@ -1,38 +0,0 @@ -# Hypercube Calamares Settings -# Configuration for the bootc-based installer - -modules-search: [ local, /usr/lib/calamares/modules ] - -sequence: - - show: - - welcome - - locale - - keyboard - - partition - - users - - summary - - exec: - - partition - - mount - - bootc-deploy - - users - - displaymanager - - hwclock - - umount - - show: - - finished - -branding: hypercube - -prompt-install: true - -dont-chroot: false - -oem-setup: false - -disable-cancel: false -disable-cancel-during-exec: true - -hide-back-and-next-during-exec: true - -quit-at-end: false diff --git a/iso_files/hook-post-rootfs.sh b/iso_files/hook-post-rootfs.sh new file mode 100644 index 0000000..1f15967 --- /dev/null +++ b/iso_files/hook-post-rootfs.sh @@ -0,0 +1,59 @@ +#!/bin/bash +# Hypercube Live ISO post-rootfs hook +# SPDX-License-Identifier: GPL-3.0-or-later +# +# This script runs inside the rootfs before it gets squashed into the ISO. +# Files are available at /app/iso_files/ (copied from hypercube project) + +set -xeuo pipefail + +ISO_FILES="/app/iso_files" + +# Verify iso_files are available +if [[ ! -d "${ISO_FILES}" ]]; then + echo "ERROR: iso_files not found at ${ISO_FILES}" + echo "Make sure iso_files directory is copied to _titanoboa before building" + exit 1 +fi + +# Install Anaconda installer (Fedora's default installer) +dnf install -y anaconda anaconda-live + +# Install netcat for log sharing support +dnf install -y nmap-ncat + +# Update BUG_REPORT_URL to point to Hypercube GitHub issues +sed -i 's|^BUG_REPORT_URL=.*|BUG_REPORT_URL="https://github.com/binarypie-dev/hypercube/issues"|' /usr/lib/os-release + +# Install Anaconda profile for Hypercube +mkdir -p /etc/anaconda/profile.d/ +install -m 0644 "${ISO_FILES}/anaconda/hypercube.conf" /etc/anaconda/profile.d/hypercube.conf + +# Create Anaconda pixmaps directory for Hypercube branding +mkdir -p /usr/share/anaconda/pixmaps/hypercube/ + +# Install Anaconda CSS theme (Tokyo Night) +install -m 0644 "${ISO_FILES}/anaconda/hypercube.css" /usr/share/anaconda/pixmaps/hypercube/hypercube.css + +# Copy Plymouth spinner frames for Anaconda loading animation (if available) +if [[ -d /usr/share/plymouth/themes/hypercube ]]; then + cp /usr/share/plymouth/themes/hypercube/animation-*.png /usr/share/anaconda/pixmaps/hypercube/ 2>/dev/null || true +fi + +# Create live ISO hyprland config directory +mkdir -p /usr/share/hypr/config.live.d/ + +# Copy Hyprland live configs (ensure readable by all users) +install -m 0644 "${ISO_FILES}/hypr/hyprland-live.conf" /usr/share/hypr/config.live.d/hyprland.conf +install -m 0644 "${ISO_FILES}/hypr/hyprpaper-live.conf" /usr/share/hypr/config.live.d/hyprpaper.conf + +# Copy background image for live ISO +install -m 0644 "${ISO_FILES}/branding/background.png" /usr/share/hypr/config.live.d/background.png + +# Configure livesys to use the hyprland session +# The livesys-hyprland script is already provided by livesys-scripts from binarypie/hypercube COPR +sed -i 's/^livesys_session=.*/livesys_session=hyprland/' /etc/sysconfig/livesys +# If the line doesn't exist, add it +grep -q '^livesys_session=' /etc/sysconfig/livesys || echo 'livesys_session=hyprland' >> /etc/sysconfig/livesys + +echo "Hypercube post-rootfs hook completed successfully" diff --git a/iso_files/hypr/hyprland-live.conf b/iso_files/hypr/hyprland-live.conf new file mode 100644 index 0000000..21c877a --- /dev/null +++ b/iso_files/hypr/hyprland-live.conf @@ -0,0 +1,69 @@ +# Minimal Hyprland config for Hypercube Live ISO installer +# SPDX-License-Identifier: GPL-3.0-or-later + +monitor=,preferred,auto,auto + +$terminal = ghostty + +# Autostart essentials for live installer +exec-once = hyprpaper -c ~/.config/hypr/hyprpaper.conf +exec-once = nm-applet +exec-once = liveinst + +# Basic keybindings +$mainMod = SUPER + +bind = $mainMod, Q, exec, $terminal +bind = $mainMod, C, killactive +bind = $mainMod, M, exit +bind = $mainMod, V, togglefloating +bind = $mainMod, F, fullscreen, 0 + +# Window navigation (vim-like) +bind = $mainMod, H, movefocus, l +bind = $mainMod, L, movefocus, r +bind = $mainMod, K, movefocus, u +bind = $mainMod, J, movefocus, d + +# Arrow key navigation +bind = $mainMod, left, movefocus, l +bind = $mainMod, right, movefocus, r +bind = $mainMod, up, movefocus, u +bind = $mainMod, down, movefocus, d + +# Workspaces +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 + +# Move windows +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Tokyo Night themed look +general { + gaps_in = 5 + gaps_out = 10 + border_size = 2 + col.active_border = rgba(7aa2f7ee) rgba(bb9af7ee) 45deg + col.inactive_border = rgba(414868aa) + layout = dwindle +} + +decoration { + rounding = 8 +} + +misc { + disable_hyprland_logo = true + force_default_wallpaper = 0 +} + +input { + kb_layout = us + follow_mouse = 1 +} + +# Ignore maximize requests +windowrule = suppressevent maximize, class:.* diff --git a/iso_files/hypr/hyprpaper-live.conf b/iso_files/hypr/hyprpaper-live.conf new file mode 100644 index 0000000..7cd3cbc --- /dev/null +++ b/iso_files/hypr/hyprpaper-live.conf @@ -0,0 +1,4 @@ +preload = /usr/share/hypr/config.live.d/background.png +wallpaper = ,/usr/share/hypr/config.live.d/background.png +ipc = false +splash = false diff --git a/iso_files/livesys-hyprland b/iso_files/livesys-hyprland deleted file mode 100644 index ac8974d..0000000 --- a/iso_files/livesys-hyprland +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh -# -# livesys-hyprland: hyprland specific setup for livesys -# SPDX-License-Identifier: GPL-3.0-or-later -# - -HYPRLAND_SESSION_FILE="hyprland.desktop" - -# set up autologin for user liveuser -if [ -f /etc/greetd/config.toml ]; then - # Use greetd for Hyprland - cat > /etc/greetd/config.toml << GREETD_EOF -[terminal] -vt = 1 - -[default_session] -command = "Hyprland" -user = "liveuser" -GREETD_EOF -elif [ -f /etc/sddm.conf ]; then - sed -i 's/^#User=.*/User=liveuser/' /etc/sddm.conf - sed -i "s/^#Session=.*/Session=${HYPRLAND_SESSION_FILE}/" /etc/sddm.conf -else - cat > /etc/sddm.conf << SDDM_EOF -[Autologin] -User=liveuser -Session=${HYPRLAND_SESSION_FILE} -SDDM_EOF -fi - -# Show harddisk install on the desktop -if [ -f /usr/share/applications/liveinst.desktop ]; then - sed -i -e 's/NoDisplay=true/NoDisplay=false/' /usr/share/applications/liveinst.desktop -fi -mkdir -p /home/liveuser/Desktop - -# echoing type liveinst to start the installer -echo "echo 'Please type liveinst and press Enter to start the installer'" >> /home/liveuser/.bashrc From 9d4263b63b06de663865d3af91a42d9596ff318a Mon Sep 17 00:00:00 2001 From: binarypie Date: Sat, 27 Dec 2025 11:29:23 -0800 Subject: [PATCH 26/27] live iso is live os --- Justfile | 5 --- iso_files/hook-post-rootfs.sh | 25 ++++++++--- iso_files/hypr/hyprland-live.conf | 69 ------------------------------ iso_files/hypr/hyprpaper-live.conf | 4 -- 4 files changed, 18 insertions(+), 85 deletions(-) delete mode 100644 iso_files/hypr/hyprland-live.conf delete mode 100644 iso_files/hypr/hyprpaper-live.conf diff --git a/Justfile b/Justfile index 89ef51e..ea41708 100644 --- a/Justfile +++ b/Justfile @@ -265,11 +265,6 @@ build-iso-local flavor="main": _titanoboa-setup 1 \ binarypie/hypercube - # Fix ownership - if [[ "${UID}" -gt 0 ]]; then - {{ SUDO }} chown "${UID}:$(id -g)" -R "${PWD}" - fi - # Stop registry before moving ISO (while sudo is still cached) cleanup trap - EXIT diff --git a/iso_files/hook-post-rootfs.sh b/iso_files/hook-post-rootfs.sh index 1f15967..bce2eae 100644 --- a/iso_files/hook-post-rootfs.sh +++ b/iso_files/hook-post-rootfs.sh @@ -40,15 +40,19 @@ if [[ -d /usr/share/plymouth/themes/hypercube ]]; then cp /usr/share/plymouth/themes/hypercube/animation-*.png /usr/share/anaconda/pixmaps/hypercube/ 2>/dev/null || true fi -# Create live ISO hyprland config directory -mkdir -p /usr/share/hypr/config.live.d/ +# Copy base image Hyprland configs for live environment +# This gives users the full Hypercube experience to test before installing +if [[ -d /usr/share/hypercube/config/hypr ]]; then + mkdir -p /usr/share/hypr/config.live.d/ + cp /usr/share/hypercube/config/hypr/* /usr/share/hypr/config.live.d/ -# Copy Hyprland live configs (ensure readable by all users) -install -m 0644 "${ISO_FILES}/hypr/hyprland-live.conf" /usr/share/hypr/config.live.d/hyprland.conf -install -m 0644 "${ISO_FILES}/hypr/hyprpaper-live.conf" /usr/share/hypr/config.live.d/hyprpaper.conf + # Add liveinst autostart to launch the installer + cat >> /usr/share/hypr/config.live.d/hyprland.conf << 'EOF' -# Copy background image for live ISO -install -m 0644 "${ISO_FILES}/branding/background.png" /usr/share/hypr/config.live.d/background.png +# Live ISO - Auto-launch installer +exec-once = liveinst +EOF +fi # Configure livesys to use the hyprland session # The livesys-hyprland script is already provided by livesys-scripts from binarypie/hypercube COPR @@ -56,4 +60,11 @@ sed -i 's/^livesys_session=.*/livesys_session=hyprland/' /etc/sysconfig/livesys # If the line doesn't exist, add it grep -q '^livesys_session=' /etc/sysconfig/livesys || echo 'livesys_session=hyprland' >> /etc/sysconfig/livesys +# Disable services that shouldn't run in live environment +# These are update/setup services that don't make sense on live media +systemctl disable rpm-ostree-countme.service || true +systemctl disable bootloader-update.service || true +systemctl disable rpm-ostreed-automatic.timer || true +systemctl disable flatpak-preinstall.service || true + echo "Hypercube post-rootfs hook completed successfully" diff --git a/iso_files/hypr/hyprland-live.conf b/iso_files/hypr/hyprland-live.conf deleted file mode 100644 index 21c877a..0000000 --- a/iso_files/hypr/hyprland-live.conf +++ /dev/null @@ -1,69 +0,0 @@ -# Minimal Hyprland config for Hypercube Live ISO installer -# SPDX-License-Identifier: GPL-3.0-or-later - -monitor=,preferred,auto,auto - -$terminal = ghostty - -# Autostart essentials for live installer -exec-once = hyprpaper -c ~/.config/hypr/hyprpaper.conf -exec-once = nm-applet -exec-once = liveinst - -# Basic keybindings -$mainMod = SUPER - -bind = $mainMod, Q, exec, $terminal -bind = $mainMod, C, killactive -bind = $mainMod, M, exit -bind = $mainMod, V, togglefloating -bind = $mainMod, F, fullscreen, 0 - -# Window navigation (vim-like) -bind = $mainMod, H, movefocus, l -bind = $mainMod, L, movefocus, r -bind = $mainMod, K, movefocus, u -bind = $mainMod, J, movefocus, d - -# Arrow key navigation -bind = $mainMod, left, movefocus, l -bind = $mainMod, right, movefocus, r -bind = $mainMod, up, movefocus, u -bind = $mainMod, down, movefocus, d - -# Workspaces -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 - -# Move windows -bindm = $mainMod, mouse:272, movewindow -bindm = $mainMod, mouse:273, resizewindow - -# Tokyo Night themed look -general { - gaps_in = 5 - gaps_out = 10 - border_size = 2 - col.active_border = rgba(7aa2f7ee) rgba(bb9af7ee) 45deg - col.inactive_border = rgba(414868aa) - layout = dwindle -} - -decoration { - rounding = 8 -} - -misc { - disable_hyprland_logo = true - force_default_wallpaper = 0 -} - -input { - kb_layout = us - follow_mouse = 1 -} - -# Ignore maximize requests -windowrule = suppressevent maximize, class:.* diff --git a/iso_files/hypr/hyprpaper-live.conf b/iso_files/hypr/hyprpaper-live.conf deleted file mode 100644 index 7cd3cbc..0000000 --- a/iso_files/hypr/hyprpaper-live.conf +++ /dev/null @@ -1,4 +0,0 @@ -preload = /usr/share/hypr/config.live.d/background.png -wallpaper = ,/usr/share/hypr/config.live.d/background.png -ipc = false -splash = false From bb8dd50c5b2eaf233040372fbab0deb32a539168 Mon Sep 17 00:00:00 2001 From: binarypie Date: Sun, 28 Dec 2025 11:45:32 -0800 Subject: [PATCH 27/27] Basic install works --- .dockerignore | 2 + .gitignore | 1 + Justfile | 65 ++++++++-- build_files/base/01-base-system.sh | 1 + .../hypercube/01-hypercube-branding.sh | 2 +- build_files/hypercube/03-hypercube-configs.sh | 16 +++ iso_files/anaconda/hypercube.conf | 19 ++- iso_files/anaconda/hypercube.css | 84 ++++++++++++- iso_files/anaconda/sidebar-logo.png | Bin 0 -> 42084 bytes iso_files/hook-post-rootfs.sh | 49 +++++++- .../system/hypercube-first-boot.service | 19 +++ .../usr/libexec/hypercube/first-boot-wizard | 111 ++++++++++++++++++ 12 files changed, 345 insertions(+), 24 deletions(-) create mode 100644 .dockerignore create mode 100644 iso_files/anaconda/sidebar-logo.png create mode 100644 system_files/shared/usr/lib/systemd/system/hypercube-first-boot.service create mode 100755 system_files/shared/usr/libexec/hypercube/first-boot-wizard diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f87a347 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +/_titanoboa +/podman_scp* diff --git a/.gitignore b/.gitignore index 824155a..11ff8f6 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ podman_scp.* # VM testing _vm_build/ +.vm/ # ISO files *.iso diff --git a/Justfile b/Justfile index ea41708..4015d37 100644 --- a/Justfile +++ b/Justfile @@ -105,7 +105,7 @@ run flavor="main": # VM Recipes # ============================================ -# Run ISO in local VM with virt-manager +# Run ISO in local VM with virt-manager (persistent disk for testing installs) [group('VM')] run-iso-local iso_file: #!/usr/bin/bash @@ -117,28 +117,69 @@ run-iso-local iso_file: fi ISO_PATH="$(realpath {{ iso_file }})" - VM_NAME="hypercube-test-$$" + VM_NAME="hypercube-test" + # Store disk in current directory to avoid libvirt permission issues + DISK_PATH="$(pwd)/.vm/${VM_NAME}.qcow2" + + # RAM: 16GB for ostreecontainer deployment (needs temp space in tmpfs) + # vCPUs: 8 cores for faster installation + ram_size=16 + vcpus=8 + + echo "VM: ${VM_NAME}" + echo "RAM: ${ram_size}GB, vCPUs: ${vcpus}" + echo "Disk: ${DISK_PATH}" + + # Check if VM already exists + if virsh dominfo "${VM_NAME}" &>/dev/null; then + echo "VM '${VM_NAME}' already exists." + echo "Starting existing VM (will boot from disk, not ISO)..." + virsh start "${VM_NAME}" || true + virt-manager --connect qemu:///system --show-domain-console "${VM_NAME}" + exit 0 + fi - # Calculate RAM size (half of available, max 8G) - mem_free=$(awk '/MemAvailable/ { printf "%.0f\n", $2/1024/1024 }' /proc/meminfo) - ram_size=$(( mem_free > 16 ? 8 : (mem_free > 8 ? mem_free / 2 : 4) )) + # Create disk directory and disk if needed + mkdir -p "$(dirname "${DISK_PATH}")" + if [[ ! -f "${DISK_PATH}" ]]; then + echo "Creating disk: ${DISK_PATH}" + qemu-img create -f qcow2 "${DISK_PATH}" 64G + fi - echo "Starting VM: ${VM_NAME}" - echo "Close virt-manager window to destroy VM" + echo "Creating new VM with ISO..." + echo "After installation, run 'just run-iso-local ' again to boot from disk" - # Run with virt-install (transient VM, destroyed on shutdown) + # Create persistent VM virt-install \ --name "${VM_NAME}" \ --memory $(( ram_size * 1024 )) \ - --vcpus $(( $(nproc) / 2 > 0 ? $(nproc) / 2 : 1 )) \ + --vcpus ${vcpus} \ --cdrom "${ISO_PATH}" \ - --disk size=64,format=qcow2,bus=virtio \ + --disk path="${DISK_PATH}",format=qcow2,bus=virtio \ --os-variant fedora-unknown \ --boot uefi \ - --transient \ - --destroy-on-exit \ --autoconsole graphical +# Delete the test VM and its disk +[group('VM')] +delete-test-vm: + #!/usr/bin/bash + set -euo pipefail + VM_NAME="hypercube-test" + DISK_PATH="$(pwd)/.vm/${VM_NAME}.qcow2" + + echo "Stopping VM if running..." + virsh destroy "${VM_NAME}" 2>/dev/null || true + + echo "Removing VM definition..." + virsh undefine "${VM_NAME}" --nvram 2>/dev/null || true + + echo "Removing disk..." + rm -f "${DISK_PATH}" + rmdir "$(pwd)/.vm" 2>/dev/null || true + + echo "Test VM deleted." + # ============================================ # ISO Recipes # ============================================ diff --git a/build_files/base/01-base-system.sh b/build_files/base/01-base-system.sh index 6eb7926..d26e77b 100755 --- a/build_files/base/01-base-system.sh +++ b/build_files/base/01-base-system.sh @@ -90,6 +90,7 @@ systemctl enable greetd.service systemctl enable NetworkManager.service systemctl enable bluetooth.service systemctl enable power-profiles-daemon.service +systemctl enable hypercube-first-boot.service ### Disable services we don't need systemctl disable gdm.service 2>/dev/null || true diff --git a/build_files/hypercube/01-hypercube-branding.sh b/build_files/hypercube/01-hypercube-branding.sh index 07ea007..1360ad0 100755 --- a/build_files/hypercube/01-hypercube-branding.sh +++ b/build_files/hypercube/01-hypercube-branding.sh @@ -32,7 +32,7 @@ if [ -f /usr/lib/os-release ]; then sed -i "s/^NAME=.*/NAME=\"Hypercube\"/" /usr/lib/os-release # Update PRETTY_NAME - sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"Hypercube ${FEDORA_VERSION} (Fedora-based)\"/" /usr/lib/os-release + sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"Hypercube ${FEDORA_VERSION}\"/" /usr/lib/os-release # Set ID to hypercube, keep fedora as ID_LIKE sed -i "s/^ID=.*/ID=hypercube/" /usr/lib/os-release diff --git a/build_files/hypercube/03-hypercube-configs.sh b/build_files/hypercube/03-hypercube-configs.sh index 5e7cdaf..71888c7 100755 --- a/build_files/hypercube/03-hypercube-configs.sh +++ b/build_files/hypercube/03-hypercube-configs.sh @@ -42,6 +42,22 @@ config-file = /usr/share/hypercube/config/ghostty/config # Your customizations below: EOF +### Hyprland - stub that sources system config +# Users can customize by adding settings after the source line +# Hyprland parses linearly: system config first, then user customizations +mkdir -p /etc/skel/.config/hypr +cat > /etc/skel/.config/hypr/hyprland.conf << 'EOF' +# Hypercube Hyprland Configuration +# System defaults are sourced below. Add your customizations after this line. +# Settings defined after source will override the defaults. +# To replace defaults entirely, remove or comment out the source line. + +source = /usr/share/hypercube/config/hypr/hyprland.conf + +# Your customizations below: + +EOF + ### GTK theme settings - install to /etc/xdg/ for system-wide defaults # Users can override by creating ~/.config/gtk-3.0/settings.ini install -Dm644 "${CONFIG_DIR}/gtk-3.0/settings.ini" /etc/xdg/gtk-3.0/settings.ini diff --git a/iso_files/anaconda/hypercube.conf b/iso_files/anaconda/hypercube.conf index 3521e38..c9ff1e9 100644 --- a/iso_files/anaconda/hypercube.conf +++ b/iso_files/anaconda/hypercube.conf @@ -1,22 +1,37 @@ +# Anaconda configuration file for Hypercube +# SPDX-License-Identifier: GPL-3.0-or-later + [Profile] +# Hypercube is an ostree-based system, inherit from fedora-silverblue profile_id = hypercube -base_profile = fedora +base_profile = fedora-silverblue [Profile Detection] +# Match os-release values os_id = hypercube -variant_id = hypercube [Network] default_on_boot = FIRST_WIRED_WITH_LINK [Bootloader] menu_auto_hide = True +# Use fedora EFI directory for compatibility efi_dir = fedora [Storage] +# Hypercube uses BTRFS with compression default_scheme = BTRFS btrfs_compression = zstd:1 +# Partitioning for ostree systems +default_partitioning = + / (min 1 GiB, max 70 GiB) + /home (min 500 MiB, free 50 GiB) + /var (btrfs) + [User Interface] custom_stylesheet = /usr/share/anaconda/pixmaps/hypercube/hypercube.css +# Hide user/password spokes - user creation happens on first boot via wizard hidden_spokes = + PasswordSpoke + UserSpoke diff --git a/iso_files/anaconda/hypercube.css b/iso_files/anaconda/hypercube.css index 725faf4..cfa4ed3 100644 --- a/iso_files/anaconda/hypercube.css +++ b/iso_files/anaconda/hypercube.css @@ -12,16 +12,18 @@ @define-color tokyo_cyan #7dcfff; @define-color tokyo_green #9ece6a; -/* Sidebar - use solid color instead of image */ +/* Sidebar background with Tokyo Night dark */ .logo-sidebar { background-image: none; background-color: @tokyo_bg; background-repeat: no-repeat; } -/* Logo placeholder */ +/* Hypercube logo in sidebar */ .logo { - background-image: none; + background-image: url('/usr/share/anaconda/pixmaps/hypercube/sidebar-logo.png'); + background-position: 50% 20px; + background-repeat: no-repeat; background-color: transparent; } @@ -31,7 +33,7 @@ background-color: transparent; } -/* Navigation bar */ +/* Navigation bar - Tokyo Night purple accent */ AnacondaSpokeWindow #nav-box, AnacondaHubWindow #nav-box { background-color: @tokyo_purple; @@ -40,20 +42,32 @@ AnacondaHubWindow #nav-box { color: white; } -/* Main content area */ +/* Remove button shadow in nav-box */ +AnacondaSpokeWindow #nav-box GtkButton, +AnacondaHubWindow #nav-box GtkButton { + box-shadow: none; +} + +/* Main content area - dark background */ AnacondaSpokeWindow, AnacondaHubWindow { background-color: @tokyo_bg_dark; } -/* Buttons */ +/* Spoke buttons (main hub tiles) */ .spoke-button { background-color: @tokyo_dark_purple; color: @tokyo_fg; + border-radius: 8px; } .spoke-button:hover { background-color: @tokyo_blue; + color: @tokyo_bg; +} + +.spoke-button:focus { + border-color: @tokyo_cyan; } /* Selection highlights */ @@ -75,3 +89,61 @@ progressbar progress { progressbar trough { background-color: @tokyo_dark_purple; } + +/* Entry fields */ +entry { + background-color: @tokyo_bg; + color: @tokyo_fg; + border-color: @tokyo_dark_purple; +} + +entry:focus { + border-color: @tokyo_blue; +} + +/* Buttons */ +button { + background-color: @tokyo_dark_purple; + color: @tokyo_fg; +} + +button:hover { + background-color: @tokyo_blue; + color: @tokyo_bg; +} + +button:active { + background-color: @tokyo_purple; +} + +/* Check buttons and radio buttons */ +checkbutton check, +radiobutton radio { + background-color: @tokyo_bg; + border-color: @tokyo_dark_purple; +} + +checkbutton check:checked, +radiobutton radio:checked { + background-color: @tokyo_blue; +} + +/* Lists and tree views */ +treeview { + background-color: @tokyo_bg; + color: @tokyo_fg; +} + +treeview:selected { + background-color: @tokyo_blue; + color: @tokyo_bg; +} + +/* Scrollbars */ +scrollbar slider { + background-color: @tokyo_dark_purple; +} + +scrollbar slider:hover { + background-color: @tokyo_blue; +} diff --git a/iso_files/anaconda/sidebar-logo.png b/iso_files/anaconda/sidebar-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c3b4eb508b7aeee6b86932683d4b2ebc5a7b8656 GIT binary patch literal 42084 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 B9q#}D literal 0 HcmV?d00001 diff --git a/iso_files/hook-post-rootfs.sh b/iso_files/hook-post-rootfs.sh index bce2eae..fd94ed7 100644 --- a/iso_files/hook-post-rootfs.sh +++ b/iso_files/hook-post-rootfs.sh @@ -22,6 +22,28 @@ dnf install -y anaconda anaconda-live # Install netcat for log sharing support dnf install -y nmap-ncat +# Configure Anaconda to use ostreecontainer instead of live image rsync +# This is required for bootc/ostree-based systems +# Get the embedded container image name from podman storage +CONTAINER_IMAGE=$(podman images --format '{{.Repository}}:{{.Tag}}' | head -1) +if [[ -n "${CONTAINER_IMAGE}" ]]; then + echo "Configuring Anaconda to install from container: ${CONTAINER_IMAGE}" + + # Add ostreecontainer command to interactive-defaults.ks + # This tells Anaconda to deploy the container image instead of rsync'ing the live filesystem + # The container image reference stored in podman will be whatever was used to build the ISO: + # - Local builds: your local registry (e.g., 10.0.7.113:5000/hypercube:stable-daily) + # - GitHub Actions: ghcr.io/binarypie-dev/hypercube:latest + # Using containers-storage transport means it uses the locally embedded image regardless of name + cat >> /usr/share/anaconda/interactive-defaults.ks << EOF +# Hypercube: Install from embedded container image using ostreecontainer +ostreecontainer --url=${CONTAINER_IMAGE} --transport=containers-storage --no-signature-verification --stateroot=hypercube +EOF +else + echo "WARNING: No container image found in podman storage" + echo "Installation may fail - ensure container is embedded during ISO build" +fi + # Update BUG_REPORT_URL to point to Hypercube GitHub issues sed -i 's|^BUG_REPORT_URL=.*|BUG_REPORT_URL="https://github.com/binarypie-dev/hypercube/issues"|' /usr/lib/os-release @@ -35,6 +57,9 @@ mkdir -p /usr/share/anaconda/pixmaps/hypercube/ # Install Anaconda CSS theme (Tokyo Night) install -m 0644 "${ISO_FILES}/anaconda/hypercube.css" /usr/share/anaconda/pixmaps/hypercube/hypercube.css +# Install Hypercube sidebar logo for installer branding +install -m 0644 "${ISO_FILES}/anaconda/sidebar-logo.png" /usr/share/anaconda/pixmaps/hypercube/sidebar-logo.png + # Copy Plymouth spinner frames for Anaconda loading animation (if available) if [[ -d /usr/share/plymouth/themes/hypercube ]]; then cp /usr/share/plymouth/themes/hypercube/animation-*.png /usr/share/anaconda/pixmaps/hypercube/ 2>/dev/null || true @@ -46,11 +71,29 @@ if [[ -d /usr/share/hypercube/config/hypr ]]; then mkdir -p /usr/share/hypr/config.live.d/ cp /usr/share/hypercube/config/hypr/* /usr/share/hypr/config.live.d/ - # Add liveinst autostart to launch the installer + # Add live environment configuration cat >> /usr/share/hypr/config.live.d/hyprland.conf << 'EOF' -# Live ISO - Auto-launch installer -exec-once = liveinst +# Live ISO - Environment variables for XDG config discovery +# These are normally set by systemd user session but greetd skips that +env = XDG_CONFIG_DIRS,/etc/xdg:/usr/share/hypercube/config +env = XDG_DATA_DIRS,/usr/local/share:/usr/share:/usr/share/hypercube/data +env = GTK_THEME,Tokyonight-Dark +env = QT_QPA_PLATFORMTHEME,qt6ct + +# Live ISO - Window rules for Anaconda installer +# Prevent fullscreen, keep as tiled window so user can access terminal/nm-applet +windowrule = tile, class:^(anaconda)$ +windowrule = tile, class:^(liveinst)$ +windowrule = noinitialfocus, class:^(anaconda)$ +windowrule = noinitialfocus, class:^(liveinst)$ + +# Auto-launch terminal and network applet for live environment +exec-once = nm-applet --indicator +exec-once = $terminal + +# Live ISO - Auto-launch installer (after terminal so it doesn't grab focus first) +exec-once = sleep 1 && liveinst EOF fi diff --git a/system_files/shared/usr/lib/systemd/system/hypercube-first-boot.service b/system_files/shared/usr/lib/systemd/system/hypercube-first-boot.service new file mode 100644 index 0000000..e3c60e4 --- /dev/null +++ b/system_files/shared/usr/lib/systemd/system/hypercube-first-boot.service @@ -0,0 +1,19 @@ +[Unit] +Description=Hypercube First Boot User Setup +After=systemd-user-sessions.service plymouth-quit-wait.service +Before=greetd.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/libexec/hypercube/first-boot-wizard +StandardInput=tty +StandardOutput=tty +TTYPath=/dev/tty1 +TTYReset=yes +TTYVHangup=yes +TTYVTDisallocate=yes + +[Install] +WantedBy=multi-user.target +RequiredBy=greetd.service diff --git a/system_files/shared/usr/libexec/hypercube/first-boot-wizard b/system_files/shared/usr/libexec/hypercube/first-boot-wizard new file mode 100755 index 0000000..a6b61fa --- /dev/null +++ b/system_files/shared/usr/libexec/hypercube/first-boot-wizard @@ -0,0 +1,111 @@ +#!/bin/bash +# Hypercube First Boot Wizard +# Creates the initial user account on first boot +# SPDX-License-Identifier: GPL-3.0-or-later + +set -euo pipefail + +# Check if any regular users exist (UID >= 1000) +if getent passwd | awk -F: '$3 >= 1000 && $3 < 65534 {exit 1}'; then + # No regular users exist, run the wizard + : +else + # Users already exist, disable this service and exit + systemctl disable hypercube-first-boot.service + exit 0 +fi + +# Clear screen and show welcome +clear +echo "" +echo " ╔═══════════════════════════════════════════════════════════╗" +echo " ║ ║" +echo " ║ Welcome to Hypercube ║" +echo " ║ ║" +echo " ║ Let's set up your user account to get started. ║" +echo " ║ ║" +echo " ╚═══════════════════════════════════════════════════════════╝" +echo "" +echo "" + +# Get username +while true; do + read -p " Enter your username: " USERNAME + + # Validate username + if [[ -z "$USERNAME" ]]; then + echo " Username cannot be empty. Please try again." + continue + fi + + if [[ ! "$USERNAME" =~ ^[a-z_][a-z0-9_-]*$ ]]; then + echo " Invalid username. Use lowercase letters, numbers, underscore, or hyphen." + echo " Must start with a letter or underscore." + continue + fi + + if [[ ${#USERNAME} -gt 32 ]]; then + echo " Username too long. Maximum 32 characters." + continue + fi + + break +done + +echo "" + +# Get full name +read -p " Enter your full name (optional): " FULLNAME + +echo "" + +# Get password +while true; do + read -s -p " Enter password: " PASSWORD + echo "" + + if [[ -z "$PASSWORD" ]]; then + echo " Password cannot be empty. Please try again." + continue + fi + + if [[ ${#PASSWORD} -lt 8 ]]; then + echo " Password must be at least 8 characters. Please try again." + continue + fi + + read -s -p " Confirm password: " PASSWORD_CONFIRM + echo "" + + if [[ "$PASSWORD" != "$PASSWORD_CONFIRM" ]]; then + echo " Passwords do not match. Please try again." + echo "" + continue + fi + + break +done + +echo "" +echo " Creating user account..." + +# Create the user +useradd -m -G wheel -c "${FULLNAME:-$USERNAME}" "$USERNAME" + +# Set the password +echo "$USERNAME:$PASSWORD" | chpasswd + +# Clear password variables +unset PASSWORD PASSWORD_CONFIRM + +echo " User '$USERNAME' created successfully!" +echo "" +echo " Your account has been added to the 'wheel' group for sudo access." +echo "" +echo " Starting login screen..." +sleep 2 + +# Disable this service so it doesn't run again +systemctl disable hypercube-first-boot.service + +exit 0