diff --git a/.github/workflows/daily-8.1.yml b/.github/workflows/daily-8.1.yml
deleted file mode 100644
index a68938412..000000000
--- a/.github/workflows/daily-8.1.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Daily OS 8
-
-on:
- push:
- branches:
- - main
- schedule:
- - cron: "0 0 * * *"
- workflow_dispatch: {}
-
-jobs:
- build:
- strategy:
- fail-fast: false
- matrix:
- include:
- - runner: ubuntu-24.04
- arch: amd64
- - runner: ubuntu-24.04-arm
- arch: arm64
- runs-on: ${{ matrix.runner }}
-
- container:
- image: debian:latest
- volumes:
- - /proc:/proc
- options: --privileged
-
- steps:
- - name: Clone build scripts
- uses: actions/checkout@v7
-
- - name: Build and upload daily .iso
- run: |
- ./workflows.sh etc/terraform-daily-8.1-azure-${{ matrix.arch }}.conf "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}"
diff --git a/.github/workflows/daily-9.0.yaml b/.github/workflows/daily-9.0.yaml
new file mode 100644
index 000000000..ead8b4307
--- /dev/null
+++ b/.github/workflows/daily-9.0.yaml
@@ -0,0 +1,108 @@
+name: Build and Release Daily (elementary OS 9)
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build-and-release:
+ name: Build Image and Release
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ env:
+ # systemd architecture ID, as expanded by %a in the sysupdate transfer config.
+ # Must be x86-64 or arm64
+ ARCH: x86-64
+ # OS Version should be quoted so 9.0 isn't recuded to just 9
+ OS_VERSION: "9.0"
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v7
+
+ - name: Maximize build space
+ uses: ublue-os/remove-unwanted-software@v8
+
+ - name: Install deps
+ run: sudo apt-get update && sudo apt-get install just podman -y
+
+ - name: Generate key
+ run: just genkey
+
+ - name: Release
+ run: just do-daily
+
+ - name: Fix output dir ownership
+ run: |
+ sudo chown -R "$(id -u):$(id -g)" mkosi.output
+ sudo chmod -R u+rwX mkosi.output
+
+ - name: Generate SHA256SUMS (all partitions)
+ run: just checksum-repo
+
+ - name: Extract Date
+ id: get_date
+ run: |
+ set -euo pipefail
+ FILE_PATH=$(ls mkosi.output/*.usr-*.raw.zst | head -n 1)
+ TIMESTAMP=$(basename "$FILE_PATH" | grep -oE '[0-9]{14}' | head -n 1 || true)
+ if [ -z "$TIMESTAMP" ]; then
+ echo "Fatal: No timpestamped file found."
+ exit 0
+ fi
+ echo "Release date: $TIMESTAMP"
+ echo "RELEASE_DATE=$TIMESTAMP" >> "$GITHUB_OUTPUT"
+
+ - name: Upload sysupdate, iso and SHA256SUMS to Bucket
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
+ AWS_DEFAULT_REGION: auto
+ AWS_ENDPOINT_URL: ${{ secrets.R2_ENDPOINT }}
+ run: |
+ set -euo pipefail
+
+ # 1. Images
+ cd mkosi.output
+ find . -maxdepth 1 -type f \( \
+ -name "*.esp.raw" \
+ -o -name "*.usr-*.*.raw.zst" \
+ -o -name "*.usr-*-verity.*.raw.zst" \
+ -o -name "*.usr-*-verity-sig.*.raw.zst" \
+ \) -print0 | while IFS= read -r -d '' f; do
+ aws s3 cp "$f" "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/" --cache-control "public, max-age=31536000, immutable"
+ done
+ cd ..
+
+
+ # 2. SHA256SUMS
+ # not cached, will change when new updates are uploaded
+ aws s3 cp mkosi.output/SHA256SUMS \
+ "s3://${{ secrets.R2_BUCKET_DAILY_UPDATES }}/$ARCH/SHA256SUMS" \
+ --content-type "text/plain" \
+ --cache-control "no-cache"
+
+ # 3. Live ISO + hash
+ ISO=$(basename $(ls mkosi.output/elementaryos-*.iso | head -n 1))
+ ( cd mkosi.output && sha256sum "$ISO" > "$ISO.sha256.txt" )
+
+ ISO_DEST="s3://${{ secrets.R2_BUCKET_DAILY_INSTALLER }}/$ARCH"
+
+ aws s3 cp "mkosi.output/$ISO" "$ISO_DEST/$ISO" \
+ --cache-control "public, max-age=31536000, immutable"
+
+ aws s3 cp "mkosi.output/$ISO.sha256.txt" "$ISO_DEST/$ISO.sha256.txt" \
+ --content-type "text/plain" \
+ --cache-control "public, max-age=31536000, immutable"
+
+ - name: Checksum Extensions
+ run: just checksum-ext
+
+ - name: Release Extensions
+ uses: softprops/action-gh-release@v3
+ with:
+ tag_name: ${{ steps.get_date.outputs.RELEASE_DATE }}
+ name: Extension release ${{ steps.get_date.outputs.RELEASE_DATE }}
+ files: |
+ mkosi.output/ext/ext-*.raw.zst
+ mkosi.output/ext/SHA256SUMS
diff --git a/.github/workflows/daily-9.0.yml b/.github/workflows/daily-9.0.yml
deleted file mode 100644
index da2db2704..000000000
--- a/.github/workflows/daily-9.0.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Daily OS 9
-
-on:
- push:
- branches:
- - main
- schedule:
- - cron: "0 0 * * *"
- workflow_dispatch: {}
-
-jobs:
- build:
- strategy:
- fail-fast: false
- matrix:
- include:
- - runner: ubuntu-26.04
- arch: amd64
- - runner: ubuntu-26.04-arm
- arch: arm64
- runs-on: ${{ matrix.runner }}
-
- container:
- image: debian:latest
- volumes:
- - /proc:/proc
- options: --privileged
-
- steps:
- - name: Clone build scripts
- uses: actions/checkout@v7
-
- - name: Build and upload daily .iso
- run: |
- ./workflows.sh etc/terraform-daily-9.0-azure-${{ matrix.arch }}.conf "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}"
diff --git a/.github/workflows/stable-8.1.yml b/.github/workflows/stable-8.1.yml
deleted file mode 100644
index 70a5d57e6..000000000
--- a/.github/workflows/stable-8.1.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-name: Stable OS 8
-
-on:
- push:
- tags:
- - "*"
- schedule:
- - cron: "0 0 1 * *"
- workflow_dispatch: {}
-
-jobs:
- build:
- strategy:
- fail-fast: false
- matrix:
- include:
- - runner: ubuntu-24.04
- arch: amd64
- - runner: ubuntu-24.04-arm
- arch: arm64
- runs-on: ${{ matrix.runner }}
-
- container:
- image: debian:latest
- volumes:
- - /proc:/proc
- options: --privileged
-
- steps:
- - name: Clone build scripts
- uses: actions/checkout@v7
-
- - name: Build and upload stable .iso
- run: |
- ./workflows.sh etc/terraform-stable-8.1-azure-${{ matrix.arch }}.conf "${{ secrets.key }}" "${{ secrets.secret }}" "${{ secrets.endpoint }}" "${{ secrets.bucket }}"
diff --git a/.gitignore b/.gitignore
index 5dce753a5..c83287d5c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,21 @@
-.DS_Store
-tmp
-artifacts
-builds
-*~
\ No newline at end of file
+cosign.key
+**/cosign.key
+cache
+_build_*
+output
+_build-*/**
+*.img
+*.raw
+*.iso
+mkosi.local/
+mkosi.local.conf
+mkosi.output/
+mkosi.cache/
+mkosi.tools/
+mkosi.tools.manifest
+mkosi.key
+mkosi.crt
+mkosi.version
+mkosi.rootpw
+.mkosi-private
+*.efi
diff --git a/Justfile b/Justfile
new file mode 100644
index 000000000..5cccecd0c
--- /dev/null
+++ b/Justfile
@@ -0,0 +1,67 @@
+default:
+ #!/usr/bin/env bash
+ set -xeuo pipefail
+ just --choose
+
+do-daily:
+ #!/usr/bin/env bash
+ sudo rm -rf mkosi.output/ && \
+ just run-in-podman mkosi -B --debug --profile=daily --force --workspace-directory=/workspace && \
+ sudo ./assemble-iso.sh
+
+
+do-release:
+ #!/usr/bin/env bash
+ echo "nyi, run do-daily instead"
+
+genkey:
+ just run-in-podman mkosi genkey
+
+run-in-podman +command:
+ mkdir -p {{env_var('HOME')}}/.cache/mkosi-workspace
+ sudo mkdir -p /var/cache/mkosi
+
+ sudo podman run --rm -it \
+ --network host \
+ --dns 8.8.8.8 \
+ --privileged \
+ --security-opt label=disable \
+ -v /var/cache/mkosi:/var/cache/mkosi \
+ -v /dev:/dev \
+ -v "{{invocation_directory()}}:/work" \
+ -w /work \
+ -v "{{env_var('HOME')}}/.cache/mkosi-workspace:/workspace" \
+ ghcr.io/jumpyvi/mkosi:tanit \
+ {{command}}
+
+
+
+clean:
+ just run-in-podman mkosi clean
+ sudo rm -r mkosi.tools/ mkosi.cache/ /var/cache/mkosi/*
+
+checksum-repo:
+ #!/usr/bin/env bash
+ cd mkosi.output
+ sha256sum elementary_*.efi \
+ elementary_*.usr-*.*.raw.zst \
+ elementary_*.usr-*-verity.*.raw.zst \
+ elementary_*.usr-*-verity-sig.*.raw.zst \
+ > SHA256SUMS
+ cat SHA256SUMS
+
+checksum-ext:
+ #!/usr/bin/env bash
+ cd mkosi.output
+ mkdir ext
+ mv ext-*.raw.zst ext/
+ cd ext/
+ sha256sum ext-*.raw.zst > SHA256SUMS
+ cat SHA256SUMS
+
+serve:
+ #!/usr/bin/env bash
+ cd mkosi.output
+ echo "Sysupdate accessible in Gnome Boxes at http://10.0.2.2:7070"
+ echo "Extensions accessible in Gnome Boxes at http://10.0.2.2:7070/ext/"
+ python -m http.server 7070
diff --git a/README.md b/README.md
index 119becb62..1c8631f03 100644
--- a/README.md
+++ b/README.md
@@ -18,27 +18,41 @@
+
---
-## Building Locally
+## Building, Testing, and Installation
-As elementary OS is built with the Debian version of `live-build`, not the Ubuntu patched version, it's easiest to build an elementary .iso in a Debian VM or container. This prevents messing up your host system too.
+You'll need the following dependencies:
+* podman
+* just
-The following example assumes you have Docker correctly installed and set up, and that your current working directory is this repo. When done, your image will be in the `builds` folder.
+Generate keys and then build with `just`
-Configure the channel (stable, daily) in the configuration file (`etc/terraform-amd64.conf` or `etc/terraform-arm64.conf` based on your host architecture), then run:
+```bash
+just genkey
+just do-release
+```
+Create install media with [Fedora Media Writer](https://flathub.org/en/apps/org.fedoraproject.MediaWriter) or [Impression](flathub.org/en/apps/io.gitlab.adhami3310.Impression), or boot with Gnome Boxes (>=51). Then, in demo mode, install via script:
-```sh
-docker run --rm --privileged -it \
- -v /proc:/proc \
- -v ${PWD}:/working_dir \
- -w /working_dir \
- debian:latest \
- ./build.sh
+```bash
+run0 elementary-install
```
-## Further Information
+It should take arround a minute, then reboot. After boot, Flatpak should start installing, it might take a while.
+
+## Operations
+
+### Upgrades
+
+`run0 sysupdate update --verify=no`
+
+Append the exact version ID at the end to upgrade to a specific version, or downgrade.
-More information about the concepts behind `live-build` and the technical decisions made to arrive at this set of tools to build an .iso can be found [on the wiki](https://github.com/elementary/os/wiki/Building-iso-Images).
+## Minimum specs
+- UEFI
+- ~8gb usb stick
+- Gnome Boxes >=51 (for VM only)
+- 70gb destination disk, 4gb ram (less should be possible, but not tested)
diff --git a/assemble-iso.sh b/assemble-iso.sh
new file mode 100755
index 000000000..7bc716f45
--- /dev/null
+++ b/assemble-iso.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+set -euo pipefail
+cd mkosi.output/
+
+SEARCH_DIR=.
+
+DATE=$(basename $(ls -d liveiso_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n1))
+DATE=${DATE#liveiso_}
+
+OUT_ISO="./elementaryos-9.0-daily-$(uname -m | tr '_' '-').${DATE}.iso"
+
+RAW_IMAGE=$(find "$SEARCH_DIR" -maxdepth 1 -type f \
+ | grep -E '/elementary_[0-9]{14}\.raw.zst$' \
+ | head -n1)
+
+if [[ -z "$RAW_IMAGE" ]]; then
+ echo "error: No .raw.zst image found matching the pattern." >&2
+ exit 1
+fi
+
+# Detect version
+output_dir=$(ls -d liveiso_* | grep -vE '\.(raw|iso|vmlinuz|initrd|efi|manifest)$' | head -n 1)
+
+if [[ -z "$output_dir" ]]; then
+ echo "error: No mkosi.output, run just build-classic first." >&2
+ exit 1
+fi
+
+base_name=$(basename "$output_dir")
+echo "Detected release target: $base_name"
+
+rm -rf iso_root
+
+rsync -a --delete "${base_name}/iso_root/" iso_root/
+
+echo "Writing minimal APT disc structure for apt-cdrom..."
+
+mkdir -p iso_root/dists/stable/main/binary-amd64
+touch iso_root/dists/stable/main/binary-amd64/Packages
+gzip -kf iso_root/dists/stable/main/binary-amd64/Packages
+mkdir -p iso_root/pool
+
+source ./base_${DATE}/usr/lib/os-release
+sed -i "s|PLACEHOLDER_VERSION|$PRETTY_NAME|g" iso_root/boot/grub/grub.cfg
+
+
+echo "Creating casper liveiso..."
+sudo podman run --rm -it \
+ --network host \
+ --dns 8.8.8.8 \
+ -v "$(pwd)":/workspace:Z \
+ -w /workspace \
+ ghcr.io/jumpyvi/xorriso:tanit \
+ sh -c "set -e
+ KERNEL_VERSION=\$(ls ${base_name}/lib/modules | head -n 1)
+ chroot ${base_name} update-initramfs -u -k \${KERNEL_VERSION}
+ cp ${base_name}/boot/vmlinuz-\${KERNEL_VERSION} iso_root/casper/vmlinuz
+ cp ${base_name}/boot/initrd.img-\${KERNEL_VERSION} iso_root/casper/initrd
+ rm -f iso_root/casper/filesystem.squashfs
+ mksquashfs ${base_name} iso_root/casper/filesystem.squashfs -comp zstd
+ grub-mkrescue -o custom_ubuntu_live.iso iso_root/
+ echo 'Live environment generated!'"
+
+
+echo "Generating installer..."
+BASE_ISO="./custom_ubuntu_live.iso"
+rm -f "$OUT_ISO"
+
+LOCAL_RAW_IMAGE="./$(basename "$RAW_IMAGE")"
+
+podman run --rm \
+ --security-opt label=disable \
+ -v "$(pwd):/work" \
+ -w /work \
+ ghcr.io/jumpyvi/xorriso:tanit \
+ sh -c '
+ apk add --no-cache xorriso && \
+ xorriso -indev "'"$BASE_ISO"'" \
+ -outdev "'"$OUT_ISO"'" \
+ -boot_image any keep \
+ -map "'"$LOCAL_RAW_IMAGE"'" /extra/"$(basename "'"$LOCAL_RAW_IMAGE"'")" \
+ -commit
+ '
+
+echo "Success! Your live ISO is at: mkosi.output/$OUT_ISO"
diff --git a/build.sh b/build.sh
deleted file mode 100755
index 71596c5bd..000000000
--- a/build.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/bash
-
-set -e
-
-# check for root permissions
-if [[ "$(id -u)" != 0 ]]; then
- echo "E: Requires root permissions" > /dev/stderr
- exit 1
-fi
-
-# get config
-if [ -n "$1" ]; then
- CONFIG_FILE="$1"
-else
- CONFIG_FILE="etc/terraform-$(dpkg --print-architecture).conf"
-fi
-BASE_DIR="$PWD"
-source "$BASE_DIR"/"$CONFIG_FILE"
-
-echo -e "
-#----------------------#
-# INSTALL DEPENDENCIES #
-#----------------------#
-"
-
-apt-get update
-apt-get install -y live-build patch gnupg2 binutils zstd
-
-# The Debian repositories don't seem to have the `ubuntu-keyring` or `ubuntu-archive-keyring` packages
-# anymore, so we add the archive keys manually. This may need to be updated if Ubuntu changes their signing keys
-# To get the current key ID, find `ubuntu-keyring-xxxx-archive.gpg` in /etc/apt/trusted.gpg.d on a running
-# system and run `gpg --keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-xxxx-archive.gpg --list-public-keys `
-gpg --homedir /tmp --no-default-keyring --keyring /etc/apt/trusted.gpg --recv-keys --keyserver keyserver.ubuntu.com F6ECB3762474EDA9D21B7022871920D1991BC93C
-
-# TODO: Remove this once debootstrap can natively build resolute images:
-ln -sfn /usr/share/debootstrap/scripts/gutsy /usr/share/debootstrap/scripts/resolute
-
-build () {
- BUILD_ARCH="$1"
-
- mkdir -p "$BASE_DIR/tmp/$BUILD_ARCH"
- cd "$BASE_DIR/tmp/$BUILD_ARCH" || exit
-
- # remove old configs and copy over new
- rm -rf config auto
- cp -r "$BASE_DIR"/etc/* .
- # Make sure conffile specified as arg has correct name
- cp -f "$BASE_DIR"/"$CONFIG_FILE" terraform.conf
-
- echo -e "
-#------------------#
-# LIVE-BUILD CLEAN #
-#------------------#
-"
- lb clean
-
- echo -e "
-#-------------------#
-# LIVE-BUILD CONFIG #
-#-------------------#
-"
- lb config
-
- echo -e "
-#------------------#
-# LIVE-BUILD BUILD #
-#------------------#
-"
- lb build
-
- echo -e "
-#---------------------------#
-# MOVE OUTPUT TO BUILDS DIR #
-#---------------------------#
-"
-
- YYYYMMDD="$(date +%Y%m%d)"
- OUTPUT_DIR="$BASE_DIR/builds/$BUILD_ARCH"
- mkdir -p "$OUTPUT_DIR"
- FNAME="elementaryos-$VERSION-$CHANNEL-$BUILD_ARCH.$YYYYMMDD$OUTPUT_SUFFIX"
- mv "$BASE_DIR/tmp/$BUILD_ARCH/live-image-$BUILD_ARCH.hybrid.iso" "$OUTPUT_DIR/${FNAME}.iso"
-
- # cd into output to so {FNAME}.sha256.txt only
- # includes the filename and not the path to
- # our file.
- cd $OUTPUT_DIR
- md5sum "${FNAME}.iso" | tee "${FNAME}.md5.txt"
- sha256sum "${FNAME}.iso" | tee "${FNAME}.sha256.txt"
- cd $BASE_DIR
-}
-
-# remove old builds before creating new ones
-rm -rf "$BASE_DIR"/builds
-
-build "$ARCH"
diff --git a/etc/auto/config b/etc/auto/config
deleted file mode 100755
index 94ff1b5df..000000000
--- a/etc/auto/config
+++ /dev/null
@@ -1,75 +0,0 @@
-#!/bin/sh
-
-set -e
-
-. ./terraform.conf
-
-if [ "$HWE_KERNEL" = "yes" ]; then
- KERNEL_FLAVORS="generic-hwe-${BASEVERSION}"
-else
- KERNEL_FLAVORS="generic"
-fi
-
-if [ "$HWE_X11" = "yes" ]; then
- XORG_HWE="xserver-xorg-hwe-${BASEVERSION}"
-fi
-
-case "$ARCH" in
- amd64|i386)
- MIRROR_BINARY_URL="http://archive.ubuntu.com/ubuntu/"
- MIRROR_BINARY_SECURITY_URL="http://security.ubuntu.com/ubuntu/"
- ;;
- arm64)
- MIRROR_BINARY_URL="http://ports.ubuntu.com/ubuntu-ports/"
- MIRROR_BINARY_SECURITY_URL="http://ports.ubuntu.com/ubuntu-ports/"
- ;;
-esac
-
-lb config noauto \
- --architectures "$ARCH" \
- --mode debian \
- --initramfs none \
- --distribution "$BASECODENAME" \
- --parent-distribution "$BASECODENAME" \
- --archive-areas "main restricted universe multiverse" \
- --parent-archive-areas "main restricted universe multiverse" \
- --linux-packages linux-image \
- --linux-flavours "$KERNEL_FLAVORS" \
- --bootappend-live "boot=casper maybe-ubiquity quiet splash" \
- --debootstrap-options="--extractor=ar --keyring=/etc/apt/trusted.gpg" \
- --checksums md5 \
- --mirror-bootstrap "$MIRROR_URL" \
- --parent-mirror-bootstrap "$MIRROR_URL" \
- --mirror-chroot-security "$MIRROR_BINARY_SECURITY_URL" \
- --parent-mirror-chroot-security "$MIRROR_BINARY_SECURITY_URL" \
- --mirror-binary-security "$MIRROR_BINARY_SECURITY_URL" \
- --parent-mirror-binary-security "$MIRROR_BINARY_SECURITY_URL" \
- --mirror-binary "$MIRROR_BINARY_URL" \
- --parent-mirror-binary "$MIRROR_BINARY_URL" \
- --keyring-packages ubuntu-keyring \
- --apt-options "--yes --option Acquire::Retries=2 --option Acquire::http::Timeout=45" \
- --cache-packages false \
- --uefi-secure-boot enable \
- --binary-images iso-hybrid \
- --iso-application "$NAME" \
- --iso-volume "$NAME" \
- --firmware-binary false \
- --firmware-chroot false \
- --zsync false \
- --security true \
- "${@}"
-
-# replace channel and suite
-sed -i "s/@CHANNEL/$CHANNEL/" config/archives/*.list*
-sed -i "s/@BASECODENAME/$BASECODENAME/" config/archives/*.list*
-
-DATE=$(date +%Y%m%d)
-sed -i "s/@CHANNEL/$CHANNEL/" config/includes.binary/.disk/info
-sed -i "s/@CODENAME/$CODENAME/" config/includes.binary/.disk/info
-sed -i "s/@ARCH/$ARCH/" config/includes.binary/.disk/info
-sed -i "s/@DISTRO_NAME/$NAME/" config/includes.binary/.disk/info
-sed -i "s/@VERSION/$VERSION/" config/includes.binary/.disk/info
-sed -i "s/@DATE/$DATE/" config/includes.binary/.disk/info
-
-sed -i "s/@XORG_HWE/$XORG_HWE/" config/package-lists/desktop.list.chroot_install
-sed -i "s/@KERNEL_HEADERS/linux-headers-$KERNEL_FLAVORS/" config/package-lists/desktop.list.chroot_install
diff --git a/etc/config/archives/elementary.key b/etc/config/archives/elementary.key
deleted file mode 100644
index 56323a415..000000000
--- a/etc/config/archives/elementary.key
+++ /dev/null
@@ -1,31 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: Hockeypuck 2.2
-
-xsFNBGY0W70BEACjPRVK1K0yzj/TPI4AOEfjUFO7w4VHDBXV6tYo/jqjlqXNsnlh
-m2Ou+V6RvJUHvX7OBZIzXWaDnlYeLAho34nF82NV8SoZt6n8YvhKGg3sCqpfDxG2
-ZlsW/N3r1BH/o7bUiLrHmcT0e13qoH2qh0aZrkH6PdNSdxtoe74RNDJM3r5UKWY7
-sailTDftcLhM7pVgK4yno80JVIgWmaW6qg+/UpkF24gHuN9XDXsD4u8ppwRuZA1e
-FPWtlZhh6mkZwoKW+G3geVt5pyztm9wD25eGq5NfqbSkyCWtQuZtF2oG2KQV/qTI
-2Ga8J7lHXraaS+UGmh++AOSj4o0OkeutwFsBRAfJhWusY9etCGnY5+S4CB9ElJqd
-m9pSHrjQtjEtGRP0iDXGVR1m+15fkBcU70cp3IIkxKhcojOJmMhpc5e3H184dB8k
-0GarxMdMPCmABqNfTZa/RTBPvVQoC30TRlTsYDlBzsAtKxZ+HLrJ+KRuKjoisBTD
-zDeGRtLf+Q3gHF8LE8FmkKrDouR8QBL1U6BSev49XZnsB8m1IYH8fLY9ItuyPsjU
-myn4OBongmV3aSDkRNLjit5DOaCuSH7R6AtEGn4PHCBOq15tvGP/Jr73+QPii9RF
-8dH3xiIkSloB1dFOBJ9+kQokO1LoQOsKkYpF+98vmqJ9jsJy/hBqlmifsQARAQAB
-zSRMYXVuY2hwYWQgUFBBIGZvciBlbGVtZW50YXJ5IE9TIHRlYW3CwY4EEwEKADgW
-IQQ2SDfPkeBwkQIxwv6CGbOgrvPUmAUCZjRbvQIbAwULCQgHAgYVCgkICwIEFgID
-AQIeAQIXgAAKCRCCGbOgrvPUmFPmD/9R76nz346nc3jiEBuQDalV562Y7V16jITQ
-T0cQa1J0F1OivPkKKuiNYpstuAK88xoCSV7U50edVtWWMCqMQXAYzpwsIiNWaRV6
-9Z/c7xQnV0MIPVUaoKK6tFNANtRGApjjzkl+F5jQkgTzWOrJzfInj7n/QrkCIGfI
-GR6QXjeM/PcwmMCC7z5OiBi0YPG0SrNQcdDvCZffpppYMYndXZA4huc27ELjVNKS
-SbdWxczMRi/SpPqBount03DfbHAR7oNpXQwIvgUZ8BMKNJ3kVWLMS/qhbpMVLzPy
-E3c62kMkeX5i6BTAfxfdZOZgqSs+pELg4uBeuDdGO1ivlbCgnTnaqeKMcuX9b2s3
-qHjToNiub9JsjpP/q6EpfBVkF5ftdGLZ864EYup4df/BEGjxbYnenifaOFTLpb+K
-ncB3ZNAbkK80+7HrYbd61e2dZWWt6N0IrUllF/GoJPC8trUNoSDtZo8wVOQ7OHG7
-BmPmjwsj6Mf8I6wEjnKK/Lp1l+EVtnOIILypbHwiyaIsBbZJVSS/DaqQQoZyyp+u
-mb4mULGwDdMA7O+785Ktc3V2+tijgSSa7H21UOcoj0gDUe6IffmNs0C6P6e5LhHg
-xqbXPFit+vPyW19q9e+eILGLqKb2biCmApJyDKMKRPjAdL+c7c3C2CJeimp0eZuq
-QQ2R1C+7Og==
-=ivCt
------END PGP PUBLIC KEY BLOCK-----
-
diff --git a/etc/config/archives/elementary.list b/etc/config/archives/elementary.list
deleted file mode 100644
index fc715b7da..000000000
--- a/etc/config/archives/elementary.list
+++ /dev/null
@@ -1,3 +0,0 @@
-deb https://ppa.launchpadcontent.net/elementary-os/@CHANNEL/ubuntu @BASECODENAME main
-deb-src https://ppa.launchpadcontent.net/elementary-os/@CHANNEL/ubuntu @BASECODENAME main
-
diff --git a/etc/config/archives/patches.key b/etc/config/archives/patches.key
deleted file mode 100644
index 56323a415..000000000
--- a/etc/config/archives/patches.key
+++ /dev/null
@@ -1,31 +0,0 @@
------BEGIN PGP PUBLIC KEY BLOCK-----
-Version: Hockeypuck 2.2
-
-xsFNBGY0W70BEACjPRVK1K0yzj/TPI4AOEfjUFO7w4VHDBXV6tYo/jqjlqXNsnlh
-m2Ou+V6RvJUHvX7OBZIzXWaDnlYeLAho34nF82NV8SoZt6n8YvhKGg3sCqpfDxG2
-ZlsW/N3r1BH/o7bUiLrHmcT0e13qoH2qh0aZrkH6PdNSdxtoe74RNDJM3r5UKWY7
-sailTDftcLhM7pVgK4yno80JVIgWmaW6qg+/UpkF24gHuN9XDXsD4u8ppwRuZA1e
-FPWtlZhh6mkZwoKW+G3geVt5pyztm9wD25eGq5NfqbSkyCWtQuZtF2oG2KQV/qTI
-2Ga8J7lHXraaS+UGmh++AOSj4o0OkeutwFsBRAfJhWusY9etCGnY5+S4CB9ElJqd
-m9pSHrjQtjEtGRP0iDXGVR1m+15fkBcU70cp3IIkxKhcojOJmMhpc5e3H184dB8k
-0GarxMdMPCmABqNfTZa/RTBPvVQoC30TRlTsYDlBzsAtKxZ+HLrJ+KRuKjoisBTD
-zDeGRtLf+Q3gHF8LE8FmkKrDouR8QBL1U6BSev49XZnsB8m1IYH8fLY9ItuyPsjU
-myn4OBongmV3aSDkRNLjit5DOaCuSH7R6AtEGn4PHCBOq15tvGP/Jr73+QPii9RF
-8dH3xiIkSloB1dFOBJ9+kQokO1LoQOsKkYpF+98vmqJ9jsJy/hBqlmifsQARAQAB
-zSRMYXVuY2hwYWQgUFBBIGZvciBlbGVtZW50YXJ5IE9TIHRlYW3CwY4EEwEKADgW
-IQQ2SDfPkeBwkQIxwv6CGbOgrvPUmAUCZjRbvQIbAwULCQgHAgYVCgkICwIEFgID
-AQIeAQIXgAAKCRCCGbOgrvPUmFPmD/9R76nz346nc3jiEBuQDalV562Y7V16jITQ
-T0cQa1J0F1OivPkKKuiNYpstuAK88xoCSV7U50edVtWWMCqMQXAYzpwsIiNWaRV6
-9Z/c7xQnV0MIPVUaoKK6tFNANtRGApjjzkl+F5jQkgTzWOrJzfInj7n/QrkCIGfI
-GR6QXjeM/PcwmMCC7z5OiBi0YPG0SrNQcdDvCZffpppYMYndXZA4huc27ELjVNKS
-SbdWxczMRi/SpPqBount03DfbHAR7oNpXQwIvgUZ8BMKNJ3kVWLMS/qhbpMVLzPy
-E3c62kMkeX5i6BTAfxfdZOZgqSs+pELg4uBeuDdGO1ivlbCgnTnaqeKMcuX9b2s3
-qHjToNiub9JsjpP/q6EpfBVkF5ftdGLZ864EYup4df/BEGjxbYnenifaOFTLpb+K
-ncB3ZNAbkK80+7HrYbd61e2dZWWt6N0IrUllF/GoJPC8trUNoSDtZo8wVOQ7OHG7
-BmPmjwsj6Mf8I6wEjnKK/Lp1l+EVtnOIILypbHwiyaIsBbZJVSS/DaqQQoZyyp+u
-mb4mULGwDdMA7O+785Ktc3V2+tijgSSa7H21UOcoj0gDUe6IffmNs0C6P6e5LhHg
-xqbXPFit+vPyW19q9e+eILGLqKb2biCmApJyDKMKRPjAdL+c7c3C2CJeimp0eZuq
-QQ2R1C+7Og==
-=ivCt
------END PGP PUBLIC KEY BLOCK-----
-
diff --git a/etc/config/archives/patches.list b/etc/config/archives/patches.list
deleted file mode 100644
index 440f4c1fc..000000000
--- a/etc/config/archives/patches.list
+++ /dev/null
@@ -1,3 +0,0 @@
-deb https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu @BASECODENAME main
-deb-src https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu @BASECODENAME main
-
diff --git a/etc/config/bootloaders/grub-pc/dejavu-bold-14.pf2 b/etc/config/bootloaders/grub-pc/dejavu-bold-14.pf2
deleted file mode 100644
index 9b093b207..000000000
Binary files a/etc/config/bootloaders/grub-pc/dejavu-bold-14.pf2 and /dev/null differ
diff --git a/etc/config/bootloaders/grub-pc/dejavu-bold-16.pf2 b/etc/config/bootloaders/grub-pc/dejavu-bold-16.pf2
deleted file mode 100644
index 11e7f7ab7..000000000
Binary files a/etc/config/bootloaders/grub-pc/dejavu-bold-16.pf2 and /dev/null differ
diff --git a/etc/config/bootloaders/grub-pc/elementary-theme/background.png b/etc/config/bootloaders/grub-pc/elementary-theme/background.png
deleted file mode 100644
index 7e74c3df5..000000000
Binary files a/etc/config/bootloaders/grub-pc/elementary-theme/background.png and /dev/null differ
diff --git a/etc/config/bootloaders/grub-pc/elementary-theme/logo.png b/etc/config/bootloaders/grub-pc/elementary-theme/logo.png
deleted file mode 100644
index 68d5b8f52..000000000
Binary files a/etc/config/bootloaders/grub-pc/elementary-theme/logo.png and /dev/null differ
diff --git a/etc/config/bootloaders/grub-pc/elementary-theme/theme.txt b/etc/config/bootloaders/grub-pc/elementary-theme/theme.txt
deleted file mode 100644
index a8831e2de..000000000
--- a/etc/config/bootloaders/grub-pc/elementary-theme/theme.txt
+++ /dev/null
@@ -1,61 +0,0 @@
-title-text: ""
-desktop-image: "background.png"
-desktop-color: "#000000"
-title-color: "#ffffff"
-title-font: "DejaVu Sans Bold 16"
-message-font: "Unifont Regular 16"
-
-terminal-left: "0"
-terminal-top: "0"
-terminal-width: "100%"
-terminal-height: "100%"
-terminal-border: "0"
-
-# Logo image
-+ image {
- left = 50%-50
- top = 50%-50
- file = "logo.png"
-}
-
-#help bar at the bottom
-+ label {
- top = 100%-50
- left = 0
- width = 100%
- height = 20
- text = "@KEYMAP_SHORT@"
- align = "center"
- color = "#ffffff"
- font = "DejaVu Sans Bold 14"
-}
-
-#boot menu
-+ boot_menu {
- left = 50%-150
- width = 500
- top = 50%+100
- height = 300
-
- item_font = "DejaVu Sans Bold 14"
- item_color = "#999"
- selected_item_font = "DejaVu Sans Bold 14"
- selected_item_color= "#fff"
-
- item_height = 26
- item_padding = 0
- item_icon_space = 0
- item_spacing = 1
- scrollbar = false
-}
-
-# Show a countdown message using the label component
-+ label {
- top = 82%
- left = 35%
- width = 30%
- align = "center"
- id = "__timeout__"
- text = "Booting in %d seconds"
- color = "#f6f6f6"
-}
diff --git a/etc/config/bootloaders/grub-pc/grub.cfg b/etc/config/bootloaders/grub-pc/grub.cfg
deleted file mode 100644
index eb2d5140d..000000000
--- a/etc/config/bootloaders/grub-pc/grub.cfg
+++ /dev/null
@@ -1,39 +0,0 @@
-set default=0
-
-set gfxmode=auto
-loadfont $prefix/dejavu-bold-16.pf2
-loadfont $prefix/dejavu-bold-14.pf2
-loadfont $prefix/unicode.pf2
-insmod all_video
-insmod gfxterm
-insmod png
-
-set color_normal=light-gray/black
-set color_highlight=white/black
-
-set theme=/boot/grub/elementary-theme/theme.txt
-
-terminal_output gfxterm
-
-set timeout=10
-set timeout_style=menu
-
-menuentry "Try or install elementary OS" {
- linux /casper/vmlinuz APPEND_LIVE
- initrd /casper/initrd.lz
-}
-
-menuentry "Try or install elementary OS (Safe graphics)" {
- linux /casper/vmlinuz APPEND_LIVE nomodeset
- initrd /casper/initrd.lz
-}
-
-submenu 'Advanced options...' {
-
-# More installer entries (if any)
-LINUX_ADVANCED_INSTALL
-
-# Memtest (if any)
-MEMTEST
-
-}
diff --git a/etc/config/bootloaders/isolinux/hdt.c32 b/etc/config/bootloaders/isolinux/hdt.c32
deleted file mode 120000
index f84c641c7..000000000
--- a/etc/config/bootloaders/isolinux/hdt.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/hdt.c32
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/isolinux.bin b/etc/config/bootloaders/isolinux/isolinux.bin
deleted file mode 120000
index 33a2ad6f2..000000000
--- a/etc/config/bootloaders/isolinux/isolinux.bin
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/ISOLINUX/isolinux.bin
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/isolinux.cfg b/etc/config/bootloaders/isolinux/isolinux.cfg
deleted file mode 100644
index 0fa37834a..000000000
--- a/etc/config/bootloaders/isolinux/isolinux.cfg
+++ /dev/null
@@ -1,3 +0,0 @@
-default vesamenu.c32
-include stdmenu.cfg
-include live.cfg
diff --git a/etc/config/bootloaders/isolinux/ldlinux.c32 b/etc/config/bootloaders/isolinux/ldlinux.c32
deleted file mode 120000
index df554c7e5..000000000
--- a/etc/config/bootloaders/isolinux/ldlinux.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/ldlinux.c32
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/libcom32.c32 b/etc/config/bootloaders/isolinux/libcom32.c32
deleted file mode 120000
index 44ab36b56..000000000
--- a/etc/config/bootloaders/isolinux/libcom32.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/libcom32.c32
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/libgpl.c32 b/etc/config/bootloaders/isolinux/libgpl.c32
deleted file mode 120000
index 81c83fbdf..000000000
--- a/etc/config/bootloaders/isolinux/libgpl.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/libgpl.c32
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/libmenu.c32 b/etc/config/bootloaders/isolinux/libmenu.c32
deleted file mode 120000
index 2491ff9a1..000000000
--- a/etc/config/bootloaders/isolinux/libmenu.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/libmenu.c32
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/libutil.c32 b/etc/config/bootloaders/isolinux/libutil.c32
deleted file mode 120000
index 478194e85..000000000
--- a/etc/config/bootloaders/isolinux/libutil.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/libutil.c32
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/live.cfg.in b/etc/config/bootloaders/isolinux/live.cfg.in
deleted file mode 100644
index 8f3599b6c..000000000
--- a/etc/config/bootloaders/isolinux/live.cfg.in
+++ /dev/null
@@ -1,27 +0,0 @@
-prompt 0
-
-MENU HIDDEN
-MENU AUTOBOOT Booting elementary OS live disk in # seconds
-timeout 50
-
-label live-@FLAVOUR@
- menu label ^Try or install elementary OS
- menu default
- linux /casper/vmlinuz
- initrd /casper/initrd.lz
- append @APPEND_LIVE@
-
-label live-safe-@FLAVOUR@
- menu label Try or install elementary OS (^Safe graphics)
- linux /casper/vmlinuz
- initrd /casper/initrd.lz
- append @APPEND_LIVE@ nomodeset
-
-label check
- menu label ^Check disk for defects
- linux /casper/vmlinuz
- append boot=casper integrity-check initrd=/casper/initrd.lz quiet splash --
-
-label hd
- menu label ^Boot from first hard disk
- localboot 0x80
diff --git a/etc/config/bootloaders/isolinux/menu.c32 b/etc/config/bootloaders/isolinux/menu.c32
deleted file mode 120000
index 86c360d37..000000000
--- a/etc/config/bootloaders/isolinux/menu.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/menu.c32
\ No newline at end of file
diff --git a/etc/config/bootloaders/isolinux/stdmenu.cfg b/etc/config/bootloaders/isolinux/stdmenu.cfg
deleted file mode 100644
index cb7f674b2..000000000
--- a/etc/config/bootloaders/isolinux/stdmenu.cfg
+++ /dev/null
@@ -1,42 +0,0 @@
-menu hshift 13
-menu width 49
-menu margin 8
-
-# Override the default radial gradient background with black
-menu background #ff000000
-
-# Title bar
-menu color title 0 #ffffffff #00000000 *
-
-# Border Area
-menu color border * #00000000 #00000000 none
-
-# Unselected menu item
-menu color unsel 0 #999999 #00000000 *
-
-# Unselected hotkey
-menu color hotkey 0 #999999 #00000000 none
-
-# Selection bar
-menu color sel 0 #ffffff #00000000 none
-
-# Selected hotkey
-menu color hotsel 0 #ffffffff #00000000 none
-
-# Press [Tab] message
-menu color tabmsg 0 #f6f6f6 #00000000 none
-
-# Timeout message
-menu color timeout_msg 0 #f6f6f6 #00000000 none
-
-# Timeout counter
-menu color timeout * #ffffffff #00000000 none
-
-# Command line
-menu color cmdline 0 #ffffffff #00000000 none
-
-# Command line marker
-menu color cmdmark 0 #00000000 #00000000 none
-
-# Helptest
-menu color help 0 #ffffffff #00000000 none
diff --git a/etc/config/bootloaders/isolinux/vesamenu.c32 b/etc/config/bootloaders/isolinux/vesamenu.c32
deleted file mode 120000
index 84e2eff1e..000000000
--- a/etc/config/bootloaders/isolinux/vesamenu.c32
+++ /dev/null
@@ -1 +0,0 @@
-/usr/lib/syslinux/modules/bios/vesamenu.c32
\ No newline at end of file
diff --git a/etc/config/hooks/live/000-remove-blacklisted-packages.chroot b/etc/config/hooks/live/000-remove-blacklisted-packages.chroot
deleted file mode 100755
index 13ae4b4df..000000000
--- a/etc/config/hooks/live/000-remove-blacklisted-packages.chroot
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/sh
-# Description: Checkout seed branches and remove blacklisted packages
-
-echo "P: Begin executing remove-blacklisted-packages chroot hook..."
-
-export LSB_OS_RELEASE="/usr/lib/upstream-os-release"
-dist="$(lsb_release -c -s)"
-unset LSB_OS_RELEASE
-
-apt-get install --no-install-recommends -f -q -y git
-
-git clone --depth 1 https://github.com/elementary/seeds.git --single-branch --branch "$dist"
-git clone --depth 1 https://github.com/elementary/platform.git --single-branch --branch "$dist"
-
-for package in $(cat 'platform/blacklist' 'seeds/blacklist' | grep -v '#'); do
- apt-get autoremove --purge -f -q -y "$package"
-done
-
-apt-get autoremove --purge -f -q -y git
-
-rm -R ../seeds ../platform
diff --git a/etc/config/hooks/live/999-cleanup-apt-cache.chroot b/etc/config/hooks/live/999-cleanup-apt-cache.chroot
deleted file mode 100755
index e0a81eceb..000000000
--- a/etc/config/hooks/live/999-cleanup-apt-cache.chroot
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/bin/sh
-# Description: Cleanup apt cache files that add ~100MB to the .iso and aren't needed
-
-rm -f /var/lib/apt/lists/*_Packages
-rm -f /var/lib/apt/lists/*_Sources
-rm -f /var/lib/apt/lists/*_Translation-*
-
diff --git a/etc/config/hooks/live/apparmor-profiles.chroot b/etc/config/hooks/live/apparmor-profiles.chroot
deleted file mode 100755
index 2067aa379..000000000
--- a/etc/config/hooks/live/apparmor-profiles.chroot
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/sh
-# Description: enable experimental AppArmor profile for bubblewrap so Flatpak apps can open in Demo Mode
-
-# The apparmor systemd service (that parses profiles and loads them into the kernel) is patched to be disabled
-# when running on "live" systems due to historical bugs with it breaking applications. Apparmor is still
-# enabled, but no profiles are loaded as a result.
-#
-# There are discussions dating back a few years questioning whether this is still necessary:
-# https://www.mail-archive.com/debian-bugs-dist@lists.debian.org/msg1821688.html
-#
-# Since it breaks our Flatpak apps, remove the config that disables it.
-mkdir -p /usr/lib/systemd/system/apparmor.service.d
-cat << EOF > /usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf
-[Unit]
-ConditionPathExists=
-EOF
diff --git a/etc/config/hooks/live/revert-os-release-divert.chroot b/etc/config/hooks/live/revert-os-release-divert.chroot
deleted file mode 100644
index 0389cf73b..000000000
--- a/etc/config/hooks/live/revert-os-release-divert.chroot
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-# Description: Revert dpkg-divert of /etc/os-release done by live-build
-# https://salsa.debian.org/live-team/live-build/-/blob/debian/1%2520250505/scripts/build/bootstrap_debootstrap?ref_type=tags#L125-142
-
-echo "P: Begin executing revert-os-release-divert chroot hook..."
-
-OS_RELEASE=/etc/os-release
-OS_RELEASE_DIVERTED="${OS_RELEASE}.debootstrap"
-
-dpkg-divert --list "$OS_RELEASE" | grep -q "$OS_RELEASE"
-if [ $? -eq 0 ]; then
- mv "$OS_RELEASE_DIVERTED" "$OS_RELEASE"
- dpkg-divert --quiet --local --remove --no-rename --divert "$OS_RELEASE_DIVERTED" "$OS_RELEASE"
-fi
diff --git a/etc/config/hooks/live/set-disk-info.binary b/etc/config/hooks/live/set-disk-info.binary
deleted file mode 100755
index fc6eb5413..000000000
--- a/etc/config/hooks/live/set-disk-info.binary
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/sh
-
-echo "P: Begin executing set-disk-info binary hook in ${PWD}"
-
-cp -rf ../config/includes.binary/.disk .
diff --git a/etc/config/hooks/live/setup-casper-folder.binary b/etc/config/hooks/live/setup-casper-folder.binary
deleted file mode 100755
index d3f63e9ba..000000000
--- a/etc/config/hooks/live/setup-casper-folder.binary
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-mkdir casper || true
-mv boot/filesystem.squashfs casper/filesystem.squashfs
-mv boot/filesystem.size casper/filesystem.size
-mv boot/initrd.img-* casper/initrd.lz
-mv boot/vmlinuz-* casper/vmlinuz
-mv boot/filesystem.packages-remove casper/filesystem.manifest-remove
-mv boot/filesystem.packages casper/filesystem.manifest
-
-mkdir live || true
-cp casper/vmlinuz live/vmlinuz
diff --git a/etc/config/includes.binary/.disk/base_installable b/etc/config/includes.binary/.disk/base_installable
deleted file mode 100644
index e69de29bb..000000000
diff --git a/etc/config/includes.binary/.disk/cd_type b/etc/config/includes.binary/.disk/cd_type
deleted file mode 100644
index daab660cd..000000000
--- a/etc/config/includes.binary/.disk/cd_type
+++ /dev/null
@@ -1 +0,0 @@
-full_cd/single
diff --git a/etc/config/includes.binary/.disk/info b/etc/config/includes.binary/.disk/info
deleted file mode 100644
index 277b60dc8..000000000
--- a/etc/config/includes.binary/.disk/info
+++ /dev/null
@@ -1 +0,0 @@
-@DISTRO_NAME @VERSION "@CODENAME" - @CHANNEL @ARCH (@DATE)
diff --git a/etc/config/includes.chroot/etc/apt/apt.conf.d/00trustcdrom b/etc/config/includes.chroot/etc/apt/apt.conf.d/00trustcdrom
deleted file mode 100644
index c7588cb4a..000000000
--- a/etc/config/includes.chroot/etc/apt/apt.conf.d/00trustcdrom
+++ /dev/null
@@ -1 +0,0 @@
-APT::Authentication::TrustCDROM "true";
diff --git a/etc/config/package-lists/desktop.list.chroot_install b/etc/config/package-lists/desktop.list.chroot_install
deleted file mode 100644
index 21b75d5f4..000000000
--- a/etc/config/package-lists/desktop.list.chroot_install
+++ /dev/null
@@ -1,7 +0,0 @@
-# elementary meta packages
-elementary-desktop
-elementary-minimal
-elementary-standard
-
-@XORG_HWE
-@KERNEL_HEADERS
diff --git a/etc/config/package-lists/desktop.list.chroot_live b/etc/config/package-lists/desktop.list.chroot_live
deleted file mode 100644
index eccbc11ab..000000000
--- a/etc/config/package-lists/desktop.list.chroot_live
+++ /dev/null
@@ -1 +0,0 @@
-elementary-live
diff --git a/etc/config/package-lists/pool.list.binary b/etc/config/package-lists/pool.list.binary
deleted file mode 100644
index 209b69a73..000000000
--- a/etc/config/package-lists/pool.list.binary
+++ /dev/null
@@ -1,26 +0,0 @@
-b43-fwcutter
-dkms
-open-vm-tools-desktop
-setserial
-user-setup
-
-efibootmgr
-secureboot-db
-shim
-shim-signed
-
-#if ARCHITECTURES amd64
-broadcom-sta-dkms
-intel-microcode
-iucode-tool
-
-grub-efi-amd64
-grub-efi-amd64-bin
-grub-efi-amd64-signed
-#endif
-
-#if ARCHITECTURES arm64
-grub-efi-arm64
-grub-efi-arm64-bin
-grub-efi-arm64-signed
-#endif
diff --git a/etc/terraform-amd64.conf b/etc/terraform-amd64.conf
deleted file mode 100644
index 7d046b1e8..000000000
--- a/etc/terraform-amd64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="amd64"
-
-# base codename
-BASECODENAME="noble"
-
-# base version
-BASEVERSION="24.04"
-
-# distribution codename
-CODENAME="circe"
-
-# distribution version
-VERSION="8.0"
-
-# distribution channel
-CHANNEL="stable"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://archive.ubuntu.com/ubuntu/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-arm64.conf b/etc/terraform-arm64.conf
deleted file mode 100644
index 13540da16..000000000
--- a/etc/terraform-arm64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="arm64"
-
-# base codename
-BASECODENAME="noble"
-
-# base version
-BASEVERSION="24.04"
-
-# distribution codename
-CODENAME="circe"
-
-# distribution version
-VERSION="8.0"
-
-# distribution channel
-CHANNEL="stable"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://ports.ubuntu.com/ubuntu-ports/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-daily-7.1-azure.conf b/etc/terraform-daily-7.1-azure.conf
deleted file mode 100644
index 2afdb4a8b..000000000
--- a/etc/terraform-daily-7.1-azure.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture - i386, amd64 or all
-ARCH="amd64"
-
-# base codename
-BASECODENAME="jammy"
-
-# base version
-BASEVERSION="22.04"
-
-# distribution codename
-CODENAME="horus"
-
-# distribution version
-VERSION="7.1"
-
-# distribution channel
-CHANNEL="daily"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="no"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-daily-8.1-azure-amd64.conf b/etc/terraform-daily-8.1-azure-amd64.conf
deleted file mode 100644
index 7a2d3be29..000000000
--- a/etc/terraform-daily-8.1-azure-amd64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="amd64"
-
-# base codename
-BASECODENAME="noble"
-
-# base version
-BASEVERSION="24.04"
-
-# distribution codename
-CODENAME="circe"
-
-# distribution version
-VERSION="8.1"
-
-# distribution channel
-CHANNEL="daily"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-daily-8.1-azure-arm64.conf b/etc/terraform-daily-8.1-azure-arm64.conf
deleted file mode 100644
index a33d7926b..000000000
--- a/etc/terraform-daily-8.1-azure-arm64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="arm64"
-
-# base codename
-BASECODENAME="noble"
-
-# base version
-BASEVERSION="24.04"
-
-# distribution codename
-CODENAME="circe"
-
-# distribution version
-VERSION="8.1"
-
-# distribution channel
-CHANNEL="daily"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://azure.ports.ubuntu.com/ubuntu-ports/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-daily-9.0-azure-amd64.conf b/etc/terraform-daily-9.0-azure-amd64.conf
deleted file mode 100644
index 79fd43a87..000000000
--- a/etc/terraform-daily-9.0-azure-amd64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="amd64"
-
-# base codename
-BASECODENAME="resolute"
-
-# base version
-BASEVERSION="26.04"
-
-# distribution codename
-CODENAME="tanit"
-
-# distribution version
-VERSION="9.0"
-
-# distribution channel
-CHANNEL="daily"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-daily-9.0-azure-arm64.conf b/etc/terraform-daily-9.0-azure-arm64.conf
deleted file mode 100644
index 22396c465..000000000
--- a/etc/terraform-daily-9.0-azure-arm64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="arm64"
-
-# base codename
-BASECODENAME="resolute"
-
-# base version
-BASEVERSION="26.04"
-
-# distribution codename
-CODENAME="tanit"
-
-# distribution version
-VERSION="9.0"
-
-# distribution channel
-CHANNEL="daily"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://azure.ports.ubuntu.com/ubuntu-ports/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-stable-8.1-azure-amd64.conf b/etc/terraform-stable-8.1-azure-amd64.conf
deleted file mode 100644
index 2f331d868..000000000
--- a/etc/terraform-stable-8.1-azure-amd64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="amd64"
-
-# base codename
-BASECODENAME="noble"
-
-# base version
-BASEVERSION="24.04"
-
-# distribution codename
-CODENAME="circe"
-
-# distribution version
-VERSION="8.1"
-
-# distribution channel
-CHANNEL="stable"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://azure.archive.ubuntu.com/ubuntu/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/etc/terraform-stable-8.1-azure-arm64.conf b/etc/terraform-stable-8.1-azure-arm64.conf
deleted file mode 100644
index 59f9438a6..000000000
--- a/etc/terraform-stable-8.1-azure-arm64.conf
+++ /dev/null
@@ -1,30 +0,0 @@
-# target architecture
-ARCH="arm64"
-
-# base codename
-BASECODENAME="noble"
-
-# base version
-BASEVERSION="24.04"
-
-# distribution codename
-CODENAME="circe"
-
-# distribution version
-VERSION="8.1"
-
-# distribution channel
-CHANNEL="stable"
-
-# distribution name
-NAME="elementary OS"
-
-# mirror to fetch packages from
-MIRROR_URL="http://azure.ports.ubuntu.com/ubuntu-ports/"
-
-# use HWE kernel and packages?
-HWE_KERNEL="yes"
-HWE_X11="no"
-
-# suffix for generated .iso files
-OUTPUT_SUFFIX=""
diff --git a/mkosi.bump b/mkosi.bump
new file mode 100755
index 000000000..fa52d3fbf
--- /dev/null
+++ b/mkosi.bump
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -e
+
+date -u +%Y%m%d%H%M%S
diff --git a/mkosi.conf b/mkosi.conf
new file mode 100644
index 000000000..a4c37e91a
--- /dev/null
+++ b/mkosi.conf
@@ -0,0 +1,26 @@
+[Config]
+MinimumVersion=26~devel
+Dependencies=
+ base
+ sysupdate
+ liveiso
+ ext-sdk
+ ext-virt
+
+[Distribution]
+Distribution=ubuntu
+Release=resolute
+Repositories=main,universe
+
+[Build]
+ToolsTree=default
+CacheDirectory=mkosi.cache
+ToolsTreePackages=grub-efi-amd64-bin
+Incremental=yes
+ToolsTreeDistribution=ubuntu
+ToolsTreeRelease=resolute
+
+[Output]
+ImageId=elementary
+OutputDirectory=mkosi.output/
+Format=none
diff --git a/mkosi.images/base/mkosi.conf b/mkosi.images/base/mkosi.conf
new file mode 100644
index 000000000..33b35765b
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf
@@ -0,0 +1,17 @@
+[Match]
+Distribution=ubuntu
+
+[Output]
+Format=directory
+ImageId=base
+SplitArtifacts=
+
+[Content]
+Bootable=no
+CleanPackageMetadata=no
+Packages=systemd-container
+VolatilePackages=
+ passwd
+ login
+ uidmap
+ systemd-boot
diff --git a/mkosi.images/base/mkosi.conf.d/core.conf b/mkosi.images/base/mkosi.conf.d/core.conf
new file mode 100644
index 000000000..b7a58029c
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/core.conf
@@ -0,0 +1,35 @@
+[Match]
+Distribution=ubuntu
+
+[Content]
+RemoveFiles=
+ /usr/bin/chsh
+ /usr/bin/lchsh
+VolatilePackages=
+ systemd-container
+Packages=
+ apparmor
+ apparmor-profiles
+ apparmor-utils
+ btrfs-progs
+ cryptsetup
+ distrobox
+ curl
+ git
+ linux-firmware
+ linux-image-generic
+ lvm2
+ nano
+ network-manager
+ pipewire-audio
+ plymouth
+ sudo-rs
+ systemd-boot
+ systemd-cryptsetup
+ systemd-homed
+ systemd-repart
+ systemd-resolved
+ systemd-zram-generator
+ vim
+ xz-utils
+ zstd
diff --git a/mkosi.images/base/mkosi.conf.d/elementary.conf b/mkosi.images/base/mkosi.conf.d/elementary.conf
new file mode 100644
index 000000000..65f7a2a15
--- /dev/null
+++ b/mkosi.images/base/mkosi.conf.d/elementary.conf
@@ -0,0 +1,9 @@
+[Match]
+Distribution=ubuntu
+
+[Content]
+WithRecommends=yes
+Packages=
+ elementary-desktop
+ elementary-minimal
+ elementary-standard
diff --git a/mkosi.images/base/mkosi.extra/boot/loader/loader.conf b/mkosi.images/base/mkosi.extra/boot/loader/loader.conf
new file mode 100644
index 000000000..e67411086
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/boot/loader/loader.conf
@@ -0,0 +1 @@
+timeout 6
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/base-ubuntu.conf b/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/base-ubuntu.conf
new file mode 100644
index 000000000..bc2e09618
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/base-ubuntu.conf
@@ -0,0 +1,4 @@
+export DRACUT_NO_XATTR=1
+reproducible=yes
+hostonly=no
+compress=zstd
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/lvm2.conf b/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/lvm2.conf
new file mode 100644
index 000000000..fa0c03dab
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/dracut.conf.d/lvm2.conf
@@ -0,0 +1 @@
+add_dracutmodules+=" lvm dm crypt fips "
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset
new file mode 100644
index 000000000..7de557ccb
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/01-systemd.preset
@@ -0,0 +1,6 @@
+disable systemd-timesyncd.service
+disable sshd.socket
+disable sshd.service
+enable ufw.service
+enable systemd-resolved.service
+enable plymouth.service
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset
new file mode 100644
index 000000000..62bad8ca9
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/10-elementary.preset
@@ -0,0 +1,15 @@
+enable systemd-resolved
+enable apparmor-firstboot.service
+enable NetworkManager.service
+enable NetworkManager-wait-online.service
+disable systemd-networkd
+
+enable systemd-timesyncd.service
+disable systemd-homed-firstboot.service
+disable systemd-firstboot.service
+
+enable systemd-homed.service
+
+disable avahi.*
+
+enable preset-global.service
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset
new file mode 100644
index 000000000..df1bca628
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system-preset/91-resolved-default.preset
@@ -0,0 +1 @@
+enable systemd-resolved.service
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/apparmor-firstboot.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/apparmor-firstboot.service
new file mode 100644
index 000000000..05448c615
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/apparmor-firstboot.service
@@ -0,0 +1,12 @@
+[Unit]
+Description=Restart apparmor after configs were added by tmpfiles
+ConditionFirstBoot=yes
+After=systemd-tmpfiles-setup.service
+
+[Service]
+Type=oneshot
+ExecStart=/usr/bin/systemctl reload --no-block apparmor.service
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target
\ No newline at end of file
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/preset-global.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/preset-global.service
new file mode 100644
index 000000000..53a76fbdf
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/preset-global.service
@@ -0,0 +1,17 @@
+[Unit]
+ConditionFirstBoot=no
+ConditionPathIsReadWrite=/etc
+
+DefaultDependencies=no
+
+Before=basic.target
+Conflicts=shutdown.target
+Before=shutdown.target
+
+[Service]
+Type=oneshot
+RemainAfterExit=yes
+ExecStart=systemctl preset-all --global
+
+[Install]
+WantedBy=basic.target
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service
new file mode 100644
index 000000000..1eea907e4
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-firstboot.service
@@ -0,0 +1 @@
+# Masked
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service
new file mode 100644
index 000000000..1eea907e4
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/system/systemd-networkd-wait-online.service
@@ -0,0 +1 @@
+# Masked
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/user-preset/01-user.preset b/mkosi.images/base/mkosi.extra/usr/lib/systemd/user-preset/01-user.preset
new file mode 100644
index 000000000..2daae828f
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/user-preset/01-user.preset
@@ -0,0 +1,4 @@
+enable gnome-keyring-daemon.service
+enable gnome-keyring-daemon.socket
+enable gcr-ssh-agent.service
+enable gcr-ssh-agent.socket
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf b/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf
new file mode 100644
index 000000000..c049a0905
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/systemd/zram-generator.conf
@@ -0,0 +1,3 @@
+[zram0]
+zram-size = min(ram / 2, 16384)
+compression-algorithm = zstd
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf
new file mode 100644
index 000000000..044dca4b5
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/session.conf
@@ -0,0 +1,2 @@
+u lightdm - "Light Display Manager" /var/lib/lightdm /usr/sbin/nologin
+u geoclue - "Geoclue Service" /var/lib/geoclue /usr/sbin/nologin
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf
new file mode 100644
index 000000000..4f28f9b46
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/sysusers.d/wpa.conf
@@ -0,0 +1 @@
+g netdev - -
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf
new file mode 100644
index 000000000..163b08fd9
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/99-factory.conf
@@ -0,0 +1,2 @@
+C+ /etc/containers/
+L? /etc/hostname
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf
new file mode 100644
index 000000000..c13db985e
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/aliases.conf
@@ -0,0 +1,3 @@
+# Type Path Mode UID GID Age Target
+L+ /usr/sbin/systemd-sysupdate - - - - /usr/lib/systemd/systemd-sysupdate
+L+ /usr/sbin/sysupdate - - - - /usr/lib/systemd/systemd-sysupdate
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf
new file mode 100644
index 000000000..9e7265489
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/etc.conf
@@ -0,0 +1,133 @@
+# This overrides the same file from systemd since we want to symlink everything
+# into /etc instead of copying so updates to /usr/propagate properly where possible.
+
+# Core System
+L+ /etc/mtab - - - - ../proc/self/mounts
+L /etc/os-release - - - - ../usr/lib/os-release
+C /etc/default
+C /etc/systemd
+C /etc/sysctl.d
+C /etc/tmpfiles.d
+C /etc/grub.d
+C /etc/init.d
+C /etc/initramfs-tools
+C /etc/kernel
+C /etc/modprobe.d
+C /etc/modules-load.d
+C /etc/modules
+C /etc/crypttab
+C /etc/cryptsetup-initramfs
+C /etc/lsb-release
+C /etc/debian_version
+# Configuration for ldconfig
+L /etc/ld.so.conf
+L /etc/ld.so.conf.d
+# Contains the default systemd locale
+L /etc/locale.conf
+L /etc/nsswitch.conf
+
+# ID
+C /etc/passwd
+C /etc/group
+C /etc/shadow
+C /etc/gshadow
+C /etc/subuid
+C /etc/subgid
+C /etc/adduser.conf
+C /etc/deluser.conf
+
+# Networking, Host & SSH
+C /etc/network
+C /etc/NetworkManager
+C /etc/dhcp
+C /etc/dhcpcd.conf
+C /etc/wpa_supplicant
+C /etc/ufw
+C /etc/chrony
+C /etc/avahi
+C /etc/ppp
+C /etc/openvpn
+# SSH configurations
+C /etc/ssh/ssh_config
+C /etc/ssh/ssh_config.d
+C /etc/ssh/sshd_config
+C /etc/ssh/sshd_config.d
+# Used by some services, like nftables
+L? /etc/services
+L? /etc/nftables.conf
+L? /etc/dbus1/systemd.d/org.freedesktop.ModemManager1.conf
+
+# Hardware
+C /etc/udev
+C /etc/udisks2
+C /etc/UPower
+C /etc/lvm
+C /etc/bluetooth
+C /etc/sane.d
+C /etc/brltty
+C /etc/brltty.conf
+C /etc/hdparm.conf
+C /etc/sensors.d
+C /etc/sensors3.conf
+C /etc/usb_modeswitch.conf
+C /etc/thermald
+L /etc/fwupd
+L? /etc/cups
+
+# Package Management & Updates
+C /etc/apt
+C /etc/dpkg
+C /etc/PackageKit
+C /etc/update-manager
+C /etc/update-motd.d
+L /etc/debuginfod
+
+# Security
+C /etc/apparmor
+C /etc/apparmor.d
+C /etc/sudoers.d
+C /etc/security
+C /etc/fprintd.conf
+C /etc/cracklib
+C /etc/sudoers
+L? /etc/authselect
+L? /etc/ca-certificates
+L /etc/ssl
+L? /etc/crypto-policies
+L? /etc/pki
+
+# Desktop Environment
+C /etc/X11
+C /etc/xdg
+C /etc/dconf
+C /etc/lightdm
+C /etc/pulse
+C /etc/speech-dispatcher
+C /etc/console-setup
+L /etc/fonts
+L? /etc/geoclue
+
+# Environment
+C /etc/profile
+C /etc/profile.d
+C /etc/environment.d
+C /etc/inputrc
+C /etc/wgetrc
+C /etc/screenrc
+L /etc/environment
+L /etc/shells
+L? /etc/bashrc
+L? /etc/bash.bashrc
+L? /etc/bash.bash_logout
+L? /etc/bash_completion
+L? /etc/bash_completion.d
+L? /etc/skel
+C /etc/apport
+C /etc/dbus-1
+C /etc/mime.types
+C /etc/fuse.conf
+C /etc/xml
+L /etc/man_db.conf
+L? /etc/manpath.config
+C /etc/alternatives
+L? /etc/profile.d/flatpak.sh
\ No newline at end of file
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf
new file mode 100644
index 000000000..3f803995a
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/login.conf
@@ -0,0 +1 @@
+d /var/lib/lightdm/data 0755 root root -
diff --git a/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf
new file mode 100644
index 000000000..360c949bf
--- /dev/null
+++ b/mkosi.images/base/mkosi.extra/usr/lib/tmpfiles.d/resolved-default.conf
@@ -0,0 +1 @@
+L /etc/resolv.conf - - - - ../run/systemd/resolve/stub-resolv.conf
diff --git a/mkosi.images/base/mkosi.finalize b/mkosi.images/base/mkosi.finalize
new file mode 100755
index 000000000..e679c8d0f
--- /dev/null
+++ b/mkosi.images/base/mkosi.finalize
@@ -0,0 +1,8 @@
+#!/usr/bin/env bash
+set -euo pipefail
+
+# Capture the entirety of /etc in /usr/share/factory/etc so we can use
+# systemd-tmpfiles to symlink individual directories from it to /etc.
+mkdir -p "$BUILDROOT/usr/share/factory/"
+cp --archive --no-target-directory --update=none "$BUILDROOT/etc" "$BUILDROOT/usr/share/factory/etc"
+ln -sr "$BUILDROOT/usr" "$BUILDROOT/usr/share/factory/usr"
diff --git a/mkosi.images/ext-sdk/mkosi.conf b/mkosi.images/ext-sdk/mkosi.conf
new file mode 100644
index 000000000..a2b6e5b34
--- /dev/null
+++ b/mkosi.images/ext-sdk/mkosi.conf
@@ -0,0 +1,15 @@
+[Config]
+Dependencies=base
+
+[Output]
+Format=sysext
+Overlay=yes
+ImageId=ext-sdk
+Verity=no
+CompressOutput=zstd
+
+[Content]
+Bootable=no
+BaseTrees=%O/base_%v
+Packages=
+ elementary-sdk
diff --git a/mkosi.images/ext-virt/mkosi.conf b/mkosi.images/ext-virt/mkosi.conf
new file mode 100644
index 000000000..7fbac6dbf
--- /dev/null
+++ b/mkosi.images/ext-virt/mkosi.conf
@@ -0,0 +1,21 @@
+[Config]
+Dependencies=base
+
+[Output]
+Format=sysext
+Overlay=yes
+ImageId=ext-virt
+Verity=no
+CompressOutput=zstd
+
+[Content]
+Bootable=no
+BaseTrees=%O/base_%v
+Packages=
+ qemu-system-x86
+ qemu-system-arm
+ libvirt-daemon-system
+ libvirt-clients
+ virt-manager
+ bridge-utils
+ virtinst
diff --git a/mkosi.images/ext-virt/mkosi.postinst.chroot b/mkosi.images/ext-virt/mkosi.postinst.chroot
new file mode 100755
index 000000000..b80be8d33
--- /dev/null
+++ b/mkosi.images/ext-virt/mkosi.postinst.chroot
@@ -0,0 +1,4 @@
+#!/bin/bash
+set -xeuo pipefail
+
+glib-compile-schemas /usr/share/glib-2.0/schemas/
diff --git a/mkosi.images/liveiso/mkosi.conf b/mkosi.images/liveiso/mkosi.conf
new file mode 100644
index 000000000..bfae87e40
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.conf
@@ -0,0 +1,48 @@
+[Config]
+Dependencies=base
+
+[Output]
+Format=directory
+SplitArtifacts=
+ImageId=liveiso
+
+[Content]
+BaseTrees=%O/base_%v
+CleanPackageMetadata=no
+Bootable=yes
+WithRecommends=yes
+RemovePackages=
+ systemd-boot
+Packages=
+ elementary-live
+ io.elementary.installer-session
+ grub-efi-amd64
+ grub-efi-amd64-signed
+ mokutil
+ shim-signed
+ e2fsprogs
+ dosfstools
+ grub-pc-bin
+ casper
+ initramfs-tools
+Bootloader=grub
+KernelInitrdModules=
+ default
+ ahci
+ nvme
+ xhci_pci
+ usb_storage
+ uas
+ sd_mod
+ sr_mod
+ isofs
+ loop
+ ext4
+KernelCommandLine=
+ rw
+ console=ttyS0
+ boot=casper
+
+[Validation]
+SecureBoot=no
+SignExpectedPcr=no
diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info b/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info
new file mode 100644
index 000000000..abbe1f6a6
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/iso_root/.disk/info
@@ -0,0 +1 @@
+elementary Live amd64
diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg b/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg
new file mode 100644
index 000000000..8cc01aa26
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/iso_root/boot/grub/grub.cfg
@@ -0,0 +1,7 @@
+set timeout=10
+set default=0
+
+menuentry "PLACEHOLDER_VERSION (Live)" {
+ linux /casper/vmlinuz boot=casper quiet splash ---
+ initrd /casper/initrd
+}
diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove b/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove
new file mode 100644
index 000000000..b63507528
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/iso_root/casper/filesystem.manifest-remove
@@ -0,0 +1,3 @@
+casper
+elementary-live
+io.elementary.installer-session
diff --git a/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release b/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release
new file mode 100644
index 000000000..11d35e3cf
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/iso_root/dists/stable/Release
@@ -0,0 +1,7 @@
+Origin: elementary-cdrom
+Label: elementary-cdrom
+Suite: stable
+Codename: stable
+Architectures: amd64
+Components: main
+Description: Empty disc index for apt-cdrom compatibility
diff --git a/mkosi.images/liveiso/mkosi.extra/opt/repart-target/home/50-home.conf b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/home/50-home.conf
new file mode 100644
index 000000000..2c59dc98d
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/home/50-home.conf
@@ -0,0 +1,7 @@
+[Partition]
+Type=home
+Format=btrfs
+SizeMinBytes=512M
+Weight=45000
+FactoryReset=yes
+Label=elementary-home
diff --git a/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf
new file mode 100644
index 000000000..eaf0be7ec
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/opt/repart-target/root/40-root.conf
@@ -0,0 +1,11 @@
+[Partition]
+Type=root
+Format=btrfs
+SizeMinBytes=9G
+SizeMaxBytes=20G
+Weight=18000
+Subvolumes=/var /opt
+MakeDirectories=/var/log/journal
+Encrypt=off
+FactoryReset=yes
+Label=elementary-root
diff --git a/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf b/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf
new file mode 100644
index 000000000..f8d5faf89
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/usr/lib/systemd/system/apparmor.service.d/99_enable_in_live_mode.conf
@@ -0,0 +1,2 @@
+[Unit]
+ConditionPathExists=
diff --git a/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install b/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install
new file mode 100755
index 000000000..1766b3795
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.extra/usr/sbin/elementary-install
@@ -0,0 +1,86 @@
+#!/bin/bash
+set -eo pipefail
+
+echo "Thank you for testing! <3"
+
+medium=$(findmnt -rn -t iso9660,udf -o TARGET | head -1)
+extra="$medium/extra"
+raw_zstd=$(find "$extra" -maxdepth 1 -type f -name '*.raw.zst' | head -n1)
+repart_src="/opt/repart-target/"
+
+if [ -z "$raw_zstd" ]; then
+ echo "Installation aborted: No .raw.zst file found."
+ exit 1
+fi
+
+echo "Using source image: $raw_zstd"
+
+PS3="Select installation disk (ALL DATA WILL BE LOST): "
+
+select selected_disk in $(lsblk -d -n -p -o NAME -e 7,11); do
+ if [[ -n "$selected_disk" ]]; then
+ break
+ fi
+ echo "Invalid selection, try again."
+done
+
+if [ -z "$selected_disk" ]; then
+ echo "Installation aborted: No disk selected."
+ exit 1
+fi
+
+dest_dev=$(echo "$selected_disk" | awk '{print $1}')
+
+echo "$dest_dev selected for repartitioning..."
+echo "Destroying drive in 3s ..."
+sleep 1
+echo "Destroying drive in 2s ..."
+sleep 1
+echo "Destroying drive in 1s ..."
+sleep 1
+
+/usr/sbin/wipefs -a "$dest_dev"
+
+echo "Creating root partition..."
+systemd-repart \
+ --definitions="$repart_src/root" \
+ --dry-run=no \
+ --empty=force \
+ "$dest_dev"
+
+partprobe "$dest_dev"
+udevadm settle
+
+root_part=$(lsblk -n -o PATH -l "$dest_dev" | grep -v "^${dest_dev}$" | head -n1)
+
+if [ -z "$root_part" ]; then
+ echo "Error: No root-scratch parition, aborting."
+ exit 1
+fi
+
+root_mount=/mnt/future-root
+mkdir -p "$root_mount"
+
+echo "Mounting $root_part to $root_mount as a scratch buffer..."
+if ! mount "$root_part" "$root_mount"; then
+ echo "Could not mount, aborting."
+ exit 1
+fi
+
+raw_src="$root_mount/source.raw"
+echo "Decompressing image into the scratch buffer..."
+zstd -dc -T0 "$raw_zstd" > "$raw_src"
+
+echo "Configuring partitions..."
+systemd-repart \
+ --copy-from="$raw_src" \
+ --definitions="$repart_src/home" \
+ --dry-run=no \
+ "$dest_dev"
+
+echo "Cleaning up scratch buffer..."
+rm "$raw_src"
+umount "$root_mount"
+rmdir "$root_mount"
+
+echo "Everything is done! Enjoy your stay."
diff --git a/mkosi.images/liveiso/mkosi.repart/00-esp.conf b/mkosi.images/liveiso/mkosi.repart/00-esp.conf
new file mode 100644
index 000000000..3ac509c71
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.repart/00-esp.conf
@@ -0,0 +1,7 @@
+[Partition]
+Type=esp
+Format=vfat
+CopyFiles=/efi:/
+CopyFiles=/boot:/
+SizeMinBytes=1.5G
+SizeMaxBytes=1.5G
diff --git a/mkosi.images/liveiso/mkosi.repart/40-root.conf b/mkosi.images/liveiso/mkosi.repart/40-root.conf
new file mode 100644
index 000000000..54c898e30
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.repart/40-root.conf
@@ -0,0 +1,10 @@
+[Partition]
+Type=root
+Format=ext4
+SizeMinBytes=2G
+SizeMaxBytes=3G
+Weight=18000
+MakeDirectories=/var/log/journal
+Encrypt=off
+FactoryReset=yes
+Label=elementary-root
diff --git a/mkosi.images/liveiso/mkosi.repart/50-home.conf b/mkosi.images/liveiso/mkosi.repart/50-home.conf
new file mode 100644
index 000000000..d0bb235b8
--- /dev/null
+++ b/mkosi.images/liveiso/mkosi.repart/50-home.conf
@@ -0,0 +1,8 @@
+[Partition]
+Type=home
+Format=btrfs
+SizeMinBytes=512M
+SizeMaxBytes=512M
+Weight=45000
+FactoryReset=yes
+Label=elementary-home
diff --git a/mkosi.images/sysupdate/mkosi.conf b/mkosi.images/sysupdate/mkosi.conf
new file mode 100644
index 000000000..976ea8cb4
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.conf
@@ -0,0 +1,44 @@
+[Config]
+Dependencies=base
+
+[Match]
+Distribution=ubuntu
+
+[Output]
+Format=disk
+SplitArtifacts=partitions,uki
+CompressOutput=zstd
+
+[Content]
+RemovePackages=
+ command-not-found
+VolatilePackages=
+ systemd-boot-efi
+Bootable=yes
+BaseTrees=%O/base_%v
+Output=elementary_%v
+CleanPackageMetadata=yes
+Bootloader=systemd-boot
+KernelInitrdModules=
+ default
+ ahci
+ nvme
+ xhci_pci
+ usb_storage
+ uas
+ sd_mod
+ dm-verity
+KernelCommandLine=
+ splash
+ quiet
+ root=dissect
+ mount.usr=dissect
+ rw
+ audit=0
+ systemd.image_policy=esp=unprotected:xbootldr=unprotected+unused+absent:usr=signed:root=unprotected+absent:home=unprotected+absent:=ignore
+ systemd.image_filter=usr=elementary_*:usr-verity=elementary_*:usr-verity-sig=elementary_*:root=elementary-*:home=elementary-*
+ ipe.enforce=0
+
+[Validation]
+SecureBoot=no
+SignExpectedPcr=no
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf
new file mode 100644
index 000000000..ae144cd02
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/00-esp.conf
@@ -0,0 +1,6 @@
+[Partition]
+Label=elementary_%A
+Type=esp
+Format=vfat
+SizeMinBytes=0.5G
+SizeMaxBytes=2G
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf
new file mode 100644
index 000000000..37ccfb4d6
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/10-usr-verity-sig.conf
@@ -0,0 +1,7 @@
+[Partition]
+Type=usr-verity-sig
+CopyBlocks=auto
+Label=elementary_%A_verity_sig
+SplitName=%t.%U
+SizeMinBytes=0.5G
+SizeMaxBytes=0.5G
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf
new file mode 100644
index 000000000..e8d03c843
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/11-usr-verity.conf
@@ -0,0 +1,7 @@
+[Partition]
+Type=usr-verity
+CopyBlocks=auto
+Label=elementary_%A_verity
+SplitName=%t.%U
+SizeMinBytes=0.5G
+SizeMaxBytes=0.5G
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf
new file mode 100644
index 000000000..829eaf1a2
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/repart.d/12-usr.conf
@@ -0,0 +1,7 @@
+[Partition]
+Type=usr
+CopyBlocks=auto
+Label=elementary_%A
+SplitName=%t.%U
+SizeMinBytes=1G
+SizeMaxBytes=3G
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer
new file mode 100644
index 000000000..27a0b53cd
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/10-usr-verity-sig.transfer
@@ -0,0 +1,15 @@
+[Transfer]
+ProtectVersion=%A
+
+[Source]
+Type=url-file
+Path=PLACEHOLDER_BUCKET_PATH
+MatchPattern=elementary_@v.usr-%a-verity-sig.@u.raw.zst
+
+[Target]
+Type=partition
+Path=auto
+MatchPattern=elementary_@v_verity_sig
+MatchPartitionType=usr-verity-sig
+PartitionFlags=0
+ReadOnly=1
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer
new file mode 100644
index 000000000..6d07cd9c2
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/11-usr-verity.transfer
@@ -0,0 +1,15 @@
+[Transfer]
+ProtectVersion=%A
+
+[Source]
+Type=url-file
+Path=PLACEHOLDER_BUCKET_PATH
+MatchPattern=elementary_@v.usr-%a-verity.@u.raw.zst
+
+[Target]
+Type=partition
+Path=auto
+MatchPattern=elementary_@v_verity
+MatchPartitionType=usr-verity
+PartitionFlags=0
+ReadOnly=1
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer
new file mode 100644
index 000000000..3d9e2e417
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/12-usr.transfer
@@ -0,0 +1,15 @@
+[Transfer]
+ProtectVersion=%A
+
+[Source]
+Type=url-file
+Path=PLACEHOLDER_BUCKET_PATH
+MatchPattern=elementary_@v.usr-%a.@u.raw.zst
+
+[Target]
+Type=partition
+Path=auto
+MatchPattern=elementary_@v
+MatchPartitionType=usr
+PartitionFlags=0
+ReadOnly=1
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer
new file mode 100644
index 000000000..e101384f8
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/20-uki.transfer
@@ -0,0 +1,23 @@
+[Transfer]
+ProtectVersion=%A
+
+[Source]
+Type=url-file
+Path=PLACEHOLDER_BUCKET_PATH
+MatchPattern=elementary_@v.efi
+
+[Target]
+Type=regular-file
+Path=/EFI/Linux
+PathRelativeTo=boot
+MatchPattern=elementary_@v_%a+@l-@d.efi \
+ elementary_@v_%a+@l.efi \
+ elementary_@v_%a.efi \
+ elementary_@v+@l-@d.efi \
+ elementary_@v+@l.efi \
+ elementary_@v.efi
+# MatchPartitionType=uki
+Mode=0600
+TriesLeft=3
+TriesDone=0
+InstancesMax=2
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature
new file mode 100644
index 000000000..a4b0be2a4
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.feature
@@ -0,0 +1,3 @@
+[Feature]
+Description=Tooling for elementary developers
+Enabled=false
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer
new file mode 100644
index 000000000..c09d22dde
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-sdk.transfer
@@ -0,0 +1,12 @@
+[Transfer]
+Features=ext-sdk
+
+[Source]
+Type=url-file
+Path=PLACEHOLDER_BUCKET_PATH
+MatchPattern=ext-sdk_@v.raw.zst
+
+[Target]
+Type=regular-file
+Path=/var/lib/extensions
+MatchPattern=ext-sdk_@v.raw
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature
new file mode 100644
index 000000000..cbc7b7351
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.feature
@@ -0,0 +1,3 @@
+[Feature]
+Description=Virtualization host packages (qemu)
+Enabled=false
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer
new file mode 100644
index 000000000..cc9417bf2
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/lib/sysupdate.d/ext-virt.transfer
@@ -0,0 +1,12 @@
+[Transfer]
+Features=ext-virt
+
+[Source]
+Type=url-file
+Path=PLACEHOLDER_BUCKET_PATH
+MatchPattern=ext-virt_@v.raw.zst
+
+[Target]
+Type=regular-file
+Path=/var/lib/extensions
+MatchPattern=ext-virt_@v.raw
diff --git a/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay
new file mode 100755
index 000000000..f184752c1
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.extra/usr/sbin/usroverlay
@@ -0,0 +1,62 @@
+#!/bin/bash
+set -euo pipefail
+
+RUN_DIR=/run/usroverlay
+UPPER="$RUN_DIR/upper"
+WORK="$RUN_DIR/work"
+TARGET=/usr
+
+if [[ $EUID -ne 0 ]]; then
+ SCRIPT_PATH="$(readlink -f "$0")"
+ exec run0 "$SCRIPT_PATH" "$@"
+fi
+
+is_active() {
+ findmnt -n -o FSTYPE "$TARGET" 2>/dev/null | grep -q '^overlay$'
+}
+
+cmd_enable() {
+ if is_active; then
+ echo "usroverlay: already active on $TARGET"
+ exit 0
+ fi
+
+ mkdir -p "$UPPER" "$WORK"
+ mount -t overlay overlay \
+ -o "lowerdir=$TARGET,upperdir=$UPPER,workdir=$WORK" \
+ "$TARGET"
+
+ echo "usroverlay is enabled, discard with usroverlay discard"
+}
+
+cmd_discard() {
+ if ! is_active; then
+ echo "usroverlay: not currently active" >&2
+ exit 1
+ fi
+
+ umount -l "$TARGET"
+ ( sleep 5; rm -rf "$RUN_DIR" 2>/dev/null || true ) &
+ disown
+
+ echo "usroverlay has been discarded"
+}
+
+cmd_status() {
+ if is_active; then
+ echo "usroverlay: ACTIVE"
+ else
+ echo "usroverlay: inactive"
+ fi
+}
+
+case "${1:-}" in
+ enable) cmd_enable ;;
+ discard) cmd_discard ;;
+ status) cmd_status ;;
+ *)
+ echo "Usage: usroverlay {enable|discard|status}" >&2
+ cmd_status
+ exit 1
+ ;;
+esac
diff --git a/mkosi.images/sysupdate/mkosi.postinst.chroot b/mkosi.images/sysupdate/mkosi.postinst.chroot
new file mode 100755
index 000000000..f03657b90
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.postinst.chroot
@@ -0,0 +1,12 @@
+#!/bin/bash
+set -xeuo pipefail
+
+fc-cache --force --really-force --system-only --verbose
+
+glib-compile-schemas /usr/share/glib-2.0/schemas/
+
+mkdir -p /var/usrlocal
+ln -s /var/usrlocal /usr/local
+cp -a /usr/local/. /var/usrlocal/
+rm -rf /usr/local
+ln -s /var/usrlocal /usr/local
diff --git a/mkosi.images/sysupdate/mkosi.repart/00-esp.conf b/mkosi.images/sysupdate/mkosi.repart/00-esp.conf
new file mode 100644
index 000000000..09c16e3e2
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.repart/00-esp.conf
@@ -0,0 +1,8 @@
+[Partition]
+Label=elementary_%A
+Type=esp
+Format=vfat
+CopyFiles=/efi:/
+CopyFiles=/boot:/
+SizeMinBytes=1.5G
+SizeMaxBytes=1.5G
diff --git a/mkosi.images/sysupdate/mkosi.repart/10-usr-verity-sig.conf b/mkosi.images/sysupdate/mkosi.repart/10-usr-verity-sig.conf
new file mode 100644
index 000000000..f8ea08c1d
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.repart/10-usr-verity-sig.conf
@@ -0,0 +1,6 @@
+[Partition]
+Type=usr-verity-sig
+Label=elementary_%A_verity_sig
+Verity=signature
+VerityMatchKey=usr
+SplitName=%t.%U
diff --git a/mkosi.images/sysupdate/mkosi.repart/11-usr-verity.conf b/mkosi.images/sysupdate/mkosi.repart/11-usr-verity.conf
new file mode 100644
index 000000000..9d08b3aee
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.repart/11-usr-verity.conf
@@ -0,0 +1,8 @@
+[Partition]
+Type=usr-verity
+Label=elementary_%A_verity
+Verity=hash
+VerityMatchKey=usr
+SizeMinBytes=400M
+SizeMaxBytes=400M
+SplitName=%t.%U
diff --git a/mkosi.images/sysupdate/mkosi.repart/12-usr.conf b/mkosi.images/sysupdate/mkosi.repart/12-usr.conf
new file mode 100644
index 000000000..87319e2a7
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.repart/12-usr.conf
@@ -0,0 +1,12 @@
+[Partition]
+Type=usr
+Label=elementary_%A
+Format=erofs
+CopyFiles=/usr:/
+Verity=data
+VerityMatchKey=usr
+Minimize=yes
+Compression=zstd
+SplitName=%t.%U
+SizeMinBytes=7G
+SizeMaxBytes=7G
diff --git a/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf b/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf
new file mode 100644
index 000000000..318fec069
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.repart/20-usr-verify-sig-bside.conf
@@ -0,0 +1,3 @@
+[Partition]
+Type=usr-verity-sig
+Label=_empty
diff --git a/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf b/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf
new file mode 100644
index 000000000..6c813102e
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.repart/21-usr-verity-bside.conf
@@ -0,0 +1,6 @@
+[Partition]
+Type=usr-verity
+Label=_empty
+NoAuto=1
+SizeMinBytes=400M
+SizeMaxBytes=400M
diff --git a/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf b/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf
new file mode 100644
index 000000000..0d8eda06c
--- /dev/null
+++ b/mkosi.images/sysupdate/mkosi.repart/22-usr-bside.conf
@@ -0,0 +1,6 @@
+[Partition]
+Type=usr
+Label=_empty
+NoAuto=1
+SizeMinBytes=7G
+SizeMaxBytes=7G
diff --git a/mkosi.profiles/daily/mkosi.conf b/mkosi.profiles/daily/mkosi.conf
new file mode 100644
index 000000000..81c498af1
--- /dev/null
+++ b/mkosi.profiles/daily/mkosi.conf
@@ -0,0 +1,2 @@
+[Match]
+Profile=daily
diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg
new file mode 100644
index 000000000..4da300657
Binary files /dev/null and b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-daily.gpg differ
diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg
new file mode 100644
index 000000000..9e7e76034
Binary files /dev/null and b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/keyrings/elementary-os-os-patches.gpg differ
diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome
new file mode 100644
index 000000000..fdd5b14ce
--- /dev/null
+++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/deprioritize-gnome
@@ -0,0 +1,3 @@
+Package: gdm3 gnome-control-center gnome-remote-desktop gnome-screensaver gnome-shell gnome-session gnome-software gnome-system-monitor nautilus
+Pin: release *
+Pin-Priority: -1
diff --git a/etc/config/archives/patches.pref b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches
similarity index 100%
rename from etc/config/archives/patches.pref
rename to mkosi.profiles/daily/mkosi.sandbox/etc/apt/preferences.d/prioritize-patches
diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources
new file mode 100644
index 000000000..ff746acb3
--- /dev/null
+++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-daily.sources
@@ -0,0 +1,5 @@
+Types: deb
+URIs: https://ppa.launchpadcontent.net/elementary-os/daily/ubuntu
+Suites: resolute
+Components: main
+Signed-By: /etc/apt/keyrings/elementary-os-daily.gpg
diff --git a/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources
new file mode 100644
index 000000000..f2fae00a6
--- /dev/null
+++ b/mkosi.profiles/daily/mkosi.sandbox/etc/apt/sources.list.d/elementary-os-patches.sources
@@ -0,0 +1,5 @@
+Types: deb
+URIs: https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu
+Suites: resolute
+Components: main
+Signed-By: /etc/apt/keyrings/elementary-os-os-patches.gpg
diff --git a/upload.py b/upload.py
deleted file mode 100644
index 56038f4c3..000000000
--- a/upload.py
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/usr/bin/env python3
-
-import boto3
-import sys
-
-KEY, SECRET, ENDPOINT, BUCKET, FILEPATH, FILENAME = [sys.argv[i+1] for i in range(6)]
-
-session = boto3.session.Session()
-client = session.client('s3',
- region_name='nyc3',
- endpoint_url='https://' + ENDPOINT,
- aws_access_key_id = KEY,
- aws_secret_access_key = SECRET)
-
-client.upload_file(FILEPATH, # Path to local file
- BUCKET, # Name of Space
- FILENAME, # Name for remote file
- ExtraArgs={'ACL':'private'})
diff --git a/upload.sh b/upload.sh
deleted file mode 100755
index b85053cc3..000000000
--- a/upload.sh
+++ /dev/null
@@ -1,65 +0,0 @@
-#!/bin/bash
-
-set -e
-
-CONFIG_FILE="$1"
-KEY="$2"
-SECRET="$3"
-ENDPOINT="$4"
-BUCKET="$5"
-
-source "$CONFIG_FILE"
-
-BASEDIR="$CHANNEL"
-if [ "$ARCH" != "amd64" ]; then
- BASEDIR="$CHANNEL-$ARCH"
-fi
-
-echo -e "
-#----------------------#
-# INSTALL DEPENDENCIES #
-#----------------------#
-"
-
-apt-get update
-apt-get install -y python3 python3-boto3
-
-echo -e "
-#------------#
-# UPLOAD ISO #
-#------------#
-"
-
-# get the paths & filenames of the files to upload
-ISOPATHS="$(find builds -name "*.iso")"
-while IFS= read -r ISOPATH; do
- SHAPATH="${ISOPATH%.*}.sha256.txt"
- MD5PATH="${ISOPATH%.*}.md5.txt"
- ISO="$BASEDIR/$(basename "$ISOPATH")"
- SHASUM="$BASEDIR/$(basename "$SHAPATH")"
- MD5="$BASEDIR/$(basename "$MD5PATH")"
- echo "uploading $ISO..."
- python3 upload.py "$KEY" "$SECRET" "$ENDPOINT" "$BUCKET" "$ISOPATH" "$ISO" || exit 1
- echo "uploading $SHASUM..."
- python3 upload.py "$KEY" "$SECRET" "$ENDPOINT" "$BUCKET" "$SHAPATH" "$SHASUM" || exit 1
- echo "uploading $MD5..."
- python3 upload.py "$KEY" "$SECRET" "$ENDPOINT" "$BUCKET" "$MD5PATH" "$MD5" || exit 1
-
- if [ "$CHANNEL" == "stable" ]; then
- # install transmission
- apt-get install -y transmission-cli
- cd "$(dirname "$ISOPATH")" || exit 1
- # create torrent file
- transmission-create "$(basename "$ISOPATH")" \
- -t https://ashrise.com:443/phoenix/announce \
- -t udp://open.demonii.com:1337/announce \
- -t udp://tracker.ccc.de:80/announce \
- -t udp://tracker.istole.it:80/announce \
- -t udp://tracker.openbittorrent.com:80/announce \
- -t udp://tracker.publicbt.com:80/announce
- cd ~- || exit 1
- echo "uploading $ISO.torrent..."
- python3 upload.py "$KEY" "$SECRET" "$ENDPOINT" "$BUCKET" "$ISOPATH.torrent" "$ISO.torrent" || exit 1
-
- fi
-done <<< "$ISOPATHS"
diff --git a/workflows.sh b/workflows.sh
deleted file mode 100755
index 2dc80485e..000000000
--- a/workflows.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/bash
-
-set -e
-
-CONFIG_FILE="$1"
-KEY="$2"
-SECRET="$3"
-ENDPOINT="$4"
-BUCKET="$5"
-
-./build.sh "$CONFIG_FILE"
-./upload.sh "$CONFIG_FILE" "$KEY" "$SECRET" "$ENDPOINT" "$BUCKET"