[kde-linux/kde-linux-packages/buildstream] /: Embrace buildstream as an environment to build kde-linux's payload

Harald Sitter <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit aa9913a210085c85d5d89187b4459e192ba1f2fd by Harald Sitter, on behalf of Aleix Pol Gonzalez.
Committed on 31/07/2026 at 18:21.
Pushed by sitter into branch 'buildstream'.

Embrace buildstream as an environment to build kde-linux's payload

M  +2    -0    .gitignore
M  +2    -1    .gitlab-ci.yml
A  +9    -0    Caddyfile
A  +73   -0    LICENSES/Apache-2.0.txt
M  +4    -3    bootstrap.sh
M  +68   -56   build.sh
A  +21   -0    elements/components/debian.bst
A  +7    -0    elements/freedesktop-sdk.bst
A  +15   -0    elements/kde-buildstream.bst
A  +1006 -0    elements/kde-linux-payload.bst
A  +10   -0    elements/plugins/buildstream-plugins-community.bst
A  +11   -0    elements/plugins/buildstream-plugins.bst
A  +18   -0    host.sh
A  +17   -0    include/aliases.yml
D  +0    -160  install-kde-deps.py
M  +42   -1    kde-builder.yaml.in
D  +0    -48   make-kde-tarball.py
A  +41   -0    plugins/elements/manual-run-host.py
A  +25   -0    plugins/elements/manual-run-host.yaml
A  +325  -0    plugins/sources/kde_builder.py
A  +106  -0    project.conf
D  +0    -15   strip/ninja

https://invent.kde.org/kde-linux/kde-linux-packages/-/commit/aa9913a210085c85d5d89187b4459e192ba1f2fd

diff --git a/.gitignore b/.gitignore
index a6d3f4b..50d827f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,5 @@ tree/
 upload/
 spaghetti.json
 ccache
+.bst/
+__pycache__
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 95efe01..fb9b77a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -14,6 +14,7 @@ variables:
   REPO_METADATA_BRANCH:
     value: "master"
     description: "Branch of sysadmin/repo-metadata to use"
+  KDECI_BUILD: "TRUE"
 
 build:
   stage: build
@@ -28,7 +29,7 @@ build:
       aud: https://tokens.kde.org
   script:
     - sudo ./bootstrap.sh
-    - sudo --preserve-env ./build.sh
+    - ./build.sh
   artifacts:
     untracked: false
     when: always
diff --git a/Caddyfile b/Caddyfile
new file mode 100644
index 0000000..1f4c8ab
--- /dev/null
+++ b/Caddyfile
@@ -0,0 +1,9 @@
+# SPDX-License-Identifier: BSD-2-Clause
+# SPDX-FileCopyrightText: 2026 Harald Sitter <[email protected]>
+
+http://localhost:12312  {
+	bind unix//tmp/host/ccache.sock
+	reverse_proxy https://ccache.cache.kde-linux.haraldsitter.eu {
+		header_up Authorization "Bearer {env.CCACHE_TOKEN}"
+	}
+}
diff --git a/LICENSES/Apache-2.0.txt b/LICENSES/Apache-2.0.txt
new file mode 100644
index 0000000..137069b
--- /dev/null
+++ b/LICENSES/Apache-2.0.txt
@@ -0,0 +1,73 @@
+Apache License
+Version 2.0, January 2004
+http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
[suppressed due to size limit]
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
[suppressed due to size limit]
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+     (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+     (b) You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+     (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+
[suppressed due to size limit]
+
+     You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
[suppressed due to size limit]
+
[suppressed due to size limit]
+
[suppressed due to size limit]
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!)  The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
diff --git a/bootstrap.sh b/bootstrap.sh
index f96ca13..d6fa7f5 100755
--- a/bootstrap.sh
+++ b/bootstrap.sh
@@ -29,11 +29,12 @@ pacman-key --populate
 # --refresh twice forces a cache refresh
 pacman --sync --refresh --refresh --noconfirm --sysupgrade \
         sudo base-devel git ninja rsync openssh ccache \
-        debugedit erofs-utils
+        python-yaml python-setproctitle python-requests python-srcinfo \
+        python-minio python-pip debugedit erofs-utils lzip
 
 # The packaged minio (as of 2025-11-28) is broken; install from PyPI instead.
-# Same workaround applied in make-kde-tarball.py.
-pip install minio setproctitle --break-system-packages
+pip install minio --break-system-packages
+pip install 'BuildStream>=2.7' buildstream-plugins dulwich tomlkit --break-system-packages
 
 git clone https://invent.kde.org/sdk/kde-builder.git /kde-builder
 ln -s /kde-builder/kde-builder /usr/local/bin
diff --git a/build.sh b/build.sh
index a84cc78..a2d9040 100755
--- a/build.sh
+++ b/build.sh
@@ -1,66 +1,77 @@
 #!/usr/bin/bash
 # SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
 # SPDX-FileCopyrightText: 2026 Hadi Chokr <[email protected]>
-set -eux
-
-mkdir -p /builder
 
-if [ -f /.dockerenv ]; then
-    export CI_COMMIT_SHORT_SHA=abcSHAdef
-    export CI_JOB_ID=123JOBID456
-    export CI_PROJECT_DIR=/work
-fi
+set -eux
 
-if [ ! -f /.dockerenv ]; then
-    # In CI, pull a warm ccache from object storage to speed up the build.
-    curl --fail https://storage.kde.org/kde-linux-packages/testing/ccache/ccache.tar \
-        | tar --extract --directory=/builder || true
+export CI_PROJECT_DIR="${CI_PROJECT_DIR:-$PWD}"
+export KDECI_BUILD="${KDECI_BUILD:-FALSE}"
+
+rm -rf tree upload
+
+HOST_PID=""
+if [ "$KDECI_BUILD" = "TRUE" ]; then
+    # Set up cache overrides
+    git clone --depth=1 https://invent.kde.org/sitter/kde-buildstream.git
+    mkdir --parents ~/.config
+    cp kde-buildstream/buildstream.conf.writable ~/.config/buildstream.conf
+    set +x
+    echo "$BST_CACHE_TOKEN" > /tmp/bst-cache-token
+    set -x
+
+    # Start a reverse proxy from a unix socket to the real ccache server.
+    # This is a bit complicated because buildstream really doesn't want to let us poke into the sandbox.
+    # We'll create a host dir in tmp. This will be mounted into the sandbox via a somewhat naughty bst plugin.
+    # Inside the sandbox we stand up another reverse proxy so ccache knows this is http.
+    # Basically
+    #   ccache(sandbox) -> caddy(sandbox) -> socket (mounted) -> caddy(host) -> real.ccache.server
+    #
+    # host does act as a general interaction point in this set up as we also want a way to collect logs from the kde-builder stage anyway.
+    # Mind that this only applies to the payload.bst, the other elements are all built as per usual bst constraints (e.g. no network during build).
+    ./host.sh &
+    HOST_PID=$!
 fi
 
-export CCACHE_DIR="/builder/ccache"
-ccache --set-config=max_size=50G
-
-export KDE_LINUX_INSTALL_DESTDIR="$PWD/tree/install"
-
-# Wrap ninja with the strip shim so debug info is stripped during install.
-if [ ! -f /usr/bin/ninja.orig ]; then
-    mv /usr/bin/ninja /usr/bin/ninja.orig
-    cp strip/ninja /usr/bin/ninja
+function finish {
+    set +e
+    if [ "$HOST_PID" != "" ]; then
+        kill ${HOST_PID} || true
+    fi
+
+    [ -d artifacts ] || mkdir artifacts
+    cp --recursive /tmp/host/kde-builder-logs artifacts/
+    cp --recursive ~/.cache/buildstream/logs artifacts/buildstream-logs
+}
+trap finish EXIT INT ABRT TERM
+
+bst source track kde-linux-payload.bst
+# Make sure most of everything will be in the cache for the imaging pipeline.
+# Bit of a hack until we move things here.
+bst build \
+    kde-buildstream.bst:os/deps.bst \
+    kde-buildstream.bst:os/deps-core.bst \
+    kde-buildstream.bst:os/deps-kde.bst \
+    kde-buildstream.bst:freedesktop-sdk.bst:components/ovmf-maybe.bst \
+    kde-buildstream.bst:freedesktop-sdk.bst:vm/prepare-image.bst \
+    kde-buildstream.bst:components/calamares.bst \
+    kde-linux-payload.bst
+
+if [ "$KDECI_BUILD" = "TRUE" ]; then
+    kill ${HOST_PID} || true
 fi
 
-rm -rf tree
-export CXXFLAGS="-ffile-prefix-map=/builder/src/=/usr/src/debug/"
-
-mkdir -p "$HOME/.config"
-cp kde-builder.yaml.in "$HOME/.config/kde-builder.yaml"
-kde-builder --generate-config
-kde-builder --metadata-only
+[ -d artifacts ] || mkdir artifacts
 
-# ------------------------------------------------------
-# WARNING! THIS IS DISTRO-SPECIFIC
-python ./install-kde-deps.py
-# ------------------------------------------------------
+# Only ship the KDE payload. Build dependencies are provided by the image pipeline.
+bst artifact checkout kde-linux-payload.bst --deps none --directory tree/install
 
-python ./make-kde-tarball.py
-
-RPM_BUILD_ROOT=$PWD/tree/install \
-RPM_BUILD_DIR=/builder/build \
-RPM_PACKAGE_NAME=kde-linux \
-    find-debuginfo \
-        -m -i -v \
-        --jobs "$(nproc)" \
-        --unique-debug-src-base "$CI_COMMIT_SHORT_SHA-$CI_JOB_ID.x86-64" \
-        --unique-debug-suffix "-$CI_COMMIT_SHORT_SHA-$CI_JOB_ID.x86-64" \
-        "/builder/build"
+mkdir --parents upload/artifacts
+mkdir --parents upload/repo
 
 mkdir -p tree/debug/usr/{lib,src}/
 mv tree/install/usr/lib/debug tree/debug/usr/lib/
 mv tree/install/usr/src/debug tree/debug/usr/src/
 
-rm -rf upload
-mkdir -p upload/artifacts upload/ccache
-
-tar --directory=/builder --create --file=upload/ccache/ccache.tar ccache
 tar --directory=tree/debug --create --file=upload/artifacts/debug.tar .
 
 mkfs.erofs -zzstd -C65536 -Efragments,ztailpacking --tar=f \
@@ -69,21 +80,22 @@ mkfs.erofs -zzstd -C65536 -Efragments,ztailpacking --tar=f \
 zstd --rm --threads="$(nproc)" upload/artifacts/debug.tar \
     -o upload/artifacts/debug.tar.zst
 
-# Only ship kde-builder output.
-# The Images Pipeline uses packages.txt to install runtime deps via mkosi.
 tar --directory=tree/install --create \
     --file=upload/artifacts/install.tar.zst --zstd .
 
-# Copy packages list artifact
-cp "$CI_PROJECT_DIR/artifacts/packages.txt" upload/artifacts/packages.txt
-# and the build_repo marker so the images pipeline uses the same mirror version
-mkdir --parents upload/repo
-cp "$CI_PROJECT_DIR/artifacts/build_repo.txt" upload/repo/build_repo.txt
+S3_REMOTE="storage.kde.org/kde-linux-packages/testing/"
+
+if [ "${CI_COMMIT_BRANCH:-}" != "master" ]; then
+    S3_REMOTE="storage.kde.org/ci-artifacts/$CI_PROJECT_PATH/j/$CI_JOB_ID/testing"
+fi
+
+if [ ! -f /.dockerenv ]; then
+    # Keep the images pipeline on the same KDE Linux package mirror version.
+    cp "$CI_PROJECT_DIR/artifacts/build_repo.txt" upload/repo/build_repo.txt
 
-if [ ! -f /.dockerenv ] && [ "${CI_COMMIT_BRANCH:-}" = "master" ]; then
     git clone --depth=1 https://invent.kde.org/sysadmin/ci-utilities.git
     CI_UTILITIES_DIR="$PWD/ci-utilities"
-    "$CI_UTILITIES_DIR/sync-s3-folder.py" --mode upload --delete --local "$PWD/upload/" --remote storage.kde.org/kde-linux-packages/testing/ --verbose
+    "$CI_UTILITIES_DIR/sync-s3-folder.py" --mode upload --delete --local "$PWD/upload/" --remote "$S3_REMOTE" --verbose
     cd "$CI_PROJECT_DIR"
     rm --recursive --force upload pkgbuilds
     git clean -dfx --exclude=artifacts
diff --git a/elements/components/debian.bst b/elements/components/debian.bst
new file mode 100644
index 0000000..ca57fbc
--- /dev/null
+++ b/elements/components/debian.bst
@@ -0,0 +1,21 @@
+# SPDX-License-Identifier: BSD-2-Clause
+# SPDX-FileCopyrightText: 2026 Harald Sitter <[email protected]>
+
+kind: manual
+
+description: Pretend we are debian so cmake and meson put libs in the right path
+
+build-depends:
+  - freedesktop-sdk.bst:public-stacks/runtime-gnu.bst
+
+config:
+  install-commands:
+  - |
+    mkdir --parents "%{install-root}/etc"
+    touch "%{install-root}/etc/debian_version"
+  - |
+    # meson also asks dpkg for the actual multiarch tuples, let's oblige
+    mkdir --parents "%{install-root}/usr/bin"
+    echo '#!/bin/sh' > "%{install-root}/usr/bin/dpkg-architecture"
+    echo 'echo "%{gcc_triplet}"' >> "%{install-root}/usr/bin/dpkg-architecture"
+    chmod +x "%{install-root}/usr/bin/dpkg-architecture"
diff --git a/elements/freedesktop-sdk.bst b/elements/freedesktop-sdk.bst
new file mode 100644
index 0000000..7b83e76
--- /dev/null
+++ b/elements/freedesktop-sdk.bst
@@ -0,0 +1,7 @@
+# SPDX-FileCopyrightText: 2025 Aleix Pol Gonzalez <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+kind: link
+
+config:
+  target: kde-buildstream.bst:freedesktop-sdk.bst
diff --git a/elements/kde-buildstream.bst b/elements/kde-buildstream.bst
new file mode 100644
index 0000000..e66a13f
--- /dev/null
+++ b/elements/kde-buildstream.bst
@@ -0,0 +1,15 @@
+# SPDX-FileCopyrightText: 2025 Aleix Pol Gonzalez <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+kind: junction
+
+sources:
+- kind: git_repo
+  url: invent:sitter/kde-buildstream.git
+  track: master
+  ref: 77e302aa2cd2bff1dfe9ec2f68b672f0ba950341
+
+config:
+  overrides:
+    plugins/buildstream-plugins.bst: plugins/buildstream-plugins.bst
+    plugins/buildstream-plugins-community.bst: plugins/buildstream-plugins-community.bst
diff --git a/elements/kde-linux-payload.bst b/elements/kde-linux-payload.bst
new file mode 100644
index 0000000..12aba74
--- /dev/null
+++ b/elements/kde-linux-payload.bst
@@ -0,0 +1,1006 @@
+# SPDX-FileCopyrightText: 2025 Aleix Pol Gonzalez <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+# This brings all of KDE Linux (minus KDE) as a dependency and produces all of KDE dependencies using KDE Builder
+
+kind: manual-run-host
+
+build-depends:
+- kde-buildstream.bst:os/deps-kde.bst
+
+depends:
+- components/debian.bst
+
+variables:
+  strip-binaries: |
+    freedesktop-sdk-stripper \
+        -t /usr \
+        "%{build-root}" \
+        "/usr/src/debug/kde-linux-payload.bst" \
+        "%{debugdatadir}/dwz/kde-linux-payload.bst" \
+        "%{debugdir}" \
+        "%{install-root}"
+
+sources:
+- kind: git_repo
+  url: invent:sdk/kde-builder.git
+  track: master
+  ref: c52f10948356822a7e96e405ca9a95e9a74141a4
+- kind: local
+  path: kde-builder.yaml.in
+  directory: kde-linux-payload
+- kind: local
+  path: targets.yaml
+  directory: kde-linux-payload
+- kind: kde_builder
+  ref: 3d0e6e05d5bec7eaea4ff66e14fff655a4908e6cef68862929a5312117dc1b3f
+- kind: cargo2
+  cargo-lock: prepared-state/src/cxx-rust-cssparser/rust/Cargo.lock
+  ref:
+  - kind: registry
+    name: anstyle
+    version: 1.0.14
+    sha: 940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000
+  - kind: registry
+    name: bitflags
+    version: 2.11.1
+    sha: c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3
+  - kind: registry
+    name: byteorder
+    version: 1.5.0
+    sha: 1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b
+  - kind: registry
+    name: cc
+    version: 1.2.60
+    sha: 43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20
+  - kind: registry
+    name: clap
+    version: 4.6.1
+    sha: 1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51
+  - kind: registry
+    name: clap_builder
+    version: 4.6.0
+    sha: 714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f
+  - kind: registry
+    name: clap_lex
+    version: 1.1.0
+    sha: c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9
+  - kind: registry
+    name: codespan-reporting
+    version: 0.13.1
+    sha: af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681
+  - kind: registry
+    name: cssparser
+    version: 0.35.0
+    sha: 4e901edd733a1472f944a45116df3f846f54d37e67e68640ac8bb69689aca2aa
+  - kind: registry
+    name: cssparser-color
+    version: 0.3.0
+    sha: 6eeef9ae8c0e112edd89eb6406b3156ffa99c7e037b3baef1dbdf4158d35c324
+  - kind: registry
+    name: cssparser-macros
+    version: 0.6.1
+    sha: 13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331
+  - kind: registry
+    name: cxx
+    version: 1.0.194
+    sha: 747d8437319e3a2f43d93b341c137927ca70c0f5dabeea7a005a73665e247c7e
+  - kind: registry
+    name: cxx-build
+    version: 1.0.194
+    sha: b0f4697d190a142477b16aef7da8a99bfdc41e7e8b1687583c0d23a79c7afc1e
+  - kind: registry
+    name: cxxbridge-cmd
+    version: 1.0.194
+    sha: d0956799fa8678d4c50eed028f2de1c0552ae183c76e976cf7ca8c4e36a7c328
+  - kind: registry
+    name: cxxbridge-flags
+    version: 1.0.194
+    sha: 23384a836ab4f0ad98ace7e3955ad2de39de42378ab487dc28d3990392cb283a
+  - kind: registry
+    name: cxxbridge-macro
+    version: 1.0.194
+    sha: e6acc6b5822b9526adfb4fc377b67128fdd60aac757cc4a741a6278603f763cf
+  - kind: registry
+    name: derive_more
+    version: 0.99.20
+    sha: 6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f
+  - kind: registry
+    name: dtoa
+    version: 1.0.11
+    sha: 4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590
+  - kind: registry
+    name: dtoa-short
+    version: 0.3.5
+    sha: cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87
+  - kind: registry
+    name: equivalent
+    version: 1.0.2
+    sha: 877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f
+  - kind: registry
+    name: find-msvc-tools
+    version: 0.1.9
+    sha: 5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582
+  - kind: registry
+    name: foldhash
+    version: 0.2.0
+    sha: 77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb
+  - kind: registry
+    name: fxhash
+    version: 0.2.1
+    sha: c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c
+  - kind: registry
+    name: hashbrown
+    version: 0.17.0
+    sha: 4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51
+  - kind: registry
+    name: indexmap
+    version: 2.14.0
+    sha: d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9
+  - kind: registry
+    name: itoa
+    version: 1.0.18
+    sha: 8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682
+  - kind: registry
+    name: link-cplusplus
+    version: 1.0.12
+    sha: 7f78c730aaa7d0b9336a299029ea49f9ee53b0ed06e9202e8cb7db9bae7b8c82
+  - kind: registry
+    name: log
+    version: 0.4.29
+    sha: 5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897
+  - kind: registry
+    name: memchr
+    version: 2.8.0
+    sha: f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79
+  - kind: registry
+    name: new_debug_unreachable
+    version: 1.0.6
+    sha: 650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086
+  - kind: registry
+    name: nom
+    version: 8.0.0
+    sha: df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405
+  - kind: registry
+    name: phf
+    version: 0.11.3
+    sha: 1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078
+  - kind: registry
+    name: phf_codegen
+    version: 0.11.3
+    sha: aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a
+  - kind: registry
+    name: phf_generator
+    version: 0.11.3
+    sha: 3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d
+  - kind: registry
+    name: phf_macros
+    version: 0.11.3
+    sha: f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216
+  - kind: registry
+    name: phf_shared
+    version: 0.11.3
+    sha: 67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5
+  - kind: registry
+    name: precomputed-hash
+    version: 0.1.1
+    sha: 925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c
+  - kind: registry
+    name: proc-macro2
+    version: 1.0.106
+    sha: 8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934
+  - kind: registry
+    name: quote
+    version: 1.0.45
+    sha: 41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924
+  - kind: registry
+    name: rand
+    version: 0.8.6
+    sha: 5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a
+  - kind: registry
+    name: rand_core
+    version: 0.6.4
+    sha: ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c
+  - kind: registry
+    name: scratch
+    version: 1.0.9
+    sha: d68f2ec51b097e4c1a75b681a8bec621909b5e91f15bb7b840c4f2f7b01148b2
+  - kind: registry
+    name: selectors
+    version: 0.27.0
+    sha: 5b75e048a93e14929e68e37b82e207db957cbb368375a80ed3ca28ac75080856
+  - kind: registry
+    name: serde
+    version: 1.0.228
+    sha: 9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e
+  - kind: registry
+    name: serde_core
+    version: 1.0.228
+    sha: 41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad
+  - kind: registry
+    name: serde_derive
+    version: 1.0.228
+    sha: d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79
+  - kind: registry
+    name: servo_arc
+    version: 0.4.3
+    sha: 170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930
+  - kind: registry
+    name: shlex
+    version: 1.3.0
+    sha: 0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64
+  - kind: registry
+    name: siphasher
+    version: 1.0.2
+    sha: b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e
+  - kind: registry
+    name: smallvec
+    version: 1.15.1
+    sha: 67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03
+  - kind: registry
+    name: stable_deref_trait
+    version: 1.2.1
+    sha: 6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596
+  - kind: registry
+    name: strsim
+    version: 0.11.1
+    sha: 7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f
+  - kind: registry
+    name: syn
+    version: 2.0.117
+    sha: e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99
+  - kind: registry
+    name: termcolor
+    version: 1.4.1
+    sha: 06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755
+  - kind: registry
+    name: unicode-ident
+    version: 1.0.24
+    sha: e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75
+  - kind: registry
+    name: unicode-width
+    version: 0.2.2
+    sha: b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254
+  - kind: registry
+    name: winapi-util
+    version: 0.1.11
+    sha: c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22
+  - kind: registry
+    name: windows-link
+    version: 0.2.1
+    sha: f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5
+  - kind: registry
+    name: windows-sys
+    version: 0.61.2
+    sha: ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc
+- kind: tar
+  directory: .cxxbridge-cmd-crate
+  url: crates:crates/cxxbridge-cmd/cxxbridge-cmd-1.0.194.crate
+  ref: d0956799fa8678d4c50eed028f2de1c0552ae183c76e976cf7ca8c4e36a7c328
+- kind: cargo2
+  cargo-lock: .cxxbridge-cmd-crate/Cargo.lock
+  ref:
+  - kind: registry
+    name: anstyle
+    version: 1.0.13
+    sha: 5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78
+  - kind: registry
+    name: clap
+    version: 4.5.54
+    sha: c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394
+  - kind: registry
+    name: clap_builder
+    version: 4.5.54
+    sha: fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00
+  - kind: registry
+    name: clap_lex
+    version: 0.7.7
+    sha: c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32
+  - kind: registry
+    name: codespan-reporting
+    version: 0.13.1
+    sha: af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681
+  - kind: registry
+    name: equivalent
+    version: 1.0.2
+    sha: 877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f
+  - kind: registry
+    name: hashbrown
+    version: 0.16.1
+    sha: 841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100
+  - kind: registry
+    name: indexmap
+    version: 2.13.0
+    sha: 7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017
+  - kind: registry
+    name: proc-macro2
+    version: 1.0.105
+    sha: 535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7
+  - kind: registry
+    name: quote
+    version: 1.0.43
+    sha: dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a
+  - kind: registry
+    name: serde
+    version: 1.0.228
+    sha: 9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e
+  - kind: registry
+    name: serde_core
+    version: 1.0.228
+    sha: 41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad
+  - kind: registry
+    name: serde_derive
+    version: 1.0.228
+    sha: d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79
+  - kind: registry
+    name: strsim
+    version: 0.11.1
+    sha: 7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f
+  - kind: registry
+    name: syn
+    version: 2.0.114
+    sha: d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a
+  - kind: registry
+    name: termcolor
+    version: 1.4.1
+    sha: 06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755
+  - kind: registry
+    name: unicode-ident
+    version: 1.0.22
+    sha: 9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5
+  - kind: registry
+    name: unicode-width
+    version: 0.2.2
+    sha: b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254
+  - kind: registry
+    name: winapi-util
+    version: 0.1.11
+    sha: c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22
+  - kind: registry
+    name: windows-link
+    version: 0.2.1
+    sha: f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5
+  - kind: registry
+    name: windows-sys
+    version: 0.61.2
+    sha: ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc
+- kind: cargo2
+  cargo-lock: prepared-state/src/kdeplasma-addons/kdeds/kameleon/qmk/kameleon-qmk-helper/Cargo.lock
+  ref:
+  - kind: registry
+    name: anyhow
+    version: 1.0.102
+    sha: 7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c
+  - kind: registry
+    name: async-broadcast
+    version: 0.7.2
+    sha: 435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532
+  - kind: registry
+    name: async-recursion
+    version: 1.1.1
+    sha: 3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11
+  - kind: registry
+    name: async-trait
+    version: 0.1.89
+    sha: 9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb
+  - kind: registry
+    name: autocfg
+    version: 1.5.0
+    sha: c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8
+  - kind: registry
+    name: bitflags
+    version: 2.11.0
+    sha: 843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af
+  - kind: registry
+    name: bumpalo
+    version: 3.20.2
+    sha: 5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb
+  - kind: registry
+    name: bytes
+    version: 1.11.1
+    sha: 1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33
+  - kind: registry
+    name: cc
+    version: 1.2.58
+    sha: e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1
+  - kind: registry
+    name: cfg-if
+    version: 1.0.4
+    sha: 9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801
+  - kind: registry
+    name: concurrent-queue
+    version: 2.5.0
+    sha: 4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973
+  - kind: registry
+    name: crossbeam-utils
+    version: 0.8.21
+    sha: d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28
+  - kind: registry
+    name: easy_color
+    version: 0.1.13
+    sha: 0a2ec16030997bd7c0592b6c530bbbaaa2c3330d1abbbdce427cd175c03ca8d0
+  - kind: registry
+    name: either
+    version: 1.15.0
+    sha: 48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719
+  - kind: registry
+    name: endi
+    version: 1.1.1
+    sha: 66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099
+  - kind: registry
+    name: enumflags2
+    version: 0.7.12
+    sha: 1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef
+  - kind: registry
+    name: enumflags2_derive
+    version: 0.7.12
+    sha: 67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827
+  - kind: registry
+    name: equivalent
+    version: 1.0.2
+    sha: 877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f
+  - kind: registry
+    name: errno
+    version: 0.3.14
+    sha: 39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb
+  - kind: registry
+    name: event-listener
+    version: 5.4.1
+    sha: e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab
+  - kind: registry
+    name: event-listener-strategy
+    version: 0.5.4
+    sha: 8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93
+  - kind: registry
+    name: fastrand
+    version: 2.3.0
+    sha: 37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be
+  - kind: registry
+    name: find-msvc-tools
+    version: 0.1.9
+    sha: 5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582
+  - kind: registry
+    name: foldhash
+    version: 0.1.5
+    sha: d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2
+  - kind: registry
+    name: futures-core
+    version: 0.3.32
+    sha: 7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d
+  - kind: registry
+    name: futures-io
+    version: 0.3.32
+    sha: cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718
+  - kind: registry
+    name: futures-lite
+    version: 2.6.1
+    sha: f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad
+  - kind: registry
+    name: getrandom
+    version: 0.2.17
+    sha: ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0
+  - kind: registry
+    name: getrandom
+    version: 0.4.2
+    sha: 0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555
+  - kind: registry
+    name: hashbrown
+    version: 0.15.5
+    sha: 9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1
+  - kind: registry
+    name: hashbrown
+    version: 0.16.1
+    sha: 841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100
+  - kind: registry
+    name: heck
+    version: 0.5.0
+    sha: 2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea
+  - kind: registry
+    name: hex
+    version: 0.4.3
+    sha: 7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70
+  - kind: registry
+    name: hidapi
+    version: 2.6.6
+    sha: c78dadfc12f865bc3fcac3897e64533b930737ceb9ef245c8277de98d0b010e9
+  - kind: registry
+    name: id-arena
+    version: 2.3.0
+    sha: 3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954
+  - kind: registry
+    name: indexmap
+    version: 2.13.0
+    sha: 7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017
+  - kind: registry
+    name: itertools
+    version: 0.14.0
+    sha: 2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285
+  - kind: registry
+    name: itoa
+    version: 1.0.18
+    sha: 8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682
+  - kind: registry
+    name: js-sys
+    version: 0.3.92
+    sha: cc4c90f45aa2e6eacbe8645f77fdea542ac97a494bcd117a67df9ff4d611f995
+  - kind: registry
+    name: leb128fmt
+    version: 0.1.0
+    sha: 09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2
+  - kind: registry
+    name: libc
+    version: 0.2.183
+    sha: b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d
+  - kind: registry
+    name: linux-raw-sys
+    version: 0.12.1
+    sha: 32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53
+  - kind: registry
+    name: log
+    version: 0.4.29
+    sha: 5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897
+  - kind: registry
+    name: memchr
+    version: 2.8.0
+    sha: f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79
+  - kind: registry
+    name: memoffset
+    version: 0.9.1
+    sha: 488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a
+  - kind: registry
+    name: mio
+    version: 1.2.0
+    sha: 50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1
+  - kind: registry
+    name: num_enum
+    version: 0.7.6
+    sha: 5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26
+  - kind: registry
+    name: num_enum_derive
+    version: 0.7.6
+    sha: 680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8
+  - kind: registry
+    name: once_cell
+    version: 1.21.4
+    sha: 9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50
+  - kind: registry
+    name: ordered-stream
+    version: 0.2.0
+    sha: 9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50
+  - kind: registry
+    name: parking
+    version: 2.2.1
+    sha: f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba
+  - kind: registry
+    name: pin-project-lite
+    version: 0.2.17
+    sha: a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd
+  - kind: registry
+    name: pkg-config
+    version: 0.3.32
+    sha: 7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c
+  - kind: registry
+    name: ppv-lite86
+    version: 0.2.21
+    sha: 85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9
+  - kind: registry
+    name: prettyplease
+    version: 0.2.37
+    sha: 479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b
+  - kind: registry
+    name: proc-macro-crate
+    version: 3.5.0
+    sha: e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f
+  - kind: registry
+    name: proc-macro2
+    version: 1.0.106
+    sha: 8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934
+  - kind: registry
+    name: qmk-via-api
+    version: 0.8.0
+    sha: 492fe58a1a12ba701efdaa5e88d20314424fb9b124cba87bc65f0c2b3777d8b6
+  - kind: registry
+    name: quote
+    version: 1.0.45
+    sha: 41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924
+  - kind: registry
+    name: r-efi
+    version: 6.0.0
+    sha: f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf
+  - kind: registry
+    name: rand
+    version: 0.8.5
+    sha: 34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404
+  - kind: registry
+    name: rand_chacha
+    version: 0.3.1
+    sha: e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88
+  - kind: registry
+    name: rand_core
+    version: 0.6.4
+    sha: ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c
+  - kind: registry
+    name: rustix
+    version: 1.1.4
+    sha: b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190
+  - kind: registry
+    name: rustversion
+    version: 1.0.22
+    sha: b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d
+  - kind: registry
+    name: semver
+    version: 1.0.27
+    sha: d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2
+  - kind: registry
+    name: serde
+    version: 1.0.228
+    sha: 9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e
+  - kind: registry
+    name: serde_core
+    version: 1.0.228
+    sha: 41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad
+  - kind: registry
+    name: serde_derive
+    version: 1.0.228
+    sha: d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79
+  - kind: registry
+    name: serde_json
+    version: 1.0.149
+    sha: 83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86
+  - kind: registry
+    name: serde_repr
+    version: 0.1.20
+    sha: 175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c
+  - kind: registry
+    name: shlex
+    version: 1.3.0
+    sha: 0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64
+  - kind: registry
+    name: signal-hook-registry
+    version: 1.4.8
+    sha: c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b
+  - kind: registry
+    name: socket2
+    version: 0.6.3
+    sha: 3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e
+  - kind: registry
+    name: static_assertions
+    version: 1.1.0
+    sha: a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f
+  - kind: registry
+    name: strum
+    version: 0.28.0
+    sha: 9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd
+  - kind: registry
+    name: strum_macros
+    version: 0.28.0
+    sha: ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664
+  - kind: registry
+    name: syn
+    version: 2.0.117
+    sha: e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99
+  - kind: registry
+    name: tempfile
+    version: 3.27.0
+    sha: 32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd
+  - kind: registry
+    name: tokio
+    version: 1.50.0
+    sha: 27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d
+  - kind: registry
+    name: tokio-macros
+    version: 2.6.1
+    sha: 5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c
+  - kind: registry
+    name: toml_datetime
+    version: 1.1.0+spec-1.1.0
+    sha: 97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f
+  - kind: registry
+    name: toml_edit
+    version: 0.25.8+spec-1.1.0
+    sha: 16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c
+  - kind: registry
+    name: toml_parser
+    version: 1.1.0+spec-1.1.0
+    sha: 2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011
+  - kind: registry
+    name: tracing
+    version: 0.1.44
+    sha: 63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100
+  - kind: registry
+    name: tracing-attributes
+    version: 0.1.31
+    sha: 7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da
+  - kind: registry
+    name: tracing-core
+    version: 0.1.36
+    sha: db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a
+  - kind: registry
+    name: uds_windows
+    version: 1.2.1
+    sha: f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e
+  - kind: registry
+    name: unicode-ident
+    version: 1.0.24
+    sha: e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75
+  - kind: registry
+    name: unicode-xid
+    version: 0.2.6
+    sha: ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853
+  - kind: registry
+    name: uuid
+    version: 1.23.0
+    sha: 5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9
+  - kind: registry
+    name: wasi
+    version: 0.11.1+wasi-snapshot-preview1
+    sha: ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b
+  - kind: registry
+    name: wasip2
+    version: 1.0.2+wasi-0.2.9
+    sha: 9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5
+  - kind: registry
+    name: wasip3
+    version: 0.4.0+wasi-0.3.0-rc-2026-01-06
+    sha: 5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5
+  - kind: registry
+    name: wasm-bindgen
+    version: 0.2.115
+    sha: 6523d69017b7633e396a89c5efab138161ed5aafcbc8d3e5c5a42ae38f50495a
+  - kind: registry
+    name: wasm-bindgen-macro
+    version: 0.2.115
+    sha: 4e3a6c758eb2f701ed3d052ff5737f5bfe6614326ea7f3bbac7156192dc32e67
+  - kind: registry
+    name: wasm-bindgen-macro-support
+    version: 0.2.115
+    sha: 921de2737904886b52bcbb237301552d05969a6f9c40d261eb0533c8b055fedf
+  - kind: registry
+    name: wasm-bindgen-shared
+    version: 0.2.115
+    sha: a93e946af942b58934c604527337bad9ae33ba1d5c6900bbb41c2c07c2364a93
+  - kind: registry
+    name: wasm-encoder
+    version: 0.244.0
+    sha: 990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319
+  - kind: registry
+    name: wasm-metadata
+    version: 0.244.0
+    sha: bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909
+  - kind: registry
+    name: wasmparser
+    version: 0.244.0
+    sha: 47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe
+  - kind: registry
+    name: windows-link
+    version: 0.2.1
+    sha: f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5
+  - kind: registry
+    name: windows-sys
+    version: 0.61.2
+    sha: ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc
+  - kind: registry
+    name: winnow
+    version: 0.7.15
+    sha: df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945
+  - kind: registry
+    name: winnow
+    version: 1.0.1
+    sha: 09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5
+  - kind: registry
+    name: wit-bindgen
+    version: 0.51.0
+    sha: d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5
+  - kind: registry
+    name: wit-bindgen-core
+    version: 0.51.0
+    sha: ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc
+  - kind: registry
+    name: wit-bindgen-rust
+    version: 0.51.0
+    sha: b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21
+  - kind: registry
+    name: wit-bindgen-rust-macro
+    version: 0.51.0
+    sha: 0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a
+  - kind: registry
+    name: wit-component
+    version: 0.244.0
+    sha: 9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2
+  - kind: registry
+    name: wit-parser
+    version: 0.244.0
+    sha: ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736
+  - kind: registry
+    name: zbus
+    version: 5.14.0
+    sha: ca82f95dbd3943a40a53cfded6c2d0a2ca26192011846a1810c4256ef92c60bc
+  - kind: registry
+    name: zbus_macros
+    version: 5.14.0
+    sha: 897e79616e84aac4b2c46e9132a4f63b93105d54fe8c0e8f6bffc21fa8d49222
+  - kind: registry
+    name: zbus_names
+    version: 4.3.1
+    sha: ffd8af6d5b78619bab301ff3c560a5bd22426150253db278f164d6cf3b72c50f
+  - kind: registry
+    name: zbus_polkit
+    version: 5.0.0
+    sha: ad23d5c4d198c7e2641b33e6e0d1f866f117408ba66fe80bbe52e289eeb77c52
+  - kind: registry
+    name: zerocopy
+    version: 0.8.48
+    sha: eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9
+  - kind: registry
+    name: zerocopy-derive
+    version: 0.8.48
+    sha: 70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4
+  - kind: registry
+    name: zmij
+    version: 1.0.21
+    sha: b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa
+  - kind: registry
+    name: zvariant
+    version: 5.10.0
+    sha: 5708299b21903bbe348e94729f22c49c55d04720a004aa350f1f9c122fd2540b
+  - kind: registry
+    name: zvariant_derive
+    version: 5.10.0
+    sha: 5b59b012ebe9c46656f9cc08d8da8b4c726510aef12559da3e5f1bf72780752c
+  - kind: registry
+    name: zvariant_utils
+    version: 3.3.0
+    sha: f75c23a64ef8f40f13a6989991e643554d9bef1d682a281160cf0c1bc389c5e9
+- kind: cargo2
+  cargo-lock: prepared-state/src/auto-chmod/Cargo.lock
+  ref:
+  - kind: registry
+    name: aho-corasick
+    version: 1.1.4
+    sha: ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301
+  - kind: registry
+    name: bitflags
+    version: 2.11.0
+    sha: 843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af
+  - kind: registry
+    name: block
+    version: 0.1.6
+    sha: 0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a
+  - kind: registry
+    name: cc
+    version: 1.2.57
+    sha: 7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423
+  - kind: registry
+    name: errno
+    version: 0.3.14
+    sha: 39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb
+  - kind: registry
+    name: find-msvc-tools
+    version: 0.1.9
+    sha: 5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582
+  - kind: registry
+    name: gettext-rs
+    version: 0.7.7
+    sha: 5d5857dc1b7f0fee86961de833f434e29494d72af102ce5355738c0664222bdf
+  - kind: registry
+    name: gettext-sys
+    version: 0.26.0
+    sha: 4ea859ab0dd7e70ff823032b3e077d03d39c965d68c6c10775add60e999d8ee9
+  - kind: registry
+    name: lazy_static
+    version: 1.5.0
+    sha: bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe
+  - kind: registry
+    name: libc
+    version: 0.2.183
+    sha: b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d
+  - kind: registry
+    name: linux-raw-sys
+    version: 0.12.1
+    sha: 32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53
+  - kind: registry
+    name: locale_config
+    version: 0.3.0
+    sha: 08d2c35b16f4483f6c26f0e4e9550717a2f6575bcd6f12a53ff0c490a94a6934
+  - kind: registry
+    name: malloc_buf
+    version: 0.0.6
+    sha: 62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb
+  - kind: registry
+    name: memchr
+    version: 2.8.0
+    sha: f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79
+  - kind: registry
+    name: objc
+    version: 0.2.7
+    sha: 915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1
+  - kind: registry
+    name: objc-foundation
+    version: 0.1.1
+    sha: 1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9
+  - kind: registry
+    name: objc_id
+    version: 0.1.1
+    sha: c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b
+  - kind: registry
+    name: regex
+    version: 1.12.3
+    sha: e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276
+  - kind: registry
+    name: regex-automata
+    version: 0.4.14
+    sha: 6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f
+  - kind: registry
+    name: regex-syntax
+    version: 0.8.10
+    sha: dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a
+  - kind: registry
+    name: rustix
+    version: 1.1.4
+    sha: b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190
+  - kind: registry
+    name: shell-words
+    version: 1.1.1
+    sha: dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77
+  - kind: registry
+    name: shlex
+    version: 1.3.0
+    sha: 0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64
+  - kind: registry
+    name: temp-dir
+    version: 0.1.16
+    sha: 83176759e9416cf81ee66cb6508dbfe9c96f20b8b56265a39917551c23c70964
+  - kind: registry
+    name: winapi
+    version: 0.3.9
+    sha: 5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419
+  - kind: registry
+    name: winapi-i686-pc-windows-gnu
+    version: 0.4.0
+    sha: ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6
+  - kind: registry
+    name: winapi-x86_64-pc-windows-gnu
+    version: 0.4.0
+    sha: 712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f
+  - kind: registry
+    name: windows-link
+    version: 0.2.1
+    sha: f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5
+  - kind: registry
+    name: windows-sys
+    version: 0.61.2
+    sha: ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc
+
+environment:
+  HOME: "%{build-root}/home"
+  XDG_STATE_HOME: "%{build-root}/prepared-state"
+  CCACHE_DIR: "%{build-root}/ccache"
+  DESTDIR: "%{install-root}"
+  PKG_CONFIG_PATH: "%{install-root}/usr/lib/pkgconfig:%{install-root}/usr/lib/%{arch}-linux-gnu/pkgconfig:%{install-root}/usr/share/pkgconfig"
+  PATH: "%{install-root}/usr/bin:/usr/bin:/bin"
+  LD_LIBRARY_PATH: "%{install-root}/usr/lib:%{install-root}/usr/lib/%{arch}-linux-gnu"
+  QML_IMPORT_PATH: "%{install-root}/usr/lib/qml:/usr/lib/qml"
+  QML2_IMPORT_PATH: "%{install-root}/usr/lib/qml:/usr/lib/qml"
+  INSTALL_ROOT: "%{install-root}" # libaccounts-qt uses qmake. qmake is weird
+
+config:
+  build-commands:
+  - mkdir -p "%{build-root}/home/.config"
+  - sed "s/@GNU_TRIPLET@/%{arch}-linux-gnu/g" kde-linux-payload/kde-builder.yaml.in > "%{build-root}/home/.config/kde-builder.yaml"
+  - ccache --set-config=remote_storage="http://localhost:21321|layout=bazel"
+  - ccache --set-config=remote_only=true
+  - ccache --set-config=log_file=/run/host/ccache.log
+  # make sure the server exists. We detach it so we won't know if it starts up properly.
+  - stat /run/host/caddy
+  - >-
+    /run/host/caddy reverse-proxy --from http://localhost:21321 --to unix//run/host/ccache.sock --disable-redirects &
+    ./kde-builder
+    --rc-file "%{build-root}/home/.config/kde-builder.yaml"
+    --no-color
+    --log-level logged-command=DEBUG
+    --no-metadata
+    --no-src
+    --refresh-build
+    --source-dir "%{build-root}/prepared-state/src"
+    --build-dir "%{build-root}/build"
+    $(sed -n "s/^  - //p" kde-linux-payload/targets.yaml)
diff --git a/elements/plugins/buildstream-plugins-community.bst b/elements/plugins/buildstream-plugins-community.bst
new file mode 100644
index 0000000..8456371
--- /dev/null
+++ b/elements/plugins/buildstream-plugins-community.bst
@@ -0,0 +1,10 @@
+# SPDX-FileCopyrightText: 2026 Aleix Pol <[email protected]>
+#
+# SPDX-License-Identifier: BSD-2-Clause
+
+kind: junction
+
+sources:
+- kind: tar
+  url: pypi:08/b4/4b5311dd4ea599bdc69d911263f5d3f8b4c14789d69265d7ea2be7e4e120/buildstream_plugins_community-2.3.0.tar.gz
+  ref: cdd3b73ff998e4145d2bb1a1215b961c65b073a4956609417ab747ef8f462c44
diff --git a/elements/plugins/buildstream-plugins.bst b/elements/plugins/buildstream-plugins.bst
new file mode 100644
index 0000000..fae16d3
--- /dev/null
+++ b/elements/plugins/buildstream-plugins.bst
@@ -0,0 +1,11 @@
+# SPDX-FileCopyrightText: 2025 Aleix Pol Gonzalez <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+kind: junction
+sources:
+- kind: git_repo
+  url: github:apache/buildstream-plugins.git
+  track: "*.*.*"
+  exclude:
+  - "*dev*"
+  ref: 2.7.0-0-g432a00368261e01c2827071d67c477bfe4a55664
diff --git a/host.sh b/host.sh
new file mode 100755
index 0000000..659242a
--- /dev/null
+++ b/host.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+# SPDX-License-Identifier: BSD-2-Clause
+# SPDX-FileCopyrightText: 2026 Harald Sitter <[email protected]>
+
+set -eux
+
+[ -d /tmp/host ] || mkdir /tmp/host
+[ -d /tmp/host/kde-builder-logs ] || mkdir /tmp/host/kde-builder-logs
+# Make sure the build namespace can write into the logs directory
+chmod 777 /tmp/host/kde-builder-logs
+
+if [ ! -x caddy ]; then
+    wget https://github.com/caddyserver/caddy/releases/download/v2.11.4/caddy_2.11.4_linux_amd64.tar.gz
+    tar --extract --file=caddy_2.11.4_linux_amd64.tar.gz caddy
+fi
+[ -x /tmp/host/caddy ] || cp caddy /tmp/host/caddy
+
+exec ./caddy run
diff --git a/include/aliases.yml b/include/aliases.yml
new file mode 100644
index 0000000..92d89eb
--- /dev/null
+++ b/include/aliases.yml
@@ -0,0 +1,17 @@
+# SPDX-FileCopyrightText: 2025 Aleix Pol Gonzalez <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+aliases:
+  github: https://github.com/
+  gitlab: https://gitlab.com/
+  pypi: https://files.pythonhosted.org/packages/
+  qt: https://download.qt.io/official_releases/qt/
+  invent: https://invent.kde.org/
+  kde_cdn: https://download.kde.org/stable/
+  fdo: https://gitlab.freedesktop.org/
+  xorg: https://xorg.freedesktop.org/
+  cpan: https://cpan.metacpan.org/
+  samba_pub: https://download.samba.org/pub/
+  openldap: https://openldap.org/
+  kerberos: https://kerberos.org/
+  crates: https://static.crates.io/
diff --git a/install-kde-deps.py b/install-kde-deps.py
deleted file mode 100644
index 449e76c..0000000
--- a/install-kde-deps.py
+++ /dev/null
@@ -1,160 +0,0 @@
-#!/usr/bin/python3
-# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-# SPDX-FileCopyrightText: 2026 Hadi Chokr <[email protected]>
-import os
-import subprocess
-import logging
-import urllib.request
-import yaml
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-REPO_METADATA_BRANCH = os.getenv("REPO_METADATA_BRANCH", "master")
-KDE_DEPS_YAML_ARCH = (
-    f"https://invent.kde.org/sysadmin/repo-metadata/-/raw/"
-    f"{REPO_METADATA_BRANCH}/distro-dependencies/arch.yaml"
-)
-CI_PROJECT_DIR = os.getenv("CI_PROJECT_DIR", "/work")
-DEPS_SENTINEL = "/depsinstalled"
-PACMAN_CACHE = "/var/cache/pacman/pkg"
-
-
-def load_targets():
-    path = os.path.join(SCRIPT_DIR, "targets.yaml")
-    with open(path) as f:
-        return yaml.safe_load(f)["targets"]
-
-
-def disable_signature_verification():
-    logger.info("Disabling pacman signature verification (trusted mirror)...")
-    subprocess.run(
-        ["sed", "-i", "s/^SigLevel.*/SigLevel = Never/", "/etc/pacman.conf"],
-        check=True,
-    )
-
-
-def clear_package_cache():
-    """Hard-wipe the pacman cache directory to prevent stale/corrupted packages
-    from a previous CI run causing checksum failures at install time."""
-    logger.info(f"Wiping pacman package cache at {PACMAN_CACHE}...")
-    subprocess.run(f"rm -rf {PACMAN_CACHE}/*", shell=True, check=True)
-    os.makedirs(PACMAN_CACHE, exist_ok=True)
-
-
-def get_all_build_targets(targets):
-    logger.info("Querying kde-builder for true build targets (respecting ignore list)...")
-    result = subprocess.run(
-        ["kde-builder", "--include-dependencies", "--no-stop-on-failure", "--pretend"] + targets,
-        capture_output=True,
-        text=True,
-    )
-    if result.stderr:
-        logger.debug("kde-builder stderr:\n%s", result.stderr)
-    resolved = []
-    for line in result.stdout.splitlines():
-        if "Building " in line:
-            part = line.split("Building ", 1)[1]
-            module = part.split()[0]
-            module = module.split("/")[-1]
-            resolved.append(module)
-    if not resolved:
-        logger.error("kde-builder stdout:\n%s", result.stdout)
-        logger.error("kde-builder stderr:\n%s", result.stderr)
-        raise RuntimeError(
-            f"kde-builder --pretend returned no buildable modules (exit {result.returncode})"
-        )
-    logger.info(f"Resolved {len(resolved)} modules from kde-builder: {', '.join(resolved)}")
-    return resolved
-
-
-def load_deps_from_yaml(url, targets):
-    logger.info(f"Fetching deps from {url}")
-    with urllib.request.urlopen(url) as f:
-        data = yaml.full_load(f)
-
-    builddeps = set()
-    rundeps = set(data.get("common", []))
-    projects = data.get("projects", {})
-
-    built_packages = set()
-    module_dep_map = {}
-    for target in targets:
-        project = projects.get(target, {})
-        target_builddeps = project.get("makedepends") or []
-        target_rundeps = project.get("depends") or []
-        target_replaces = project.get("replaces") or []
-
-        builddeps.update(target_builddeps)
-        rundeps.update(target_rundeps)
-        built_packages.add(target)
-        built_packages.update(target_replaces)
-
-        if target_builddeps or target_rundeps:
-            module_dep_map[target] = {
-                "makedepends": sorted(target_builddeps),
-                "depends": sorted(target_rundeps),
-                "replaces": sorted(target_replaces),
-            }
-
-    # Log per-module dep breakdown
-    logger.info("=== Per-module dependency breakdown ===")
-    for module, deps in sorted(module_dep_map.items()):
-        parts = []
-        if deps["depends"]:
-            parts.append(f"depends=[{', '.join(deps['depends'])}]")
-        if deps["makedepends"]:
-            parts.append(f"makedepends=[{', '.join(deps['makedepends'])}]")
-        if deps["replaces"]:
-            parts.append(f"replaces=[{', '.join(deps['replaces'])}]")
-        logger.info(f"  {module}: {' | '.join(parts)}")
-    logger.info("=== End of per-module breakdown ===")
-
-    return list(builddeps), list(rundeps), built_packages
-
-
-def install_arch(packages):
-    packages = list(set(packages))
-    # supremely awesome hack to make the build succeed with part of python pips installed from pip and the other from pacman
-    # this either needs fixing properly or we need to move to buildstream!
-    subprocess.run(["sh", "-c", "rm -rfv /usr/lib/python*/site-packages/{psutil,click}*"], check=True)
-    cmd = ["pacman", "-S", "--noconfirm", "--needed", "--asdeps"] + packages
-    logger.info(f"Installing {len(packages)} packages via pacman: {', '.join(sorted(packages))}")
-    result = subprocess.run(cmd)
-    if result.returncode != 0:
-        raise RuntimeError(f"pacman install failed (exit {result.returncode})")
-
-
-def main():
-    if os.path.exists(DEPS_SENTINEL):
-        logger.info("Dependencies already installed, skipping.")
-        return
-
-    disable_signature_verification()
-    clear_package_cache()
-
-    targets = load_targets()
-    all_targets = get_all_build_targets(targets)
-    builddeps, rundeps, built_packages = load_deps_from_yaml(KDE_DEPS_YAML_ARCH, all_targets)
-    install_arch(list(set(builddeps + rundeps)))
-    clear_package_cache()
-
-    # Write only runtime deps for the Images Pipeline to consume via mkosi Packages=.
-    alldeps = sorted(set(rundeps) - built_packages)
-    if built_packages:
-        logger.info(
-            f"Excluding {len(built_packages)} built-from-source package(s) from packages.txt: "
-            + ", ".join(sorted(built_packages))
-        )
-    deps_path = os.path.join(CI_PROJECT_DIR, "artifacts", "packages.txt")
-    os.makedirs(os.path.dirname(deps_path), exist_ok=True)
-    with open(deps_path, "w") as f:
-        f.write("\n".join(alldeps) + "\n")
-    logger.info(f"Wrote {len(alldeps)} runtime deps to {deps_path}")
-
-    open(DEPS_SENTINEL, "w").close()
-
-
-if __name__ == "__main__":
-    main()
diff --git a/kde-builder.yaml.in b/kde-builder.yaml.in
index 4b01969..a5d590f 100644
--- a/kde-builder.yaml.in
+++ b/kde-builder.yaml.in
@@ -17,7 +17,7 @@ global:
   source-dir: /builder/src  # Directory for downloaded source code
   build-dir: /builder/build  # Directory to build KDE into before installing
   # qt-install-dir: ~/kde/qt  # Directory to install Qt if kde-builder supplies it
-  log-dir: /builder/log  # Directory to write logs into
+  log-dir: /run/host/kde-builder-logs  # Directory to write logs into
 
   # Tell kde-builder to use /usr/ as the configure location, but later
   # we'll actually install everything into ~/kde/ which is the source
@@ -27,6 +27,18 @@ global:
   # between system and source-built stuff.
   install-dir: /usr/
 
+  # BuildStream installs this element into /buildstream-install while
+  # kde-builder configures projects with /usr as their install prefix. Make
+  # dependencies built earlier in this same kde-builder run visible to later
+  # projects, while keeping staged system dependencies visible under /usr.
+  set-env:
+    PKG_CONFIG_PATH: /buildstream-install/usr/lib/pkgconfig:/buildstream-install/usr/lib/x86_64-linux-gnu/pkgconfig:/buildstream-install/usr/share/pkgconfig:/usr/lib/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/share/pkgconfig
+    PATH: /buildstream-install/usr/bin:/usr/bin:/bin
+    LD_LIBRARY_PATH: /buildstream-install/usr/lib:/buildstream-install/usr/lib/x86_64-linux-gnu
+    XDG_DATA_DIRS: /buildstream-install/usr/share:/usr/share
+    QML_IMPORT_PATH: /buildstream-install/usr/lib/qml:/usr/lib/qml
+    QML2_IMPORT_PATH: /buildstream-install/usr/lib/qml:/usr/lib/qml
+
   # Build RelWithDebInfo because that's our standard thing
   # Use system Qt paths to prevent issues
   # Don't build docs because we don't ship them in KDE Linux
@@ -47,6 +59,8 @@ global:
     -DCMAKE_C_COMPILER_LAUNCHER=ccache
     -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
     -DCMAKE_INTERPROCEDURAL_OPTIMIZATION=OFF
+    -DCMAKE_PREFIX_PATH=/buildstream-install/usr
+    -DCMAKE_FIND_ROOT_PATH=/buildstream-install
 
   # kde-builder sets 2 options which is used in options like make-options or set-env
   # to help manage the number of compile jobs that happen during a build:
@@ -156,9 +170,36 @@ include ${build-configs-dir}/kde6.yaml: ""
 override discover:
     cmake-options: -DBUILD_SystemdSysupdateBackend=ON
 
+override kdoctools:
+    cmake-options: -DDocBookXSL_DIR=/usr/share/xml/docbook/xml/xsl-stylesheets/ -DDTD_PATH_LIST=/usr/share/xml/docbook/xml-dtd/4.5/
+
+# qca: have to specify all of these directories because USE_RELATIVE_PATHS doesn't affect includes
+override qca:
+    cmake-options: >
+      -DUSE_RELATIVE_PATHS=ON
+      -DBUILD_WITH_QT6=ON
+
 override plasma-login-manager:
     cmake-options: -DPAM_OS_CONFIGURATION=kde-linux
 
 # Kapsule is only enabled for KDE Linux because it's still experimental
 override konsole:
     cmake-options: -DWITH_KAPSULE=ON
+
+override kdeconnect-kde:
+    cmake-options: -DWITH_X11=OFF
+
+override appstream:
+    # Something is causing wonky rpath resolution which then leads the qt tests to find the library from LD_LIBRARY_PATH
+    # and fail to link if they expect a symbol that isn't yet available in the build that is installed in the PATH.
+    # Force disable the variable; appstream builds fine without it anyway
+    set-env:
+        LD_LIBRARY_PATH: ""
+    meson-options: --libdir=lib/@GNU_TRIPLET@ -Dqt=true -Ddocs=false -Dapidocs=false -Dman=false
+
+override drkonqi:
+    cmake-options: -DWITH_PYTHON_VENDORING=OFF
+
+override plasma-wayland-protocols:
+    # temporary for https://invent.kde.org/libraries/plasma-wayland-protocols/-/merge_requests/139
+    cmake-options: -DQT_MAJOR_VERSION=6 -DBUILD_WITH_QT6=ON
diff --git a/make-kde-tarball.py b/make-kde-tarball.py
deleted file mode 100755
index 8153faa..0000000
--- a/make-kde-tarball.py
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/python3
-# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-# SPDX-FileCopyrightText: 2026 Hadi Chokr <[email protected]>
-import os
-import subprocess
-import logging
-import yaml
-
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-CI_PROJECT_DIR = os.getenv("CI_PROJECT_DIR", ".")
-
-
-def load_targets():
-    path = os.path.join(SCRIPT_DIR, "targets.yaml")
-    with open(path) as f:
-        return yaml.safe_load(f)["targets"]
-
-
-def patch_builder_config(log_dir):
-    config_path = os.path.join(os.environ["HOME"], ".config", "kde-builder.yaml")
-    with open(config_path) as f:
-        config = yaml.full_load(f)
-    config["global"]["log-dir"] = log_dir
-    with open(config_path, "w") as f:
-        f.write(yaml.dump(config))
-
-
-def build(targets):
-    env = os.environ.copy()
-    env["PATH"] = "/work/strip:" + env["PATH"]
-    args = ["kde-builder", "--refresh-build"] + targets
-    logger.info(f"Running: {' '.join(args)}")
-    result = subprocess.run(args, env=env)
-    if result.returncode != 0:
-        raise RuntimeError(f"kde-builder failed (exit {result.returncode})")
-
-
-def main():
-    targets = load_targets()
-    patch_builder_config(log_dir=f"{CI_PROJECT_DIR}/artifacts/logs")
-    build(targets)
-
-
-if __name__ == "__main__":
-    main()
diff --git a/plugins/elements/manual-run-host.py b/plugins/elements/manual-run-host.py
new file mode 100644
index 0000000..35a98ed
--- /dev/null
+++ b/plugins/elements/manual-run-host.py
@@ -0,0 +1,41 @@
+# SPDX-License-Identifier: BSD-2-Clause
+# SPDX-FileCopyrightText: 2026 Harald Sitter <[email protected]>
+
+from buildstream import BuildElement, Sandbox
+
+
+class ManualRunHostElement(BuildElement):
+
+    BST_MIN_VERSION = "2.7"
+
+    def configure(self, node):
+        self.warn("Configuring manual-run-host element")
+        super().configure(node)
+
+    def preflight(self):
+        self.warn("Preflighting manual-run-host element")
+        super().preflight()
+
+    def get_unique_key(self):
+        self.warn("Getting unique key for manual-run-host element")
+        return super().get_unique_key()
+
+    def configure_sandbox(self, sandbox):
+        self.warn("Configuring sandbox for manual-run-host element")
+        super().configure_sandbox(sandbox)
+
+    def stage(self, sandbox: Sandbox):
+        self.warn("Staging manual-run-host element")
+
+        sandbox.mark_directory("/run/host")
+        sandbox._set_mount_source("/run/host", "/tmp/host")
+
+        super().stage(sandbox)
+
+    def assemble(self, sandbox):
+        self.warn("Assembling manual-run-host element")
+        return super().assemble(sandbox)
+
+
+def setup():
+    return ManualRunHostElement
diff --git a/plugins/elements/manual-run-host.yaml b/plugins/elements/manual-run-host.yaml
new file mode 100644
index 0000000..ff06a63
--- /dev/null
+++ b/plugins/elements/manual-run-host.yaml
@@ -0,0 +1,25 @@
+# SPDX-License-Identifier: Apache-2.0
+# SPDX-FileCopyrightText: none
+
+# Manual build element does not provide any default
+# build commands
+config:
+
+  # Commands for configuring the software
+  #
+  configure-commands: []
+
+  # Commands for building the software
+  #
+  build-commands: []
+
+  # Commands for installing the software into a
+  # destination folder
+  #
+  install-commands: []
+
+  # Commands for stripping installed binaries
+  #
+  strip-commands:
+  - |
+    %{strip-binaries}
diff --git a/plugins/sources/kde_builder.py b/plugins/sources/kde_builder.py
new file mode 100644
index 0000000..532d14f
--- /dev/null
+++ b/plugins/sources/kde_builder.py
@@ -0,0 +1,325 @@
+# SPDX-FileCopyrightText: 2026 Aleix Pol Gonzalez <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+import hashlib
+import json
+import os
+from pathlib import Path
+import shutil
+import signal
+import subprocess
+import time
+
+from buildstream import Source, SourceError, utils
+import yaml
+
+
+class KdeBuilderSource(Source):
+    BST_MIN_VERSION = "2.7"
+    BST_REQUIRES_PREVIOUS_SOURCES_FETCH = True
+    BST_REQUIRES_PREVIOUS_SOURCES_TRACK = True
+
+    def configure(self, node):
+        node.validate_keys(["ref", "state-directory", *Source.COMMON_CONFIG_KEYS])
+        self.ref = self._parse_ref(node)
+        self.state_directory = node.get_str("state-directory", default="prepared-state")
+        self.mirror_root = os.path.join(self.get_mirror_directory(), "snapshots")
+        self.manifest_root = os.path.join(self.mirror_root, "manifests")
+        os.makedirs(self.mirror_root, exist_ok=True)
+        os.makedirs(self.manifest_root, exist_ok=True)
+
+    def preflight(self):
+        pass
+
+    def get_unique_key(self):
+        return [self.ref, self.state_directory]
+
+    def load_ref(self, node):
+        self.ref = self._parse_ref(node)
+
+    def get_ref(self):
+        return self.ref
+
+    def set_ref(self, ref, node):
+        node["ref"] = self.ref = ref
+
+    def is_resolved(self):
+        return self.ref is not None
+
+    def is_cached(self):
+        return bool(self.ref) and (
+            os.path.isfile(self._manifest_path(self.ref))
+            and self._work_tree_matches_manifest(self.ref)
+        )
+
+    def track(self, *, previous_sources_dir):
+        return self._prepare_snapshot(previous_sources_dir)
+
+    def fetch(self, *, previous_sources_dir):
+        if self.is_cached():
+            return
+
+        fetched_ref = self._prepare_snapshot(previous_sources_dir)
+        if fetched_ref != self.ref and not self.is_cached():
+            raise SourceError(
+                f"KDE source snapshot changed: expected {self.ref}, got {fetched_ref}. "
+                "Run `bst source track kde-linux-payload.bst` again."
+            )
+
+    def stage(self, directory):
+        if not self.ref:
+            raise SourceError("KDE source snapshot is not tracked")
+
+        manifest_path = self._manifest_path(self.ref)
+        if not os.path.isfile(manifest_path) or not self._work_tree_matches_manifest(
+            self.ref
+        ):
+            raise SourceError(f"KDE source snapshot is not cached: {self.ref}")
+
+        with self.timed_activity("Staging KDE source snapshot"):
+            utils.copy_files(
+                os.path.join(self.mirror_root, "work", "state"),
+                os.path.join(directory, self.state_directory),
+            )
+
+    def _snapshot_dir(self, ref):
+        return os.path.join(self.mirror_root, ref)
+
+    def _manifest_path(self, ref):
+        return os.path.join(self.manifest_root, f"{ref}.json")
+
+    @staticmethod
+    def _parse_ref(node):
+        ref = node.get_str("ref", default=None)
+        return ref or None
+
+    def _prepare_snapshot(self, previous_sources_dir):
+        os.makedirs(self.mirror_root, exist_ok=True)
+        payload_candidates = [
+            path
+            for path in Path(previous_sources_dir).glob("**/kde-builder")
+            if path.is_file() and (path.parent / "kde_builder_lib").is_dir()
+        ]
+        if len(payload_candidates) != 1:
+            raise SourceError(
+                f"Expected one staged kde-builder executable, found {len(payload_candidates)}"
+            )
+        payload_root = payload_candidates[0].parent
+
+        work_dir = Path(self.mirror_root) / "work"
+        if not work_dir.exists():
+            seed_dir = self._seed_snapshot_dir()
+            if seed_dir:
+                with self.timed_activity("Migrating KDE source snapshot to work tree"):
+                    seed_ref, seed_revisions = self._snapshot_ref(seed_dir)
+                    self._write_manifest(seed_ref, seed_revisions)
+                    work_dir.mkdir()
+                    seed_dir.rename(work_dir / "state")
+            else:
+                leftovers = sorted(
+                    Path(self.mirror_root).glob("kde-builder-*"),
+                    key=lambda path: path.stat().st_mtime,
+                )
+                if leftovers:
+                    leftovers[-1].rename(work_dir)
+
+        state_dir = work_dir / "state"
+        home_dir = work_dir / "home"
+        config_dir = home_dir / ".config"
+        source_dir = state_dir / "src"
+        build_dir = work_dir / "build"
+        log_dir = work_dir / "logs"
+        config_dir.mkdir(parents=True, exist_ok=True)
+        source_dir.mkdir(parents=True, exist_ok=True)
+        build_dir.mkdir(parents=True, exist_ok=True)
+        log_dir.mkdir(parents=True, exist_ok=True)
+
+        shutil.copyfile(
+            payload_root / "kde-linux-payload" / "kde-builder.yaml.in",
+            config_dir / "kde-builder.yaml",
+        )
+
+        targets_path = payload_root / "kde-linux-payload" / "targets.yaml"
+        with targets_path.open(encoding="utf-8") as stream:
+            targets = yaml.safe_load(stream)["targets"]
+
+        env = os.environ.copy()
+        env["HOME"] = str(home_dir)
+        env["XDG_STATE_HOME"] = str(state_dir)
+        common_args = [
+            str(payload_root / "kde-builder"),
+            "--rc-file",
+            str(config_dir / "kde-builder.yaml"),
+            "--no-color",
+            "--source-dir",
+            str(source_dir),
+            "--build-dir",
+            str(build_dir),
+            "--log-dir",
+            str(log_dir),
+        ]
+        fetch_log = log_dir / "kde-builder-fetch.log"
+        with self.timed_activity("Fetching KDE sources with kde-builder", silent_nested=True):
+            try:
+                self._run(
+                    [*common_args, "--src-only", *targets],
+                    env=env,
+                    log_path=fetch_log,
+                    progress_dir=source_dir,
+                    check=True,
+                )
+            except subprocess.CalledProcessError as error:
+                raise SourceError(
+                    f"kde-builder failed to fetch KDE sources; see {fetch_log}"
+                ) from error
+
+        snapshot_ref, revisions = self._snapshot_ref(state_dir)
+        self._write_manifest(snapshot_ref, revisions)
+        return snapshot_ref
+
+    def _seed_snapshot_dir(self):
+        if self.ref:
+            snapshot_dir = Path(self._snapshot_dir(self.ref))
+            if snapshot_dir.is_dir():
+                return snapshot_dir
+
+        snapshots = [
+            path
+            for path in Path(self.mirror_root).iterdir()
+            if path.is_dir() and self._is_snapshot_ref(path.name)
+        ]
+        if not snapshots:
+            return None
+
+        return max(snapshots, key=lambda path: path.stat().st_mtime)
+
+    def _write_manifest(self, ref, revisions):
+        manifest_path = Path(self._manifest_path(ref))
+        if manifest_path.exists():
+            return
+
+        manifest_path.parent.mkdir(parents=True, exist_ok=True)
+        with manifest_path.open("w", encoding="utf-8") as stream:
+            json.dump(revisions, stream, sort_keys=True, separators=(",", ":"))
+
+    def _read_manifest(self, ref):
+        with open(self._manifest_path(ref), encoding="utf-8") as stream:
+            return json.load(stream)
+
+    def _work_tree_matches_manifest(self, ref):
+        state_dir = Path(self.mirror_root) / "work" / "state"
+        if not state_dir.is_dir():
+            return False
+
+        revisions = self._read_manifest(ref)
+        for relative_path, revision in revisions.items():
+            repository = state_dir / relative_path
+            if not (repository / ".git").is_dir():
+                return False
+            try:
+                current = subprocess.run(
+                    ["git", "-C", str(repository), "rev-parse", "HEAD"],
+                    check=True,
+                    stdout=subprocess.PIPE,
+                    text=True,
+                ).stdout.strip()
+            except subprocess.CalledProcessError:
+                return False
+            if current != revision:
+                return False
+
+        return True
+
+    @staticmethod
+    def _is_snapshot_ref(value):
+        return len(value) == 64 and all(
+            character in "0123456789abcdef" for character in value
+        )
+
+    @staticmethod
+    def _snapshot_ref(state_dir):
+        revisions = {}
+        for git_dir in KdeBuilderSource._repository_git_dirs(state_dir):
+            repository = git_dir.parent
+            relative_path = repository.relative_to(state_dir).as_posix()
+            try:
+                revision = subprocess.run(
+                    ["git", "-C", str(repository), "rev-parse", "HEAD"],
+                    check=True,
+                    stdout=subprocess.PIPE,
+                    text=True,
+                ).stdout.strip()
+            except subprocess.CalledProcessError as error:
+                raise SourceError(f"Failed to read Git revision for {relative_path}") from error
+            revisions[relative_path] = revision
+
+        if not revisions:
+            raise SourceError("kde-builder did not fetch any Git repositories")
+
+        manifest = json.dumps(revisions, sort_keys=True, separators=(",", ":")).encode()
+        return hashlib.sha256(manifest).hexdigest(), revisions
+
+    def _run(self, args, **kwargs):
+        check = kwargs.pop("check", False)
+        log_path = kwargs.pop("log_path", None)
+        progress_dir = kwargs.pop("progress_dir", None)
+        log = None
+        try:
+            if log_path:
+                self.status(f"Writing kde-builder fetch log to {log_path}")
+                log = log_path.open("w", encoding="utf-8")
+                kwargs["stdout"] = log
+                kwargs["stderr"] = subprocess.STDOUT
+
+            process = subprocess.Popen(args, start_new_session=True, **kwargs)
+            try:
+                if progress_dir:
+                    last_count = None
+                    while process.poll() is None:
+                        count = self._repository_count(progress_dir)
+                        if count != last_count:
+                            self.status(f"KDE source repositories fetched: {count}")
+                            last_count = count
+                        time.sleep(5)
+                    stdout = None
+                else:
+                    stdout, _ = process.communicate()
+            except KeyboardInterrupt:
+                os.killpg(process.pid, signal.SIGTERM)
+                try:
+                    process.wait(timeout=5)
+                except subprocess.TimeoutExpired:
+                    os.killpg(process.pid, signal.SIGKILL)
+                    process.wait()
+                raise
+            finally:
+                if progress_dir:
+                    process.wait()
+        finally:
+            if log:
+                log.close()
+
+        returncode = process.returncode
+        if check and returncode:
+            raise subprocess.CalledProcessError(returncode, args)
+
+        return subprocess.CompletedProcess(args, returncode, stdout=stdout)
+
+    @staticmethod
+    def _repository_count(directory):
+        return len(KdeBuilderSource._repository_git_dirs(Path(directory).parent))
+
+    @staticmethod
+    def _repository_git_dirs(state_dir):
+        source_dir = Path(state_dir) / "src"
+        if not source_dir.is_dir():
+            source_dir = Path(state_dir)
+        return sorted(
+            path / ".git"
+            for path in source_dir.iterdir()
+            if (path / ".git").is_dir()
+        )
+
+
+def setup():
+    return KdeBuilderSource
diff --git a/project.conf b/project.conf
new file mode 100644
index 0000000..f561bb1
--- /dev/null
+++ b/project.conf
@@ -0,0 +1,106 @@
+# SPDX-FileCopyrightText: 2025 Aleix Pol Gonzalez <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+# Unique project name
+name: kde-linux-packages
+
+# Required BuildStream version
+min-version: 2.5
+
+# Subdirectory where elements are stored
+element-path: elements
+
+(@):
+- freedesktop-sdk.bst:include/runtime.yml
+- include/aliases.yml
+
+# Options to specify for the project, these provide
+# command line switches which control the behavior of
+# conditional directives in the element.bst files.
+#
+options:
+  arch:
+    type: arch
+    description: Machine architecture
+    variable: arch
+    values:
+    - aarch64
+    - x86_64
+    - riscv64
+  minimal_vm:
+    type: flags
+    description: Parts to include in minimal vm builds (firmware, locale).
+    values:
+    - firmware
+    - locale
+    default:
+    - firmware
+    - locale
+
+sandbox:
+  build-arch: '%{arch}'
+
+variables:
+  branch: 'qt6.11'
+  strip-binaries: ''
+  fsdk-branch: master
+  runstatedir: "/run"
+
+environment:
+# These need getting set so that projects can run tools and not get weird warnings.
+# trigger to adding this was qca's usage of qmake -query (which in turn comes from Qt upstream)
+  LANG: C.UTF-8
+  LC_ALL: C.UTF-8
+
+plugins:
+- origin: local
+  path: plugins/sources
+  sources:
+  - kde_builder
+
+- origin: local
+  path: plugins/elements
+  elements:
+  - manual-run-host
+
+- origin: junction
+  junction: plugins/buildstream-plugins.bst
+  elements:
+  - autotools
+  - meson
+  - cmake
+  - make
+  - pip
+  sources:
+  - patch
+  - git
+
+- origin: junction
+  junction: plugins/buildstream-plugins-community.bst
+  elements:
+  - pyproject
+  - flatpak_image
+  - flatpak_repo
+  - collect_manifest
+  - collect_integration
+  sources:
+  - cargo2
+  - git_repo
+  - zip
+
+- origin: junction
+  junction: freedesktop-sdk.bst
+  elements:
+  - collect_initial_scripts
+  - uki_builder
+
+sources:
+  git_repo:
+    config:
+      ref-format: git-describe
+
+artifacts:
+- url: https://buildstream.cache.kde-linux.haraldsitter.eu:11001
+
+source-caches:
+- url: https://buildstream.cache.kde-linux.haraldsitter.eu:11001
diff --git a/strip/ninja b/strip/ninja
deleted file mode 100755
index 88126e7..0000000
--- a/strip/ninja
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/usr/bin/env ruby
-# frozen_string_literal: true
-# SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
-# SPDX-FileCopyrightText: 2024-2025 Harald Sitter <[email protected]>
-# Hijack ninja to run the strip target instead of the default install target.
-
-destdir = ENV.fetch('KDE_LINUX_INSTALL_DESTDIR', '/work/tree/install')
-
-ARGV.each do |arg|
-  next arg if arg != 'install'
-  raise 'Failed to install with destdir' unless system({'DESTDIR' => destdir}, '/usr/bin/ninja.orig', *ARGV)
-  break
-end
-
-exec('/usr/bin/ninja.orig', *ARGV)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.