Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions .github/workflows/build-disk.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +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
hook-pre-initramfs: ${{ github.workspace }}/iso_files/hide_hyprland_session.sh
livesys: true
livesys-repo: binarypie/hypercube
flatpaks-list: ${{ github.workspace }}/flatpaks/system-flatpaks.list

- name: Rename ISO and generate checksum
id: rename
Expand Down
16 changes: 11 additions & 5 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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 }}
Expand All @@ -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:
Expand Down Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,4 @@ _vm_build/
# ISO files
*.iso
result-iso/
dot_files/nvim/lazy-lock.json
3 changes: 1 addition & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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/
Expand Down
15 changes: 11 additions & 4 deletions Containerfile
Original file line number Diff line number Diff line change
@@ -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=""

# ============================================
Expand All @@ -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
Expand Down
31 changes: 25 additions & 6 deletions Justfile
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -157,8 +156,18 @@ build-iso flavor="main": _titanoboa-setup
fi

# Build ISO with Titanoboa
# 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 }} just build "${IMAGE_FULL}"
{{ 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
Expand Down Expand Up @@ -197,8 +206,18 @@ build-iso-ghcr flavor="main": _titanoboa-setup

echo "Building ISO for ${IMAGE_FULL}..."

# 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 }} just build "${IMAGE_FULL}"
{{ 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}"
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 |
Expand All @@ -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
Expand Down
98 changes: 98 additions & 0 deletions build_files/base/01-base-system.sh
Original file line number Diff line number Diff line change
@@ -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"
36 changes: 36 additions & 0 deletions build_files/dx/01-dx-tooling.sh
Original file line number Diff line number Diff line change
@@ -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"
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -26,22 +26,22 @@ 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

# 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
Expand Down Expand Up @@ -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"
Loading