summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build-disk.yml24
-rw-r--r--.github/workflows/build-live-installer.yml128
-rw-r--r--.github/workflows/build.yml94
-rw-r--r--.github/workflows/promote-acr.yml18
-rw-r--r--.github/workflows/validate-live-installer.yml40
-rw-r--r--Containerfile16
-rw-r--r--Justfile24
-rw-r--r--README.md34
-rwxr-xr-xbuild_files/build-initramfs17
-rwxr-xr-xbuild_files/build.sh12
-rwxr-xr-xbuild_files/image-info78
-rwxr-xr-xbuild_files/install-instruments.sh182
-rwxr-xr-xbuild_files/patch-bazzite-deck-identity.sh35
-rw-r--r--disk_config/iso-gnome.toml7
-rw-r--r--disk_config/iso-kde.toml7
-rw-r--r--image-template.env9
-rw-r--r--installer/Containerfile19
-rwxr-xr-xinstaller/build.sh65
-rw-r--r--installer/iso.yaml10
-rw-r--r--installer/lorax_templates/remove_root_password_prompt.tmpl1
-rw-r--r--installer/lorax_templates/set_default_user.tmpl1
-rwxr-xr-xjust_scripts/build-live-installer.sh122
-rwxr-xr-xjust_scripts/run-live-installer.sh23
-rw-r--r--system_files/etc/xdg/kcm-about-distrorc5
-rw-r--r--system_files/usr/lib/systemd/system/aerocore-instruments-setup.service18
-rw-r--r--system_files/usr/lib/tmpfiles.d/aerocore-deck-compat.conf2
-rwxr-xr-xsystem_files/usr/libexec/aerocore-instruments-setup123
l---------system_files/usr/share/backgrounds/default-dark.jxl1
l---------system_files/usr/share/backgrounds/default.jxl1
-rw-r--r--system_files/usr/share/icons/hicolor/128x128/bazzite-logo-icon.pngbin0 -> 5613 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/16x16/bazzite-logo-icon.pngbin0 -> 634 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/22x22/bazzite-logo-icon.pngbin0 -> 837 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/24x24/bazzite-logo-icon.pngbin0 -> 921 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/256x256/bazzite-logo-icon.pngbin0 -> 12105 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/32x32/bazzite-logo-icon.pngbin0 -> 1203 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/36x36/bazzite-logo-icon.pngbin0 -> 1345 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/48x48/bazzite-logo-icon.pngbin0 -> 1853 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/64x64/bazzite-logo-icon.pngbin0 -> 2571 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/96x96/bazzite-logo-icon.pngbin0 -> 4083 bytes
-rw-r--r--system_files/usr/share/icons/hicolor/scalable/places/bazzite-logo-le.svg19
-rw-r--r--system_files/usr/share/icons/hicolor/scalable/places/distributor-logo-white.svg11
-rw-r--r--system_files/usr/share/icons/hicolor/scalable/places/distributor-logo.svg19
-rw-r--r--system_files/usr/share/pixmaps/bazzite-logo-le.svg19
-rw-r--r--system_files/usr/share/pixmaps/bootloader/fedora.icnsbin0 -> 15377 bytes
-rw-r--r--system_files/usr/share/pixmaps/combination_med.pngbin0 -> 76166 bytes
-rw-r--r--system_files/usr/share/pixmaps/fedora-gdm-logo.pngbin0 -> 8908 bytes
-rw-r--r--system_files/usr/share/pixmaps/fedora-logo-small.pngbin0 -> 9520 bytes
-rw-r--r--system_files/usr/share/pixmaps/fedora-logo-sprite.pngbin0 -> 15673 bytes
-rw-r--r--system_files/usr/share/pixmaps/fedora-logo-sprite.svg19
-rw-r--r--system_files/usr/share/pixmaps/fedora-logo.pngbin0 -> 48311 bytes
-rw-r--r--system_files/usr/share/pixmaps/fedora_logo_med.pngbin0 -> 11667 bytes
-rw-r--r--system_files/usr/share/pixmaps/fedora_whitelogo.pngbin0 -> 71205 bytes
-rw-r--r--system_files/usr/share/pixmaps/fedora_whitelogo.svg31
-rw-r--r--system_files/usr/share/pixmaps/fedora_whitelogo_med.pngbin0 -> 10651 bytes
-rw-r--r--system_files/usr/share/pixmaps/system-logo-white.pngbin0 -> 53377 bytes
-rw-r--r--system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js4
-rw-r--r--system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/splash/images/bazzite_logo.svgzbin0 -> 1384 bytes
-rw-r--r--system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js4
-rw-r--r--system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/splash/images/bazzite_logo.svgzbin0 -> 1384 bytes
-rw-r--r--system_files/usr/share/plymouth/themes/spinner/watermark.pngbin0 -> 4140 bytes
-rw-r--r--system_files/usr/share/steamos/steamos.pngbin0 -> 20042 bytes
-rw-r--r--system_files/usr/share/ublue-os/bazzite/docs.svg23
-rw-r--r--system_files/usr/share/ublue-os/bazzite/logo.svg19
-rw-r--r--system_files/usr/share/ublue-os/bazzite/updatelogo.pngbin0 -> 61110 bytes
-rw-r--r--system_files/usr/share/wallpapers/aerocore-wallpaper.jxlbin0 -> 3395468 bytes
65 files changed, 1217 insertions, 67 deletions
diff --git a/.github/workflows/build-disk.yml b/.github/workflows/build-disk.yml
index 1de6c6e..cef58be 100644
--- a/.github/workflows/build-disk.yml
+++ b/.github/workflows/build-disk.yml
@@ -19,9 +19,9 @@ on:
branches:
- main
paths:
- - './disk_config/disk.toml'
- - './disk_config/iso.toml'
- - './.github/workflows/build-disk.yml'
+ - 'disk_config/disk.toml'
+ - 'disk_config/iso-kde.toml'
+ - '.github/workflows/build-disk.yml'
env:
IMAGE_NAME: ${{ github.event.repository.name }} # output of build.yml, keep in sync
@@ -36,7 +36,7 @@ concurrency:
jobs:
build:
name: Build disk images
- runs-on: ${{ inputs.platform == 'amd64' && 'ubuntu-24.04' || 'ubuntu-24.04-arm' }}
+ runs-on: ${{ inputs.platform == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-24.04' }}
strategy:
fail-fast: false
matrix:
@@ -54,11 +54,13 @@ jobs:
# Concatenate the types with a hyphen
DISK_TYPE=$(echo "${{ matrix.disk-type }}" | tr ' ' '-')
# Lowercase the image uri
- echo "IMAGE_REGISTRY=${IMAGE_REGISTRY,,}" >> ${GITHUB_ENV}
- echo "IMAGE_NAME=${IMAGE_NAME,,}" >> ${GITHUB_ENV}
- echo "DISK_TYPE=${DISK_TYPE}" >> ${GITHUB_ENV}
- echo "USER_UID=${USER_UID}" >> ${GITHUB_ENV}
- echo "USER_GID=${USER_GID}" >> ${GITHUB_ENV}
+ {
+ echo "IMAGE_REGISTRY=${IMAGE_REGISTRY,,}"
+ echo "IMAGE_NAME=${IMAGE_NAME,,}"
+ echo "DISK_TYPE=${DISK_TYPE}"
+ echo "USER_UID=${USER_UID}"
+ echo "USER_GID=${USER_GID}"
+ } >> "$GITHUB_ENV"
- name: Install dependencies
if: inputs.platform == 'arm64'
@@ -82,7 +84,7 @@ jobs:
uses: osbuild/bootc-image-builder-action@30960621b85c9e76c653082f9ef4cab5a10210d5 # main
with:
builder-image: ${{ env.BIB_IMAGE }}
- config-file: ${{ matrix.disk-type == 'anaconda-iso' && './disk_config/iso.toml' || './disk_config/disk.toml' }}
+ config-file: ${{ matrix.disk-type == 'anaconda-iso' && './disk_config/iso-kde.toml' || './disk_config/disk.toml' }}
image: ${{ env.IMAGE_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.DEFAULT_TAG }}
chown: ${{ env.USER_UID }}:${{ env.USER_GID }}
types: ${{ matrix.disk-type }}
@@ -112,4 +114,4 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install -y rclone
- rclone copy $SOURCE_DIR S3:${{ secrets.S3_BUCKET_NAME }}
+ rclone copy "$SOURCE_DIR" "S3:${{ secrets.S3_BUCKET_NAME }}"
diff --git a/.github/workflows/build-live-installer.yml b/.github/workflows/build-live-installer.yml
new file mode 100644
index 0000000..059c3e9
--- /dev/null
+++ b/.github/workflows/build-live-installer.yml
@@ -0,0 +1,128 @@
+name: Build live installer
+
+on:
+ workflow_dispatch:
+ inputs:
+ image_tag:
+ description: "AeroCore image tag to install"
+ required: false
+ default: latest
+ type: string
+ workflow_call:
+ push:
+ branches:
+ - main
+ paths:
+ - "Justfile"
+ - "installer/**"
+ - "just_scripts/build-live-installer.sh"
+ - ".github/workflows/build-live-installer.yml"
+
+permissions: {}
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
+ cancel-in-progress: true
+
+jobs:
+ build-live-installer:
+ name: Build KDE live installer
+ runs-on: ubuntu-24.04
+ permissions:
+ contents: read
+ packages: read
+
+ env:
+ IMAGE_REGISTRY: ghcr.io/${{ github.repository_owner }}
+ IMAGE_TAG: ${{ inputs.image_tag || 'latest' }}
+ # Keep these aligned with the Fedora major used by the target bazzite-deck base image.
+ LIVE_BASE_IMAGE: quay.io/fedora/fedora-kinoite:43
+ FEDORA_VERSION: "43"
+
+ steps:
+ - name: Maximize build space
+ uses: ublue-os/remove-unwanted-software@cc0becac701cf642c8f0a6613bbdaf5dc36b259e # v9
+ with:
+ remove-codeql: true
+
+ - name: Mount container storage BTRFS loopback
+ run: |
+ sudo truncate -s 70G /mnt/podman-storage.img
+ sudo mkfs.btrfs -f /mnt/podman-storage.img
+ sudo podman system reset --force
+ sudo systemctl stop podman.service
+ sudo mount -o compress-force=zstd:2 /mnt/podman-storage.img /var/lib/containers/storage
+ sudo systemctl start podman.service
+
+ - name: Checkout
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
+
+ - name: Install just
+ uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4
+
+ - name: Prepare image references
+ run: |
+ image_name="$(just image_name)"
+ image_registry="${IMAGE_REGISTRY,,}"
+ echo "IMAGE_NAME=${image_name,,}" >> "$GITHUB_ENV"
+ echo "IMAGE_REGISTRY=${image_registry}" >> "$GITHUB_ENV"
+
+ - name: Login to GHCR
+ run: |
+ echo '${{ secrets.GITHUB_TOKEN }}' | sudo podman login ghcr.io \
+ --username '${{ github.actor }}' --password-stdin
+
+ - name: Pull AeroCore install image
+ run: |
+ sudo podman pull "${IMAGE_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}"
+
+ - name: Build live installer payload
+ run: |
+ mkdir -p output
+ sudo podman tag \
+ "${IMAGE_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}" \
+ localhost/aerocore-live-payload:latest
+ sudo podman save \
+ --format oci-archive \
+ --output output/install-payload.oci \
+ localhost/aerocore-live-payload:latest
+
+ sudo podman build \
+ --cap-add sys_admin \
+ --security-opt label=disable \
+ --build-arg "BASE_IMAGE=${LIVE_BASE_IMAGE}" \
+ --build-arg "INSTALL_IMAGE_PAYLOAD=localhost/aerocore-live-payload:latest" \
+ --build-arg "INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci" \
+ --tag localhost/aerocore-live-payload:latest \
+ --file installer/Containerfile \
+ .
+
+ - name: Build ISO
+ id: build
+ uses: Zeglius/titanoboa@7737f4748458252ac827dca14b3d6dd09298472a # revamp-pr
+ with:
+ arch: x86_64
+ image_name: aerocore-live-payload
+ image_repo: localhost
+ variant: Kinoite
+ version: ${{ env.FEDORA_VERSION }}
+ image_tag: latest
+ iso_name: aerocore-os-${{ env.IMAGE_TAG }}-amd64.iso
+ enable_cache_dnf: "false"
+ enable_cache_skopeo: "false"
+ enable_flatpak_dependencies: "false"
+ additional_templates: /github/workspace/installer/lorax_templates/remove_root_password_prompt.tmpl /github/workspace/installer/lorax_templates/set_default_user.tmpl
+
+ - name: Display checksum
+ run: |
+ cat "${{ steps.build.outputs.iso_path }}/${{ steps.build.outputs.iso_name }}-CHECKSUM"
+
+ - name: Upload ISO artifact
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7
+ with:
+ name: aerocore-os-live-installer-${{ env.IMAGE_TAG }}
+ path: |
+ ${{ steps.build.outputs.iso_path }}/${{ steps.build.outputs.iso_name }}
+ ${{ steps.build.outputs.iso_path }}/${{ steps.build.outputs.iso_name }}-CHECKSUM
+ if-no-files-found: error
+ compression-level: 0
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 95f2f1c..b4b9d89 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -12,7 +12,7 @@ env:
IMAGE_REGISTRY: "ghcr.io/${{ github.repository_owner }}" # do not edit
concurrency:
- group: ${{ github.workflow }}-${{ github.ref || github.run_id }}-${{ inputs.brand_name}}-${{ inputs.stream_name }}
+ group: ${{ github.workflow }}-${{ github.ref || github.run_id }}
cancel-in-progress: true
jobs:
@@ -27,11 +27,34 @@ jobs:
steps:
# These stage versions are pinned by https://github.com/renovatebot/renovate
- - name: Checkout
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
+ - name: Show disk space
+ run: sudo df -h
- name: Maximize build space
uses: ublue-os/remove-unwanted-software@695eb75bc387dbcd9685a8e72d23439d8686cba6
+ with:
+ extra-squeeze: true
+
+ - name: Check if /mnt is there
+ id: check-mnt
+ run: |
+ if sudo mountpoint /mnt; then
+ echo "mnt_is_there=1" >> "$GITHUB_OUTPUT"
+ else
+ echo "mnt_is_there=0" >> "$GITHUB_OUTPUT"
+ fi
+
+ - name: Mount BTRFS for podman storage
+ if: ${{ steps.check-mnt.outputs.mnt_is_there == '1' }}
+ uses: ublue-os/container-storage-action@main
+ with:
+ target-dir: /var/lib/containers
+
+ - name: Show available build space
+ run: sudo df -h
+
+ - name: Checkout
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
- name: Install just
uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 #v4.0.0
@@ -46,20 +69,24 @@ jobs:
run: |
IMAGE_NAME=$(just image_name)
- echo "IMAGE_NAME=${IMAGE_NAME}" >> $GITHUB_ENV
+ echo "IMAGE_NAME=${IMAGE_NAME}" >> "$GITHUB_ENV"
- name: Default Tag
id: gen-default-tag
run: |
- DEFAULT_TAG=$(just generate-default-tag)
+ if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" && "${GITHUB_REF_NAME}" == "testing" ]]; then
+ DEFAULT_TAG="testing-$(date -u +%Y%m%d)"
+ else
+ DEFAULT_TAG=$(just generate-default-tag)
+ fi
- echo "DEFAULT_TAG=${DEFAULT_TAG}" >> $GITHUB_ENV
+ echo "DEFAULT_TAG=${DEFAULT_TAG}" >> "$GITHUB_ENV"
- name: Prepare environment
run: |
# Lowercase the image uri https://github.com/macbre/push-to-ghcr/issues/12
- echo "IMAGE_REGISTRY=${IMAGE_REGISTRY,,}" >> ${GITHUB_ENV}
- echo "IMAGE_NAME=${IMAGE_NAME,,}" >> ${GITHUB_ENV}
+ echo "IMAGE_REGISTRY=${IMAGE_REGISTRY,,}" >> "$GITHUB_ENV"
+ echo "IMAGE_NAME=${IMAGE_NAME,,}" >> "$GITHUB_ENV"
# This actually builds the container image
- name: Build Image
@@ -69,18 +96,23 @@ jobs:
FLATPAK_REMOTE_URL: ${{ vars.FLATPAK_REMOTE_URL }}
HOMEBREW_BOTTLE_DOMAIN: ${{ vars.HOMEBREW_BOTTLE_DOMAIN }}
HOMEBREW_API_DOMAIN: ${{ vars.HOMEBREW_API_DOMAIN }}
+ OSTREE_IMAGE_REF: ${{ vars.OSTREE_IMAGE_REF }}
+ INSTRUMENTS_ENABLED: ${{ vars.INSTRUMENTS_ENABLED || 'true' }}
+ INSTRUMENTS_RELEASE_REPOSITORY: ${{ vars.INSTRUMENTS_RELEASE_REPOSITORY || 'AeroCore-IO/booster-installer' }}
+ INSTRUMENTS_VERSION: ${{ vars.INSTRUMENTS_VERSION || 'latest' }}
+ INSTRUMENTS_RELEASE_API_BASE: ${{ vars.INSTRUMENTS_RELEASE_API_BASE || 'https://api.github.com' }}
run: |
- sudo -E $(command -v just) build \
- ${IMAGE_NAME} \
- ${DEFAULT_TAG}
+ sudo -E "$(command -v just)" build \
+ "${IMAGE_NAME}" \
+ "${DEFAULT_TAG}"
# This is optional, this provides smaller delta updates
- name: Rechunk with rpm-ostree
id: rechunk
run: |
- sudo -E $(command -v just) ostree-rechunk \
- ${IMAGE_NAME} \
- ${DEFAULT_TAG}
+ sudo -E "$(command -v just)" ostree-rechunk \
+ "${IMAGE_NAME}" \
+ "${DEFAULT_TAG}"
# If you are feeling adventurous, use the new distro agnostic rechunker
# https://github.com/coreos/chunkah
@@ -95,48 +127,53 @@ jobs:
- name: Generate Build Tags
id: gen-build-tags
run: |
- alias_tags="$(just generate-build-tags \
- ${IMAGE_NAME} \
- ${DEFAULT_TAG})"
+ if [[ "${GITHUB_EVENT_NAME}" == "workflow_dispatch" && "${GITHUB_REF_NAME}" == "testing" ]]; then
+ alias_tags="testing ${DEFAULT_TAG}"
+ else
+ alias_tags="$(just generate-build-tags \
+ "${IMAGE_NAME}" \
+ "${DEFAULT_TAG}")"
+ fi
echo "Tags for this Action..."
echo "${alias_tags}"
- echo "alias_tags=${alias_tags}" >> $GITHUB_OUTPUT
+ echo "alias_tags=${alias_tags}" >> "$GITHUB_OUTPUT"
- name: Tag Image
id: tag-images
env:
ALIAS_TAGS: ${{ steps.gen-build-tags.outputs.alias_tags }}
run: |
- sudo -E $(command -v just) tag-images \
+ sudo -E "$(command -v just)" tag-images \
"${IMAGE_NAME}" \
"${DEFAULT_TAG}" \
"${ALIAS_TAGS}"
- # These `if` statements are so that pull requests for your custom images do not make it publish any packages under your name without you knowing
- # They also check if the runner is on the default branch so that things like the merge queue (if you enable it), are going to work
+ # These `if` statements keep pull requests from publishing packages.
+ # They publish default-branch builds and manual testing branch builds.
- name: Login to GitHub Container Registry
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
- if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
+ if: github.event_name != 'pull_request' && (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/testing'))
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push To GHCR
- if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
+ if: github.event_name != 'pull_request' && (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/testing'))
id: push-image
env:
ALIAS_TAGS: ${{ steps.gen-build-tags.outputs.alias_tags }}
run: |
set -euox pipefail
for tag in ${ALIAS_TAGS}; do
- sudo -E podman push --digestfile=/tmp/digestfile ${IMAGE_NAME}:${tag} ${IMAGE_REGISTRY}/${IMAGE_NAME}:${tag}
+ sudo -E podman push --digestfile=/tmp/digestfile \
+ "${IMAGE_NAME}:${tag}" "${IMAGE_REGISTRY}/${IMAGE_NAME}:${tag}"
done
digest=$(< /tmp/digestfile)
- echo "digest=${digest}" >> $GITHUB_OUTPUT
+ echo "digest=${digest}" >> "$GITHUB_OUTPUT"
# This section is optional and only needs to be enabled if you plan on distributing
# your project for others to consume. You will need to create a public and private key
@@ -144,17 +181,18 @@ jobs:
# to consume. For more details, review the image signing section of the README.
- name: Install Cosign
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
- if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
+ if: github.event_name != 'pull_request' && (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/testing'))
# https://github.com/containers/container-libs/issues/388
with:
cosign-release: 'v2.6.3'
- name: Sign container image
id: sign-image
- if: github.event_name != 'pull_request' && github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
+ if: github.event_name != 'pull_request' && (github.ref == format('refs/heads/{0}', github.event.repository.default_branch) || (github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/testing'))
env:
COSIGN_EXPERIMENTAL: false
COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }}
+ COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
DIGEST: ${{ steps.push-image.outputs.digest }}
run: |
- cosign sign -y --key env://COSIGN_PRIVATE_KEY ${IMAGE_REGISTRY}/${IMAGE_NAME}@${DIGEST}
+ cosign sign -y --key env://COSIGN_PRIVATE_KEY "${IMAGE_REGISTRY}/${IMAGE_NAME}@${DIGEST}"
diff --git a/.github/workflows/promote-acr.yml b/.github/workflows/promote-acr.yml
index 99a67f8..6b00e3b 100644
--- a/.github/workflows/promote-acr.yml
+++ b/.github/workflows/promote-acr.yml
@@ -13,7 +13,7 @@ on:
required: false
type: string
image_name:
- description: "Image name override; defaults to image-template.env"
+ description: "Image name override; defaults to IMAGE_NAME var, then image-template.env"
required: false
type: string
@@ -48,18 +48,21 @@ jobs:
- name: Prepare image variables
env:
IMAGE_NAME_INPUT: ${{ inputs.image_name }}
+ IMAGE_NAME_VAR: ${{ vars.IMAGE_NAME }}
SOURCE_TAG: ${{ inputs.source_tag }}
TARGET_TAGS_INPUT: ${{ inputs.target_tags }}
run: |
set -euo pipefail
- image_name="${IMAGE_NAME_INPUT:-$(just image_name)}"
+ image_name="${IMAGE_NAME_INPUT:-${IMAGE_NAME_VAR:-$(just image_name)}}"
target_tags="${TARGET_TAGS_INPUT:-$SOURCE_TAG}"
- echo "IMAGE_REGISTRY=${IMAGE_REGISTRY,,}" >> "$GITHUB_ENV"
- echo "IMAGE_NAME=${image_name,,}" >> "$GITHUB_ENV"
- echo "SOURCE_TAG=${SOURCE_TAG}" >> "$GITHUB_ENV"
- echo "TARGET_TAGS=${target_tags}" >> "$GITHUB_ENV"
+ {
+ echo "IMAGE_REGISTRY=${IMAGE_REGISTRY,,}"
+ echo "IMAGE_NAME=${image_name,,}"
+ echo "SOURCE_TAG=${SOURCE_TAG}"
+ echo "TARGET_TAGS=${target_tags}"
+ } >> "$GITHUB_ENV"
- name: Validate ACR configuration
env:
@@ -68,6 +71,7 @@ jobs:
ACR_USERNAME: ${{ secrets.ACR_USERNAME }}
ACR_PASSWORD: ${{ secrets.ACR_PASSWORD }}
COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }}
+ COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
run: |
set -euo pipefail
@@ -76,6 +80,7 @@ jobs:
: "${ACR_USERNAME:?Repository secret ACR_USERNAME is required.}"
: "${ACR_PASSWORD:?Repository secret ACR_PASSWORD is required.}"
: "${COSIGN_PRIVATE_KEY:?Repository secret SIGNING_SECRET is required.}"
+ : "${COSIGN_PASSWORD:?Repository secret COSIGN_PASSWORD is required.}"
- name: Login to GitHub Container Registry
env:
@@ -140,6 +145,7 @@ jobs:
ACR_NAMESPACE: ${{ vars.ACR_NAMESPACE }}
COSIGN_EXPERIMENTAL: false
COSIGN_PRIVATE_KEY: ${{ secrets.SIGNING_SECRET }}
+ COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
DIGEST: ${{ steps.promote.outputs.digest }}
run: |
set -euo pipefail
diff --git a/.github/workflows/validate-live-installer.yml b/.github/workflows/validate-live-installer.yml
new file mode 100644
index 0000000..3d35a5d
--- /dev/null
+++ b/.github/workflows/validate-live-installer.yml
@@ -0,0 +1,40 @@
+name: Validate live installer
+
+on:
+ pull_request:
+ paths:
+ - "Justfile"
+ - "installer/**"
+ - "just_scripts/build-live-installer.sh"
+ - ".github/workflows/build-live-installer.yml"
+ - ".github/workflows/validate-live-installer.yml"
+
+permissions:
+ contents: read
+
+jobs:
+ validate-live-installer:
+ name: Validate live installer inputs
+ runs-on: ubuntu-24.04
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7
+
+ - name: Install just
+ uses: extractions/setup-just@53165ef7e734c5c07cb06b3c8e7b647c5aa16db3 # v4
+
+ - name: Validate workflow YAML
+ run: |
+ ruby -e 'require "yaml"; Dir[".github/workflows/*.yml"].each { |file| YAML.load_file(file) }'
+
+ - name: Validate Justfile formatting
+ run: |
+ just --unstable --fmt --check -f Justfile
+
+ - name: Validate build scripts
+ run: |
+ for script in build_files/*.sh installer/*.sh just_scripts/*.sh; do
+ bash -n "$script"
+ done
+ bash -n system_files/usr/libexec/aerocore-instruments-setup
diff --git a/Containerfile b/Containerfile
index 976da0c..16e85a2 100644
--- a/Containerfile
+++ b/Containerfile
@@ -7,10 +7,16 @@ COPY system_files /system_files
# Base Image
FROM ${BASE_IMAGE}
+ARG BASE_IMAGE
+ARG IMAGE_NAME="aerocore-os"
+ARG IMAGE_VENDOR="AeroCore-IO"
+ARG IMAGE_BRANCH="stable"
+ARG VERSION_TAG="latest"
+ARG VERSION_PRETTY="latest"
+ARG OSTREE_IMAGE_REF=""
## Other possible base images include:
# ghcr.io/ublue-os/bazzite-deck:testing
# ghcr.io/ublue-os/bazzite-deck:stable-43.20260420
-# ghcr.io/ublue-os/bazzite:stable
### [IM]MUTABLE /opt
## Some bootable images, like Fedora, have /opt symlinked to /var/opt, in order to
@@ -30,12 +36,18 @@ FROM ${BASE_IMAGE}
ARG FLATPAK_REMOTE_URL=""
ARG HOMEBREW_BOTTLE_DOMAIN=""
ARG HOMEBREW_API_DOMAIN=""
+ARG INSTRUMENTS_ENABLED="true"
+ARG INSTRUMENTS_RELEASE_REPOSITORY="AeroCore-IO/booster-installer"
+ARG INSTRUMENTS_VERSION="latest"
+ARG INSTRUMENTS_RELEASE_API_BASE="https://api.github.com"
RUN --mount=type=bind,from=ctx,source=/,target=/ctx \
--mount=type=cache,dst=/var/cache \
--mount=type=cache,dst=/var/log \
--mount=type=tmpfs,dst=/tmp \
- /ctx/build.sh
+ /ctx/build.sh && \
+ /ctx/image-info && \
+ /ctx/build-initramfs
### LINTING
## Verify final image and contents are correct.
diff --git a/Justfile b/Justfile
index e83466d..b65d2c9 100644
--- a/Justfile
+++ b/Justfile
@@ -9,18 +9,34 @@ export image_logo_url := env_var("IMAGE_LOGO_URL")
export default_tag := env_var("DEFAULT_TAG")
export bib_image := env_var("BIB_IMAGE")
export BASE_IMAGE := env_var_or_default("BASE_IMAGE", "ghcr.io/ublue-os/bazzite-deck:stable")
+export LIVE_BASE_IMAGE := env_var_or_default("LIVE_BASE_IMAGE", "quay.io/fedora/fedora-kinoite:43")
+export INSTALLER_BUILDER_IMAGE := env_var_or_default("INSTALLER_BUILDER_IMAGE", "ghcr.io/jasonn3/build-container-installer:v1.5.0")
export FLATPAK_REMOTE_URL := env_var_or_default("FLATPAK_REMOTE_URL", "")
export HOMEBREW_BOTTLE_DOMAIN := env_var_or_default("HOMEBREW_BOTTLE_DOMAIN", "")
export HOMEBREW_API_DOMAIN := env_var_or_default("HOMEBREW_API_DOMAIN", "")
+export INSTRUMENTS_ENABLED := env_var_or_default("INSTRUMENTS_ENABLED", "true")
+export INSTRUMENTS_RELEASE_REPOSITORY := env_var_or_default("INSTRUMENTS_RELEASE_REPOSITORY", "AeroCore-IO/booster-installer")
+export INSTRUMENTS_VERSION := env_var_or_default("INSTRUMENTS_VERSION", "latest")
+export INSTRUMENTS_RELEASE_API_BASE := env_var_or_default("INSTRUMENTS_RELEASE_API_BASE", "https://api.github.com")
alias build-vm := build-qcow2
alias rebuild-vm := rebuild-qcow2
alias run-vm := run-vm-qcow2
+alias build-live-iso := build-live-installer
+alias run-live-iso := run-live-installer
[private]
default:
@just --list
+# Build a Bazzite-style live installer ISO
+build-live-installer $target_image=("localhost/" + image_name) $tag=default_tag:
+ @IMAGE_NAME="{{ target_image }}" IMAGE_TAG="{{ tag }}" ./just_scripts/build-live-installer.sh
+
+# Boot the live installer ISO with QEMU
+run-live-installer:
+ @./just_scripts/run-live-installer.sh
+
# Check Just Syntax
[group('Just')]
check:
@@ -104,7 +120,7 @@ build $target_image=image_name $tag=default_tag:
BUILD_ARGS=()
LABELS=()
- for arg in BASE_IMAGE FLATPAK_REMOTE_URL HOMEBREW_BOTTLE_DOMAIN HOMEBREW_API_DOMAIN; do
+ for arg in BASE_IMAGE FLATPAK_REMOTE_URL HOMEBREW_BOTTLE_DOMAIN HOMEBREW_API_DOMAIN OSTREE_IMAGE_REF INSTRUMENTS_ENABLED INSTRUMENTS_RELEASE_REPOSITORY INSTRUMENTS_VERSION INSTRUMENTS_RELEASE_API_BASE; do
if [[ -n "${!arg:-}" ]]; then
BUILD_ARGS+=("--build-arg" "${arg}=${!arg}")
fi
@@ -348,7 +364,7 @@ build-raw $target_image=("localhost/" + image_name) $tag=default_tag: && (_build
# Build an ISO virtual machine image
[group('Build Virtal Machine Image')]
-build-iso $target_image=("localhost/" + image_name) $tag=default_tag: && (_build-bib target_image tag "iso" "disk_config/iso.toml")
+build-iso $target_image=("localhost/" + image_name) $tag=default_tag: && (_build-bib target_image tag "iso" "disk_config/iso-kde.toml")
# Rebuild a QCOW2 virtual machine image
[group('Build Virtal Machine Image')]
@@ -360,7 +376,7 @@ rebuild-raw $target_image=("localhost/" + image_name) $tag=default_tag: && (_reb
# Rebuild an ISO virtual machine image
[group('Build Virtal Machine Image')]
-rebuild-iso $target_image=("localhost/" + image_name) $tag=default_tag: && (_rebuild-bib target_image tag "iso" "disk_config/iso.toml")
+rebuild-iso $target_image=("localhost/" + image_name) $tag=default_tag: && (_rebuild-bib target_image tag "iso" "disk_config/iso-kde.toml")
# Run a virtual machine with the specified image type and configuration
_run-vm $target_image $tag $type $config:
@@ -414,7 +430,7 @@ run-vm-raw $target_image=("localhost/" + image_name) $tag=default_tag: && (_run-
# Run a virtual machine from an ISO
[group('Run Virtal Machine')]
-run-vm-iso $target_image=("localhost/" + image_name) $tag=default_tag: && (_run-vm target_image tag "iso" "disk_config/iso.toml")
+run-vm-iso $target_image=("localhost/" + image_name) $tag=default_tag: && (_run-vm target_image tag "iso" "disk_config/iso-kde.toml")
# Run a virtual machine using systemd-vmspawn
[group('Run Virtal Machine')]
diff --git a/README.md b/README.md
index fdd7c76..3fc11c5 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,25 @@ FROM ghcr.io/ublue-os/bazzite-deck:stable
By focusing strictly on file overlays and configuration writing, this build intentionally avoids invasive operations like `dnf5 install/remove`, COPR enablement, akmods pulls, or kernel recompilations. This architectural choice keeps AeroCore OS completely immune to Fedora/COPR dependency drift during major upstream transition windows (e.g., Bazzite 43 to 44).
+## AeroCore Booster integration
+
+Image builds download the selected AeroCore Booster release from
+`AeroCore-IO/booster-installer`, verify its published SHA-256 checksum, and
+store the complete release seed under `/usr/share/aerocore-booster-release`.
+The release installer runs once for the first active graphical user and copies
+the application into that user's XDG directories. After bootstrapping, updates
+and uninstallation remain owned by the normal Instruments user-space installer.
+The bootstrap completion marker is stored at
+`/var/lib/aerocore/instruments-bootstrap-complete`, so uninstalling the user
+application does not cause the image seed to reinstall it on the next boot.
+Remove that marker and enable `aerocore-instruments-setup.service` to explicitly
+bootstrap the application again.
+
+Set `INSTRUMENTS_VERSION` to a release tag for reproducible builds, or leave it
+as `latest` for rolling development images. Set `INSTRUMENTS_ENABLED=false` to
+build without Booster. The release repository and API base can be overridden
+with `INSTRUMENTS_RELEASE_REPOSITORY` and `INSTRUMENTS_RELEASE_API_BASE`.
+
---
## Key Features & Optimizations
@@ -25,7 +44,7 @@ By focusing strictly on file overlays and configuration writing, this build inte
To build AeroCore OS locally, edit `image-template.env` to match your target configurations and then run:
```bash
-just build
+sudo just build
```
@@ -35,3 +54,16 @@ To test a different upstream base image directly without modifying the environme
BASE_IMAGE=ghcr.io/ublue-os/bazzite-deck:testing just build
```
+
+To build the Bazzite-style live installer locally, first build the AeroCore
+image and then run:
+
+```bash
+sudo just build
+just build-live-installer
+just run-live-installer
+```
+
+This requires privileged Podman, a rootful Podman API socket, and roughly
+70 GiB of free space. The live installer workflow consumes the published
+`latest` AeroCore image and uploads the ISO as a GitHub Actions artifact.
diff --git a/build_files/build-initramfs b/build_files/build-initramfs
new file mode 100755
index 0000000..9eec951
--- /dev/null
+++ b/build_files/build-initramfs
@@ -0,0 +1,17 @@
+#!/usr/bin/bash
+
+set -eoux pipefail
+
+echo "::group::Executing build-initramfs"
+trap 'echo "::endgroup::"' EXIT
+
+if [[ "${KERNEL_FLAVOR:-}" == "surface" ]]; then
+ KERNEL_SUFFIX="surface"
+else
+ KERNEL_SUFFIX=""
+fi
+
+QUALIFIED_KERNEL="$(dnf5 repoquery --installed --queryformat='%{evr}.%{arch}' "kernel${KERNEL_SUFFIX:+-${KERNEL_SUFFIX}}")"
+/usr/bin/dracut --no-hostonly --kver "$QUALIFIED_KERNEL" --reproducible --zstd -v --add ostree --add fido2 -f "/usr/lib/modules/$QUALIFIED_KERNEL/initramfs.img"
+
+chmod 0600 /usr/lib/modules/"$QUALIFIED_KERNEL"/initramfs.img
diff --git a/build_files/build.sh b/build_files/build.sh
index f1709da..03adff0 100755
--- a/build_files/build.sh
+++ b/build_files/build.sh
@@ -2,6 +2,15 @@
set -ouex pipefail
+case "${BASE_IMAGE:-}" in
+ ghcr.io/ublue-os/bazzite-deck:* | ghcr.io/ublue-os/bazzite-deck@*)
+ ;;
+ *)
+ echo "AeroCore OS only supports bazzite-deck BASE_IMAGE values for HTPC game-mode builds: ${BASE_IMAGE:-<unset>}" >&2
+ exit 1
+ ;;
+esac
+
# Copy the contents of system_files/ of the git repo to /
cp -avf "/ctx/system_files"/. /
@@ -32,3 +41,6 @@ if [[ -n "${HOMEBREW_API_DOMAIN:-}" ]]; then
fi
find /etc/environment.d /etc/skel/.config/environment.d -name 99-aerocore-mirrors.conf -type f -exec chmod 0644 {} + 2>/dev/null || true
+
+/ctx/install-instruments.sh
+/ctx/patch-bazzite-deck-identity.sh
diff --git a/build_files/image-info b/build_files/image-info
new file mode 100755
index 0000000..a52d666
--- /dev/null
+++ b/build_files/image-info
@@ -0,0 +1,78 @@
+#!/usr/bin/bash
+
+set -eoux pipefail
+
+IMAGE_PRETTY_NAME="AeroCore OS"
+IMAGE_ID="aerocore"
+IMAGE_LIKE="fedora"
+HOME_URL="https://os.aerocore.com.cn"
+DOCUMENTATION_URL="https://docs.os.aerocore.com.cn"
+SUPPORT_URL="https://os.aerocore.com.cn/support"
+BUG_SUPPORT_URL="https://github.com/AeroCore-IO/AeroCore-OS/issues/"
+LOGO_ICON="distributor-logo"
+LOGO_COLOR="0;38;2;12;109;129"
+
+IMAGE_INFO="/usr/share/ublue-os/image-info.json"
+OSTREE_REGISTRY="${OSTREE_REGISTRY:-docker://ghcr.io}"
+OSTREE_NAMESPACE="${OSTREE_NAMESPACE:-$IMAGE_VENDOR}"
+IMAGE_REF="${OSTREE_IMAGE_REF:-ostree-image-signed:${OSTREE_REGISTRY%/}/$OSTREE_NAMESPACE/$IMAGE_NAME}"
+IMAGE_BRANCH_NORMALIZED="$IMAGE_BRANCH"
+BASE_IMAGE_NAME=$(jq -er '."base-image-name"' < "$IMAGE_INFO")
+
+if [[ $IMAGE_BRANCH_NORMALIZED == "main" ]]; then
+ IMAGE_BRANCH_NORMALIZED="stable"
+fi
+
+FEDORA_VERSION=$(rpm -E %fedora)
+
+mkdir -p "$(dirname "$IMAGE_INFO")"
+cat > "$IMAGE_INFO" <<EOF
+{
+ "image-name": "$IMAGE_NAME",
+ "image-vendor": "$IMAGE_VENDOR",
+ "image-ref": "$IMAGE_REF",
+ "image-tag": "stable",
+ "image-branch": "$IMAGE_BRANCH_NORMALIZED",
+ "base-image-name": "$BASE_IMAGE_NAME",
+ "fedora-version": "$FEDORA_VERSION",
+ "version": "$VERSION_TAG",
+ "version-pretty": "$VERSION_PRETTY"
+}
+EOF
+
+# Keep the display name consistent across desktop settings and os-release.
+sed -i "s/^VARIANT_ID=.*/VARIANT_ID=$IMAGE_ID/" /usr/lib/os-release
+sed -i "s/^PRETTY_NAME=.*/PRETTY_NAME=\"$IMAGE_PRETTY_NAME\"/" /usr/lib/os-release
+sed -i "s/^NAME=.*/NAME=\"$IMAGE_PRETTY_NAME\"/" /usr/lib/os-release
+sed -i "s|^HOME_URL=.*|HOME_URL=\"$HOME_URL\"|" /usr/lib/os-release
+sed -i "s|^DOCUMENTATION_URL=.*|DOCUMENTATION_URL=\"$DOCUMENTATION_URL\"|" /usr/lib/os-release
+sed -i "s|^SUPPORT_URL=.*|SUPPORT_URL=\"$SUPPORT_URL\"|" /usr/lib/os-release
+sed -i "s|^BUG_REPORT_URL=.*|BUG_REPORT_URL=\"$BUG_SUPPORT_URL\"|" /usr/lib/os-release
+sed -i "s|^CPE_NAME=.*|CPE_NAME=\"cpe:/o:universal-blue:$IMAGE_ID\"|" /usr/lib/os-release
+sed -i "s/^DEFAULT_HOSTNAME=.*/DEFAULT_HOSTNAME=\"$IMAGE_ID\"/" /usr/lib/os-release
+sed -i "s/^ID=fedora/ID=$IMAGE_ID\nID_LIKE=\"$IMAGE_LIKE\"/" /usr/lib/os-release
+sed -i "s/^LOGO=.*/LOGO=$LOGO_ICON/" /usr/lib/os-release
+sed -i "s/^ANSI_COLOR=.*/ANSI_COLOR=\"$LOGO_COLOR\"/" /usr/lib/os-release
+sed -i "/^REDHAT_BUGZILLA_PRODUCT=/d; /^REDHAT_BUGZILLA_PRODUCT_VERSION=/d; /^REDHAT_SUPPORT_PRODUCT=/d; /^REDHAT_SUPPORT_PRODUCT_VERSION=/d" /usr/lib/os-release
+sed -i "s|^VERSION_CODENAME=.*|VERSION_CODENAME=\"Deck\"|" /usr/lib/os-release
+
+echo "$IMAGE_PRETTY_NAME release $FEDORA_VERSION (Deck)" > /etc/system-release
+
+if grep -q '^BUILD_ID=' /usr/lib/os-release; then
+ sed -i "s/^BUILD_ID=.*/BUILD_ID=\"$VERSION_PRETTY\"/" /usr/lib/os-release
+else
+ echo "BUILD_ID=\"$VERSION_PRETTY\"" >> /usr/lib/os-release
+fi
+
+if grep -q '^BOOTLOADER_NAME=' /usr/lib/os-release; then
+ sed -i "s/^BOOTLOADER_NAME=.*/BOOTLOADER_NAME=\"$IMAGE_PRETTY_NAME $VERSION_PRETTY\"/" /usr/lib/os-release
+else
+ echo "BOOTLOADER_NAME=\"$IMAGE_PRETTY_NAME $VERSION_PRETTY\"" >> /usr/lib/os-release
+fi
+
+# Keep hibernation images tied to this exact image version.
+if grep -q '^IMAGE_ID=' /usr/lib/os-release; then
+ sed -i "s/^IMAGE_ID=.*/IMAGE_ID=\"$IMAGE_NAME-$VERSION_TAG\"/" /usr/lib/os-release
+else
+ echo "IMAGE_ID=\"$IMAGE_NAME-$VERSION_TAG\"" >> /usr/lib/os-release
+fi
diff --git a/build_files/install-instruments.sh b/build_files/install-instruments.sh
new file mode 100755
index 0000000..f85bd3b
--- /dev/null
+++ b/build_files/install-instruments.sh
@@ -0,0 +1,182 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+: "${INSTRUMENTS_ENABLED:=true}"
+: "${INSTRUMENTS_RELEASE_REPOSITORY:=AeroCore-IO/booster-installer}"
+: "${INSTRUMENTS_VERSION:=latest}"
+: "${INSTRUMENTS_RELEASE_API_BASE:=https://api.github.com}"
+: "${INSTRUMENTS_SEED_ROOT:=/usr/share/aerocore-booster-release}"
+
+if [[ "${INSTRUMENTS_ENABLED}" != "true" ]]; then
+ echo "AeroCore Booster image integration is disabled"
+ exit 0
+fi
+
+case "$(uname -m)" in
+ x86_64 | amd64)
+ asset_suffix="_linux-x86_64.tar.gz"
+ ;;
+ *)
+ echo "Unsupported AeroCore Booster image architecture: $(uname -m)" >&2
+ exit 1
+ ;;
+esac
+
+for command in curl jq sha256sum tar; do
+ command -v "$command" >/dev/null 2>&1 || {
+ echo "Required command is unavailable: $command" >&2
+ exit 1
+ }
+done
+
+workdir="$(mktemp -d)"
+trap 'rm -rf "$workdir"' EXIT
+
+github_curl() {
+ local args=(
+ --fail
+ --location
+ --retry 3
+ --retry-delay 2
+ --retry-max-time 60
+ --silent
+ --show-error
+ )
+
+ if [[ -s /run/secrets/GITHUB_TOKEN ]]; then
+ args+=(--header "Authorization: Bearer $(</run/secrets/GITHUB_TOKEN)")
+ fi
+
+ curl "${args[@]}" "$@"
+}
+
+if [[ "${INSTRUMENTS_VERSION}" == "latest" ]]; then
+ release_endpoint="releases/latest"
+else
+ release_endpoint="releases/tags/${INSTRUMENTS_VERSION}"
+fi
+
+release_json="$workdir/release.json"
+github_curl \
+ "${INSTRUMENTS_RELEASE_API_BASE%/}/repos/${INSTRUMENTS_RELEASE_REPOSITORY}/${release_endpoint}" \
+ --output "$release_json"
+
+release_tag="$(jq -er '.tag_name' "$release_json")"
+mapfile -t payload_assets < <(
+ jq -er --arg suffix "$asset_suffix" '
+ .assets[]
+ | select(
+ (.name | startswith("AeroCore-Booster-v"))
+ or (.name | startswith("instruments-ng_v"))
+ )
+ | select(.name | endswith($suffix))
+ | [.name, .browser_download_url]
+ | @tsv
+ ' "$release_json"
+)
+
+if [[ "${#payload_assets[@]}" -ne 1 ]]; then
+ echo "Expected one x86_64 Booster tarball in release $release_tag, found ${#payload_assets[@]}" >&2
+ exit 1
+fi
+
+IFS=$'\t' read -r asset_name asset_url <<<"${payload_assets[0]}"
+checksum_name="${asset_name}.sha256"
+checksum_url="$(
+ jq -er --arg name "$checksum_name" \
+ '.assets[] | select(.name == $name) | .browser_download_url' \
+ "$release_json"
+)"
+
+archive="$workdir/$asset_name"
+checksum_file="$workdir/$checksum_name"
+github_curl "$asset_url" --output "$archive"
+github_curl "$checksum_url" --output "$checksum_file"
+
+expected_checksum="$(awk 'NR == 1 { print $1 }' "$checksum_file")"
+actual_checksum="$(sha256sum "$archive" | awk '{ print $1 }')"
+if [[ ! "$expected_checksum" =~ ^[[:xdigit:]]{64}$ ]] ||
+ [[ "${actual_checksum,,}" != "${expected_checksum,,}" ]]; then
+ echo "Checksum verification failed for $asset_name" >&2
+ exit 1
+fi
+
+while IFS= read -r entry; do
+ case "$entry" in
+ /* | ../* | */../* | */..)
+ echo "Unsafe path in release archive: $entry" >&2
+ exit 1
+ ;;
+ esac
+done < <(tar -tzf "$archive")
+
+extract_dir="$workdir/extracted"
+install -d "$extract_dir"
+tar --extract --gzip --file "$archive" --directory "$extract_dir" \
+ --no-same-owner
+
+if [[ -d "$extract_dir/aerocore-booster-release" ]]; then
+ payload="$extract_dir/aerocore-booster-release"
+elif [[ -d "$extract_dir/instruments-ng-release" ]]; then
+ payload="$extract_dir/instruments-ng-release"
+else
+ echo "Release archive does not contain a supported payload root" >&2
+ exit 1
+fi
+
+required_paths=(
+ install.sh
+ appimage/AppRun
+ appimage/AppRun.wrapped
+ sidecar/hhd-input-helper.cjs
+ sidecar/vendor/hhd-input-helper/instruments_hhd_input/__init__.py
+ runtime/avionics
+ runtime/cabin
+ runtime/wing
+ runtime/node/bin/node
+ python-wheelhouse
+ pkg/systemd/ac-avionics.service
+ pkg/systemd/ac-cabin.service
+ pkg/systemd/ac-wing.service
+ pkg/systemd/ac-instruments.service
+ scripts/check-runtime-health.cjs
+ manifest.yaml
+)
+
+for path in "${required_paths[@]}"; do
+ if [[ ! -e "$payload/$path" ]]; then
+ echo "Required path is missing from Booster release: $path" >&2
+ exit 1
+ fi
+done
+
+if [[ ! -f "$payload/pkg/aerocore-booster.sh" &&
+ ! -f "$payload/pkg/instruments-ng.sh" ]]; then
+ echo "Booster launcher is missing from the release payload" >&2
+ exit 1
+fi
+
+# Remove the first implementation's image-owned runtime when upgrading an
+# existing AeroCore OS image. The release seed itself remains immutable.
+rm -rf /usr/lib/aerocore-booster
+rm -f /usr/bin/aerocore-booster
+for unit in ac-avionics.service ac-cabin.service ac-wing.service \
+ ac-instruments.service; do
+ rm -f "/usr/lib/systemd/system/$unit"
+done
+
+rm -rf "$INSTRUMENTS_SEED_ROOT"
+install -d -m 0755 "$INSTRUMENTS_SEED_ROOT"
+cp -a "$payload/." "$INSTRUMENTS_SEED_ROOT/"
+
+cat >"$INSTRUMENTS_SEED_ROOT/image-release" <<EOF
+RELEASE_TAG=$release_tag
+ASSET_NAME=$asset_name
+SHA256=$actual_checksum
+EOF
+chmod 0644 "$INSTRUMENTS_SEED_ROOT/image-release"
+
+systemctl enable aerocore-instruments-setup.service
+
+echo "Seeded AeroCore Booster $release_tag from $asset_name"
diff --git a/build_files/patch-bazzite-deck-identity.sh b/build_files/patch-bazzite-deck-identity.sh
new file mode 100755
index 0000000..078b76c
--- /dev/null
+++ b/build_files/patch-bazzite-deck-identity.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/bash
+
+set -euo pipefail
+
+hardware_setup="${1:-/usr/libexec/bazzite-hardware-setup}"
+# These are literal source lines; variable expansion must happen at boot time.
+# shellcheck disable=SC2016
+old_condition='if [[ "$IMAGE_NAME" != *deck* && "$IMAGE_NAME" != *dx* ]]; then'
+# shellcheck disable=SC2016
+new_condition='if [[ "$IMAGE_NAME" != aerocore-os && "$IMAGE_NAME" != *deck* && "$IMAGE_NAME" != *dx* ]]; then'
+
+if grep -Fqx "$new_condition" "$hardware_setup"; then
+ exit 0
+fi
+
+if [[ "$(grep -Fxc "$old_condition" "$hardware_setup")" -ne 1 ]]; then
+ echo "Unable to locate the Bazzite Deck image check in $hardware_setup" >&2
+ exit 1
+fi
+
+patched_file=$(mktemp)
+trap 'rm -f "$patched_file"' EXIT
+
+awk \
+ -v old_condition="$old_condition" \
+ -v new_condition="$new_condition" \
+ '$0 == old_condition {
+ print new_condition
+ next
+ }
+ { print }' "$hardware_setup" > "$patched_file"
+
+cp "$patched_file" "$hardware_setup"
+
+grep -Fqx "$new_condition" "$hardware_setup"
diff --git a/disk_config/iso-gnome.toml b/disk_config/iso-gnome.toml
index 0a9c84f..33cf931 100644
--- a/disk_config/iso-gnome.toml
+++ b/disk_config/iso-gnome.toml
@@ -1,10 +1,3 @@
-[customizations.installer.kickstart]
-contents = """
-%post
-bootc switch --mutate-in-place --transport registry ghcr.io/ublue-os/image-template:latest
-%end
-"""
-
[customizations.installer.modules]
enable = [
"org.fedoraproject.Anaconda.Modules.Storage",
diff --git a/disk_config/iso-kde.toml b/disk_config/iso-kde.toml
index 17d2787..7f6c80d 100644
--- a/disk_config/iso-kde.toml
+++ b/disk_config/iso-kde.toml
@@ -1,10 +1,3 @@
-[customizations.installer.kickstart]
-contents = """
-%post
-bootc switch --mutate-in-place --transport registry ghcr.io/ublue-os/image-template:latest
-%end
-"""
-
[customizations.installer.modules]
enable = [
"org.fedoraproject.Anaconda.Modules.Storage",
diff --git a/image-template.env b/image-template.env
index bf848fb..3035db5 100644
--- a/image-template.env
+++ b/image-template.env
@@ -1,7 +1,7 @@
# Here we set a bunch of parameters for your image build
# output image name, usually same as repo name, change as needed
-IMAGE_NAME=aerocore-bazzite-image
+IMAGE_NAME=aerocore-os
# Make this the same as your github username/organisation
REPO_ORGANIZATION="AeroCore-IO"
@@ -22,3 +22,10 @@ BASE_IMAGE="ghcr.io/ublue-os/bazzite-deck:stable"
FLATPAK_REMOTE_URL=""
HOMEBREW_BOTTLE_DOMAIN=""
HOMEBREW_API_DOMAIN=""
+
+# AeroCore Booster release embedded into the image. Use a concrete tag for
+# reproducible production builds, or "latest" for rolling development images.
+INSTRUMENTS_ENABLED="true"
+INSTRUMENTS_RELEASE_REPOSITORY="AeroCore-IO/booster-installer"
+INSTRUMENTS_VERSION="latest"
+INSTRUMENTS_RELEASE_API_BASE="https://api.github.com"
diff --git a/installer/Containerfile b/installer/Containerfile
new file mode 100644
index 0000000..50579e6
--- /dev/null
+++ b/installer/Containerfile
@@ -0,0 +1,19 @@
+# Build the live installer payload from a desktop Bazzite runtime.
+# The image installed to disk is supplied separately as INSTALL_IMAGE_PAYLOAD.
+
+ARG BASE_IMAGE=ghcr.io/ublue-os/bazzite:stable
+ARG INSTALL_IMAGE_PAYLOAD=ghcr.io/AeroCore-IO/aerocore-bazzite-image:stable
+ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci
+
+FROM ${BASE_IMAGE}
+
+ARG BASE_IMAGE
+ARG INSTALL_IMAGE_PAYLOAD
+ARG INSTALL_IMAGE_PAYLOAD_ARCHIVE
+
+RUN --mount=type=bind,source=.,target=/src \
+ --mount=type=bind,source=output/install-payload.oci,target=/install-payload.oci,ro \
+ env BASE_IMAGE="${BASE_IMAGE}" \
+ INSTALL_IMAGE_PAYLOAD="${INSTALL_IMAGE_PAYLOAD}" \
+ INSTALL_IMAGE_PAYLOAD_ARCHIVE="${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" \
+ /src/installer/build.sh
diff --git a/installer/build.sh b/installer/build.sh
new file mode 100755
index 0000000..033fe9b
--- /dev/null
+++ b/installer/build.sh
@@ -0,0 +1,65 @@
+#!/usr/bin/env bash
+
+set -euxo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+BASE_IMAGE=${BASE_IMAGE:?}
+INSTALL_IMAGE_PAYLOAD=${INSTALL_IMAGE_PAYLOAD:?}
+INSTALL_IMAGE_PAYLOAD_ARCHIVE=${INSTALL_IMAGE_PAYLOAD_ARCHIVE:-}
+
+# The installer is a live KDE environment. Keep the installed system payload
+# separate: it is the AeroCore image, while BASE_IMAGE provides the live UI.
+# Bazzite excludes some base packages from normal transactions. The live
+# installer needs Anaconda's exact NetworkManager dependencies, so clear the
+# excludes only for this dependency install.
+dnf --setopt=excludepkgs= install -y \
+ anaconda-live \
+ libblockdev-btrfs \
+ libblockdev-dm \
+ libblockdev-lvm \
+ dracut-live \
+ livesys-scripts \
+ grub2-efi-x64-cdboot
+
+# Apply the same AeroCore overlay to the live session where possible.
+if [[ -d /src/system_files ]]; then
+ cp -a /src/system_files/. /
+fi
+
+# Make the install payload available to Anaconda.
+if [[ -n "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" && -f "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}" ]]; then
+ podman load --storage-opt additionalimagestore='' < "${INSTALL_IMAGE_PAYLOAD_ARCHIVE}"
+elif mountpoint -q /usr/lib/containers/storage; then
+ podman save --format oci-archive "${INSTALL_IMAGE_PAYLOAD}" | \
+ podman load --storage-opt additionalimagestore=''
+else
+ podman pull "${INSTALL_IMAGE_PAYLOAD}"
+fi
+
+# Tell Anaconda to install the bootc container that was loaded above.
+mkdir -p /var/lib/rpm-state
+cat >> /usr/share/anaconda/interactive-defaults.ks <<EOF
+ostreecontainer --url=${INSTALL_IMAGE_PAYLOAD} --transport=containers-storage --no-signature-verification
+EOF
+
+mkdir -p /usr/lib/bootc-image-builder
+cp "${SCRIPT_DIR}/iso.yaml" /usr/lib/bootc-image-builder/iso.yaml
+
+kernel="$(kernel-install list --json pretty | jq -r \
+ '.[] | select(.has_kernel == true) | .version' | head -n1)"
+if [[ -n "${kernel}" && -d "/usr/lib/modules/${kernel}" ]]; then
+ DRACUT_NO_XATTR=1 dracut -v --force --zstd --reproducible --no-hostonly \
+ --add "dmsquash-live dmsquash-live-autooverlay" \
+ "/usr/lib/modules/${kernel}/initramfs.img" "${kernel}"
+fi
+
+sed -i 's/^livesys_session=.*/livesys_session=kde/' /etc/sysconfig/livesys
+systemctl enable livesys.service livesys-late.service
+
+mkdir -p /boot/efi
+if compgen -G '/usr/lib/efi/*/*/EFI' >/dev/null; then
+ cp -a /usr/lib/efi/*/*/EFI /boot/efi/
+fi
+
+systemd-firstboot --timezone UTC
+dnf clean all
diff --git a/installer/iso.yaml b/installer/iso.yaml
new file mode 100644
index 0000000..8e6bd73
--- /dev/null
+++ b/installer/iso.yaml
@@ -0,0 +1,10 @@
+label: "AeroCore-Live"
+grub2:
+ timeout: 3
+ entries:
+ - name: "Launch AeroCore Installer"
+ linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Live enforcing=0 rd.live.image"
+ initrd: "/images/pxeboot/initrd.img"
+ - name: "Launch AeroCore Installer (Basic Graphics Mode)"
+ linux: "/images/pxeboot/vmlinuz quiet rhgb root=live:CDLABEL=AeroCore-Live enforcing=0 rd.live.image nomodeset"
+ initrd: "/images/pxeboot/initrd.img"
diff --git a/installer/lorax_templates/remove_root_password_prompt.tmpl b/installer/lorax_templates/remove_root_password_prompt.tmpl
new file mode 100644
index 0000000..3bd0342
--- /dev/null
+++ b/installer/lorax_templates/remove_root_password_prompt.tmpl
@@ -0,0 +1 @@
+append etc/anaconda/profile.d/fedora-kinoite.conf "\\n[User Interface]\\nhidden_spokes =\\n PasswordSpoke"
diff --git a/installer/lorax_templates/set_default_user.tmpl b/installer/lorax_templates/set_default_user.tmpl
new file mode 100644
index 0000000..b4cf2c8
--- /dev/null
+++ b/installer/lorax_templates/set_default_user.tmpl
@@ -0,0 +1 @@
+append usr/share/anaconda/interactive-defaults.ks "\\nuser --name=aerocore --password=aerocore --plaintext --groups=wheel"
diff --git a/just_scripts/build-live-installer.sh b/just_scripts/build-live-installer.sh
new file mode 100755
index 0000000..45335cb
--- /dev/null
+++ b/just_scripts/build-live-installer.sh
@@ -0,0 +1,122 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+project_root="$(git rev-parse --show-toplevel)"
+cd "${project_root}"
+
+image_name="${IMAGE_NAME:-localhost/$(just image_name)}"
+image_tag="${IMAGE_TAG:-$(just generate-default-tag)}"
+live_base_image="${LIVE_BASE_IMAGE:-quay.io/fedora/fedora-kinoite:43}"
+installer_builder_image="${INSTALLER_BUILDER_IMAGE:-ghcr.io/jasonn3/build-container-installer:v1.5.0}"
+source_image="${image_name}:${image_tag}"
+payload="localhost/aerocore-live-payload:latest"
+output_dir="${project_root}/output"
+payload_archive="${output_dir}/install-payload.oci"
+iso="${output_dir}/aerocore-os-${image_tag}-amd64.iso"
+checksum="${iso}-CHECKSUM"
+api_socket="${PODMAN_SOCKET:-/run/podman/podman.sock}"
+if [[ "${EUID}" -eq 0 ]]; then
+ podman_cmd=(podman)
+ socket_test=(test -S "${api_socket}")
+else
+ podman_cmd=(sudo podman)
+ socket_test=(sudo test -S "${api_socket}")
+fi
+
+if ! "${socket_test[@]}"; then
+ echo "Podman API socket not found: ${api_socket}" >&2
+ echo "Set PODMAN_SOCKET to the rootful Podman socket and retry." >&2
+ exit 1
+fi
+
+ensure_rootful_image() {
+ local root_image_id user_image_id user_name user_uid copy_tmp
+
+ root_image_id="$("${podman_cmd[@]}" images \
+ --filter "reference=${source_image}" \
+ --format "{{.ID}}" | head -n1)"
+
+ if [[ -n "${root_image_id}" ]]; then
+ return 0
+ fi
+
+ if [[ "${EUID}" -ne 0 ]]; then
+ just _rootful_load_image "${image_name}" "${image_tag}"
+ return
+ fi
+
+ if [[ -z "${SUDO_USER:-}" ]]; then
+ return
+ fi
+
+ user_name="${SUDO_USER}"
+ user_uid="$(id -u "${user_name}")"
+ user_image_id="$(sudo -u "${user_name}" \
+ env XDG_RUNTIME_DIR="/run/user/${user_uid}" \
+ podman images \
+ --filter "reference=${source_image}" \
+ --format "{{.ID}}" | head -n1)"
+
+ if [[ -z "${user_image_id}" ]]; then
+ return
+ fi
+
+ copy_tmp="$(mktemp -p "${project_root}" -d -t _build_podman_scp.XXXXXXXXXX)"
+ TMPDIR="${copy_tmp}" podman image scp \
+ "${user_uid}@localhost::${source_image}" \
+ "root@localhost::${source_image}"
+ rm -rf "${copy_tmp}"
+}
+
+mkdir -p "${output_dir}"
+ensure_rootful_image
+
+"${podman_cmd[@]}" tag "${source_image}" "${payload}"
+"${podman_cmd[@]}" save --format oci-archive --output "${payload_archive}" "${payload}"
+
+"${podman_cmd[@]}" build \
+ --cap-add sys_admin \
+ --security-opt label=disable \
+ --build-arg "BASE_IMAGE=${live_base_image}" \
+ --build-arg "INSTALL_IMAGE_PAYLOAD=${payload}" \
+ --build-arg "INSTALL_IMAGE_PAYLOAD_ARCHIVE=/install-payload.oci" \
+ --tag "${payload}" \
+ --file installer/Containerfile \
+ .
+
+if [[ "${EUID}" -eq 0 ]]; then
+ rm -f "${iso}" "${checksum}"
+else
+ sudo rm -f "${iso}" "${checksum}"
+fi
+
+"${podman_cmd[@]}" run --rm --privileged \
+ --volume "${api_socket}:/var/run/docker.sock" \
+ --volume /var/lib/containers/storage:/var/lib/containers/storage \
+ --volume "${project_root}/output:/build-container-installer/build" \
+ --volume "${project_root}/installer/lorax_templates:/additional_lorax_templates:ro" \
+ "${installer_builder_image}" \
+ ADDITIONAL_TEMPLATES="/additional_lorax_templates/remove_root_password_prompt.tmpl /additional_lorax_templates/set_default_user.tmpl" \
+ ARCH="x86_64" \
+ ENABLE_CACHE_DNF="false" \
+ ENABLE_CACHE_SKOPEO="false" \
+ ENABLE_FLATPAK_DEPENDENCIES="false" \
+ IMAGE_NAME="aerocore-live-payload" \
+ IMAGE_REPO="localhost" \
+ IMAGE_SRC="containers-storage:${payload}" \
+ IMAGE_TAG="latest" \
+ ISO_NAME="build/aerocore-os-${image_tag}-amd64.iso" \
+ VARIANT="Kinoite" \
+ VERSION="${FEDORA_VERSION:-44}"
+
+if [[ -f "${iso}" ]]; then
+ if [[ "${EUID}" -ne 0 ]]; then
+ sudo chown "$(id -u):$(id -g)" "${iso}"
+ sudo rm -f "${checksum}"
+ (cd "${output_dir}" && sha256sum "$(basename "${iso}")") | sudo tee "${checksum}"
+ sudo chown "$(id -u):$(id -g)" "${checksum}"
+ else
+ (cd "${output_dir}" && sha256sum "$(basename "${iso}")") | tee "${checksum}"
+ fi
+fi
diff --git a/just_scripts/run-live-installer.sh b/just_scripts/run-live-installer.sh
new file mode 100755
index 0000000..2723aae
--- /dev/null
+++ b/just_scripts/run-live-installer.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+project_root="$(git rev-parse --show-toplevel)"
+cd "${project_root}"
+
+image_tag="${IMAGE_TAG:-$(just generate-default-tag)}"
+iso="${project_root}/output/aerocore-os-${image_tag}-amd64.iso"
+
+if [[ ! -f "${iso}" ]]; then
+ just build-live-installer
+fi
+
+podman run --rm --cap-add NET_ADMIN \
+ --publish 127.0.0.1:8006:8006 \
+ --env CPU_CORES=2 \
+ --env RAM_SIZE=4G \
+ --env DISK_SIZE=64G \
+ --env BOOT_MODE=uefi \
+ --device /dev/kvm \
+ --volume "${iso}:/boot.iso:ro" \
+ docker.io/qemux/qemu-docker
diff --git a/system_files/etc/xdg/kcm-about-distrorc b/system_files/etc/xdg/kcm-about-distrorc
new file mode 100644
index 0000000..ed2c831
--- /dev/null
+++ b/system_files/etc/xdg/kcm-about-distrorc
@@ -0,0 +1,5 @@
+[General]
+LogoPath=/usr/share/pixmaps/system-logo-white.png
+Name=AeroCore OS
+Website=https://os.aerocore.com.cn
+Variant=Handheld & HTPC Edition
diff --git a/system_files/usr/lib/systemd/system/aerocore-instruments-setup.service b/system_files/usr/lib/systemd/system/aerocore-instruments-setup.service
new file mode 100644
index 0000000..0c9cc45
--- /dev/null
+++ b/system_files/usr/lib/systemd/system/aerocore-instruments-setup.service
@@ -0,0 +1,18 @@
+[Unit]
+Description=Configure AeroCore Booster for the graphical user
+Documentation=https://github.com/AeroCore-IO/instruments-ng
+After=systemd-user-sessions.service display-manager.service
+Wants=systemd-user-sessions.service
+ConditionPathExists=/usr/share/aerocore-booster-release/install.sh
+ConditionPathExists=!/var/lib/aerocore/instruments-bootstrap-complete
+
+[Service]
+Type=oneshot
+Environment=AEROCORE_INSTRUMENTS_SETUP_WAIT_SECONDS=180
+ExecStart=/usr/libexec/aerocore-instruments-setup
+Restart=on-failure
+RestartSec=15
+TimeoutStartSec=360
+
+[Install]
+WantedBy=multi-user.target
diff --git a/system_files/usr/lib/tmpfiles.d/aerocore-deck-compat.conf b/system_files/usr/lib/tmpfiles.d/aerocore-deck-compat.conf
new file mode 100644
index 0000000..830329f
--- /dev/null
+++ b/system_files/usr/lib/tmpfiles.d/aerocore-deck-compat.conf
@@ -0,0 +1,2 @@
+# Restore the Deck SDDM defaults if an older AeroCore deployment removed them.
+C /etc/sddm.conf.d/steamos.conf 0644 root root - /usr/etc/sddm.conf.d/steamos.conf
diff --git a/system_files/usr/libexec/aerocore-instruments-setup b/system_files/usr/libexec/aerocore-instruments-setup
new file mode 100755
index 0000000..cdbe8cd
--- /dev/null
+++ b/system_files/usr/libexec/aerocore-instruments-setup
@@ -0,0 +1,123 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+: "${AEROCORE_INSTRUMENTS_SETUP_WAIT_SECONDS:=180}"
+
+seed_root="/usr/share/aerocore-booster-release"
+state_dir="/var/lib/aerocore"
+identity_file="$state_dir/instruments-user"
+complete_marker="$state_dir/instruments-bootstrap-complete"
+attempt_marker="$state_dir/instruments-bootstrap-attempted"
+
+find_graphical_user() {
+ local requested_uid="${1:-}"
+ local active seat session state type uid user
+
+ while read -r session _; do
+ [[ -n "$session" ]] || continue
+ uid="$(loginctl show-session "$session" --property=User --value 2>/dev/null || true)"
+ if [[ ! "$uid" =~ ^[0-9]+$ ]] || ((uid < 1000)); then
+ continue
+ fi
+ [[ -z "$requested_uid" || "$uid" == "$requested_uid" ]] || continue
+
+ active="$(loginctl show-session "$session" --property=Active --value 2>/dev/null || true)"
+ state="$(loginctl show-session "$session" --property=State --value 2>/dev/null || true)"
+ type="$(loginctl show-session "$session" --property=Type --value 2>/dev/null || true)"
+ seat="$(loginctl show-session "$session" --property=Seat --value 2>/dev/null || true)"
+ [[ "$active" == "yes" || "$state" == "active" || "$state" == "online" ]] || continue
+
+ user="$(getent passwd "$uid" | cut -d: -f1)"
+ [[ -n "$user" && "$user" != "root" ]] || continue
+ if [[ "$type" == "x11" || "$type" == "wayland" ]]; then
+ printf '%s\n' "$user"
+ return 0
+ fi
+ if [[ "$seat" == "seat0" ]] && pgrep -u "$uid" -x steam >/dev/null 2>&1; then
+ printf '%s\n' "$user"
+ return 0
+ fi
+ done < <(loginctl list-sessions --no-legend --no-pager 2>/dev/null || true)
+
+ return 1
+}
+
+if [[ -f "$complete_marker" ]]; then
+ echo "AeroCore Booster user bootstrap is already complete"
+ exit 0
+fi
+
+configured_uid=""
+if [[ -f "$identity_file" ]]; then
+ configured_uid="$(awk -F= '$1 == "uid" { print $2; exit }' "$identity_file")"
+ if [[ ! "$configured_uid" =~ ^[0-9]+$ ]] ||
+ ! getent passwd "$configured_uid" >/dev/null 2>&1; then
+ configured_uid=""
+ fi
+fi
+
+deadline=$((SECONDS + AEROCORE_INSTRUMENTS_SETUP_WAIT_SECONDS))
+desktop_user=""
+while ((SECONDS < deadline)); do
+ desktop_user="$(find_graphical_user "$configured_uid" || true)"
+ [[ -n "$desktop_user" ]] && break
+ sleep 2
+done
+
+if [[ -z "$desktop_user" ]]; then
+ echo "No active graphical user found within ${AEROCORE_INSTRUMENTS_SETUP_WAIT_SECONDS}s" >&2
+ exit 1
+fi
+
+desktop_uid="$(id -u "$desktop_user")"
+desktop_group="$(id -gn "$desktop_user")"
+desktop_home="$(getent passwd "$desktop_user" | cut -d: -f6)"
+if [[ -z "$desktop_home" || ! -d "$desktop_home" ]]; then
+ echo "Home directory is unavailable for $desktop_user: $desktop_home" >&2
+ exit 1
+fi
+
+install -d -m 0755 "$state_dir"
+printf 'user=%s\nuid=%s\n' "$desktop_user" "$desktop_uid" >"$identity_file"
+chmod 0644 "$identity_file"
+
+existing_install=0
+for installed_path in \
+ "$desktop_home/.local/share/aerocore-booster/manifest.yaml" \
+ "$desktop_home/.local/share/aerocore-booster/appimage/AppRun" \
+ "$desktop_home/.local/share/aerocore-booster/aerocore-booster" \
+ "$desktop_home/.local/share/instruments-ng/manifest.yaml" \
+ "$desktop_home/.local/share/instruments-ng/appimage/AppRun" \
+ "$desktop_home/.local/share/instruments-ng/instruments-ng"; do
+ if [[ -e "$installed_path" ]]; then
+ existing_install=1
+ break
+ fi
+done
+
+if [[ "$existing_install" == "0" || -f "$attempt_marker" ]]; then
+ touch "$attempt_marker"
+ HOME="$desktop_home" \
+ AEROCORE_INSTRUMENTS_USER="$desktop_user" \
+ AEROCORE_INSTRUMENTS_GROUP="$desktop_group" \
+ AEROCORE_INSTRUMENTS_UID="$desktop_uid" \
+ AEROCORE_INSTRUMENTS_HOME="$desktop_home" \
+ bash "$seed_root/install.sh" install
+else
+ echo "Existing Instruments installation found for $desktop_user; preserving it"
+fi
+
+cat >"$complete_marker" <<EOF
+user=$desktop_user
+uid=$desktop_uid
+seed_release=$(awk -F= '$1 == "RELEASE_TAG" { print $2; exit }' "$seed_root/image-release")
+EOF
+chmod 0644 "$complete_marker"
+rm -f "$attempt_marker"
+
+# Bootstrap is deliberately one-shot. Independent updates and uninstalls are
+# owned by the user-space Instruments installer after this point.
+systemctl disable aerocore-instruments-setup.service >/dev/null 2>&1 || true
+
+echo "AeroCore Booster user bootstrap completed for $desktop_user (uid $desktop_uid)"
diff --git a/system_files/usr/share/backgrounds/default-dark.jxl b/system_files/usr/share/backgrounds/default-dark.jxl
new file mode 120000
index 0000000..f87d865
--- /dev/null
+++ b/system_files/usr/share/backgrounds/default-dark.jxl
@@ -0,0 +1 @@
+/usr/share/wallpapers/aerocore-wallpaper.jxl \ No newline at end of file
diff --git a/system_files/usr/share/backgrounds/default.jxl b/system_files/usr/share/backgrounds/default.jxl
new file mode 120000
index 0000000..f87d865
--- /dev/null
+++ b/system_files/usr/share/backgrounds/default.jxl
@@ -0,0 +1 @@
+/usr/share/wallpapers/aerocore-wallpaper.jxl \ No newline at end of file
diff --git a/system_files/usr/share/icons/hicolor/128x128/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/128x128/bazzite-logo-icon.png
new file mode 100644
index 0000000..30cd4aa
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/128x128/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/16x16/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/16x16/bazzite-logo-icon.png
new file mode 100644
index 0000000..e7d57f9
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/16x16/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/22x22/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/22x22/bazzite-logo-icon.png
new file mode 100644
index 0000000..f368a0a
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/22x22/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/24x24/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/24x24/bazzite-logo-icon.png
new file mode 100644
index 0000000..b722b22
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/24x24/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/256x256/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/256x256/bazzite-logo-icon.png
new file mode 100644
index 0000000..b7acaa2
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/256x256/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/32x32/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/32x32/bazzite-logo-icon.png
new file mode 100644
index 0000000..54e23b2
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/32x32/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/36x36/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/36x36/bazzite-logo-icon.png
new file mode 100644
index 0000000..ff03f27
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/36x36/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/48x48/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/48x48/bazzite-logo-icon.png
new file mode 100644
index 0000000..977f02e
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/48x48/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/64x64/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/64x64/bazzite-logo-icon.png
new file mode 100644
index 0000000..74477a7
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/64x64/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/96x96/bazzite-logo-icon.png b/system_files/usr/share/icons/hicolor/96x96/bazzite-logo-icon.png
new file mode 100644
index 0000000..ea0d730
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/96x96/bazzite-logo-icon.png
Binary files differ
diff --git a/system_files/usr/share/icons/hicolor/scalable/places/bazzite-logo-le.svg b/system_files/usr/share/icons/hicolor/scalable/places/bazzite-logo-le.svg
new file mode 100644
index 0000000..291b91c
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/scalable/places/bazzite-logo-le.svg
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600px" height="600px" viewBox="-102.4 -102.4 1228.8 1228.8" version="1.1">
+ <title>AeroCoreIcon</title>
+ <defs>
+ <linearGradient x1="73.6318768%" y1="26.3681232%" x2="0%" y2="100%" id="linearGradient-1">
+ <stop stop-color="#006F84" offset="0%" />
+ <stop stop-color="#00B875" offset="100%" />
+ </linearGradient>
+ </defs>
+ <g id="Root_AeroCore_Icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Group_Symbol_Elements">
+ <circle id="Icon_Base_Circle" fill="url(#linearGradient-1)" cx="512" cy="512" r="512" />
+ <path d="M512.125099,203.775657 C524.425722,203.720223 536.565487,206.928767 547.230065,213.049297 C557.526611,218.958608 566.447921,227.582512 572.811208,238.604049 L741.889,531.455 L741.661543,531.166142 C732.09877,519.141785 717.545473,511.911367 701.936588,511.746739 L701.39167,511.743866 L569.700515,511.743867 L512.124234,412.018554 L454.547952,511.743867 L322.856323,511.743866 C306.925343,511.743866 292.043073,519.10911 282.373856,531.435299 L451.437046,238.604049 C464.26151,216.391425 487.47628,203.917765 511.396183,203.77566 Z" id="Symbol_Top_Wing" stroke="#979797" stroke-width="0.512" fill="#FFFFFF" opacity="0.400000006" />
+ <path d="M745.732175,537.599874 L848.744911,716.023241 L848.744911,716.023241 C868.043949,749.450156 856.591042,792.192986 823.164127,811.492024 C789.737212,830.791063 746.994382,819.338156 727.695344,785.911241 L667.101514,680.959867 L357.146442,680.959867 L296.552911,785.911241 C277.253872,819.338156 234.511042,830.791063 201.084127,811.492024 C167.657212,792.192986 156.204305,749.450156 175.503344,716.023241 L278.51579,537.599923 C287.66178,521.758556 304.564301,511.999866 322.856323,511.999866 L701.39167,511.999866 C719.683671,511.999866 736.586177,521.758535 745.732175,537.599874 Z" id="Symbol_Bottom_Gamepad" fill="#FFFFFF" opacity="0.800000012" />
+ <path d="M336.384,648.192 C306.692879,648.192 282.624,624.12246 282.624,594.432 C282.624,564.74154 306.69354,540.672 336.384,540.672 C366.075121,540.672 390.144,564.74154 390.144,594.432 C390.144,624.123121 366.07446,648.192 336.384,648.192 Z" id="Icon_Left_Stick" fill="#FFFFFF" fill-rule="nonzero" />
+ <path d="M676.223669,580.991669 L649.304007,580.991669 C641.912222,580.991669 635.904,587.005841 635.904,594.432 C635.904,601.904432 641.90495,607.872331 649.304007,607.872331 L676.223669,607.872331 L676.223669,634.791993 C676.223669,642.184439 682.237841,648.192 689.664,648.192 C697.136432,648.192 703.104331,642.191711 703.104331,634.791993 L703.104331,607.872331 L730.023993,607.872331 C737.416439,607.872331 743.424,601.858159 743.424,594.432 C743.424,586.959568 737.42305,580.991669 730.023993,580.991669 L703.104331,580.991669 L703.104331,554.072007 C703.104331,546.679561 697.090159,540.672 689.664,540.672 C682.191568,540.672 676.223669,546.67295 676.223669,554.072007 L676.223669,580.991669 Z" id="Icon_Right_Cross" fill="#FFFFFF" fill-rule="nonzero" />
+ </g>
+ </g>
+</svg>
diff --git a/system_files/usr/share/icons/hicolor/scalable/places/distributor-logo-white.svg b/system_files/usr/share/icons/hicolor/scalable/places/distributor-logo-white.svg
new file mode 100644
index 0000000..5f58794
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/scalable/places/distributor-logo-white.svg
@@ -0,0 +1,11 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600px" height="600px" viewBox="-50 -50 600 600" version="1.1">
+ <title>distributor-logo-white</title>
+ <g id="distributor-logo-white" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Group_Icon_Symbol" fill="#FFFFFF" fill-rule="nonzero">
+ <path d="M250,0 C388.071187,0 500,111.928813 500,250 C500,388.071187 388.071187,500 250,500 C111.928813,500 0,388.071187 0,250 C0,111.928813 111.928813,0 250,0 Z M342.476402,249.999935 L157.644689,249.999935 C148.713038,249.999935 140.459853,254.76492 135.994038,262.499963 L85.694992,349.620724 C76.2716335,365.942459 81.8638733,386.81298 98.1856089,396.236339 C114.507345,405.659698 135.377867,400.067459 144.801226,383.745724 L174.387911,332.499935 L325.733161,332.499935 L355.319991,383.745724 C364.74335,400.067459 385.613874,405.659698 401.935609,396.236339 C418.257346,386.81298 423.849585,365.942459 414.426226,349.620724 L364.127039,262.499935 C359.66122,254.764909 351.408043,249.999935 342.476402,249.999935 Z M249.705715,99.4994879 C238.025528,99.5692215 226.690191,105.659875 220.428246,116.505883 L145.354419,246.540081 C149.174171,244.890029 153.346061,243.999935 157.644689,243.999935 L225.338419,243.999152 L250.060661,201.180935 L274.781419,243.999152 L342.476402,243.999935 C346.77684,243.999935 350.950435,244.890779 354.771498,246.542166 L279.692972,116.505883 C276.576735,111.108401 272.204065,106.888569 267.115291,104.002544 C261.874722,101.03043 255.874804,99.4728404 249.705715,99.4994879 Z" id="Symbol_Combined_Mark" />
+ <path d="M330.187339,283.687339 L317.042972,283.687339 C313.433702,283.687339 310.5,286.623946 310.5,290.25 C310.5,293.898648 313.430152,296.812661 317.042972,296.812661 L330.187339,296.812661 L330.187339,309.957028 C330.187339,313.566622 333.123946,316.5 336.75,316.5 C340.398648,316.5 343.312661,313.570172 343.312661,309.957028 L343.312661,296.812661 L356.457028,296.812661 C360.066622,296.812661 363,293.876054 363,290.25 C363,286.601352 360.069848,283.687339 356.457028,283.687339 L343.312661,283.687339 L343.312661,270.542972 C343.312661,266.933378 340.376054,264 336.75,264 C333.101352,264 330.187339,266.930152 330.187339,270.542972 L330.187339,283.687339 Z" id="Icon_Deco_Plus" />
+ <path d="M164.25,316.5 C149.752382,316.5 138,304.747296 138,290.25 C138,275.752704 149.752705,264 164.25,264 C178.747618,264 190.5,275.752704 190.5,290.25 C190.5,304.747617 178.747295,316.5 164.25,316.5 Z" id="Icon_Deco_Dot" />
+ </g>
+ </g>
+</svg>
diff --git a/system_files/usr/share/icons/hicolor/scalable/places/distributor-logo.svg b/system_files/usr/share/icons/hicolor/scalable/places/distributor-logo.svg
new file mode 100644
index 0000000..291b91c
--- /dev/null
+++ b/system_files/usr/share/icons/hicolor/scalable/places/distributor-logo.svg
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns="http://www.w3.org/2000/svg" width="600px" height="600px" viewBox="-102.4 -102.4 1228.8 1228.8" version="1.1">
+ <title>AeroCoreIcon</title>
+ <defs>
+ <linearGradient x1="73.6318768%" y1="26.3681232%" x2="0%" y2="100%" id="linearGradient-1">
+ <stop stop-color="#006F84" offset="0%" />
+ <stop stop-color="#00B875" offset="100%" />
+ </linearGradient>
+ </defs>
+ <g id="Root_AeroCore_Icon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="Group_Symbol_Elements">
+ <circle id="Icon_Base_Circle" fill="url(#linearGradient-1)" cx="512" cy="512" r="512" />
+ <path d="M512.125099,203.775657 C524.425722,203.720223 536.565487,206.928767 547.230065,213.049297 C557.526611,218.958608 566.447921,227.582512 572.811208,238.604049 L741.889,531.455 L741.661543,531.166142 C732.09877,519.141785 717.545473,511.911367 701.936588,511.746739 L701.39167,511.743866 L569.700515,511.743867 L512.124234,412.018554 L454.547952,511.743867 L322.856323,511.743866 C306.925343,511.743866 292.043073,519.10911 282.373856,531.435299 L451.437046,238.604049 C464.26151,216.391425 487.47628,203.917765 511.396183,203.77566 Z" id="Symbol_Top_Wing" stroke="#979797" stroke-width="0.512" fill="#FFFFFF" opacity="0.400000006" />
+ <path d="M745.732175,537.599874 L848.744911,716.023241 L848.744911,716.023241 C868.043949,749.450156 856.591042,792.192986 823.164127,811.492024 C789.737212,830.791063 746.994382,819.338156 727.695344,785.911241 L667.101514,680.959867 L357.146442,680.959867 L296.552911,785.911241 C277.253872,819.338156 234.511042,830.791063 201.084127,811.492024 C167.657212,792.192986 156.204305,749.450156 175.503344,716.023241 L278.51579,537.599923 C287.66178,521.758556 304.564301,511.999866 322.856323,511.999866 L701.39167,511.999866 C719.683671,511.999866 736.586177,521.758535 745.732175,537.599874 Z" id="Symbol_Bottom_Gamepad" fill="#FFFFFF" opacity="0.800000012" />
+ <path d="M336.384,648.192 C306.692879,648.192 282.624,624.12246 282.624,594.432 C282.624,564.74154 306.69354,540.672 336.384,540.672 C366.075121,540.672 390.144,564.74154 390.144,594.432 C390.144,624.123121 366.07446,648.192 336.384,648.192 Z" id="Icon_Left_Stick" fill="#FFFFFF" fill-rule="nonzero" />
+ <path d="M676.223669,580.991669 L649.304007,580.991669 C641.912222,580.991669 635.904,587.005841 635.904,594.432 C635.904,601.904432 641.90495,607.872331 649.304007,607.872331 L676.223669,607.872331 L676.223669,634.791993 C676.223669,642.184439 682.237841,648.192 689.664,648.192 C697.136432,648.192 703.104331,642.191711 703.104331,634.791993 L703.104331,607.872331 L730.023993,607.872331 C737.416439,607.872331 743.424,601.858159 743.424,594.432 C743.424,586.959568 737.42305,580.991669 730.023993,580.991669 L703.104331,580.991669 L703.104331,554.072007 C703.104331,546.679561 697.090159,540.672 689.664,540.672 C682.191568,540.672 676.223669,546.67295 676.223669,554.072007 L676.223669,580.991669 Z" id="Icon_Right_Cross" fill="#FFFFFF" fill-rule="nonzero" />
+ </g>
+ </g>
+</svg>
diff --git a/system_files/usr/share/pixmaps/bazzite-logo-le.svg b/system_files/usr/share/pixmaps/bazzite-logo-le.svg
new file mode 100644
index 0000000..bd0dae2
--- /dev/null
+++ b/system_files/usr/share/pixmaps/bazzite-logo-le.svg
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500px" height="500px" viewBox="0 0 1024 1024" version="1.1">
+ <title>AeroCoreIcon</title>
+ <defs>
+ <linearGradient x1="73.6318768%" y1="26.3681232%" x2="0%" y2="100%" id="linearGradient-1">
+ <stop stop-color="#006F84" offset="0%" />
+ <stop stop-color="#00B875" offset="100%" />
+ </linearGradient>
+ </defs>
+ <g id="AeroCoreIcon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="LogoMark">
+ <circle id="CircularGradientBackground" fill="url(#linearGradient-1)" cx="512" cy="512" r="512" />
+ <path d="M512.125099,203.775657 C524.425722,203.720223 536.565487,206.928767 547.230065,213.049297 C557.526611,218.958608 566.447921,227.582512 572.811208,238.604049 L741.889,531.455 L741.661543,531.166142 C732.09877,519.141785 717.545473,511.911367 701.936588,511.746739 L701.39167,511.743866 L569.700515,511.743867 L512.124234,412.018554 L454.547952,511.743867 L322.856323,511.743866 C306.925343,511.743866 292.043073,519.10911 282.373856,531.435299 L451.437046,238.604049 C464.26151,216.391425 487.47628,203.917765 511.396183,203.77566 Z" id="AeroCoreLetterA" stroke="#979797" stroke-width="0.512" fill="#FFFFFF" opacity="0.400000006" />
+ <path d="M745.732175,537.599874 L848.744911,716.023241 L848.744911,716.023241 C868.043949,749.450156 856.591042,792.192986 823.164127,811.492024 C789.737212,830.791063 746.994382,819.338156 727.695344,785.911241 L667.101514,680.959867 L357.146442,680.959867 L296.552911,785.911241 C277.253872,819.338156 234.511042,830.791063 201.084127,811.492024 C167.657212,792.192986 156.204305,749.450156 175.503344,716.023241 L278.51579,537.599923 C287.66178,521.758556 304.564301,511.999866 322.856323,511.999866 L701.39167,511.999866 C719.683671,511.999866 736.586177,521.758535 745.732175,537.599874 Z" id="GamepadLowerHalf" fill="#FFFFFF" opacity="0.800000012" />
+ <path d="M676.223669,580.991669 L649.304007,580.991669 C641.912222,580.991669 635.904,587.005841 635.904,594.432 C635.904,601.904432 641.90495,607.872331 649.304007,607.872331 L676.223669,607.872331 L676.223669,634.791993 C676.223669,642.184439 682.237841,648.192 689.664,648.192 C697.136432,648.192 703.104331,642.191711 703.104331,634.791993 L703.104331,607.872331 L730.023993,607.872331 C737.416439,607.872331 743.424,601.858159 743.424,594.432 C743.424,586.959568 737.42305,580.991669 730.023993,580.991669 L703.104331,580.991669 L703.104331,554.072007 C703.104331,546.679561 697.090159,540.672 689.664,540.672 C682.191568,540.672 676.223669,546.67295 676.223669,554.072007 L676.223669,580.991669 Z" id="GamepadDPadCross" fill="#FFFFFF" fill-rule="nonzero" />
+ <path d="M336.384,648.192 C306.692879,648.192 282.624,624.12246 282.624,594.432 C282.624,564.74154 306.69354,540.672 336.384,540.672 C366.075121,540.672 390.144,564.74154 390.144,594.432 C390.144,624.123121 366.07446,648.192 336.384,648.192 Z" id="GamepadLeftAnalogStick" fill="#FFFFFF" fill-rule="nonzero" />
+ </g>
+ </g>
+</svg>
diff --git a/system_files/usr/share/pixmaps/bootloader/fedora.icns b/system_files/usr/share/pixmaps/bootloader/fedora.icns
new file mode 100644
index 0000000..c16933f
--- /dev/null
+++ b/system_files/usr/share/pixmaps/bootloader/fedora.icns
Binary files differ
diff --git a/system_files/usr/share/pixmaps/combination_med.png b/system_files/usr/share/pixmaps/combination_med.png
new file mode 100644
index 0000000..2f75183
--- /dev/null
+++ b/system_files/usr/share/pixmaps/combination_med.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/fedora-gdm-logo.png b/system_files/usr/share/pixmaps/fedora-gdm-logo.png
new file mode 100644
index 0000000..b903599
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora-gdm-logo.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/fedora-logo-small.png b/system_files/usr/share/pixmaps/fedora-logo-small.png
new file mode 100644
index 0000000..02e6d48
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora-logo-small.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/fedora-logo-sprite.png b/system_files/usr/share/pixmaps/fedora-logo-sprite.png
new file mode 100644
index 0000000..1f02770
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora-logo-sprite.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/fedora-logo-sprite.svg b/system_files/usr/share/pixmaps/fedora-logo-sprite.svg
new file mode 100644
index 0000000..bd0dae2
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora-logo-sprite.svg
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500px" height="500px" viewBox="0 0 1024 1024" version="1.1">
+ <title>AeroCoreIcon</title>
+ <defs>
+ <linearGradient x1="73.6318768%" y1="26.3681232%" x2="0%" y2="100%" id="linearGradient-1">
+ <stop stop-color="#006F84" offset="0%" />
+ <stop stop-color="#00B875" offset="100%" />
+ </linearGradient>
+ </defs>
+ <g id="AeroCoreIcon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="LogoMark">
+ <circle id="CircularGradientBackground" fill="url(#linearGradient-1)" cx="512" cy="512" r="512" />
+ <path d="M512.125099,203.775657 C524.425722,203.720223 536.565487,206.928767 547.230065,213.049297 C557.526611,218.958608 566.447921,227.582512 572.811208,238.604049 L741.889,531.455 L741.661543,531.166142 C732.09877,519.141785 717.545473,511.911367 701.936588,511.746739 L701.39167,511.743866 L569.700515,511.743867 L512.124234,412.018554 L454.547952,511.743867 L322.856323,511.743866 C306.925343,511.743866 292.043073,519.10911 282.373856,531.435299 L451.437046,238.604049 C464.26151,216.391425 487.47628,203.917765 511.396183,203.77566 Z" id="AeroCoreLetterA" stroke="#979797" stroke-width="0.512" fill="#FFFFFF" opacity="0.400000006" />
+ <path d="M745.732175,537.599874 L848.744911,716.023241 L848.744911,716.023241 C868.043949,749.450156 856.591042,792.192986 823.164127,811.492024 C789.737212,830.791063 746.994382,819.338156 727.695344,785.911241 L667.101514,680.959867 L357.146442,680.959867 L296.552911,785.911241 C277.253872,819.338156 234.511042,830.791063 201.084127,811.492024 C167.657212,792.192986 156.204305,749.450156 175.503344,716.023241 L278.51579,537.599923 C287.66178,521.758556 304.564301,511.999866 322.856323,511.999866 L701.39167,511.999866 C719.683671,511.999866 736.586177,521.758535 745.732175,537.599874 Z" id="GamepadLowerHalf" fill="#FFFFFF" opacity="0.800000012" />
+ <path d="M676.223669,580.991669 L649.304007,580.991669 C641.912222,580.991669 635.904,587.005841 635.904,594.432 C635.904,601.904432 641.90495,607.872331 649.304007,607.872331 L676.223669,607.872331 L676.223669,634.791993 C676.223669,642.184439 682.237841,648.192 689.664,648.192 C697.136432,648.192 703.104331,642.191711 703.104331,634.791993 L703.104331,607.872331 L730.023993,607.872331 C737.416439,607.872331 743.424,601.858159 743.424,594.432 C743.424,586.959568 737.42305,580.991669 730.023993,580.991669 L703.104331,580.991669 L703.104331,554.072007 C703.104331,546.679561 697.090159,540.672 689.664,540.672 C682.191568,540.672 676.223669,546.67295 676.223669,554.072007 L676.223669,580.991669 Z" id="GamepadDPadCross" fill="#FFFFFF" fill-rule="nonzero" />
+ <path d="M336.384,648.192 C306.692879,648.192 282.624,624.12246 282.624,594.432 C282.624,564.74154 306.69354,540.672 336.384,540.672 C366.075121,540.672 390.144,564.74154 390.144,594.432 C390.144,624.123121 366.07446,648.192 336.384,648.192 Z" id="GamepadLeftAnalogStick" fill="#FFFFFF" fill-rule="nonzero" />
+ </g>
+ </g>
+</svg>
diff --git a/system_files/usr/share/pixmaps/fedora-logo.png b/system_files/usr/share/pixmaps/fedora-logo.png
new file mode 100644
index 0000000..55d2a45
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora-logo.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/fedora_logo_med.png b/system_files/usr/share/pixmaps/fedora_logo_med.png
new file mode 100644
index 0000000..e5b8db5
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora_logo_med.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/fedora_whitelogo.png b/system_files/usr/share/pixmaps/fedora_whitelogo.png
new file mode 100644
index 0000000..66e2c3e
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora_whitelogo.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/fedora_whitelogo.svg b/system_files/usr/share/pixmaps/fedora_whitelogo.svg
new file mode 100644
index 0000000..372e337
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora_whitelogo.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="1009px" height="270px" viewBox="131 133 1009 270" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>AeroCoreLogo_WhiteText</title>
+ <defs>
+ <linearGradient x1="73.6318768%" y1="26.3681232%" x2="0%" y2="100%" id="PrimaryGradient">
+ <stop stop-color="#006F84" offset="0%"></stop>
+ <stop stop-color="#00B875" offset="100%"></stop>
+ </linearGradient>
+ </defs>
+ <g id="AeroCoreWhiteLogo" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="LogoMarkWithLogotype" transform="translate(131, 153)">
+ <g id="LogoMark">
+ <circle id="CircularGradientBackground" fill="url(#PrimaryGradient)" cx="115" cy="115" r="115"></circle>
+ <path d="M114.864629,45.7699231 C117.70241,45.7575066 120.462372,46.4739976 122.873034,47.8411701 C125.21387,49.1687417 127.225298,51.1098643 128.658767,53.5927063 L166.7383,119.548024 C164.446278,116.589412 161.109775,114.94247 157.539145,114.94247 L127.960077,114.94247 L115.027904,92.5432299 L102.095731,114.94247 L72.5165569,114.94247 C68.9383095,114.94247 65.5956122,116.596773 63.4238152,119.36535 L101.396993,53.5927062 C104.277488,48.6035427 109.491743,45.8018419 114.864629,45.7699231 Z" id="AeroCoreLetterA" stroke="#979797" stroke-width="0.115" fill="#FFFFFF" opacity="0.400000006"></path>
+ <path d="M167.498438,120.749972 L190.636064,160.825533 L190.636064,160.825533 C194.970809,168.333531 192.398379,177.933971 184.89038,182.268716 C177.382382,186.603461 167.781941,184.031031 163.447196,176.523033 L149.837254,152.94997 L80.218439,152.94997 L66.6085639,176.523033 C62.273819,184.031031 52.6733786,186.603461 45.1653801,182.268716 C37.6573817,177.933971 35.0849514,168.333531 39.4196963,160.825533 L62.5572574,120.749983 C64.6115326,117.191863 68.4079974,114.99997 72.5165569,114.99997 L157.539145,114.99997 C161.6477,114.99997 165.444161,117.191858 167.498438,120.749972 Z" id="GamepadLowerHalf" fill="#FFFFFF" opacity="0.800000012"></path>
+ <path d="M151.886176,130.496176 L145.839767,130.496176 C144.179503,130.496176 142.83,131.847015 142.83,133.515 C142.83,135.193378 144.17787,136.533824 145.839767,136.533824 L151.886176,136.533824 L151.886176,142.580233 C151.886176,144.240646 153.237015,145.59 154.905,145.59 C156.583378,145.59 157.923824,144.242279 157.923824,142.580233 L157.923824,136.533824 L163.970233,136.533824 C165.630646,136.533824 166.98,135.182985 166.98,133.515 C166.98,131.836622 165.63213,130.496176 163.970233,130.496176 L157.923824,130.496176 L157.923824,124.449767 C157.923824,122.789354 156.572985,121.44 154.905,121.44 C153.226622,121.44 151.886176,122.78787 151.886176,124.449767 L151.886176,130.496176 Z" id="GamepadDPadCross" fill="#FFFFFF" fill-rule="nonzero"></path>
+ <path d="M75.555,145.59 C68.8860959,145.59 63.48,140.183756 63.48,133.515 C63.48,126.846244 68.8862444,121.44 75.555,121.44 C82.2239041,121.44 87.63,126.846244 87.63,133.515 C87.63,140.183904 82.2237556,145.59 75.555,145.59 Z" id="GamepadLeftAnalogStick" fill="#FFFFFF" fill-rule="nonzero"></path>
+ </g>
+ <g id="AeroCoreLogotype" transform="translate(249, 55)" fill="#FFFFFF">
+ <path d="M83.3127642,77.1178173 C75.2815486,57.3796211 67.3524172,37.892275 59.23062,17.9322434 C51.1591459,37.909537 43.2724297,57.429938 35.3177772,77.1178173 L83.3127642,77.1178173 Z M26.1438667,56.4008281 C33.5614992,38.7601503 40.9873992,21.1235126 48.3953265,3.47879478 C49.8011397,0.130331091 49.7691486,0.132534752 53.2914097,0.124087383 C57.9017293,0.112701799 62.5142056,0.144287614 67.1212902,0.00251872244 C68.5943207,-0.0426563388 69.2075442,0.518175519 69.7539099,1.82053948 C80.2038718,26.7193438 90.6858248,51.6038242 101.186829,76.4802246 C105.013236,85.5447172 110.924679,99.5776887 118.921161,118.579139 L118.921877,118.578838 C119.136086,119.087888 118.89707,119.674207 118.388019,119.888416 C118.266108,119.939717 118.135231,119.966323 118.002967,119.966694 L111.833051,119.965812 L111.833051,119.965812 C105.490776,119.988604 102.316726,120 102.3109,120 C101.628187,119.99261 100.791073,119.203345 100.530112,118.607622 C96.8141063,110.125361 93.2062958,101.593519 89.4856176,93.1138291 C89.269947,92.6224125 88.310572,92.2048187 87.6955512,92.202615 C72.3049342,92.1453198 56.9143172,92.1519308 41.5237002,92.1387088 C37.9306271,92.1357706 34.3371947,92.133567 30.7452,92.0612134 C29.7074647,92.0402786 29.2211274,92.3579732 28.7897861,93.3955305 C25.256382,101.893217 21.6453364,110.357848 18.0026591,118.807788 C17.786629,119.308754 17.0968424,119.922473 16.6194913,119.929452 C13.1892194,119.980464 7.9823162,120.00269 0.998781717,119.996131 L0.998781717,119.996131 C0.446497377,119.995458 -0.000672089547,119.547197 7.58321357e-07,118.994913 C0.000162122448,118.862463 0.0266339959,118.731364 0.0778793675,118.609229" id="LogotypeLetterA"></path>
+ <path d="M743.897267,65.9992853 C743.802219,55.0047342 733.069736,40.4329326 714.191754,40.6115059 C698.732611,40.7575456 684.1728,53.027414 684.53957,65.9992853 L743.897267,65.9992853 Z M696.209114,99.5139592 C707.962097,108.157415 725.957072,107.07983 736.162798,97.0779152 C737.275425,95.9875647 739.070118,93.8106092 741.546875,90.5470485 L741.543818,90.5447379 C741.731764,90.2960549 742.024926,90.1492381 742.336639,90.14769 L757.734611,90.1067171 C758.286896,90.1069616 758.734413,90.554875 758.734168,91.1071597 C758.734108,91.243261 758.706266,91.3779175 758.652347,91.5028828 C757.546494,94.0936092 756.63239,95.9933041 755.910726,97.2022659 C747.308487,111.612484 734.260017,118.740597 717.732487,119.872766 C709.336307,120.447888 701.202055,119.087983 693.548486,115.49302 C675.825958,107.168755 665.352863,88.3542097 667.212473,68.5766698 C668.779683,51.9053661 676.6901,39.2736518 691.50023,31.3762999 C702.625241,25.4443393 714.571222,24.7925827 726.770062,27.6132463 C739.934259,30.6573072 749.669459,38.2022117 755.890048,50.078062 C760.376185,58.6423528 761.451827,67.9310585 760.844534,77.4753337 C760.747309,79.0040517 759.725357,78.7531814 758.787934,78.7517355 C747.06216,78.7318538 735.336023,78.7286005 723.610248,78.6758237 C710.978249,78.6190707 698.346614,78.5135172 685.714615,78.4343521 C685.303585,78.4318217 684.892193,78.4838755 684.212343,78.5276151 C685.092084,87.484478 689.199842,94.3595517 696.209114,99.5139592 Z" id="LogotypeFinalLetterE"></path>
+ <path d="M198.897267,65.9992853 C198.802219,55.0047342 188.069736,40.4329326 169.191754,40.6115059 C153.732611,40.7575456 139.1728,53.027414 139.53957,65.9992853 L198.897267,65.9992853 Z M151.209114,99.5139592 C162.962097,108.157415 180.957072,107.07983 191.162798,97.0779152 C192.275425,95.9875647 194.070118,93.8106092 196.546875,90.5470485 L196.543818,90.5447379 C196.731764,90.2960549 197.024926,90.1492381 197.336639,90.14769 L212.734611,90.1067171 C213.286896,90.1069616 213.734413,90.554875 213.734168,91.1071597 C213.734108,91.243261 213.706266,91.3779175 213.652347,91.5028828 C212.546494,94.0936092 211.63239,95.9933041 210.910726,97.2022659 C202.308487,111.612484 189.260017,118.740597 172.732487,119.872766 C164.336307,120.447888 156.202055,119.087983 148.548486,115.49302 C130.825958,107.168755 120.352863,88.3542097 122.212473,68.5766698 C123.779683,51.9053661 131.6901,39.2736518 146.50023,31.3762999 C157.625241,25.4443393 169.571222,24.7925827 181.770062,27.6132463 C194.934259,30.6573072 204.669459,38.2022117 210.890048,50.078062 C215.376185,58.6423528 216.451827,67.9310585 215.844534,77.4753337 C215.747309,79.0040517 214.725357,78.7531814 213.787934,78.7517355 C202.06216,78.7318538 190.336023,78.7286005 178.610248,78.6758237 C165.978249,78.6190707 153.346614,78.5135172 140.714615,78.4343521 C140.303585,78.4318217 139.892193,78.4838755 139.212343,78.5276151 C140.092084,87.484478 144.199842,94.3595517 151.209114,99.5139592 Z" id="LogotypeFirstLetterE"></path>
+ <path d="M491.683211,31.0011732 L477.139717,31.0141312 C476.806923,31.013771 476.496114,30.8478783 476.310595,30.5715915 C475.918648,29.9860374 475.612781,29.5282525 475.393075,29.1981841 C474.885253,28.4352768 474.357944,27.6753323 473.760193,26.9772687 C467.820235,20.0385481 460.229595,16.2095898 451.26267,15.3804163 C440.725811,14.4058119 431.119694,17.0528723 422.997404,24.0769703 C416.918461,29.3334672 412.83177,36.0052027 410.794141,43.8664331 C407.685355,55.8579749 407.363793,67.9280205 411.364377,79.7053954 C419.58242,103.89939 443.92785,110.007852 460.516499,101.398122 C466.098094,98.50108 470.279824,94.1598575 473.438631,88.7644414 C473.71817,88.2870959 473.960873,87.8729798 474.16674,87.5220933 L474.165684,87.5214768 C474.344459,87.2153044 474.671986,87.0266823 475.026529,87.025718 L490.501653,87.0013529 C491.053933,86.9992831 491.503323,87.4453173 491.505393,87.9975982 C491.505874,88.1259531 491.48164,88.2532003 491.434014,88.3723933 C490.288471,91.2241519 489.3635,93.2702381 488.6585,94.5104112 C477.879397,113.476489 461.204998,121.390537 440.186302,119.80165 C419.555981,118.242066 404.528692,107.450872 396.632925,88.1476261 C388.508135,68.2843625 389.048358,48.0387097 399.062144,28.8845125 C409.050205,9.77915402 428.074862,-1.51128039 451.719288,0.163707958 C463.404837,0.991434381 473.870571,4.81915035 482.529893,12.9131549 C487.295763,17.3678886 490.667349,22.969513 492.644652,29.7180283 L492.644119,29.7181854 C492.800409,30.2478946 492.497693,30.8040069 491.967984,30.960297 C491.875526,30.9875765 491.77961,31.001344 491.683211,31.001172 Z" id="LogotypeLetterC"></path>
+ <path d="M513.333355,73.8699387 C513.525393,75.2714416 513.703259,77.8018024 514.234023,80.2527171 C519.272379,103.517087 543.48944,110.552769 559.148382,101.299094 C568.817633,95.5851079 573.77308,86.488159 574.690046,75.2389409 C575.472728,65.638231 573.026184,56.8699004 566.380302,49.8414411 C558.636398,41.6512621 548.919669,39.3177111 538.116611,41.2088913 C528.895923,42.8234544 521.886514,47.7924519 517.240384,56.0743552 C514.35449,61.2188566 513.535314,66.9147866 513.333355,73.8699387 M546.33388,26.0000016 C556.675974,26.1036444 568.110066,29.3724936 577.220562,38.4658313 C586.920638,48.147793 591.440278,60.1640279 590.966205,73.9876635 C590.168642,97.2260327 573.904885,116.102807 551.35452,119.440629 C524.677805,123.389105 502.873273,105.942723 498.076206,82.6140743 C494.131265,63.4299882 501.171854,45.2693134 516.884652,34.1031526 C524.098146,28.9770683 534.138365,25.9974754 546.33388,26.0000016" id="LogotypeSecondLetterO"></path>
+ <path d="M304.333355,73.8699387 C304.525393,75.2714416 304.703259,77.8018024 305.234023,80.2527171 C310.272379,103.517087 334.48944,110.552769 350.148382,101.299094 C359.817633,95.5851079 364.77308,86.488159 365.690046,75.2389409 C366.472728,65.638231 364.026184,56.8699004 357.380302,49.8414411 C349.636398,41.6512621 339.919669,39.3177111 329.116611,41.2088913 C319.895923,42.8234544 312.886514,47.7924519 308.240384,56.0743552 C305.35449,61.2188566 304.535314,66.9147866 304.333355,73.8699387 M337.33388,26.0000016 C347.675974,26.1036444 359.110066,29.3724936 368.220562,38.4658313 C377.920638,48.147793 382.440278,60.1640279 381.966205,73.9876635 C381.168642,97.2260327 364.904885,116.102807 342.35452,119.440629 C315.677805,123.389105 293.873273,105.942723 289.076206,82.6140743 C285.131265,63.4299882 292.171854,45.2693134 307.884652,34.1031526 C315.098146,28.9770683 325.138365,25.9974754 337.33388,26.0000016" id="LogotypeFirstLetterO"></path>
+ <path d="M659.997819,42.0093636 C649.952499,42.008574 643.873046,42.0103061 641.759459,42.01456 C630.723875,42.0367702 623.020688,49.6296699 622.991883,61.1507526 C623.005106,63.6796505 623.015872,82.9594201 623.024182,118.990061 C623.024327,119.542346 622.576729,119.990179 622.024444,119.990323 C622.023872,119.990323 622.023299,119.990323 622.022727,119.990322 L607.001623,119.999394 C606.449574,120.000231 606.001278,119.553562 606.000109,119.001513 C606.004244,94.2397496 606.006076,75.9048313 606.005602,63.996758 C606.005242,53.603616 608.861521,44.2489265 616.082559,36.7872027 C622.144225,30.5235205 629.665014,27.0784953 638.1182,26.4599942 C642.860333,26.1129793 650.154524,25.9623028 660.000775,26.0079646 L660.000775,26.0079557 C660.552745,26.0090174 660.999469,26.4571028 660.998851,27.0090732 L660.99986,41.0057795 C661.001839,41.5580607 660.555731,42.0073777 660.00345,42.0093572 C660.001573,42.0093639 659.999696,42.0093654 659.997819,42.0093615 Z" id="LogotypeSecondLetterR"></path>
+ <path d="M282.997819,42.0093636 C272.952499,42.008574 266.873046,42.0103061 264.759459,42.01456 C253.723875,42.0367702 246.020688,49.6296699 245.991883,61.1507526 C246.005106,63.6796505 246.015872,82.9594201 246.024182,118.990061 C246.024327,119.542346 245.576729,119.990179 245.024444,119.990323 C245.023872,119.990323 245.023299,119.990323 245.022727,119.990322 L230.001623,119.999394 C229.449574,120.000231 229.001278,119.553562 229.000109,119.001513 C229.004244,94.2397496 229.006076,75.9048313 229.005602,63.996758 C229.005242,53.603616 231.861521,44.2489265 239.082559,36.7872027 C245.144225,30.5235205 252.665014,27.0784953 261.1182,26.4599942 C265.860333,26.1129793 273.154524,25.9623028 283.000775,26.0079646 L283.000775,26.0079557 C283.552745,26.0090174 283.999469,26.4571028 283.998851,27.0090732 L283.99986,41.0057795 C284.001839,41.5580607 283.555731,42.0073777 283.00345,42.0093572 C283.001573,42.0093639 282.999696,42.0093654 282.997819,42.0093615 Z" id="LogotypeFirstLetterR"></path>
+ </g>
+ </g>
+ </g>
+</svg>
diff --git a/system_files/usr/share/pixmaps/fedora_whitelogo_med.png b/system_files/usr/share/pixmaps/fedora_whitelogo_med.png
new file mode 100644
index 0000000..3b12a8c
--- /dev/null
+++ b/system_files/usr/share/pixmaps/fedora_whitelogo_med.png
Binary files differ
diff --git a/system_files/usr/share/pixmaps/system-logo-white.png b/system_files/usr/share/pixmaps/system-logo-white.png
new file mode 100644
index 0000000..60349b2
--- /dev/null
+++ b/system_files/usr/share/pixmaps/system-logo-white.png
Binary files differ
diff --git a/system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js b/system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js
new file mode 100644
index 0000000..b207690
--- /dev/null
+++ b/system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js
@@ -0,0 +1,4 @@
+applet.wallpaperPlugin = 'org.kde.image'
+applet.currentConfigGroup = ["Wallpaper", "org.kde.image", "General"]
+applet.writeConfig("Image", "/usr/share/wallpapers/aerocore-wallpaper.jxl")
+applet.reloadConfig()
diff --git a/system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/splash/images/bazzite_logo.svgz b/system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/splash/images/bazzite_logo.svgz
new file mode 100644
index 0000000..0da602b
--- /dev/null
+++ b/system_files/usr/share/plasma/look-and-feel/com.valve.vapor.desktop/contents/splash/images/bazzite_logo.svgz
Binary files differ
diff --git a/system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js b/system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js
new file mode 100644
index 0000000..b207690
--- /dev/null
+++ b/system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/plasmoidsetupscripts/org.kde.plasma.folder.js
@@ -0,0 +1,4 @@
+applet.wallpaperPlugin = 'org.kde.image'
+applet.currentConfigGroup = ["Wallpaper", "org.kde.image", "General"]
+applet.writeConfig("Image", "/usr/share/wallpapers/aerocore-wallpaper.jxl")
+applet.reloadConfig()
diff --git a/system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/splash/images/bazzite_logo.svgz b/system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/splash/images/bazzite_logo.svgz
new file mode 100644
index 0000000..0da602b
--- /dev/null
+++ b/system_files/usr/share/plasma/look-and-feel/com.valve.vgui.desktop/contents/splash/images/bazzite_logo.svgz
Binary files differ
diff --git a/system_files/usr/share/plymouth/themes/spinner/watermark.png b/system_files/usr/share/plymouth/themes/spinner/watermark.png
new file mode 100644
index 0000000..4b53dd2
--- /dev/null
+++ b/system_files/usr/share/plymouth/themes/spinner/watermark.png
Binary files differ
diff --git a/system_files/usr/share/steamos/steamos.png b/system_files/usr/share/steamos/steamos.png
new file mode 100644
index 0000000..3c75128
--- /dev/null
+++ b/system_files/usr/share/steamos/steamos.png
Binary files differ
diff --git a/system_files/usr/share/ublue-os/bazzite/docs.svg b/system_files/usr/share/ublue-os/bazzite/docs.svg
new file mode 100644
index 0000000..a7e16e7
--- /dev/null
+++ b/system_files/usr/share/ublue-os/bazzite/docs.svg
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="20.5" height="20.5" viewBox="0 0 20.5 20.5" version="1.1" xmlns="http://www.w3.org/2000/svg">
+ <defs>
+ <linearGradient id="file-body" x1="21.057846" y1="23.008402" x2="-41.097679" y2="-46.29372" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#008f7b" offset="0"/>
+ <stop stop-color="#006f84" offset="1"/>
+ </linearGradient>
+ <linearGradient id="file-corner" x1="-9.108303" y1="22.616745" x2="32.585659" y2="-12.171739" gradientUnits="userSpaceOnUse">
+ <stop stop-color="#10b981" offset="0"/>
+ <stop stop-color="#008f7b" offset="1"/>
+ </linearGradient>
+ </defs>
+ <path opacity="0.2" d="m 3.25,0.5 c -0.554,0 -1,0.446 -1,1 v 18 c 0,0.554 0.446,1 1,1 h 14 c 0.554,0 1,-0.446 1,-1 V 6.5 L 12.75,6 12.25,0.5 Z"/>
+ <path fill="url(#file-body)" d="m 3.25,0 c -0.554,0 -1,0.446 -1,1 v 18 c 0,0.554 0.446,1 1,1 h 14 c 0.554,0 1,-0.446 1,-1 V 6 L 12.75,5.5 12.25,0 Z"/>
+ <path fill="#ffffff" opacity="0.2" d="m 3.25,0 c -0.554,0 -1,0.446 -1,1 v 0.5 c 0,-0.554 0.446,-1 1,-1 h 9 l 5.5,5.5 h 0.5 l -6,-6 z"/>
+ <path opacity="0.2" d="m 12.25,0.5 v 5 c 0,0.5523 0.44772,1 1,1 h 5 z"/>
+ <path fill="url(#file-corner)" d="m 12.25,0 v 5 c 0,0.5523 0.44772,1 1,1 h 5 z"/>
+ <g fill="#ffffff" fill-rule="nonzero" transform="translate(5.1 7) scale(0.0206)">
+ <path d="M250,0 C388.071187,0 500,111.928813 500,250 C500,388.071187 388.071187,500 250,500 C111.928813,500 0,388.071187 0,250 C0,111.928813 111.928813,0 250,0 Z M342.476402,249.999935 L157.644689,249.999935 C148.713038,249.999935 140.459853,254.76492 135.994038,262.499963 L85.694992,349.620724 C76.2716335,365.942459 81.8638733,386.81298 98.1856089,396.236339 C114.507345,405.659698 135.377867,400.067459 144.801226,383.745724 L174.387911,332.499935 L325.733161,332.499935 L355.319991,383.745724 C364.74335,400.067459 385.613874,405.659698 401.935609,396.236339 C418.257346,386.81298 423.849585,365.942459 414.426226,349.620724 L364.127039,262.499935 C359.66122,254.764909 351.408043,249.999935 342.476402,249.999935 Z M249.705715,99.4994879 C238.025528,99.5692215 226.690191,105.659875 220.428246,116.505883 L145.354419,246.540081 C149.174171,244.890029 153.346061,243.999935 157.644689,243.999935 L225.338419,243.999152 L250.060661,201.180935 L274.781419,243.999152 L342.476402,243.999935 C346.77684,243.999935 350.950435,244.890779 354.771498,246.542166 L279.692972,116.505883 C276.576735,111.108401 272.204065,106.888569 267.115291,104.002544 C261.874722,101.03043 255.874804,99.4728404 249.705715,99.4994879 Z"/>
+ <path d="M330.187339,283.687339 L317.042972,283.687339 C313.433702,283.687339 310.5,286.623946 310.5,290.25 C310.5,293.898648 313.430152,296.812661 317.042972,296.812661 L330.187339,296.812661 L330.187339,309.957028 C330.187339,313.566622 333.123946,316.5 336.75,316.5 C340.398648,316.5 343.312661,313.570172 343.312661,309.957028 L343.312661,296.812661 L356.457028,296.812661 C360.066622,296.812661 363,293.876054 363,290.25 C363,286.601352 360.069848,283.687339 356.457028,283.687339 L343.312661,283.687339 L343.312661,270.542972 C343.312661,266.933378 340.376054,264 336.75,264 C333.101352,264 330.187339,266.930152 330.187339,270.542972 L330.187339,283.687339 Z"/>
+ <path d="M164.25,316.5 C149.752382,316.5 138,304.747296 138,290.25 C138,275.752704 149.752705,264 164.25,264 C178.747618,264 190.5,275.752704 190.5,290.25 C190.5,304.747617 178.747295,316.5 164.25,316.5 Z"/>
+ </g>
+</svg>
diff --git a/system_files/usr/share/ublue-os/bazzite/logo.svg b/system_files/usr/share/ublue-os/bazzite/logo.svg
new file mode 100644
index 0000000..bd0dae2
--- /dev/null
+++ b/system_files/usr/share/ublue-os/bazzite/logo.svg
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='utf-8'?>
+<svg xmlns="http://www.w3.org/2000/svg" width="500px" height="500px" viewBox="0 0 1024 1024" version="1.1">
+ <title>AeroCoreIcon</title>
+ <defs>
+ <linearGradient x1="73.6318768%" y1="26.3681232%" x2="0%" y2="100%" id="linearGradient-1">
+ <stop stop-color="#006F84" offset="0%" />
+ <stop stop-color="#00B875" offset="100%" />
+ </linearGradient>
+ </defs>
+ <g id="AeroCoreIcon" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="LogoMark">
+ <circle id="CircularGradientBackground" fill="url(#linearGradient-1)" cx="512" cy="512" r="512" />
+ <path d="M512.125099,203.775657 C524.425722,203.720223 536.565487,206.928767 547.230065,213.049297 C557.526611,218.958608 566.447921,227.582512 572.811208,238.604049 L741.889,531.455 L741.661543,531.166142 C732.09877,519.141785 717.545473,511.911367 701.936588,511.746739 L701.39167,511.743866 L569.700515,511.743867 L512.124234,412.018554 L454.547952,511.743867 L322.856323,511.743866 C306.925343,511.743866 292.043073,519.10911 282.373856,531.435299 L451.437046,238.604049 C464.26151,216.391425 487.47628,203.917765 511.396183,203.77566 Z" id="AeroCoreLetterA" stroke="#979797" stroke-width="0.512" fill="#FFFFFF" opacity="0.400000006" />
+ <path d="M745.732175,537.599874 L848.744911,716.023241 L848.744911,716.023241 C868.043949,749.450156 856.591042,792.192986 823.164127,811.492024 C789.737212,830.791063 746.994382,819.338156 727.695344,785.911241 L667.101514,680.959867 L357.146442,680.959867 L296.552911,785.911241 C277.253872,819.338156 234.511042,830.791063 201.084127,811.492024 C167.657212,792.192986 156.204305,749.450156 175.503344,716.023241 L278.51579,537.599923 C287.66178,521.758556 304.564301,511.999866 322.856323,511.999866 L701.39167,511.999866 C719.683671,511.999866 736.586177,521.758535 745.732175,537.599874 Z" id="GamepadLowerHalf" fill="#FFFFFF" opacity="0.800000012" />
+ <path d="M676.223669,580.991669 L649.304007,580.991669 C641.912222,580.991669 635.904,587.005841 635.904,594.432 C635.904,601.904432 641.90495,607.872331 649.304007,607.872331 L676.223669,607.872331 L676.223669,634.791993 C676.223669,642.184439 682.237841,648.192 689.664,648.192 C697.136432,648.192 703.104331,642.191711 703.104331,634.791993 L703.104331,607.872331 L730.023993,607.872331 C737.416439,607.872331 743.424,601.858159 743.424,594.432 C743.424,586.959568 737.42305,580.991669 730.023993,580.991669 L703.104331,580.991669 L703.104331,554.072007 C703.104331,546.679561 697.090159,540.672 689.664,540.672 C682.191568,540.672 676.223669,546.67295 676.223669,554.072007 L676.223669,580.991669 Z" id="GamepadDPadCross" fill="#FFFFFF" fill-rule="nonzero" />
+ <path d="M336.384,648.192 C306.692879,648.192 282.624,624.12246 282.624,594.432 C282.624,564.74154 306.69354,540.672 336.384,540.672 C366.075121,540.672 390.144,564.74154 390.144,594.432 C390.144,624.123121 366.07446,648.192 336.384,648.192 Z" id="GamepadLeftAnalogStick" fill="#FFFFFF" fill-rule="nonzero" />
+ </g>
+ </g>
+</svg>
diff --git a/system_files/usr/share/ublue-os/bazzite/updatelogo.png b/system_files/usr/share/ublue-os/bazzite/updatelogo.png
new file mode 100644
index 0000000..1b3cb8a
--- /dev/null
+++ b/system_files/usr/share/ublue-os/bazzite/updatelogo.png
Binary files differ
diff --git a/system_files/usr/share/wallpapers/aerocore-wallpaper.jxl b/system_files/usr/share/wallpapers/aerocore-wallpaper.jxl
new file mode 100644
index 0000000..9eca7b7
--- /dev/null
+++ b/system_files/usr/share/wallpapers/aerocore-wallpaper.jxl
Binary files differ